fix asm parser for methods

This commit is contained in:
wea_ondara
2022-09-10 11:11:58 +02:00
parent 284bf647b4
commit 967d099d81
3 changed files with 21 additions and 10 deletions

View File

@@ -69,7 +69,7 @@ public class AsmParser {
} }
private AsmParseResult parseMethodExpression() throws Exception { private AsmParseResult parseMethodExpression() throws Exception {
var cls = method.getClass(); var cls = method.getDeclaringClass();
var loader = cls.getClassLoader(); var loader = cls.getClassLoader();
InputStream is = loader.getResourceAsStream(cls.getName().replace(".", "/") + ".class"); InputStream is = loader.getResourceAsStream(cls.getName().replace(".", "/") + ".class");
Object[] args = new Object[0];//TODO capturing args here? or maybe not supported since this will only be user by getter evaluation Object[] args = new Object[0];//TODO capturing args here? or maybe not supported since this will only be user by getter evaluation

View File

@@ -10,6 +10,7 @@ class FilterClassVisitor extends ClassVisitor {
private final String lambdaname; private final String lambdaname;
private final Object[] args; private final Object[] args;
private String className;
private FilterMethodVisitor mv; private FilterMethodVisitor mv;
protected FilterClassVisitor(int api, String lambdaname, Object[] args) { protected FilterClassVisitor(int api, String lambdaname, Object[] args) {
@@ -19,6 +20,12 @@ class FilterClassVisitor extends ClassVisitor {
this.args = args; this.args = args;
} }
@Override
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
super.visit(version, access, name, signature, superName, interfaces);
this.className = name;
}
@Override @Override
public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
if (!name.equals(lambdaname)) { if (!name.equals(lambdaname)) {
@@ -28,7 +35,7 @@ class FilterClassVisitor extends ClassVisitor {
if (mv != null) { if (mv != null) {
throw new IllegalStateException("multiple lambda with same name found: " + lambdaname); throw new IllegalStateException("multiple lambda with same name found: " + lambdaname);
} }
return mv = new FilterMethodVisitor(api, descriptor, args); return mv = new FilterMethodVisitor(api, className, descriptor, args);
} }
@Override @Override

View File

@@ -30,7 +30,6 @@ import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.Stack; import java.util.Stack;
import java.util.function.Consumer;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.IntStream; import java.util.stream.IntStream;
@@ -41,17 +40,22 @@ class FilterMethodVisitor extends MethodVisitor {
private Expression lambdaExpr; private Expression lambdaExpr;
private final Set<Field> accessedMembers = new HashSet<>(); private final Set<Field> accessedMembers = new HashSet<>();
protected FilterMethodVisitor(int api, String descriptor, Object[] args) { protected FilterMethodVisitor(int api, String className, String descriptor, Object[] args) {
super(api); super(api);
this.args = args;
//parameters //parameters
var types = Type.getMethodType(descriptor).getArgumentTypes(); var types = Type.getMethodType(descriptor).getArgumentTypes();
if (types.length == 0) {// class method //TODO this is dirty, as only works for parameterless class methods
this.args = new Object[]{null};
parameterClasses = new String[]{className};
} else {
this.args = args;
parameterClasses = new String[types.length]; parameterClasses = new String[types.length];
for (int i = 0; i < types.length; i++) { for (int i = 0; i < types.length; i++) {
parameterClasses[i] = types[i].getClassName(); parameterClasses[i] = types[i].getClassName();
} }
} }
}
public AsmParseResult getResult() { public AsmParseResult getResult() {
return new AsmParseResult(lambdaExpr, accessedMembers); return new AsmParseResult(lambdaExpr, accessedMembers);