Package jadx.core.dex.instructions.mods

Examples of jadx.core.dex.instructions.mods.ConstructorInsn


        && callMth.getShortId().equals(Consts.MTH_TOSTRING_SIGNATURE)
        && insn.getArg(0).isInsnWrap()) {
      try {
        List<InsnNode> chain = flattenInsnChain(insn);
        if (chain.size() > 1 && chain.get(0).getType() == InsnType.CONSTRUCTOR) {
          ConstructorInsn constr = (ConstructorInsn) chain.get(0);
          if (constr.getClassType().getFullName().equals(Consts.CLASS_STRING_BUILDER)
              && constr.getArgsCount() == 0) {
            int len = chain.size();
            InsnNode concatInsn = new InsnNode(InsnType.STR_CONCAT, len - 1);
            for (int i = 1; i < len; i++) {
              concatInsn.addArg(chain.get(i).getArg(1));
            }
View Full Code Here


      }
    }

    for (InsnNode insn : insns) {
      if (insn.getType() == InsnType.CONSTRUCTOR) {
        ConstructorInsn co = (ConstructorInsn) insn;
        if (insn.getArgsCount() < 2) {
          continue;
        }
        ClassInfo clsInfo = co.getClassType();
        ClassNode constrCls = cls.dex().resolveClass(clsInfo);
        if (constrCls == null) {
          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);
        for (int i = 2; i < insn.getArgsCount(); i++) {
          InsnArg constrArg;
          InsnArg iArg = insn.getArg(i);
          if (iArg.isLiteral()) {
            constrArg = iArg;
          } else {
            constrArg = CodeShrinker.inlineArgument(staticMethod, (RegisterArg) iArg);
            if (constrArg == null) {
              throw new JadxException("Can't inline constructor arg in enum: " + cls);
            }
          }
          field.getArgs().add(constrArg);
        }

        if (co.getClassType() != cls.getClassInfo()) {
          // enum contains additional methods
          for (ClassNode innerCls : cls.getInnerClasses()) {
            if (innerCls.getClassInfo().equals(co.getClassType())) {
              // remove constructor, because it is anonymous class
              for (Iterator<?> mit = innerCls.getMethods().iterator(); mit.hasNext(); ) {
                MethodNode innerMth = (MethodNode) mit.next();
                if (innerMth.getAccessFlags().isConstructor()) {
                  mit.remove();
View Full Code Here

      }
      // remove synthetic constructor for inner non-static classes
      if (af.isSynthetic() && af.isConstructor() && mth.getBasicBlocks().size() == 2) {
        List<InsnNode> insns = mth.getBasicBlocks().get(0).getInstructions();
        if (insns.size() == 1 && insns.get(0).getType() == InsnType.CONSTRUCTOR) {
          ConstructorInsn constr = (ConstructorInsn) insns.get(0);
          if (constr.isThis() && !mth.getArguments(false).isEmpty()) {
            mth.removeFirstArgument();
            mth.add(AFlag.DONT_GENERATE);
          }
        }
      }
View Full Code Here

    InsnNode insn = block.getInstructions().get(insnNumber);
    InvokeNode inv = (InvokeNode) insn;
    MethodInfo callMth = inv.getCallMth();
    if (callMth.isConstructor()) {
      InsnNode instArgAssignInsn = ((RegisterArg) inv.getArg(0)).getAssignInsn();
      ConstructorInsn co = new ConstructorInsn(mth, inv);
      boolean remove = false;
      if (co.isSuper() && (co.getArgsCount() == 0 || parentClass.isEnum())) {
        remove = true;
      } else if (co.isThis() && co.getArgsCount() == 0) {
        MethodNode defCo = parentClass.searchMethodByName(callMth.getShortId());
        if (defCo == null || defCo.isNoCode()) {
          // default constructor not implemented
          remove = true;
        }
      }
      // remove super() call in instance initializer
      if (parentClass.isAnonymous() && mth.isDefaultConstructor() && co.isSuper()) {
        remove = true;
      }
      if (remove) {
        remover.add(insn);
      } else {
        replaceInsn(block, insnNumber, co);
        if (co.isNewInstance()) {
          InsnNode newInstInsn = removeAssignChain(instArgAssignInsn, remover, InsnType.NEW_INSTANCE);
          if (newInstInsn != null) {
            RegisterArg instArg = newInstInsn.getResult();
            RegisterArg resultArg = co.getResult();
            if (!resultArg.equals(instArg)) {
              // replace all usages of 'instArg' with result of this constructor instruction
              for (RegisterArg useArg : new ArrayList<RegisterArg>(instArg.getSVar().getUseList())) {
                RegisterArg dup = resultArg.duplicate();
                InsnNode parentInsn = useArg.getParentInsn();
                parentInsn.replaceArg(useArg, dup);
                dup.setParentInsn(parentInsn);
                resultArg.getSVar().use(dup);
              }
            }
          }
        }
        ConstructorInsn replace = processConstructor(mth, co);
        if (replace != null) {
          replaceInsn(block, insnNumber, replace);
        }
      }
    } else if (inv.getArgsCount() > 0) {
View Full Code Here

    String ctrId = "<init>(" + (passThis ? TypeGen.signature(co.getArg(0).getType()) : "") + ")V";
    MethodNode defCtr = classNode.searchMethodByName(ctrId);
    if (defCtr == null) {
      return null;
    }
    ConstructorInsn newInsn = new ConstructorInsn(defCtr.getMethodInfo(), co.getCallType(), co.getInstanceArg());
    newInsn.setResult(co.getResult());
    return newInsn;
  }
View Full Code Here

        case MOVE_EXCEPTION:
          it.remove();
          break;

        case CONSTRUCTOR:
          ConstructorInsn co = (ConstructorInsn) insn;
          if (co.isSelf()) {
            it.remove();
          }
          break;

        case MOVE:
View Full Code Here

          return "it";
        }
        return name;

      case CONSTRUCTOR:
        ConstructorInsn co = (ConstructorInsn) insn;
        return makeNameForObject(co.getClassType().getType());

      case ARRAY_LENGTH:
        return "length";

      case ARITH:
View Full Code Here

TOP

Related Classes of jadx.core.dex.instructions.mods.ConstructorInsn

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.