# HG changeset patch # User Jaroslav Tulach # Date 1371459651 -7200 # Node ID 0250b8a739de124cf8e2e78166a2805c55dfbeb2 # Parent 15c6903c86120028b6a96bb7bd922c435588572d @JavaScriptBody methods may be native diff -r 15c6903c8612 -r 0250b8a739de launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader.java --- a/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader.java Thu Jun 13 16:48:17 2013 +0200 +++ b/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader.java Mon Jun 17 11:00:51 2013 +0200 @@ -115,7 +115,7 @@ @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { return new FindInMethod(name, desc, - super.visitMethod(access, name, desc, signature, exceptions) + super.visitMethod(access & (~Opcodes.ACC_NATIVE), name, desc, signature, exceptions) ); } @@ -124,6 +124,7 @@ private final String desc; private List args; private String body; + private boolean bodyGenerated; public FindInMethod(String name, String desc, MethodVisitor mv) { super(Opcodes.ASM4, mv); @@ -150,6 +151,14 @@ if (body == null) { return; } + generateBody(); + } + + private boolean generateBody() { + if (bodyGenerated) { + return false; + } + bodyGenerated = true; super.visitFieldInsn( Opcodes.GETSTATIC, FindInClass.this.name, @@ -252,12 +261,12 @@ switch (sv.returnType.getSort()) { case Type.VOID: super.visitInsn(Opcodes.RETURN); - return; + break; case Type.ARRAY: case Type.OBJECT: super.visitTypeInsn(Opcodes.CHECKCAST, sv.returnType.getInternalName()); super.visitInsn(Opcodes.ARETURN); - return; + break; default: super.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Number"); super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, @@ -265,12 +274,17 @@ ); super.visitInsn(sv.returnType.getOpcode(Opcodes.IRETURN)); } + return true; } @Override public void visitEnd() { super.visitEnd(); if (body != null) { + if (generateBody()) { + // native method + super.visitMaxs(1, 0); + } FindInClass.this.visitField( Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, "$$bck2brwsr$$" + name, diff -r 15c6903c8612 -r 0250b8a739de launcher/fx/src/test/java/org/apidesign/bck2brwsr/launcher/fximpl/JsMethods.java --- a/launcher/fx/src/test/java/org/apidesign/bck2brwsr/launcher/fximpl/JsMethods.java Thu Jun 13 16:48:17 2013 +0200 +++ b/launcher/fx/src/test/java/org/apidesign/bck2brwsr/launcher/fximpl/JsMethods.java Mon Jun 17 11:00:51 2013 +0200 @@ -30,7 +30,5 @@ } @JavaScriptBody(args = {"x", "y" }, body = "return x + y;") - public static int plus(int x, int y) { - return 0; - } + public static native int plus(int x, int y); }