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 }