Add support for H_NEWINVOKESPECIAL

This commit is contained in:
Lauri Hartikka
2015-10-18 17:38:46 +03:00
parent 743f2814c3
commit 91e3e652aa
4 changed files with 65 additions and 0 deletions

View File

@@ -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();

View File

@@ -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";

View File

@@ -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<Integer> integers = Arrays.asList(1, 2, 3);
List<Integer> collected = integers.stream().collect(Collectors.toCollection(ArrayList::new));
return collected.size();
}
}

View File

@@ -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<Integer> integers = Arrays.asList(1, 2, 3, 4);
List<Integer> collected = integers.stream().collect(Collectors.toCollection(ArrayList::new));
return collected.size();
}
}