boot/src/main/java/org/apidesign/html/boot/impl/JsClassLoader.java
changeset 188 5f3b1d7fafec
parent 171 54ac82353158
child 189 5c78e49bd297
     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              }