From df2ec4b1ba5cb301f5ac30798f60450232b915c1 Mon Sep 17 00:00:00 2001 From: Daniel Holle Date: Tue, 30 Apr 2024 16:55:40 +0200 Subject: [PATCH] Fix #326, convert captures to correct types --- resources/bytecode/javFiles/Bug326.jav | 8 ++++++++ src/main/java/de/dhbwstuttgart/bytecode/Codegen.java | 7 +++++-- .../de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java | 3 --- src/test/java/TestComplete.java | 7 +++++++ 4 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 resources/bytecode/javFiles/Bug326.jav diff --git a/resources/bytecode/javFiles/Bug326.jav b/resources/bytecode/javFiles/Bug326.jav new file mode 100644 index 00000000..6329fe6b --- /dev/null +++ b/resources/bytecode/javFiles/Bug326.jav @@ -0,0 +1,8 @@ +import java.lang.Integer; + +public class Bug326 { + public Bug326() { + var func = x -> y -> x * y; + return func.apply(3).apply(4); + } +} diff --git a/src/main/java/de/dhbwstuttgart/bytecode/Codegen.java b/src/main/java/de/dhbwstuttgart/bytecode/Codegen.java index ee39830a..b3c1fe20 100644 --- a/src/main/java/de/dhbwstuttgart/bytecode/Codegen.java +++ b/src/main/java/de/dhbwstuttgart/bytecode/Codegen.java @@ -784,9 +784,12 @@ public class Codegen { var descriptor = TargetMethod.getDescriptor(state.contextType, params.toArray(TargetType[]::new)); mv.visitVarInsn(ALOAD, 0); - for (var capture : lambda.captures()) { + for (var index = 0; index < lambda.captures().size(); index++) { + var capture = lambda.captures().get(index); var pattern = (TargetTypePattern) capture.pattern(); - mv.visitVarInsn(ALOAD, state.scope.get(pattern.name()).index); + var variable = state.scope.get(pattern.name()); + mv.visitVarInsn(ALOAD, variable.index); + mv.visitTypeInsn(CHECKCAST, capture.pattern().type().getInternalName()); } mv.visitInvokeDynamicInsn(methodName, descriptor, bootstrap, Type.getType(signature.getSignature()), handle, Type.getType(signature.getDescriptor())); diff --git a/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java b/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java index 86b390e7..cabe5f87 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java @@ -592,7 +592,6 @@ public class TYPEStmt implements StatementVisitor { var params = convertParams(ctor.getParameterList(), info); if (params.size() != superCall.arglist.getArguments().size()) continue; var assumption = new MethodAssumption(null, new Void(new NullToken()), params, createTypeScope(clazz, ctor), ctor.isInherited); - System.out.println(params); GenericsResolver resolver = getResolverInstance(); Set> oneMethodConstraints = generateConstraint(superCall, assumption, info, resolver); @@ -683,7 +682,6 @@ public class TYPEStmt implements StatementVisitor { extendsMethodConstraint.addAll(parameterContraints); Set methodSignatureConstraint = generatemethodSignatureConstraint(forMethod, assumption, info, resolver); - System.out.println(methodSignatureConstraint); //System.out.println("methodSignatureConstraint: " + methodSignatureConstraint); //System.out.println("methodConstraint: " + methodConstraint); @@ -718,7 +716,6 @@ public class TYPEStmt implements StatementVisitor { Set ret = new HashSet<>(); for (int i = 0; i < foMethod.arglist.getArguments().size(); i++) { - System.out.println(foMethod.signature); // Zuordnung von MethoCall.signature (Argumenttypen) zu der Argumenttypen der ausgewaehlten Methode (assumption.params) ret.add(new Pair(foMethod.signature.get(i), assumption.getArgTypes().get(i), PairOperator.EQUALSDOT)); diff --git a/src/test/java/TestComplete.java b/src/test/java/TestComplete.java index 399b587b..160bc5aa 100644 --- a/src/test/java/TestComplete.java +++ b/src/test/java/TestComplete.java @@ -1085,6 +1085,13 @@ public class TestComplete { assertEquals(res, List.of(6, 7, 8)); } + @Test + public void testBug326() throws Exception { + var classFiles = generateClassFiles(new ByteArrayClassLoader(), "Bug326.jav"); + var clazz = classFiles.get("Bug326"); + var instance = clazz.getDeclaredConstructor().newInstance(); + } + @Test public void testBug328() throws Exception { var loader = new ByteArrayClassLoader();