# HG changeset patch # User Lubomir Nerad # Date 1368464090 -7200 # Node ID 36961c9a009f50a8be7cc343cd68d193233cb9bb # Parent d868b5a67b9bf342e017ab04256a23c21d11af58 Changed the way the external classes are identified diff -r d868b5a67b9b -r 36961c9a009f rt/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java Wed May 08 17:47:47 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java Mon May 13 18:54:50 2013 +0200 @@ -99,10 +99,7 @@ * @since 0.5 */ public static Bck2Brwsr newCompiler() { - StringArray arr = StringArray.asList( - Class.class.getName().replace('.', '/'), - VM.class.getName().replace('.', '/')); - return new Bck2Brwsr(ObfuscationLevel.NONE, arr, null, false); + return new Bck2Brwsr(ObfuscationLevel.NONE, new StringArray(), null, false); } /** Creates new instance of the Bck2Brwsr compiler which inherits diff -r d868b5a67b9b -r 36961c9a009f rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Wed May 08 17:47:47 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon May 13 18:54:50 2013 +0200 @@ -1506,12 +1506,11 @@ } final String in = mi[0]; - out.append(accessStaticMethod( - accessClass(in.replace('/', '_')) + "(false)", - mn.startsWith("cons_") - ? "constructor." + mn - : mn, - mi)); + String object = accessClass(in.replace('/', '_')) + "(false)"; + if (mn.startsWith("cons_")) { + object += ".constructor"; + } + out.append(accessStaticMethod(object, mn, mi)); if (isStatic) { out.append('('); } else { diff -r d868b5a67b9b -r 36961c9a009f rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java Wed May 08 17:47:47 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java Mon May 13 18:54:50 2013 +0200 @@ -158,6 +158,7 @@ private static final String[] FIXED_EXTERNS = { "bck2brwsr", + "registerExtension", "$class", "anno", "array", diff -r d868b5a67b9b -r 36961c9a009f rt/vm/src/main/java/org/apidesign/vm4brwsr/LdrRsrcs.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/LdrRsrcs.java Wed May 08 17:47:47 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/LdrRsrcs.java Mon May 13 18:54:50 2013 +0200 @@ -27,70 +27,19 @@ * @author Jaroslav Tulach */ final class LdrRsrcs implements Bck2Brwsr.Resources { - private final String module; private final ClassLoader loader; LdrRsrcs(ClassLoader loader) { - this(null, loader); - } - - LdrRsrcs(String module, ClassLoader loader) { - this.module = module; this.loader = loader; } @Override public InputStream get(String name) throws IOException { - final URL url = findSource(name); - if (url == null) { - return null; - } - if (module != null) { - final String resourceModule = getModule(url); - if ((resourceModule != null) && !module.equals(resourceModule)) { - return null; - } - } - - return url.openStream(); - } - - private URL findSource(String name) throws IOException { Enumeration en = loader.getResources(name); URL u = null; while (en.hasMoreElements()) { u = en.nextElement(); } - return u; - } - - private static String getModule(URL url) throws IOException { - if (!"jar".equalsIgnoreCase(url.getProtocol())) { - return null; - } - - final String fullPathString = url.getPath(); - final int sepIndex = fullPathString.indexOf('!'); - final String jarPathString = - (sepIndex != -1) ? fullPathString.substring(0, sepIndex) - : fullPathString; - if (!jarPathString.endsWith(".jar")) { - return null; - } - - String moduleName = - jarPathString.substring( - jarPathString.lastIndexOf('/') + 1, - jarPathString.length() - 4); - if (moduleName.endsWith("-SNAPSHOT")) { - moduleName = moduleName.substring( - 0, moduleName.length() - 9); - } - final int dashIndex = moduleName.lastIndexOf('-'); - if (dashIndex != -1) { - moduleName = moduleName.substring(0, dashIndex); - } - - return moduleName; + return (u != null) ? u.openStream() : null; } } diff -r d868b5a67b9b -r 36961c9a009f rt/vm/src/main/java/org/apidesign/vm4brwsr/Main.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/Main.java Wed May 08 17:47:47 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/Main.java Mon May 13 18:54:50 2013 +0200 @@ -97,20 +97,12 @@ collectClasses(classes, mainClassLoader, args[i]); } } - final File outputFile = new File(generateTo); - String moduleName = null; - if (createExtension) { - moduleName = outputFile.getName(); - if (moduleName.endsWith(".js")) { - moduleName = moduleName.substring(0, moduleName.length() - 3); - } - } - try (Writer w = new BufferedWriter(new FileWriter(outputFile))) { + try (Writer w = new BufferedWriter(new FileWriter(generateTo))) { Bck2Brwsr.newCompiler(). extension(createExtension). obfuscation(obfLevel). addRootClasses(classes.toArray()). - resources(new LdrRsrcs(moduleName, mainClassLoader)). + resources(new LdrRsrcs(mainClassLoader)). generate(w); } } diff -r d868b5a67b9b -r 36961c9a009f rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Wed May 08 17:47:47 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Mon May 13 18:54:50 2013 +0200 @@ -58,8 +58,14 @@ } static void compile(Appendable out, Bck2Brwsr.Resources l, StringArray names, boolean extension) throws IOException { - VM vm = extension ? new Extension(out, l) : new Standalone(out, l); - vm.doCompile(names); + VM vm = extension ? new Extension(out, l, names.toArray()) + : new Standalone(out, l); + + final StringArray fixedNames = + StringArray.asList(Class.class.getName().replace('.', '/'), + VM.class.getName().replace('.', '/')); + + vm.doCompile(fixedNames.addAndNew(names.toArray())); } private void doCompile(StringArray names) throws IOException { @@ -85,10 +91,9 @@ protected abstract void generateEpilogue() throws IOException; - protected abstract String generateClass(String className) - throws IOException; + protected abstract String getExportsObject(); - protected abstract String getExportsObject(); + protected abstract boolean isExternalClass(String className); @Override protected final void declaredClass(ClassData classData, String mangledName) @@ -102,6 +107,14 @@ } } + protected String generateClass(String className) throws IOException { + ClassData classData = classDataCache.getClassData(className); + if (classData == null) { + throw new IOException("Can't find class " + className); + } + return compile(classData); + } + @Override protected void declaredField(FieldData fieldData, String destObject, @@ -314,6 +327,7 @@ fieldInfoName[2]); if ((method != null) + && !isExternalClass(method.cls.getClassName()) && (((method.access & ByteCodeParser.ACC_FINAL) != 0) || ((referencedClass.getAccessFlags() & ByteCodeParser.ACC_FINAL) != 0) @@ -353,11 +367,13 @@ return (exportedMethodFinder.getFound() != null); } - private static String accessNonVirtualMember(String object, - String mangledName, - ClassData declaringClass) { - return (declaringClass != null) ? object + "." + mangledName - : object + "['" + mangledName + "']"; + private String accessNonVirtualMember(String object, + String mangledName, + ClassData declaringClass) { + return ((declaringClass != null) + && !isExternalClass(declaringClass.getClassName())) + ? object + "." + mangledName + : object + "['" + mangledName + "']"; } private static final class ExportedMethodFinder @@ -440,23 +456,23 @@ } @Override - protected String generateClass(String className) throws IOException { - ClassData classData = classDataCache.getClassData(className); - if (classData == null) { - throw new IOException("Can't find class " + className); - } - return compile(classData); + protected String getExportsObject() { + return "vm"; } @Override - protected String getExportsObject() { - return "vm"; + protected boolean isExternalClass(String className) { + return false; } } private static final class Extension extends VM { - private Extension(Appendable out, Bck2Brwsr.Resources resources) { + private final StringArray extensionClasses; + + private Extension(Appendable out, Bck2Brwsr.Resources resources, + String[] extClassesArray) { super(out, resources); + this.extensionClasses = StringArray.asList(extClassesArray); } @Override @@ -464,10 +480,10 @@ out.append("bck2brwsr.registerExtension(function(exports) {\n" + " var vm = {};\n"); out.append(" function link(n, inst) {\n" - + " var cls = n.replace__Ljava_lang_String_2CC(" - + "'/', '_').toString();\n" - + " var dot = n.replace__Ljava_lang_String_2CC(" - + "'/', '.').toString();\n" + + " var cls = n['replace__Ljava_lang_String_2CC']" + + "('/', '_').toString();\n" + + " var dot = n['replace__Ljava_lang_String_2CC']" + + "('/', '.').toString();\n" + " exports.loadClass(dot);\n" + " vm[cls] = exports[cls];\n" + " return vm[cls](inst);\n" @@ -481,8 +497,7 @@ @Override protected String generateClass(String className) throws IOException { - ClassData classData = classDataCache.getClassData(className); - if (classData == null) { + if (isExternalClass(className)) { out.append("\n").append(assignClass( className.replace('/', '_'))) .append("function() {\n return link('") @@ -493,12 +508,17 @@ return null; } - return compile(classData); + return super.generateClass(className); } @Override protected String getExportsObject() { return "exports"; } + + @Override + protected boolean isExternalClass(String className) { + return !extensionClasses.contains(className); + } } }