From 87794d25c18f6a045ad3774cb0f81834ed919eec Mon Sep 17 00:00:00 2001 From: Skylot Date: Fri, 19 Apr 2013 22:03:33 +0400 Subject: [PATCH] Fix bug for args in methods with generics --- src/main/java/jadx/codegen/MethodGen.java | 2 +- .../jadx/dex/instructions/args/ArgType.java | 4 ++++ src/main/java/jadx/dex/nodes/MethodNode.java | 13 +++++++---- src/main/java/jadx/utils/Utils.java | 2 ++ .../java/jadx/samples/TestGenerics.java | 23 +++++++++++++++++++ 5 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/main/java/jadx/codegen/MethodGen.java b/src/main/java/jadx/codegen/MethodGen.java index aaacb66d..6d6c2279 100644 --- a/src/main/java/jadx/codegen/MethodGen.java +++ b/src/main/java/jadx/codegen/MethodGen.java @@ -263,7 +263,7 @@ public class MethodGen { } private void makeFallbackMethod(CodeWriter code, MethodNode mth) { - if (!mth.getAccessFlags().isStatic()) { + if (mth.getThisArg() != null) { code.startLine(getFallbackMethodGen(mth).makeArgName(mth.getThisArg())).add(" = this;"); } makeFallbackInsns(code, mth, mth.getInstructions(), true); diff --git a/src/main/java/jadx/dex/instructions/args/ArgType.java b/src/main/java/jadx/dex/instructions/args/ArgType.java index afb56241..6241083f 100644 --- a/src/main/java/jadx/dex/instructions/args/ArgType.java +++ b/src/main/java/jadx/dex/instructions/args/ArgType.java @@ -5,6 +5,7 @@ import jadx.utils.Utils; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -421,6 +422,9 @@ public abstract class ArgType { } private static List parseSignatureListInner(String str, boolean parsePrimitives) { + if (str.isEmpty()) { + return Collections.emptyList(); + } if (str.equals("*")) { return Arrays.asList(UNKNOWN); } diff --git a/src/main/java/jadx/dex/nodes/MethodNode.java b/src/main/java/jadx/dex/nodes/MethodNode.java index 03ffc1f2..9f287afa 100644 --- a/src/main/java/jadx/dex/nodes/MethodNode.java +++ b/src/main/java/jadx/dex/nodes/MethodNode.java @@ -154,29 +154,32 @@ public class MethodNode extends AttrNode implements ILoadable { LOG.warn("Signature parse error: {}", returnType); return false; } - if (mthInfo.getArgumentsTypes().isEmpty()) { - argsList = Collections.emptyList(); - return true; - } List argsTypes = ArgType.parseSignatureList(argsTypesStr); if (argsTypes == null) return false; if (argsTypes.size() != mthInfo.getArgumentsTypes().size()) { + if (argsTypes.isEmpty()) { + return false; + } if (!mthInfo.isConstructor()) { LOG.warn("Wrong signature parse result: " + sign + " -> " + argsTypes + ", not generic version: " + mthInfo.getArgumentsTypes()); return false; } else if (getParentClass().getAccessFlags().isEnum()) { // TODO: - argsTypes.add(0, mthInfo.getArgumentsTypes().get(1)); + argsTypes.add(0, mthInfo.getArgumentsTypes().get(0)); argsTypes.add(1, mthInfo.getArgumentsTypes().get(1)); } else { // add synthetic arg for outer class argsTypes.add(0, mthInfo.getArgumentsTypes().get(0)); } + if (argsTypes.size() != mthInfo.getArgumentsTypes().size()) { + return false; + } } + initArguments(argsTypes); return true; } diff --git a/src/main/java/jadx/utils/Utils.java b/src/main/java/jadx/utils/Utils.java index ee822a74..fb996282 100644 --- a/src/main/java/jadx/utils/Utils.java +++ b/src/main/java/jadx/utils/Utils.java @@ -49,6 +49,8 @@ public class Utils { case '>': case ',': case ' ': + case '?': + case '*': break; default: diff --git a/src/samples/java/jadx/samples/TestGenerics.java b/src/samples/java/jadx/samples/TestGenerics.java index 6c88b2e4..bb3eccbd 100644 --- a/src/samples/java/jadx/samples/TestGenerics.java +++ b/src/samples/java/jadx/samples/TestGenerics.java @@ -1,6 +1,7 @@ package jadx.samples; import java.util.ArrayList; +import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -141,6 +142,28 @@ public class TestGenerics extends AbstractTest { } } + private class TestConstructor implements Enumeration { + private final TestGenerics a; + + TestConstructor(TestGenerics a) { + this.a = a; + } + + @Override + public boolean hasMoreElements() { + return false; + } + + @Override + public String nextElement() { + return null; + } + } + + public Enumeration testThis() { + return new TestConstructor(this); + } + private List test1(Map map) { List list = new ArrayList(); String str = map.get("key"); -- GitLab