launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader.java
1.1 --- a/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader.java Thu Jun 13 16:48:17 2013 +0200
1.2 +++ b/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader.java Mon Jun 17 11:00:51 2013 +0200
1.3 @@ -115,7 +115,7 @@
1.4 @Override
1.5 public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
1.6 return new FindInMethod(name, desc,
1.7 - super.visitMethod(access, name, desc, signature, exceptions)
1.8 + super.visitMethod(access & (~Opcodes.ACC_NATIVE), name, desc, signature, exceptions)
1.9 );
1.10 }
1.11
1.12 @@ -124,6 +124,7 @@
1.13 private final String desc;
1.14 private List<String> args;
1.15 private String body;
1.16 + private boolean bodyGenerated;
1.17
1.18 public FindInMethod(String name, String desc, MethodVisitor mv) {
1.19 super(Opcodes.ASM4, mv);
1.20 @@ -150,6 +151,14 @@
1.21 if (body == null) {
1.22 return;
1.23 }
1.24 + generateBody();
1.25 + }
1.26 +
1.27 + private boolean generateBody() {
1.28 + if (bodyGenerated) {
1.29 + return false;
1.30 + }
1.31 + bodyGenerated = true;
1.32
1.33 super.visitFieldInsn(
1.34 Opcodes.GETSTATIC, FindInClass.this.name,
1.35 @@ -252,12 +261,12 @@
1.36 switch (sv.returnType.getSort()) {
1.37 case Type.VOID:
1.38 super.visitInsn(Opcodes.RETURN);
1.39 - return;
1.40 + break;
1.41 case Type.ARRAY:
1.42 case Type.OBJECT:
1.43 super.visitTypeInsn(Opcodes.CHECKCAST, sv.returnType.getInternalName());
1.44 super.visitInsn(Opcodes.ARETURN);
1.45 - return;
1.46 + break;
1.47 default:
1.48 super.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Number");
1.49 super.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
1.50 @@ -265,12 +274,17 @@
1.51 );
1.52 super.visitInsn(sv.returnType.getOpcode(Opcodes.IRETURN));
1.53 }
1.54 + return true;
1.55 }
1.56
1.57 @Override
1.58 public void visitEnd() {
1.59 super.visitEnd();
1.60 if (body != null) {
1.61 + if (generateBody()) {
1.62 + // native method
1.63 + super.visitMaxs(1, 0);
1.64 + }
1.65 FindInClass.this.visitField(
1.66 Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC,
1.67 "$$bck2brwsr$$" + name,