add method reference support to asm parser

This commit is contained in:
wea_ondara
2022-09-12 18:48:14 +02:00
parent 4e75ce3b2e
commit 6870435eea
3 changed files with 12 additions and 8 deletions

View File

@@ -8,7 +8,6 @@
- references to platform specific impls - references to platform specific impls
## Asm ## Asm
- method references
- equals function for primitive and string + String::equalsIgnoreCase - equals function for primitive and string + String::equalsIgnoreCase
- equals function for registered primitive conversion types - equals function for registered primitive conversion types
- IConst0Fixer: IConst0/1 on its own => false/true - IConst0Fixer: IConst0/1 on its own => false/true

View File

@@ -46,20 +46,17 @@ public class AsmParser {
} }
private AsmParseResult parseLambdaExpression() throws Exception { private AsmParseResult parseLambdaExpression() throws Exception {
var cls = lambda.getClass(); var cls = (Class) lambda.getClass();
var loader = cls.getClassLoader(); var loader = cls.getClassLoader();
InputStream is;
if (cls.getName().contains("$$Lambda$")) {
is = loader.getResourceAsStream(cls.getName().split("\\$\\$")[0].replace(".", "/") + ".class");
} else {
is = loader.getResourceAsStream(cls.getName().replace(".", "/") + ".class");
}
var writeReplace = cls.getDeclaredMethod("writeReplace"); var writeReplace = cls.getDeclaredMethod("writeReplace");
writeReplace.setAccessible(true); writeReplace.setAccessible(true);
var serlambda = (SerializedLambda) writeReplace.invoke(lambda); var serlambda = (SerializedLambda) writeReplace.invoke(lambda);
Object[] args = IntStream.range(0, serlambda.getCapturedArgCount()).mapToObj(serlambda::getCapturedArg).toArray(); Object[] args = IntStream.range(0, serlambda.getCapturedArgCount()).mapToObj(serlambda::getCapturedArg).toArray();
var classname = serlambda.getImplClass();
var lambdaname = serlambda.getImplMethodName(); var lambdaname = serlambda.getImplMethodName();
cls = Class.forName(classname.replace("/", "."));
var is = loader.getResourceAsStream(cls.getName().replace(".", "/") + ".class");
var cr = new ClassReader(is); var cr = new ClassReader(is);
var visiter = new FilterClassVisitor(Opcodes.ASM9, lambdaname, args); var visiter = new FilterClassVisitor(Opcodes.ASM9, lambdaname, args);

View File

@@ -159,6 +159,13 @@ public class OptimizedAsmParserTest {
Assertions.assertEquals("`i` = 1337", act); Assertions.assertEquals("`i` = 1337", act);
} }
@Test
public void testMethodReference() throws AsmParseException {
String act;
act = new OptimizedAsmParser((SerializablePredicate<TestClass>) TestClass::isB).parse().getExpression().toString();
Assertions.assertEquals("`b`", act);
}
@Getter @Getter
public static class TestClass extends SerializableObject { public static class TestClass extends SerializableObject {
public int i = 1; public int i = 1;
@@ -166,5 +173,6 @@ public class OptimizedAsmParserTest {
public double d; public double d;
public float f; public float f;
public long l; public long l;
public boolean b;
} }
} }