1.1 --- a/boot/src/main/java/org/apidesign/html/boot/impl/JsClassLoader.java Sat Jun 29 22:44:59 2013 +0200
1.2 +++ b/boot/src/main/java/org/apidesign/html/boot/impl/JsClassLoader.java Thu Jul 11 17:58:45 2013 +0200
1.3 @@ -225,11 +225,14 @@
1.4 super.visitLdcInsn(body);
1.5 super.visitIntInsn(Opcodes.SIPUSH, args.size());
1.6 super.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/String");
1.7 + boolean needsVM = false;
1.8 for (int i = 0; i < args.size(); i++) {
1.9 - String name = args.get(i);
1.10 + assert !needsVM;
1.11 + String argName = args.get(i);
1.12 + needsVM = "vm".equals(argName);
1.13 super.visitInsn(Opcodes.DUP);
1.14 super.visitIntInsn(Opcodes.BIPUSH, i);
1.15 - super.visitLdcInsn(name);
1.16 + super.visitLdcInsn(argName);
1.17 super.visitInsn(Opcodes.AASTORE);
1.18 }
1.19 super.visitMethodInsn(Opcodes.INVOKESTATIC,
1.20 @@ -327,6 +330,15 @@
1.21 SignatureReader sr = new SignatureReader(desc);
1.22 sr.accept(sv);
1.23
1.24 + if (needsVM) {
1.25 + FindInMethod.super.visitInsn(Opcodes.DUP);
1.26 + FindInMethod.super.visitIntInsn(Opcodes.SIPUSH, sv.index);
1.27 + int lastSlash = FindInClass.this.name.lastIndexOf('/');
1.28 + String jsCallbacks = FindInClass.this.name.substring(0, lastSlash + 1) + "$JsCallbacks$";
1.29 + FindInMethod.super.visitFieldInsn(Opcodes.GETSTATIC, jsCallbacks, "VM", "L" + jsCallbacks + ";");
1.30 + FindInMethod.super.visitInsn(Opcodes.AASTORE);
1.31 + }
1.32 +
1.33 super.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
1.34 "org/apidesign/html/boot/spi/Fn", "invoke", "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;"
1.35 );
1.36 @@ -408,10 +420,11 @@
1.37 @Override
1.38 public void visitEnd() {
1.39 if (body != null) {
1.40 - generateJSBody(args, javacall ?
1.41 - FnUtils.callback(body, JsClassLoader.this, FindInClass.this.name, FindInClass.this.methods) :
1.42 - body
1.43 - );
1.44 + if (javacall) {
1.45 + body = FnUtils.callback(body, JsClassLoader.this, FindInClass.this.name, FindInClass.this.methods);
1.46 + args.add("vm");
1.47 + }
1.48 + generateJSBody(args, body);
1.49 }
1.50 }
1.51 }