# HG changeset patch # User Lubomir Nerad # Date 1366994914 -7200 # Node ID b1fe994d4267ef837c700f68b09c9896047c7c90 # Parent a6bacea2518f331fbc126c2f69f41cba5f8fed6e Partially working extension modules diff -r a6bacea2518f -r b1fe994d4267 dew/src/main/java/org/apidesign/bck2brwsr/dew/Dew.java --- a/dew/src/main/java/org/apidesign/bck2brwsr/dew/Dew.java Thu Apr 25 16:17:48 2013 +0200 +++ b/dew/src/main/java/org/apidesign/bck2brwsr/dew/Dew.java Fri Apr 26 18:48:34 2013 +0200 @@ -135,9 +135,4 @@ byte[] arr = data == null ? null : data.get(r); return arr == null ? null : new ByteArrayInputStream(arr); } - - @Override - public String getModule(String resource) throws IOException { - return null; - } } diff -r a6bacea2518f -r b1fe994d4267 dew/src/main/java/org/apidesign/bck2brwsr/dew/DewLauncher.java --- a/dew/src/main/java/org/apidesign/bck2brwsr/dew/DewLauncher.java Thu Apr 25 16:17:48 2013 +0200 +++ b/dew/src/main/java/org/apidesign/bck2brwsr/dew/DewLauncher.java Fri Apr 26 18:48:34 2013 +0200 @@ -122,11 +122,6 @@ } throw new IOException("Can't find " + resource); } - - @Override - public String getModule(String resource) throws IOException { - return null; - } } private static class VM extends HttpHandler { diff -r a6bacea2518f -r b1fe994d4267 rt/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java --- a/rt/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java Thu Apr 25 16:17:48 2013 +0200 +++ b/rt/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java Fri Apr 26 18:48:34 2013 +0200 @@ -460,11 +460,6 @@ } throw new IOException("Can't find " + resource); } - - @Override - public String getModule(String resource) throws IOException { - return null; - } } private static class Page extends HttpHandler { diff -r a6bacea2518f -r b1fe994d4267 rt/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/JSLauncher.java --- a/rt/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/JSLauncher.java Thu Apr 25 16:17:48 2013 +0200 +++ b/rt/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/JSLauncher.java Fri Apr 26 18:48:34 2013 +0200 @@ -128,10 +128,5 @@ } throw new IOException("Can't find " + resource); } - - @Override - public String getModule(String resource) throws IOException { - return null; - } } } diff -r a6bacea2518f -r b1fe994d4267 rt/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java Thu Apr 25 16:17:48 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java Fri Apr 26 18:48:34 2013 +0200 @@ -57,11 +57,13 @@ private final ObfuscationLevel level; private final StringArray classes; private final Resources res; + private final boolean extension; - private Bck2Brwsr(ObfuscationLevel level, StringArray classes, Resources resources) { + private Bck2Brwsr(ObfuscationLevel level, StringArray classes, Resources resources, boolean extension) { this.level = level; this.classes = classes; this.res = resources; + this.extension = extension; } /** Helper method to generate virtual machine from bytes served by a resources @@ -98,8 +100,10 @@ * @since 0.5 */ public static Bck2Brwsr newCompiler() { - StringArray arr = StringArray.asList(VM.class.getName().replace('.', '/')); - return new Bck2Brwsr(ObfuscationLevel.NONE, arr, null); + StringArray arr = StringArray.asList( + Class.class.getName().replace('.', '/'), + VM.class.getName().replace('.', '/')); + return new Bck2Brwsr(ObfuscationLevel.NONE, arr, null, false); } /** Creates new instance of the Bck2Brwsr compiler which inherits @@ -114,7 +118,8 @@ if (classes.length == 0) { return this; } else { - return new Bck2Brwsr(level, this.classes.addAndNew(classes), res); + return new Bck2Brwsr(level, this.classes.addAndNew(classes), res, + extension); } } @@ -127,7 +132,7 @@ * @since 0.5 */ public Bck2Brwsr obfuscation(ObfuscationLevel level) { - return new Bck2Brwsr(level, classes, res); + return new Bck2Brwsr(level, classes, res, extension); } /** A way to change the provider of additional resources (classes) for the @@ -139,7 +144,11 @@ * @since 0.5 */ public Bck2Brwsr resources(Resources res) { - return new Bck2Brwsr(level, classes, res); + return new Bck2Brwsr(level, classes, res, extension); + } + + public Bck2Brwsr extension(boolean extension) { + return new Bck2Brwsr(level, classes, res, extension); } /** A way to change the provider of additional resources (classes) for the @@ -162,19 +171,23 @@ */ public void generate(Appendable out) throws IOException { Resources r = res != null ? res : new LdrRsrcs(Bck2Brwsr.class.getClassLoader()); - if (level != ObfuscationLevel.NONE) { - try { - ClosureWrapper.produceTo(out, level, r, classes); - return; - } catch (IOException ex) { - throw ex; - } catch (Throwable ex) { - out.append("/* Failed to obfuscate: " + ex.getMessage() - + " */\n"); - } +// if (level != ObfuscationLevel.NONE) { +// try { +// ClosureWrapper.produceTo(out, level, r, classes); +// return; +// } catch (IOException ex) { +// throw ex; +// } catch (Throwable ex) { +// out.append("/* Failed to obfuscate: " + ex.getMessage() +// + " */\n"); +// } +// } + + if (extension) { + VM.compileExtension(r, out, classes); + } else { + VM.compileStandalone(r, out, classes); } - - VM.compile(r, out, classes); } /** Provider of resources (classes and other files). The @@ -193,7 +206,5 @@ * or the file cannot be found */ public InputStream get(String resource) throws IOException; - - public String getModule(String resource) throws IOException; } } diff -r a6bacea2518f -r b1fe994d4267 rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Apr 25 16:17:48 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Apr 26 18:48:34 2013 +0200 @@ -28,12 +28,9 @@ abstract class ByteCodeToJavaScript { private ClassData jc; final Appendable out; - final ObfuscationDelegate obfuscationDelegate; - protected ByteCodeToJavaScript( - Appendable out, ObfuscationDelegate obfuscationDelegate) { + protected ByteCodeToJavaScript(Appendable out) { this.out = out; - this.obfuscationDelegate = obfuscationDelegate; } /* Collects additional required resources. @@ -62,7 +59,9 @@ return classOperation; } - abstract String getExportsObject(); + protected void declaredClass(ClassData classData, String mangledName) + throws IOException { + } /** Prints out a debug message. * @@ -145,7 +144,7 @@ .append("; };"); } - obfuscationDelegate.exportField(out, "c", "_" + v.getName(), v); +// obfuscationDelegate.exportField(out, "c", "_" + v.getName(), v); } for (MethodData m : jc.getMethods()) { byte[] onlyArr = m.findAnnotationData(true); @@ -175,7 +174,7 @@ mn = generateInstanceMethod(destObject, m); } } - obfuscationDelegate.exportMethod(out, destObject, mn, m); +// obfuscationDelegate.exportMethod(out, destObject, mn, m); byte[] runAnno = m.findAnnotationData(false); if (runAnno != null) { out.append("\n ").append(destObject).append(".").append(mn).append(".anno = {"); @@ -188,11 +187,11 @@ out.append("\n c.constructor = CLS;"); String instOfName = "$instOf_" + className; out.append("\n c.").append(instOfName).append(" = true;"); - obfuscationDelegate.exportJSProperty(out, "c", instOfName); +// obfuscationDelegate.exportJSProperty(out, "c", instOfName); for (String superInterface : jc.getSuperInterfaces()) { instOfName = "$instOf_" + superInterface.replace('/', '_'); out.append("\n c.").append(instOfName).append(" = true;"); - obfuscationDelegate.exportJSProperty(out, "c", instOfName); +// obfuscationDelegate.exportJSProperty(out, "c", instOfName); } out.append("\n CLS.$class = 'temp';"); out.append("\n CLS.$class = "); @@ -239,7 +238,7 @@ out.append("\n return arguments[0] ? new CLS() : CLS.prototype;"); out.append("\n};"); - obfuscationDelegate.exportClass(out, getExportsObject(), className, jc); + declaredClass(jc, className); // StringBuilder sb = new StringBuilder(); // for (String init : toInitilize.toArray()) { diff -r a6bacea2518f -r b1fe994d4267 rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java Thu Apr 25 16:17:48 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java Fri Apr 26 18:48:34 2013 +0200 @@ -104,7 +104,7 @@ if (compiledCode == null) { StringBuilder sb = new StringBuilder(); try { - VM.compile(res, sb, classes, obfuscationDelegate); + VM.compileStandalone(res, sb, classes); compiledCode = sb.toString(); } catch (IOException ex) { compiledCode = ex.getMessage(); diff -r a6bacea2518f -r b1fe994d4267 rt/vm/src/main/java/org/apidesign/vm4brwsr/ExportedSymbols.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ExportedSymbols.java Fri Apr 26 18:48:34 2013 +0200 @@ -0,0 +1,148 @@ +/** + * 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.vm4brwsr; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import org.apidesign.bck2brwsr.core.ExtraJavaScript; +import org.apidesign.vm4brwsr.ByteCodeParser.AnnotationParser; +import org.apidesign.vm4brwsr.ByteCodeParser.ClassData; +import org.apidesign.vm4brwsr.ByteCodeParser.FieldData; +import org.apidesign.vm4brwsr.ByteCodeParser.MethodData; + +@ExtraJavaScript(processByteCode = false, resource="") +final class ExportedSymbols { + private final Bck2Brwsr.Resources resources; + private final Map isMarkedAsExportedCache; + + ExportedSymbols(final Bck2Brwsr.Resources resources) { + this.resources = resources; + + isMarkedAsExportedCache = new HashMap(); + } + + boolean isExported(ClassData classData) throws IOException { + return classData.isPublic() && isMarkedAsExportedPackage( + classData.getPkgName()) + || isMarkedAsExported(classData); + } + + boolean isExported(MethodData methodData) throws IOException { + return isAccessible(methodData.access) && isExported(methodData.cls) + || isMarkedAsExported(methodData); + } + + boolean isExported(FieldData fieldData) throws IOException { + return isAccessible(fieldData.access) && isExported(fieldData.cls) + || isMarkedAsExported(fieldData); + } + + private boolean isMarkedAsExportedPackage(String pkgName) { + if (pkgName == null) { + return false; + } + + final Boolean cachedValue = isMarkedAsExportedCache.get(pkgName); + if (cachedValue != null) { + return cachedValue; + } + + final boolean newValue = resolveIsMarkedAsExportedPackage(pkgName); + isMarkedAsExportedCache.put(pkgName, newValue); + + return newValue; + } + + private boolean isMarkedAsExported(ClassData classData) + throws IOException { + final Boolean cachedValue = isMarkedAsExportedCache.get(classData); + if (cachedValue != null) { + return cachedValue; + } + + final boolean newValue = + isMarkedAsExported(classData.findAnnotationData(true), + classData); + isMarkedAsExportedCache.put(classData, newValue); + + return newValue; + } + + private boolean isMarkedAsExported(MethodData methodData) + throws IOException { + return isMarkedAsExported(methodData.findAnnotationData(true), + methodData.cls); + } + + private boolean isMarkedAsExported(FieldData fieldData) + throws IOException { + return isMarkedAsExported(fieldData.findAnnotationData(true), + fieldData.cls); + } + + private boolean resolveIsMarkedAsExportedPackage(String pkgName) { + try { + final InputStream is = + resources.get(pkgName + "/package-info.class"); + if (is == null) { + return false; + } + + try { + final ClassData pkgInfoClass = new ClassData(is); + return isMarkedAsExported( + pkgInfoClass.findAnnotationData(true), + pkgInfoClass); + } finally { + is.close(); + } + } catch (final IOException e) { + return false; + } + } + + private boolean isMarkedAsExported(byte[] arrData, ClassData cd) + throws IOException { + if (arrData == null) { + return false; + } + + final boolean[] found = { false }; + final AnnotationParser annotationParser = + new AnnotationParser(false, false) { + @Override + protected void visitAnnotationStart( + String type, + boolean top) { + if (top && type.equals("Lorg/apidesign/bck2brwsr" + + "/core/Exported;")) { + found[0] = true; + } + } + }; + annotationParser.parse(arrData, cd); + return found[0]; + } + + private static boolean isAccessible(int access) { + return (access & (ByteCodeParser.ACC_PUBLIC + | ByteCodeParser.ACC_PROTECTED)) != 0; + } +} diff -r a6bacea2518f -r b1fe994d4267 rt/vm/src/main/java/org/apidesign/vm4brwsr/LdrRsrcs.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/LdrRsrcs.java Thu Apr 25 16:17:48 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/LdrRsrcs.java Fri Apr 26 18:48:34 2013 +0200 @@ -27,21 +27,44 @@ * @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 { - return findSource(name).openStream(); + 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(); } - @Override - public String getModule(String name) throws IOException { - final URL url = findSource(name); + 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; } @@ -70,16 +93,4 @@ return moduleName; } - - private URL findSource(String name) throws IOException { - Enumeration en = loader.getResources(name); - URL u = null; - while (en.hasMoreElements()) { - u = en.nextElement(); - } - if (u == null) { - throw new IOException("Can't find " + name); - } - return u; - } } diff -r a6bacea2518f -r b1fe994d4267 rt/vm/src/main/java/org/apidesign/vm4brwsr/Main.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/Main.java Thu Apr 25 16:17:48 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/Main.java Fri Apr 26 18:48:34 2013 +0200 @@ -39,10 +39,11 @@ public static void main(String... args) throws IOException, URISyntaxException { final String obfuscate = "--obfuscatelevel"; - + final String extension = "--createextension"; + if (args.length < 2) { System.err.println("Bck2Brwsr Translator from Java(tm) to JavaScript, (c) Jaroslav Tulach 2012"); - System.err.println("Usage: java -cp ... -jar ... ["); + System.err.print("Usage: java -cp ... -jar ... ["); System.err.print(obfuscate); System.err.print(" ["); boolean first = true; @@ -53,7 +54,8 @@ System.err.print(l.name()); first = false; } - + System.err.print("]] ["); + System.err.print(extension); System.err.println("] java/lang/Class org/your/App ..."); System.exit(9); } @@ -61,6 +63,7 @@ final ClassLoader mainClassLoader = Main.class.getClassLoader(); ObfuscationLevel obfLevel = ObfuscationLevel.NONE; + boolean createExtension = false; StringArray classes = new StringArray(); String generateTo = null; for (int i = 0; i < args.length; i++) { @@ -84,17 +87,30 @@ } continue; } + if (extension.equals(args[i])) { // NOI18N + createExtension = true; + continue; + } if (generateTo == null) { generateTo = args[i]; } else { collectClasses(classes, mainClassLoader, args[i]); } } - try (Writer w = new BufferedWriter(new FileWriter(generateTo))) { + 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))) { Bck2Brwsr.newCompiler(). + extension(createExtension). obfuscation(obfLevel). addRootClasses(classes.toArray()). - resources(mainClassLoader). + resources(new LdrRsrcs(moduleName, mainClassLoader)). generate(w); } } diff -r a6bacea2518f -r b1fe994d4267 rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Thu Apr 25 16:17:48 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Fri Apr 26 18:48:34 2013 +0200 @@ -19,14 +19,20 @@ import java.io.IOException; import java.io.InputStream; +import org.apidesign.vm4brwsr.ByteCodeParser.ClassData; /** Generator of JavaScript from bytecode of classes on classpath of the VM. * * @author Jaroslav Tulach */ abstract class VM extends ByteCodeToJavaScript { - private VM(Appendable out, ObfuscationDelegate obfuscationDelegate) { - super(out, obfuscationDelegate); + protected final Bck2Brwsr.Resources resources; + private final ExportedSymbols exportedSymbols; + + private VM(Appendable out, Bck2Brwsr.Resources resources) { + super(out); + this.resources = resources; + this.exportedSymbols = new ExportedSymbols(resources); } static { @@ -44,20 +50,19 @@ return false; } - static void compile(Bck2Brwsr.Resources l, Appendable out, StringArray names) throws IOException { - VM vm = new Standalone(out, ObfuscationDelegate.NULL); - vm.doCompile(l, names); + static void compileStandalone(Bck2Brwsr.Resources l, Appendable out, StringArray names) throws IOException { + VM vm = new Standalone(out, l); + vm.doCompile(names); } - static void compile(Bck2Brwsr.Resources l, Appendable out, StringArray names, - ObfuscationDelegate obfuscationDelegate) throws IOException { - VM vm = new Standalone(out, obfuscationDelegate); - vm.doCompile(l, names); + static void compileExtension(Bck2Brwsr.Resources l, Appendable out, StringArray names) throws IOException { + VM vm = new Extension(out, l); + vm.doCompile(names); } - private void doCompile(Bck2Brwsr.Resources l, StringArray names) throws IOException { + private void doCompile(StringArray names) throws IOException { generatePrologue(); - generateBody(l, names); + generateBody(names); generateEpilogue(); } @@ -65,7 +70,24 @@ protected abstract void generateEpilogue() throws IOException; - protected void generateBody(Bck2Brwsr.Resources l, StringArray names) throws IOException { + protected abstract String generateClass(String className) + throws IOException; + + protected abstract String getExportsObject(); + + @Override + protected final void declaredClass(ClassData classData, String mangledName) + throws IOException { + if (exportedSymbols.isExported(classData)) { + out.append("\n").append(getExportsObject()).append("['") + .append(mangledName) + .append("'] = ") + .append(accessClass(mangledName)) + .append(";\n"); + } + } + + private void generateBody(StringArray names) throws IOException { StringArray processed = new StringArray(); StringArray initCode = new StringArray(); for (String baseClass : names.toArray()) { @@ -81,12 +103,9 @@ if (name == null) { break; } - InputStream is = loadClass(l, name); - if (is == null) { - throw new IOException("Can't find class " + name); - } + try { - String ic = compile(is); + String ic = generateClass(name); processed.add(name); initCode.add(ic == null ? "" : ic); } catch (RuntimeException ex) { @@ -113,7 +132,7 @@ while (resource.startsWith("/")) { resource = resource.substring(1); } - InputStream emul = l.get(resource); + InputStream emul = resources.get(resource); if (emul == null) { throw new IOException("Can't find " + resource); } @@ -221,9 +240,8 @@ } private static final class Standalone extends VM { - private Standalone(Appendable out, - ObfuscationDelegate obfuscationDelegate) { - super(out, obfuscationDelegate); + private Standalone(Appendable out, Bck2Brwsr.Resources resources) { + super(out, resources); } @Override @@ -236,9 +254,13 @@ out.append( " return vm;\n" + " };\n" + + " var extensions = [];\n" + " global.bck2brwsr = function() {\n" + " var args = Array.prototype.slice.apply(arguments);\n" + " var vm = fillInVMSkeleton({});\n" + + " for (var i = 0; i < extensions.length; ++i) {\n" + + " extensions[i](vm);\n" + + " }\n" + " var loader = {};\n" + " loader.vm = vm;\n" + " loader.loadClass = function(name) {\n" @@ -261,29 +283,47 @@ + " loadBytes___3BLjava_lang_Object_2Ljava_lang_String_2_3Ljava_lang_Object_2(loader, null, args);\n" + " return loader;\n" + " };\n"); + out.append( + " global.bck2brwsr.registerExtension" + + " = function(extension) {\n" + + " extensions.push(extension);\n" + + " };\n"); out.append("}(this));"); } @Override - String getExportsObject() { + protected String generateClass(String className) throws IOException { + InputStream is = loadClass(resources, className); + if (is == null) { + throw new IOException("Can't find class " + className); + } + return compile(is); + } + + @Override + protected String getExportsObject() { return "vm"; } } private static final class Extension extends VM { - private final String name; - - private Extension(String name, - Appendable out, - ObfuscationDelegate obfuscationDelegate) { - super(out, obfuscationDelegate); - this.name = name; + private Extension(Appendable out, Bck2Brwsr.Resources resources) { + super(out, resources); } @Override protected void generatePrologue() throws IOException { 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" + + " exports.loadClass(dot);\n" + + " vm[cls] = exports[cls];\n" + + " return vm[cls](inst);\n" + + " };\n"); } @Override @@ -292,7 +332,24 @@ } @Override - String getExportsObject() { + protected String generateClass(String className) throws IOException { + InputStream is = loadClass(resources, className); + if (is == null) { + out.append("\n").append(assignClass( + className.replace('/', '_'))) + .append("function() {\n return link('") + .append(className) + .append("', arguments.length == 0 || arguments[0] === true);" + + "\n};"); + + return null; + } + + return compile(is); + } + + @Override + protected String getExportsObject() { return "exports"; } } diff -r a6bacea2518f -r b1fe994d4267 rt/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java Thu Apr 25 16:17:48 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java Fri Apr 26 18:48:34 2013 +0200 @@ -106,7 +106,7 @@ private final VMLazy lazy; public Gen(VMLazy vm, Appendable out) { - super(out, ObfuscationDelegate.NULL); + super(out); this.lazy = vm; } @@ -151,10 +151,5 @@ String accessClass(String classOperation) { return "vm." + classOperation; } - - @Override - String getExportsObject() { - return "vm"; - } } } diff -r a6bacea2518f -r b1fe994d4267 rt/vm/src/test/java/org/apidesign/vm4brwsr/TestVM.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/TestVM.java Thu Apr 25 16:17:48 2013 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/TestVM.java Fri Apr 26 18:48:34 2013 +0200 @@ -166,10 +166,5 @@ } return u.openStream(); } - - @Override - public String getModule(String resource) throws IOException { - return null; - } } } diff -r a6bacea2518f -r b1fe994d4267 rt/vm/src/test/java/org/apidesign/vm4brwsr/VMinVM.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/VMinVM.java Thu Apr 25 16:17:48 2013 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/VMinVM.java Fri Apr 26 18:48:34 2013 +0200 @@ -43,9 +43,4 @@ @Override protected void requireScript(String resourcePath) { } - - @Override - String getExportsObject() { - return "global"; - } }