Package jadx.core.dex.instructions.args

Examples of jadx.core.dex.instructions.args.RegisterArg


  }

  public static boolean process(MethodNode mth, InsnNode insn) {
    switch (insn.getType()) {
      case CONST:
        RegisterArg res = insn.getResult();
        LiteralArg litArg = (LiteralArg) insn.getArg(0);
        if (res.getType().isObject()) {
          long lit = litArg.getLiteral();
          if (lit != 0) {
            // incorrect literal value for object
            ArgType type = lit == 1 ? ArgType.BOOLEAN : ArgType.INT;
            // can't merge with object -> force it
            litArg.setType(type);
            res.getSVar().setType(type);
            return true;
          }
        }
        return litArg.merge(res);

      case MOVE: {
        boolean change = false;
        if (insn.getResult().merge(insn.getArg(0))) {
          change = true;
        }
        if (insn.getArg(0).merge(insn.getResult())) {
          change = true;
        }
        return change;
      }

      case AGET:
        return fixArrayTypes(insn.getArg(0), insn.getResult());

      case APUT:
        return fixArrayTypes(insn.getArg(0), insn.getArg(2));

      case IF: {
        boolean change = false;
        if (insn.getArg(1).merge(insn.getArg(0))) {
          change = true;
        }
        if (insn.getArg(0).merge(insn.getArg(1))) {
          change = true;
        }
        return change;
      }

      // check argument types for overloaded methods
      case INVOKE: {
        boolean change = false;
        InvokeNode inv = (InvokeNode) insn;
        MethodInfo callMth = inv.getCallMth();
        MethodNode node = mth.dex().resolveMethod(callMth);
        if (node != null && node.isArgsOverload()) {
          List<ArgType> args = callMth.getArgumentsTypes();
          int j = inv.getArgsCount() - 1;
          for (int i = args.size() - 1; i >= 0; i--) {
            ArgType argType = args.get(i);
            InsnArg insnArg = inv.getArg(j--);
            if (insnArg.isRegister() && !argType.equals(insnArg.getType())) {
              insnArg.setType(argType);
              change = true;
            }
          }
        }
        return change;
      }

      case CHECK_CAST: {
        ArgType castType = (ArgType) ((IndexInsnNode) insn).getIndex();
        RegisterArg result = insn.getResult();
        // don't override generic types of same base class
        boolean skip = castType.isObject() && castType.getObject().equals(result.getType().getObject());
        if (!skip) {
          // workaround for compiler bug (see TestDuplicateCast)
          result.getSVar().setType(castType);
        }
        return true;
      }

      case PHI: {
        PhiInsn phi = (PhiInsn) insn;
        RegisterArg result = phi.getResult();
        SSAVar resultSVar = result.getSVar();
        if (resultSVar != null && !result.getType().isTypeKnown()) {
          for (InsnArg arg : phi.getArguments()) {
            ArgType argType = arg.getType();
            if (argType.isTypeKnown()) {
              resultSVar.setType(argType);
              return true;
View Full Code Here


            if (!kill.get(regNum)) {
              gen.set(regNum);
            }
          }
        }
        RegisterArg result = insn.getResult();
        if (result != null) {
          int regNum = result.getRegNum();
          kill.set(regNum);
          assignBlocks[regNum].set(blockId);
        }
      }
    }
View Full Code Here

      if (args.isEmpty()) {
        continue;
      }
      ListIterator<RegisterArg> it = args.listIterator(args.size());
      while (it.hasPrevious()) {
        RegisterArg arg = it.previous();
//        if (arg.getName() != null) {
//          continue;
//        }
        SSAVar sVar = arg.getSVar();
        // allow inline only one use arg or 'this'
        if (sVar.getVariableUseCount() != 1 && !arg.isThis()) {
          continue;
        }
        InsnNode assignInsn = sVar.getAssign().getParentInsn();
        if (assignInsn == null || assignInsn.contains(AFlag.DONT_INLINE)) {
          continue;
        }
        int assignPos = insnList.getIndex(assignInsn);
        if (assignPos != -1) {
          WrapInfo wrapInfo = argsInfo.checkInline(assignPos, arg);
          if (wrapInfo != null) {
            wrapList.add(wrapInfo);
          }
        } else {
          // another block
          BlockNode assignBlock = BlockUtils.getBlockByInsn(mth, assignInsn);
          if (assignBlock != null
              && assignInsn != arg.getParentInsn()
              && canMoveBetweenBlocks(assignInsn, assignBlock, block, argsInfo.getInsn())) {
            arg.wrapInstruction(assignInsn);
            InsnList.remove(assignBlock, assignInsn);
          }
        }
      }
    }
View Full Code Here

      }
    }
  }

  private static ArgType processType(SSAVar var) {
    RegisterArg assign = var.getAssign();
    List<RegisterArg> useList = var.getUseList();
    if (useList.isEmpty() || var.isTypeImmutable()) {
      return assign.getType();
    }
    ArgType type = assign.getType();
    for (RegisterArg arg : useList) {
      ArgType useType = arg.getType();
      ArgType newType = ArgType.merge(type, useType);
      if (newType != null) {
        type = newType;
View Full Code Here

        }
      }
    }
    phi.getResult().setType(type);
    for (int i = 0; i < phi.getArgsCount(); i++) {
      RegisterArg arg = phi.getArg(i);
      arg.setType(type);
      arg.getSVar().setName(phi.getResult().getName());
    }
  }
View Full Code Here

    SSAVar[] inputVars = Arrays.copyOf(vars, vars.length);
    for (InsnNode insn : block.getInstructions()) {
      if (insn.getType() != InsnType.PHI) {
        for (InsnArg arg : insn.getArguments()) {
          if (arg.isRegister()) {
            RegisterArg reg = (RegisterArg) arg;
            int regNum = reg.getRegNum();
            SSAVar var = vars[regNum];
            if (var == null) {
              var = mth.makeNewSVar(regNum, vers, null);
              vars[regNum] = var;
            }
            var.use(reg);
          }
        }
      }
      RegisterArg result = insn.getResult();
      if (result != null) {
        int regNum = result.getRegNum();
        vars[regNum] = mth.makeNewSVar(regNum, vers, result);
      }
    }
    for (BlockNode s : block.getSuccessors()) {
      PhiListAttr phiList = s.get(AType.PHI_LIST);
View Full Code Here

      }
      return true;
    }

    private static boolean usedArgAssign(InsnNode insn, BitSet args) {
      RegisterArg result = insn.getResult();
      return result != null && args.get(result.getRegNum());
    }
View Full Code Here

      if (phiList == null || !block.contains(AType.EXC_HANDLER)) {
        continue;
      }
      for (PhiInsn phi : phiList.getList()) {
        for (int i = 0; i < phi.getArgsCount(); i++) {
          RegisterArg arg = phi.getArg(i);
          InsnNode parentInsn = arg.getAssignInsn();
          if (parentInsn != null
              && parentInsn.getResult() != null
              && parentInsn.contains(AFlag.TRY_LEAVE)) {
            phi.removeArg(arg);
          }
View Full Code Here

        // fix debug for splitter 'return' instructions
        for (BlockNode exit : mth.getExitBlocks()) {
          InsnNode ret = exit.getInstructions().get(0);
          InsnNode oldRet = insnArr[ret.getOffset()];
          if (oldRet != ret) {
            RegisterArg oldArg = (RegisterArg) oldRet.getArg(0);
            RegisterArg newArg = (RegisterArg) ret.getArg(0);
            newArg.mergeDebugInfo(oldArg.getType(), oldArg.getName());
            ret.setSourceLine(oldRet.getSourceLine());
          }
        }
      }
    }
View Full Code Here

          continue;
        }
        if (!clsInfo.equals(cls.getClassInfo()) && !constrCls.getAccessFlags().isEnum()) {
          continue;
        }
        RegisterArg nameArg = (RegisterArg) insn.getArg(0);
        // InsnArg pos = insn.getArg(1);
        // TODO add check: pos == j
        String name = (String) nameArg.getConstValue(cls.dex());
        if (name == null) {
          throw new JadxException("Unknown enum field name: " + cls);
        }
        EnumField field = new EnumField(name, insn.getArgsCount() - 2);
        attr.getFields().add(field);
View Full Code Here

TOP

Related Classes of jadx.core.dex.instructions.args.RegisterArg

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.