# HG changeset patch # User Jaroslav Tulach # Date 1370881180 -7200 # Node ID 9753524d698fb591d8760928e234cd8d1a68a027 # Parent ebedd84fba806a40673c2385f68336f19fbe7d07 Separating the Fn class outside of the classloader and moving methods the generated code deals with into it diff -r ebedd84fba80 -r 9753524d698f launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/Fn.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/Fn.java Mon Jun 10 18:19:40 2013 +0200 @@ -0,0 +1,32 @@ +/** + * Back 2 Browser Bytecode Translator + * Copyright (C) 2012 Jaroslav Tulach + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. Look for COPYING file in the top folder. + * If not, see http://opensource.org/licenses/GPL-2.0. + */ +package org.apidesign.bck2brwsr.launcher.fximpl; + +/** + * + * @author Jaroslav Tulach + */ +public abstract class Fn { + public static Fn define(Class caller, String code, String... names) { + JsClassLoader cl = (JsClassLoader)caller.getClassLoader(); + return cl.defineFn(code, names); + } + + public abstract Object invoke(Object... args) throws Exception; + +} diff -r ebedd84fba80 -r 9753524d698f 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 Mon Jun 10 18:12:38 2013 +0200 +++ b/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader.java Mon Jun 10 18:19:40 2013 +0200 @@ -22,7 +22,6 @@ import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.ClassReader; @@ -37,7 +36,7 @@ * * @author Jaroslav Tulach */ -public abstract class JsClassLoader extends URLClassLoader { +abstract class JsClassLoader extends URLClassLoader { JsClassLoader(URL[] urls, ClassLoader parent) { super(urls, parent); } @@ -65,24 +64,15 @@ } } } - if (name.startsWith("org.apidesign.bck2brwsr.launcher.fximpl.JsClassLoader")) { + if (name.startsWith("org.apidesign.bck2brwsr.launcher.fximpl.Fn")) { return Class.forName(name); } return super.findClass(name); } - public final Fn define(String code, String... names) { - return defineFn(code, names); - } - - protected abstract Fn defineFn(String code, String... names); - public static abstract class Fn { - public abstract Object invoke(Object... args) throws Exception; - } - private static final class FindInClass extends ClassVisitor { private String name; @@ -138,7 +128,7 @@ super.visitFieldInsn( Opcodes.GETSTATIC, FindInClass.this.name, "$$bck2brwsr$$" + name, - "Lorg/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader$Fn;" + "Lorg/apidesign/bck2brwsr/launcher/fximpl/Fn;" ); super.visitInsn(Opcodes.DUP); Label ifNotNull = new Label(); @@ -147,10 +137,6 @@ // init Fn super.visitInsn(Opcodes.POP); super.visitLdcInsn(Type.getObjectType(FindInClass.this.name)); - super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, - "java/lang/Class", "getClassLoader", "()Ljava/lang/ClassLoader;" - ); - super.visitTypeInsn(Opcodes.CHECKCAST, "org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader"); super.visitLdcInsn(body); super.visitIntInsn(Opcodes.SIPUSH, args.size()); super.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/String"); @@ -161,9 +147,9 @@ super.visitLdcInsn(name); super.visitInsn(Opcodes.AASTORE); } - super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, - "org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader", - "define", "(Ljava/lang/String;[Ljava/lang/String;)Lorg/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader$Fn;" + super.visitMethodInsn(Opcodes.INVOKESTATIC, + "org/apidesign/bck2brwsr/launcher/fximpl/Fn", "define", + "(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/String;)Lorg/apidesign/bck2brwsr/launcher/fximpl/Fn;" ); // end of Fn init @@ -171,7 +157,7 @@ super.visitIntInsn(Opcodes.SIPUSH, args.size()); super.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object"); super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, - "org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader$Fn", "invoke", "([Ljava/lang/Object;)Ljava/lang/Object;" + "org/apidesign/bck2brwsr/launcher/fximpl/Fn", "invoke", "([Ljava/lang/Object;)Ljava/lang/Object;" ); super.visitInsn(Opcodes.ARETURN); } @@ -183,7 +169,7 @@ FindInClass.this.visitField( Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, "$$bck2brwsr$$" + name, - "Lorg/apidesign/bck2brwsr/launcher/fximpl/JsClassLoader$Fn;", + "Lorg/apidesign/bck2brwsr/launcher/fximpl/Fn;", null, null ); } diff -r ebedd84fba80 -r 9753524d698f launcher/fx/src/test/java/org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoaderTest.java --- a/launcher/fx/src/test/java/org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoaderTest.java Mon Jun 10 18:12:38 2013 +0200 +++ b/launcher/fx/src/test/java/org/apidesign/bck2brwsr/launcher/fximpl/JsClassLoaderTest.java Mon Jun 10 18:19:40 2013 +0200 @@ -48,7 +48,7 @@ ClassLoader parent = JsClassLoaderTest.class.getClassLoader().getParent(); loader = new JsClassLoader(new URL[] { my }, parent) { @Override - protected JsClassLoader.Fn defineFn(String code, String... names) { + protected Fn defineFn(String code, String... names) { StringBuilder sb = new StringBuilder(); sb.append("(function() {"); sb.append("var r = {};"); @@ -66,7 +66,7 @@ sb.append("})()"); try { final Object val = eng.eval(sb.toString()); - return new JsClassLoader.Fn() { + return new Fn() { @Override public Object invoke(Object... args) throws Exception { Invocable inv = (Invocable)eng;