Commit 87794d25 authored by Skylot's avatar Skylot

Fix bug for args in methods with generics

parent c4f21199
...@@ -263,7 +263,7 @@ public class MethodGen { ...@@ -263,7 +263,7 @@ public class MethodGen {
} }
private void makeFallbackMethod(CodeWriter code, MethodNode mth) { private void makeFallbackMethod(CodeWriter code, MethodNode mth) {
if (!mth.getAccessFlags().isStatic()) { if (mth.getThisArg() != null) {
code.startLine(getFallbackMethodGen(mth).makeArgName(mth.getThisArg())).add(" = this;"); code.startLine(getFallbackMethodGen(mth).makeArgName(mth.getThisArg())).add(" = this;");
} }
makeFallbackInsns(code, mth, mth.getInstructions(), true); makeFallbackInsns(code, mth, mth.getInstructions(), true);
......
...@@ -5,6 +5,7 @@ import jadx.utils.Utils; ...@@ -5,6 +5,7 @@ import jadx.utils.Utils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -421,6 +422,9 @@ public abstract class ArgType { ...@@ -421,6 +422,9 @@ public abstract class ArgType {
} }
private static List<ArgType> parseSignatureListInner(String str, boolean parsePrimitives) { private static List<ArgType> parseSignatureListInner(String str, boolean parsePrimitives) {
if (str.isEmpty()) {
return Collections.emptyList();
}
if (str.equals("*")) { if (str.equals("*")) {
return Arrays.asList(UNKNOWN); return Arrays.asList(UNKNOWN);
} }
......
...@@ -154,29 +154,32 @@ public class MethodNode extends AttrNode implements ILoadable { ...@@ -154,29 +154,32 @@ public class MethodNode extends AttrNode implements ILoadable {
LOG.warn("Signature parse error: {}", returnType); LOG.warn("Signature parse error: {}", returnType);
return false; return false;
} }
if (mthInfo.getArgumentsTypes().isEmpty()) {
argsList = Collections.emptyList();
return true;
}
List<ArgType> argsTypes = ArgType.parseSignatureList(argsTypesStr); List<ArgType> argsTypes = ArgType.parseSignatureList(argsTypesStr);
if (argsTypes == null) if (argsTypes == null)
return false; return false;
if (argsTypes.size() != mthInfo.getArgumentsTypes().size()) { if (argsTypes.size() != mthInfo.getArgumentsTypes().size()) {
if (argsTypes.isEmpty()) {
return false;
}
if (!mthInfo.isConstructor()) { if (!mthInfo.isConstructor()) {
LOG.warn("Wrong signature parse result: " + sign + " -> " + argsTypes LOG.warn("Wrong signature parse result: " + sign + " -> " + argsTypes
+ ", not generic version: " + mthInfo.getArgumentsTypes()); + ", not generic version: " + mthInfo.getArgumentsTypes());
return false; return false;
} else if (getParentClass().getAccessFlags().isEnum()) { } else if (getParentClass().getAccessFlags().isEnum()) {
// TODO: // TODO:
argsTypes.add(0, mthInfo.getArgumentsTypes().get(1)); argsTypes.add(0, mthInfo.getArgumentsTypes().get(0));
argsTypes.add(1, mthInfo.getArgumentsTypes().get(1)); argsTypes.add(1, mthInfo.getArgumentsTypes().get(1));
} else { } else {
// add synthetic arg for outer class // add synthetic arg for outer class
argsTypes.add(0, mthInfo.getArgumentsTypes().get(0)); argsTypes.add(0, mthInfo.getArgumentsTypes().get(0));
} }
if (argsTypes.size() != mthInfo.getArgumentsTypes().size()) {
return false;
} }
}
initArguments(argsTypes); initArguments(argsTypes);
return true; return true;
} }
......
...@@ -49,6 +49,8 @@ public class Utils { ...@@ -49,6 +49,8 @@ public class Utils {
case '>': case '>':
case ',': case ',':
case ' ': case ' ':
case '?':
case '*':
break; break;
default: default:
......
package jadx.samples; package jadx.samples;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -141,6 +142,28 @@ public class TestGenerics extends AbstractTest { ...@@ -141,6 +142,28 @@ public class TestGenerics extends AbstractTest {
} }
} }
private class TestConstructor implements Enumeration<String> {
private final TestGenerics a;
TestConstructor(TestGenerics a) {
this.a = a;
}
@Override
public boolean hasMoreElements() {
return false;
}
@Override
public String nextElement() {
return null;
}
}
public Enumeration<String> testThis() {
return new TestConstructor(this);
}
private List<String> test1(Map<String, String> map) { private List<String> test1(Map<String, String> map) {
List<String> list = new ArrayList<String>(); List<String> list = new ArrayList<String>();
String str = map.get("key"); String str = map.get("key");
......
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