# HG changeset patch # User Jaroslav Tulach # Date 1407659843 -7200 # Node ID 3e5087bd13c17559f58ce63f2305a9fdaffc0a43 # Parent c90c5a9b1900d9f49cda6d34d26dc23a5f49a132 Managed to call the bootstrap method. Just with wrong arguments. diff -r c90c5a9b1900 -r 3e5087bd13c1 rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Aug 10 08:57:22 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Aug 10 10:37:23 2014 +0200 @@ -1057,7 +1057,10 @@ println("invoke dynamic: " + indx); ByteCodeParser.CPX2 c2 = jc.getCpoolEntry(indx); BootMethodData bm = jc.getBootMethod(c2.cpx1); - String[] mi = jc.getFieldInfoName(bm.method); + CPX2 methodHandle = jc.getCpoolEntry(bm.method); + println(" type: " + methodHandle.cpx1); + String[] mi = jc.getFieldInfoName(methodHandle.cpx2); + String mcn = mangleClassName(mi[0]); char[] returnType = {'V'}; StringBuilder cnt = new StringBuilder(); String mn = findMethodName(mi, cnt, returnType); @@ -1066,7 +1069,22 @@ println(" mi[2]: " + mi[2]); println(" mn : " + mn); println(" name and type: " + jc.stringValue(c2.cpx2, true)); - emit(smapper, this, "throw 'Invoke dynamic: ' + @1;", "" + indx); + String object = accessClass(mcn) + "(false)"; + if (mn.startsWith("cons_")) { + object += ".constructor"; + } + append("var metHan = "); + append(accessStaticMethod(object, mn, mi)); + append('('); +// if (numArguments > 0) { +// append(vars[0]); +// for (int j = 1; j < numArguments; ++j) { +// append(", "); +// append(vars[j]); +// } +// } + append(");"); + emit(smapper, this, "throw 'Invoke dynamic: ' + @1 + ': ' + metHan;", "" + indx); i += 4; break; } diff -r c90c5a9b1900 -r 3e5087bd13c1 rt/vm8/src/test/java/org/apidesign/bck2brwsr/vm8/InvokeDynamic.java --- a/rt/vm8/src/test/java/org/apidesign/bck2brwsr/vm8/InvokeDynamic.java Sun Aug 10 08:57:22 2014 +0200 +++ b/rt/vm8/src/test/java/org/apidesign/bck2brwsr/vm8/InvokeDynamic.java Sun Aug 10 10:37:23 2014 +0200 @@ -21,6 +21,7 @@ import java.lang.invoke.ConstantCallSite; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; +import org.apidesign.bck2brwsr.core.JavaScriptBody; public class InvokeDynamic { @@ -33,6 +34,9 @@ } public static CallSite boot1(MethodHandles.Lookup lookup, String name, MethodType type) { + assertReal("1st parameter lookup", lookup); + assertReal("2nd parameter name", name); + assertReal("3rd parameter type", type); try { return new ConstantCallSite(lookup.findVirtual(InvokeDynamic.class, "instance_sayHello", MethodType.methodType(String.class))); } catch (NoSuchMethodException | IllegalAccessException e) { @@ -40,6 +44,14 @@ } } + @JavaScriptBody(args = { "msg", "value" }, body = + "if (!value) throw msg + ' value: ' + value;" + ) + private static void assertReal(String msg, Object value) { + assert value != null : msg; + System.err.println(msg + " value: " + value); + } + public String instance_sayHello() { return "Hello from Dynamic!"; }