Managed to call the bootstrap method. Just with wrong arguments.
1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Aug 10 08:57:22 2014 +0200
1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Aug 10 10:37:23 2014 +0200
1.3 @@ -1057,7 +1057,10 @@
1.4 println("invoke dynamic: " + indx);
1.5 ByteCodeParser.CPX2 c2 = jc.getCpoolEntry(indx);
1.6 BootMethodData bm = jc.getBootMethod(c2.cpx1);
1.7 - String[] mi = jc.getFieldInfoName(bm.method);
1.8 + CPX2 methodHandle = jc.getCpoolEntry(bm.method);
1.9 + println(" type: " + methodHandle.cpx1);
1.10 + String[] mi = jc.getFieldInfoName(methodHandle.cpx2);
1.11 + String mcn = mangleClassName(mi[0]);
1.12 char[] returnType = {'V'};
1.13 StringBuilder cnt = new StringBuilder();
1.14 String mn = findMethodName(mi, cnt, returnType);
1.15 @@ -1066,7 +1069,22 @@
1.16 println(" mi[2]: " + mi[2]);
1.17 println(" mn : " + mn);
1.18 println(" name and type: " + jc.stringValue(c2.cpx2, true));
1.19 - emit(smapper, this, "throw 'Invoke dynamic: ' + @1;", "" + indx);
1.20 + String object = accessClass(mcn) + "(false)";
1.21 + if (mn.startsWith("cons_")) {
1.22 + object += ".constructor";
1.23 + }
1.24 + append("var metHan = ");
1.25 + append(accessStaticMethod(object, mn, mi));
1.26 + append('(');
1.27 +// if (numArguments > 0) {
1.28 +// append(vars[0]);
1.29 +// for (int j = 1; j < numArguments; ++j) {
1.30 +// append(", ");
1.31 +// append(vars[j]);
1.32 +// }
1.33 +// }
1.34 + append(");");
1.35 + emit(smapper, this, "throw 'Invoke dynamic: ' + @1 + ': ' + metHan;", "" + indx);
1.36 i += 4;
1.37 break;
1.38 }
2.1 --- a/rt/vm8/src/test/java/org/apidesign/bck2brwsr/vm8/InvokeDynamic.java Sun Aug 10 08:57:22 2014 +0200
2.2 +++ b/rt/vm8/src/test/java/org/apidesign/bck2brwsr/vm8/InvokeDynamic.java Sun Aug 10 10:37:23 2014 +0200
2.3 @@ -21,6 +21,7 @@
2.4 import java.lang.invoke.ConstantCallSite;
2.5 import java.lang.invoke.MethodHandles;
2.6 import java.lang.invoke.MethodType;
2.7 +import org.apidesign.bck2brwsr.core.JavaScriptBody;
2.8
2.9 public class InvokeDynamic {
2.10
2.11 @@ -33,6 +34,9 @@
2.12 }
2.13
2.14 public static CallSite boot1(MethodHandles.Lookup lookup, String name, MethodType type) {
2.15 + assertReal("1st parameter lookup", lookup);
2.16 + assertReal("2nd parameter name", name);
2.17 + assertReal("3rd parameter type", type);
2.18 try {
2.19 return new ConstantCallSite(lookup.findVirtual(InvokeDynamic.class, "instance_sayHello", MethodType.methodType(String.class)));
2.20 } catch (NoSuchMethodException | IllegalAccessException e) {
2.21 @@ -40,6 +44,14 @@
2.22 }
2.23 }
2.24
2.25 + @JavaScriptBody(args = { "msg", "value" }, body =
2.26 + "if (!value) throw msg + ' value: ' + value;"
2.27 + )
2.28 + private static void assertReal(String msg, Object value) {
2.29 + assert value != null : msg;
2.30 + System.err.println(msg + " value: " + value);
2.31 + }
2.32 +
2.33 public String instance_sayHello() {
2.34 return "Hello from Dynamic!";
2.35 }