Commit dabaeed8 authored by Skylot's avatar Skylot

core: add return type to method short id

parent 4923b36e
...@@ -21,4 +21,6 @@ public class Consts { ...@@ -21,4 +21,6 @@ public class Consts {
public static final String DEFAULT_PACKAGE_NAME = "defpackage"; public static final String DEFAULT_PACKAGE_NAME = "defpackage";
public static final String ANONYMOUS_CLASS_PREFIX = "AnonymousClass_"; public static final String ANONYMOUS_CLASS_PREFIX = "AnonymousClass_";
public static final String MTH_TOSTRING_SIGNATURE = "toString()Ljava/lang/String;";
} }
...@@ -31,14 +31,16 @@ public final class MethodInfo { ...@@ -31,14 +31,16 @@ public final class MethodInfo {
retType = dex.getType(proto.getReturnTypeIndex()); retType = dex.getType(proto.getReturnTypeIndex());
args = dex.readParamList(proto.getParametersOffset()); args = dex.readParamList(proto.getParametersOffset());
StringBuilder strArg = new StringBuilder(); StringBuilder signature = new StringBuilder();
strArg.append('('); signature.append(name);
for (ArgType arg : args) signature.append('(');
strArg.append(TypeGen.signature(arg)); for (ArgType arg : args) {
strArg.append(')'); signature.append(TypeGen.signature(arg));
// strArg.append(TypeGen.signature(retType)); }
signature.append(')');
shortId = name + strArg; signature.append(TypeGen.signature(retType));
shortId = signature.toString();
} }
public String getName() { public String getName() {
...@@ -108,8 +110,8 @@ public final class MethodInfo { ...@@ -108,8 +110,8 @@ public final class MethodInfo {
@Override @Override
public String toString() { public String toString() {
return retType + " " + declClass.getFullName() + "." + name return declClass.getFullName() + "." + name
+ "(" + Utils.listToString(args) + ")"; + "(" + Utils.listToString(args) + "):" + retType;
} }
} }
...@@ -516,8 +516,8 @@ public class MethodNode extends LineAttrNode implements ILoadable { ...@@ -516,8 +516,8 @@ public class MethodNode extends LineAttrNode implements ILoadable {
@Override @Override
public String toString() { public String toString() {
return retType return parentClass.getFullName() + "." + mthInfo.getName()
+ " " + parentClass.getFullName() + "." + mthInfo.getName() + "(" + Utils.listToString(mthInfo.getArgumentsTypes()) + "):"
+ "(" + Utils.listToString(mthInfo.getArgumentsTypes()) + ")"; + retType;
} }
} }
package jadx.core.dex.visitors; package jadx.core.dex.visitors;
import jadx.core.codegen.TypeGen;
import jadx.core.dex.attributes.AttributeFlag; import jadx.core.dex.attributes.AttributeFlag;
import jadx.core.dex.attributes.EnumClassAttr; import jadx.core.dex.attributes.EnumClassAttr;
import jadx.core.dex.attributes.EnumClassAttr.EnumField; import jadx.core.dex.attributes.EnumClassAttr.EnumField;
...@@ -8,6 +9,7 @@ import jadx.core.dex.info.FieldInfo; ...@@ -8,6 +9,7 @@ import jadx.core.dex.info.FieldInfo;
import jadx.core.dex.info.MethodInfo; import jadx.core.dex.info.MethodInfo;
import jadx.core.dex.instructions.IndexInsnNode; import jadx.core.dex.instructions.IndexInsnNode;
import jadx.core.dex.instructions.InsnType; import jadx.core.dex.instructions.InsnType;
import jadx.core.dex.instructions.args.ArgType;
import jadx.core.dex.instructions.args.InsnArg; import jadx.core.dex.instructions.args.InsnArg;
import jadx.core.dex.instructions.args.RegisterArg; import jadx.core.dex.instructions.args.RegisterArg;
import jadx.core.dex.instructions.mods.ConstructorInsn; import jadx.core.dex.instructions.mods.ConstructorInsn;
...@@ -30,8 +32,9 @@ public class EnumVisitor extends AbstractVisitor { ...@@ -30,8 +32,9 @@ public class EnumVisitor extends AbstractVisitor {
@Override @Override
public boolean visit(ClassNode cls) throws JadxException { public boolean visit(ClassNode cls) throws JadxException {
if (!cls.isEnum()) if (!cls.isEnum()) {
return true; return true;
}
// collect enum fields, remove synthetic // collect enum fields, remove synthetic
List<FieldNode> enumFields = new ArrayList<FieldNode>(); List<FieldNode> enumFields = new ArrayList<FieldNode>();
...@@ -47,19 +50,29 @@ public class EnumVisitor extends AbstractVisitor { ...@@ -47,19 +50,29 @@ public class EnumVisitor extends AbstractVisitor {
MethodNode staticMethod = null; 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 // remove synthetic methods
for (Iterator<MethodNode> it = cls.getMethods().iterator(); it.hasNext(); ) { for (Iterator<MethodNode> it = cls.getMethods().iterator(); it.hasNext(); ) {
MethodNode mth = it.next(); MethodNode mth = it.next();
MethodInfo mi = mth.getMethodInfo(); MethodInfo mi = mth.getMethodInfo();
if (mi.isClassInit()) { if (mi.isClassInit()) {
staticMethod = mth; staticMethod = mth;
} else if (mi.isConstructor() && !mth.getAccessFlags().isSynthetic()) { } else {
if (mi.getShortId().equals("<init>(Ljava/lang/String;I)")) String shortId = mi.getShortId();
boolean isSynthetic = mth.getAccessFlags().isSynthetic();
if (mi.isConstructor() && !isSynthetic) {
if (shortId.equals(enumConstructor)) {
it.remove();
}
} else if (isSynthetic
|| shortId.equals(valuesMethod)
|| shortId.equals(valuesOfMethod)) {
it.remove(); it.remove();
} else if (mth.getAccessFlags().isSynthetic() }
|| mi.getShortId().equals("values()")
|| mi.getShortId().equals("valueOf(Ljava/lang/String;)")) {
it.remove();
} }
} }
...@@ -89,10 +102,11 @@ public class EnumVisitor extends AbstractVisitor { ...@@ -89,10 +102,11 @@ public class EnumVisitor extends AbstractVisitor {
IndexInsnNode fp = (IndexInsnNode) insn; IndexInsnNode fp = (IndexInsnNode) insn;
FieldInfo f = (FieldInfo) fp.getIndex(); FieldInfo f = (FieldInfo) fp.getIndex();
if (f.getName().equals("$VALUES")) { if (f.getName().equals("$VALUES")) {
if (i == size - 1) if (i == size - 1) {
cls.getMethods().remove(staticMethod); cls.getMethods().remove(staticMethod);
else } else {
list.subList(0, i + 1).clear(); list.subList(0, i + 1).clear();
}
break; break;
} }
} }
...@@ -102,16 +116,19 @@ public class EnumVisitor extends AbstractVisitor { ...@@ -102,16 +116,19 @@ public class EnumVisitor extends AbstractVisitor {
if (insn.getType() == InsnType.CONSTRUCTOR) { if (insn.getType() == InsnType.CONSTRUCTOR) {
ConstructorInsn co = (ConstructorInsn) insn; ConstructorInsn co = (ConstructorInsn) insn;
if (insn.getArgsCount() < 2) if (insn.getArgsCount() < 2) {
continue; continue;
}
ClassInfo clsInfo = co.getClassType(); ClassInfo clsInfo = co.getClassType();
ClassNode constrCls = cls.dex().resolveClass(clsInfo); ClassNode constrCls = cls.dex().resolveClass(clsInfo);
if (constrCls == null) if (constrCls == null) {
continue; continue;
}
if (!clsInfo.equals(cls.getClassInfo()) && !constrCls.getAccessFlags().isEnum()) if (!clsInfo.equals(cls.getClassInfo()) && !constrCls.getAccessFlags().isEnum()) {
continue; continue;
}
RegisterArg nameArg = (RegisterArg) insn.getArg(0); RegisterArg nameArg = (RegisterArg) insn.getArg(0);
// InsnArg pos = insn.getArg(1); // InsnArg pos = insn.getArg(1);
...@@ -130,8 +147,9 @@ public class EnumVisitor extends AbstractVisitor { ...@@ -130,8 +147,9 @@ public class EnumVisitor extends AbstractVisitor {
constrArg = iArg; constrArg = iArg;
} else { } else {
constrArg = CodeShrinker.inlineArgument(staticMethod, (RegisterArg) iArg); constrArg = CodeShrinker.inlineArgument(staticMethod, (RegisterArg) iArg);
if (constrArg == null) if (constrArg == null) {
throw new JadxException("Can't inline constructor arg in enum: " + cls); throw new JadxException("Can't inline constructor arg in enum: " + cls);
}
} }
field.getArgs().add(constrArg); field.getArgs().add(constrArg);
} }
...@@ -143,8 +161,9 @@ public class EnumVisitor extends AbstractVisitor { ...@@ -143,8 +161,9 @@ public class EnumVisitor extends AbstractVisitor {
// remove constructor, because it is anonymous class // remove constructor, because it is anonymous class
for (Iterator<?> mit = innerCls.getMethods().iterator(); mit.hasNext(); ) { for (Iterator<?> mit = innerCls.getMethods().iterator(); mit.hasNext(); ) {
MethodNode innerMth = (MethodNode) mit.next(); MethodNode innerMth = (MethodNode) mit.next();
if (innerMth.getAccessFlags().isConstructor()) if (innerMth.getAccessFlags().isConstructor()) {
mit.remove(); mit.remove();
}
} }
field.setCls(innerCls); field.setCls(innerCls);
innerCls.getAttributes().add(AttributeFlag.DONT_GENERATE); innerCls.getAttributes().add(AttributeFlag.DONT_GENERATE);
......
...@@ -109,7 +109,7 @@ public class SimplifyVisitor extends AbstractVisitor { ...@@ -109,7 +109,7 @@ public class SimplifyVisitor extends AbstractVisitor {
case INVOKE: case INVOKE:
MethodInfo callMth = ((InvokeNode) insn).getCallMth(); MethodInfo callMth = ((InvokeNode) insn).getCallMth();
if (callMth.getDeclClass().getFullName().equals(Consts.CLASS_STRING_BUILDER) if (callMth.getDeclClass().getFullName().equals(Consts.CLASS_STRING_BUILDER)
&& callMth.getShortId().equals("toString()") && callMth.getShortId().equals(Consts.MTH_TOSTRING_SIGNATURE)
&& insn.getArg(0).isInsnWrap()) { && insn.getArg(0).isInsnWrap()) {
try { try {
List<InsnNode> chain = flattenInsnChain(insn); List<InsnNode> chain = flattenInsnChain(insn);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment