rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
branchjdk8
changeset 1658 3e5087bd13c1
parent 1657 c90c5a9b1900
child 1659 d279ddd06652
     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                  }