diff --git a/springloaded/src/main/java/org/springsource/loaded/support/Java8.java b/springloaded/src/main/java/org/springsource/loaded/support/Java8.java index b127d09..7218e13 100644 --- a/springloaded/src/main/java/org/springsource/loaded/support/Java8.java +++ b/springloaded/src/main/java/org/springsource/loaded/support/Java8.java @@ -188,6 +188,10 @@ public class Java8 { } } break; + case Opcodes.H_NEWINVOKESPECIAL: + Class clazz = callerLoader.loadClass(owner.replace("/", ".")); + implMethod = caller.findConstructor(clazz, implMethodType); + break; case Opcodes.H_INVOKEINTERFACE: Handle h = (Handle) bsmArgs[1]; String interfaceOwner = h.getOwner(); diff --git a/springloaded/src/test/java/org/springsource/loaded/test/Java8Tests.java b/springloaded/src/test/java/org/springsource/loaded/test/Java8Tests.java index b7f56d0..9ddff1d 100644 --- a/springloaded/src/test/java/org/springsource/loaded/test/Java8Tests.java +++ b/springloaded/src/test/java/org/springsource/loaded/test/Java8Tests.java @@ -425,6 +425,26 @@ public class Java8Tests extends SpringLoadedTests { // assertEquals("{15=test3}", r.returnValue); } + @Test + public void lambdaWithDoubleDotConstructor() throws Exception { + String t = "basic.LambdaO"; + TypeRegistry typeRegistry = getTypeRegistry(t); + byte[] sc = loadBytesForClass(t); + ReloadableType rtype = typeRegistry.addType(t, sc); + + Class simpleClass = rtype.getClazz(); + Result r = runUnguarded(simpleClass, "run"); + + r = runUnguarded(simpleClass, "run"); + assertEquals(3, r.returnValue); + + byte[] renamed = retrieveRename(t, t + "2"); + rtype.loadNewVersion("002", renamed); + r = runUnguarded(simpleClass, "run"); + assertEquals(4, r.returnValue); + + } + @Test public void streamWithLambda() throws Exception { String t = "basic.StreamA"; diff --git a/testdata-java8/src/main/java/basic/LambdaO.java b/testdata-java8/src/main/java/basic/LambdaO.java new file mode 100644 index 0000000..11bf9bc --- /dev/null +++ b/testdata-java8/src/main/java/basic/LambdaO.java @@ -0,0 +1,20 @@ +package basic; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class LambdaO { + + public static void main(String[] args) { + run(); + } + + public static int run() { + List integers = Arrays.asList(1, 2, 3); + List collected = integers.stream().collect(Collectors.toCollection(ArrayList::new)); + return collected.size(); + } + +} \ No newline at end of file diff --git a/testdata-java8/src/main/java/basic/LambdaO2.java b/testdata-java8/src/main/java/basic/LambdaO2.java new file mode 100644 index 0000000..c3675fb --- /dev/null +++ b/testdata-java8/src/main/java/basic/LambdaO2.java @@ -0,0 +1,21 @@ +package basic; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class LambdaO2 { + + public static void main(String[] args) { + run(); + } + + public static int run() { + + List integers = Arrays.asList(1, 2, 3, 4); + List collected = integers.stream().collect(Collectors.toCollection(ArrayList::new)); + return collected.size(); + } + +} \ No newline at end of file