Package jadx.core.dex.instructions.args

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


        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 (mth.isNoCode()) {
      return;
    }
    for (SSAVar var : mth.getSVars()) {
      // inference variable type
      ArgType type = processType(var);
      if (type == null) {
        type = ArgType.UNKNOWN;
      }
      var.setType(type);
View Full Code Here

    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;
      }
    }
    return type;
View Full Code Here

    }
    return type;
  }

  private static void processPhiNode(PhiInsn phi) {
    ArgType type = phi.getResult().getType();
    if (!type.isTypeKnown()) {
      for (InsnArg arg : phi.getArguments()) {
        if (arg.getType().isTypeKnown()) {
          type = arg.getType();
          break;
        }
View Full Code Here

      }
    }
  }

  private static void selectType(InsnArg arg) {
    ArgType t = arg.getType();
    ArgType newType = ArgType.merge(t, t.selectFirst());
    arg.setType(newType);
  }
View Full Code Here

      case SPUT:
        return convertFieldArith(mth, insn);

      case CHECK_CAST:
        InsnArg castArg = insn.getArg(0);
        ArgType castType = (ArgType) ((IndexInsnNode) insn).getIndex();
        if (!ArgType.isCastNeeded(castArg.getType(), castType)) {
          InsnNode insnNode = new InsnNode(InsnType.MOVE, 1);
          insnNode.setResult(insn.getResult());
          insnNode.addArg(castArg);
          return insnNode;
View Full Code Here

      }
    }

    MethodNode staticMethod = null;

    ArgType clsType = cls.getClassInfo().getType();
    String enumConstructor = "<init>(Ljava/lang/String;I)V";
    String valuesOfMethod = "valueOf(Ljava/lang/String;)" + TypeGen.signature(clsType);
    String valuesMethod = "values()" + TypeGen.signature(ArgType.array(clsType));

    // remove synthetic methods
View Full Code Here

    Map<String, Object> values = new LinkedHashMap<String, Object>(size);
    for (int i = 0; i < size; i++) {
      String name = dex.getString(s.readUleb128());
      values.put(name, parser.parseValue());
    }
    ArgType type = dex.getType(typeIndex);
    Annotation annotation = new Annotation(visibility, type, values);
    if (!type.isObject()) {
      throw new DecodeException("Incorrect type for annotation: " + annotation);
    }
    return annotation;
  }
View Full Code Here

        }
        return false;
      }

    }
    ArgType resType = insn.getResult().getType();
    // make sure arg has correct type
    if (!arg.getType().isTypeKnown()) {
      arg.merge(resType);
    }
    return replaceConst(mth, sVar, lit);
View Full Code Here

        int count = insn.getArgsCount();
        int k = types.size() == count ? 0 : -1;
        for (int i = 0; i < count; i++) {
          InsnArg arg = insn.getArg(i);
          if (!arg.getType().isTypeKnown()) {
            ArgType type;
            if (k >= 0) {
              type = types.get(k);
            } else {
              type = mth.getParentClass().getClassInfo().getType();
            }
View Full Code Here

TOP

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

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.