Separating the Fn class outside of the classloader and moving methods the generated code deals with into it
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/Fn.java Mon Jun 10 18:19:40 2013 +0200
1.3 @@ -0,0 +1,32 @@
1.4 +/**
1.5 + * Back 2 Browser Bytecode Translator
1.6 + * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
1.7 + *
1.8 + * This program is free software: you can redistribute it and/or modify
1.9 + * it under the terms of the GNU General Public License as published by
1.10 + * the Free Software Foundation, version 2 of the License.
1.11 + *
1.12 + * This program is distributed in the hope that it will be useful,
1.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1.15 + * GNU General Public License for more details.
1.16 + *
1.17 + * You should have received a copy of the GNU General Public License
1.18 + * along with this program. Look for COPYING file in the top folder.
1.19 + * If not, see http://opensource.org/licenses/GPL-2.0.
1.20 + */
1.21 +package org.apidesign.bck2brwsr.launcher.fximpl;
1.22 +
1.23 +/**
1.24 + *
1.25 + * @author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
1.26 + */
1.27 +public abstract class Fn {
1.28 + public static Fn define(Class<?> caller, String code, String... names) {
1.29 + JsClassLoader cl = (JsClassLoader)caller.getClassLoader();
1.30 + return cl.defineFn(code, names);
1.31 + }
1.32 +
1.33 + public abstract Object invoke(Object... args) throws Exception;
1.34 +
1.35 +}
2.1 --- a/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader.java Mon Jun 10 18:12:38 2013 +0200
2.2 +++ b/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader.java Mon Jun 10 18:19:40 2013 +0200
2.3 @@ -22,7 +22,6 @@
2.4 import java.net.URL;
2.5 import java.net.URLClassLoader;
2.6 import java.util.ArrayList;
2.7 -import java.util.Arrays;
2.8 import java.util.List;
2.9 import org.objectweb.asm.AnnotationVisitor;
2.10 import org.objectweb.asm.ClassReader;
2.11 @@ -37,7 +36,7 @@
2.12 *
2.13 * @author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
2.14 */
2.15 -public abstract class JsClassLoader extends URLClassLoader {
2.16 +abstract class JsClassLoader extends URLClassLoader {
2.17 JsClassLoader(URL[] urls, ClassLoader parent) {
2.18 super(urls, parent);
2.19 }
2.20 @@ -65,24 +64,15 @@
2.21 }
2.22 }
2.23 }
2.24 - if (name.startsWith("org.apidesign.bck2brwsr.launcher.fximpl.JsClassLoader")) {
2.25 + if (name.startsWith("org.apidesign.bck2brwsr.launcher.fximpl.Fn")) {
2.26 return Class.forName(name);
2.27 }
2.28
2.29 return super.findClass(name);
2.30 }
2.31
2.32 - public final Fn define(String code, String... names) {
2.33 - return defineFn(code, names);
2.34 - }
2.35 -
2.36 -
2.37 protected abstract Fn defineFn(String code, String... names);
2.38
2.39 - public static abstract class Fn {
2.40 - public abstract Object invoke(Object... args) throws Exception;
2.41 - }
2.42 -
2.43
2.44 private static final class FindInClass extends ClassVisitor {
2.45 private String name;
2.46 @@ -138,7 +128,7 @@
2.47 super.visitFieldInsn(
2.48 Opcodes.GETSTATIC, FindInClass.this.name,
2.49 "$$bck2brwsr$$" + name,
2.50 - "Lorg/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader$Fn;"
2.51 + "Lorg/apidesign/bck2brwsr/launcher/fximpl/Fn;"
2.52 );
2.53 super.visitInsn(Opcodes.DUP);
2.54 Label ifNotNull = new Label();
2.55 @@ -147,10 +137,6 @@
2.56 // init Fn
2.57 super.visitInsn(Opcodes.POP);
2.58 super.visitLdcInsn(Type.getObjectType(FindInClass.this.name));
2.59 - super.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
2.60 - "java/lang/Class", "getClassLoader", "()Ljava/lang/ClassLoader;"
2.61 - );
2.62 - super.visitTypeInsn(Opcodes.CHECKCAST, "org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader");
2.63 super.visitLdcInsn(body);
2.64 super.visitIntInsn(Opcodes.SIPUSH, args.size());
2.65 super.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/String");
2.66 @@ -161,9 +147,9 @@
2.67 super.visitLdcInsn(name);
2.68 super.visitInsn(Opcodes.AASTORE);
2.69 }
2.70 - super.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
2.71 - "org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader",
2.72 - "define", "(Ljava/lang/String;[Ljava/lang/String;)Lorg/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader$Fn;"
2.73 + super.visitMethodInsn(Opcodes.INVOKESTATIC,
2.74 + "org/apidesign/bck2brwsr/launcher/fximpl/Fn", "define",
2.75 + "(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/String;)Lorg/apidesign/bck2brwsr/launcher/fximpl/Fn;"
2.76 );
2.77 // end of Fn init
2.78
2.79 @@ -171,7 +157,7 @@
2.80 super.visitIntInsn(Opcodes.SIPUSH, args.size());
2.81 super.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object");
2.82 super.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
2.83 - "org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader$Fn", "invoke", "([Ljava/lang/Object;)Ljava/lang/Object;"
2.84 + "org/apidesign/bck2brwsr/launcher/fximpl/Fn", "invoke", "([Ljava/lang/Object;)Ljava/lang/Object;"
2.85 );
2.86 super.visitInsn(Opcodes.ARETURN);
2.87 }
2.88 @@ -183,7 +169,7 @@
2.89 FindInClass.this.visitField(
2.90 Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC,
2.91 "$$bck2brwsr$$" + name,
2.92 - "Lorg/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader$Fn;",
2.93 + "Lorg/apidesign/bck2brwsr/launcher/fximpl/Fn;",
2.94 null, null
2.95 );
2.96 }
3.1 --- a/launcher/fx/src/test/java/org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoaderTest.java Mon Jun 10 18:12:38 2013 +0200
3.2 +++ b/launcher/fx/src/test/java/org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoaderTest.java Mon Jun 10 18:19:40 2013 +0200
3.3 @@ -48,7 +48,7 @@
3.4 ClassLoader parent = JsClassLoaderTest.class.getClassLoader().getParent();
3.5 loader = new JsClassLoader(new URL[] { my }, parent) {
3.6 @Override
3.7 - protected JsClassLoader.Fn defineFn(String code, String... names) {
3.8 + protected Fn defineFn(String code, String... names) {
3.9 StringBuilder sb = new StringBuilder();
3.10 sb.append("(function() {");
3.11 sb.append("var r = {};");
3.12 @@ -66,7 +66,7 @@
3.13 sb.append("})()");
3.14 try {
3.15 final Object val = eng.eval(sb.toString());
3.16 - return new JsClassLoader.Fn() {
3.17 + return new Fn() {
3.18 @Override
3.19 public Object invoke(Object... args) throws Exception {
3.20 Invocable inv = (Invocable)eng;