1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java Wed May 08 17:47:47 2013 +0200
1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java Mon May 13 18:54:50 2013 +0200
1.3 @@ -99,10 +99,7 @@
1.4 * @since 0.5
1.5 */
1.6 public static Bck2Brwsr newCompiler() {
1.7 - StringArray arr = StringArray.asList(
1.8 - Class.class.getName().replace('.', '/'),
1.9 - VM.class.getName().replace('.', '/'));
1.10 - return new Bck2Brwsr(ObfuscationLevel.NONE, arr, null, false);
1.11 + return new Bck2Brwsr(ObfuscationLevel.NONE, new StringArray(), null, false);
1.12 }
1.13
1.14 /** Creates new instance of the Bck2Brwsr compiler which inherits
2.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Wed May 08 17:47:47 2013 +0200
2.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon May 13 18:54:50 2013 +0200
2.3 @@ -1506,12 +1506,11 @@
2.4 }
2.5
2.6 final String in = mi[0];
2.7 - out.append(accessStaticMethod(
2.8 - accessClass(in.replace('/', '_')) + "(false)",
2.9 - mn.startsWith("cons_")
2.10 - ? "constructor." + mn
2.11 - : mn,
2.12 - mi));
2.13 + String object = accessClass(in.replace('/', '_')) + "(false)";
2.14 + if (mn.startsWith("cons_")) {
2.15 + object += ".constructor";
2.16 + }
2.17 + out.append(accessStaticMethod(object, mn, mi));
2.18 if (isStatic) {
2.19 out.append('(');
2.20 } else {
3.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java Wed May 08 17:47:47 2013 +0200
3.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java Mon May 13 18:54:50 2013 +0200
3.3 @@ -158,6 +158,7 @@
3.4
3.5 private static final String[] FIXED_EXTERNS = {
3.6 "bck2brwsr",
3.7 + "registerExtension",
3.8 "$class",
3.9 "anno",
3.10 "array",
4.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/LdrRsrcs.java Wed May 08 17:47:47 2013 +0200
4.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/LdrRsrcs.java Mon May 13 18:54:50 2013 +0200
4.3 @@ -27,70 +27,19 @@
4.4 * @author Jaroslav Tulach <jtulach@netbeans.org>
4.5 */
4.6 final class LdrRsrcs implements Bck2Brwsr.Resources {
4.7 - private final String module;
4.8 private final ClassLoader loader;
4.9
4.10 LdrRsrcs(ClassLoader loader) {
4.11 - this(null, loader);
4.12 - }
4.13 -
4.14 - LdrRsrcs(String module, ClassLoader loader) {
4.15 - this.module = module;
4.16 this.loader = loader;
4.17 }
4.18
4.19 @Override
4.20 public InputStream get(String name) throws IOException {
4.21 - final URL url = findSource(name);
4.22 - if (url == null) {
4.23 - return null;
4.24 - }
4.25 - if (module != null) {
4.26 - final String resourceModule = getModule(url);
4.27 - if ((resourceModule != null) && !module.equals(resourceModule)) {
4.28 - return null;
4.29 - }
4.30 - }
4.31 -
4.32 - return url.openStream();
4.33 - }
4.34 -
4.35 - private URL findSource(String name) throws IOException {
4.36 Enumeration<URL> en = loader.getResources(name);
4.37 URL u = null;
4.38 while (en.hasMoreElements()) {
4.39 u = en.nextElement();
4.40 }
4.41 - return u;
4.42 - }
4.43 -
4.44 - private static String getModule(URL url) throws IOException {
4.45 - if (!"jar".equalsIgnoreCase(url.getProtocol())) {
4.46 - return null;
4.47 - }
4.48 -
4.49 - final String fullPathString = url.getPath();
4.50 - final int sepIndex = fullPathString.indexOf('!');
4.51 - final String jarPathString =
4.52 - (sepIndex != -1) ? fullPathString.substring(0, sepIndex)
4.53 - : fullPathString;
4.54 - if (!jarPathString.endsWith(".jar")) {
4.55 - return null;
4.56 - }
4.57 -
4.58 - String moduleName =
4.59 - jarPathString.substring(
4.60 - jarPathString.lastIndexOf('/') + 1,
4.61 - jarPathString.length() - 4);
4.62 - if (moduleName.endsWith("-SNAPSHOT")) {
4.63 - moduleName = moduleName.substring(
4.64 - 0, moduleName.length() - 9);
4.65 - }
4.66 - final int dashIndex = moduleName.lastIndexOf('-');
4.67 - if (dashIndex != -1) {
4.68 - moduleName = moduleName.substring(0, dashIndex);
4.69 - }
4.70 -
4.71 - return moduleName;
4.72 + return (u != null) ? u.openStream() : null;
4.73 }
4.74 }
5.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/Main.java Wed May 08 17:47:47 2013 +0200
5.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/Main.java Mon May 13 18:54:50 2013 +0200
5.3 @@ -97,20 +97,12 @@
5.4 collectClasses(classes, mainClassLoader, args[i]);
5.5 }
5.6 }
5.7 - final File outputFile = new File(generateTo);
5.8 - String moduleName = null;
5.9 - if (createExtension) {
5.10 - moduleName = outputFile.getName();
5.11 - if (moduleName.endsWith(".js")) {
5.12 - moduleName = moduleName.substring(0, moduleName.length() - 3);
5.13 - }
5.14 - }
5.15 - try (Writer w = new BufferedWriter(new FileWriter(outputFile))) {
5.16 + try (Writer w = new BufferedWriter(new FileWriter(generateTo))) {
5.17 Bck2Brwsr.newCompiler().
5.18 extension(createExtension).
5.19 obfuscation(obfLevel).
5.20 addRootClasses(classes.toArray()).
5.21 - resources(new LdrRsrcs(moduleName, mainClassLoader)).
5.22 + resources(new LdrRsrcs(mainClassLoader)).
5.23 generate(w);
5.24 }
5.25 }
6.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Wed May 08 17:47:47 2013 +0200
6.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Mon May 13 18:54:50 2013 +0200
6.3 @@ -58,8 +58,14 @@
6.4 }
6.5
6.6 static void compile(Appendable out, Bck2Brwsr.Resources l, StringArray names, boolean extension) throws IOException {
6.7 - VM vm = extension ? new Extension(out, l) : new Standalone(out, l);
6.8 - vm.doCompile(names);
6.9 + VM vm = extension ? new Extension(out, l, names.toArray())
6.10 + : new Standalone(out, l);
6.11 +
6.12 + final StringArray fixedNames =
6.13 + StringArray.asList(Class.class.getName().replace('.', '/'),
6.14 + VM.class.getName().replace('.', '/'));
6.15 +
6.16 + vm.doCompile(fixedNames.addAndNew(names.toArray()));
6.17 }
6.18
6.19 private void doCompile(StringArray names) throws IOException {
6.20 @@ -85,10 +91,9 @@
6.21
6.22 protected abstract void generateEpilogue() throws IOException;
6.23
6.24 - protected abstract String generateClass(String className)
6.25 - throws IOException;
6.26 + protected abstract String getExportsObject();
6.27
6.28 - protected abstract String getExportsObject();
6.29 + protected abstract boolean isExternalClass(String className);
6.30
6.31 @Override
6.32 protected final void declaredClass(ClassData classData, String mangledName)
6.33 @@ -102,6 +107,14 @@
6.34 }
6.35 }
6.36
6.37 + protected String generateClass(String className) throws IOException {
6.38 + ClassData classData = classDataCache.getClassData(className);
6.39 + if (classData == null) {
6.40 + throw new IOException("Can't find class " + className);
6.41 + }
6.42 + return compile(classData);
6.43 + }
6.44 +
6.45 @Override
6.46 protected void declaredField(FieldData fieldData,
6.47 String destObject,
6.48 @@ -314,6 +327,7 @@
6.49 fieldInfoName[2]);
6.50
6.51 if ((method != null)
6.52 + && !isExternalClass(method.cls.getClassName())
6.53 && (((method.access & ByteCodeParser.ACC_FINAL) != 0)
6.54 || ((referencedClass.getAccessFlags()
6.55 & ByteCodeParser.ACC_FINAL) != 0)
6.56 @@ -353,11 +367,13 @@
6.57 return (exportedMethodFinder.getFound() != null);
6.58 }
6.59
6.60 - private static String accessNonVirtualMember(String object,
6.61 - String mangledName,
6.62 - ClassData declaringClass) {
6.63 - return (declaringClass != null) ? object + "." + mangledName
6.64 - : object + "['" + mangledName + "']";
6.65 + private String accessNonVirtualMember(String object,
6.66 + String mangledName,
6.67 + ClassData declaringClass) {
6.68 + return ((declaringClass != null)
6.69 + && !isExternalClass(declaringClass.getClassName()))
6.70 + ? object + "." + mangledName
6.71 + : object + "['" + mangledName + "']";
6.72 }
6.73
6.74 private static final class ExportedMethodFinder
6.75 @@ -440,23 +456,23 @@
6.76 }
6.77
6.78 @Override
6.79 - protected String generateClass(String className) throws IOException {
6.80 - ClassData classData = classDataCache.getClassData(className);
6.81 - if (classData == null) {
6.82 - throw new IOException("Can't find class " + className);
6.83 - }
6.84 - return compile(classData);
6.85 + protected String getExportsObject() {
6.86 + return "vm";
6.87 }
6.88
6.89 @Override
6.90 - protected String getExportsObject() {
6.91 - return "vm";
6.92 + protected boolean isExternalClass(String className) {
6.93 + return false;
6.94 }
6.95 }
6.96
6.97 private static final class Extension extends VM {
6.98 - private Extension(Appendable out, Bck2Brwsr.Resources resources) {
6.99 + private final StringArray extensionClasses;
6.100 +
6.101 + private Extension(Appendable out, Bck2Brwsr.Resources resources,
6.102 + String[] extClassesArray) {
6.103 super(out, resources);
6.104 + this.extensionClasses = StringArray.asList(extClassesArray);
6.105 }
6.106
6.107 @Override
6.108 @@ -464,10 +480,10 @@
6.109 out.append("bck2brwsr.registerExtension(function(exports) {\n"
6.110 + " var vm = {};\n");
6.111 out.append(" function link(n, inst) {\n"
6.112 - + " var cls = n.replace__Ljava_lang_String_2CC("
6.113 - + "'/', '_').toString();\n"
6.114 - + " var dot = n.replace__Ljava_lang_String_2CC("
6.115 - + "'/', '.').toString();\n"
6.116 + + " var cls = n['replace__Ljava_lang_String_2CC']"
6.117 + + "('/', '_').toString();\n"
6.118 + + " var dot = n['replace__Ljava_lang_String_2CC']"
6.119 + + "('/', '.').toString();\n"
6.120 + " exports.loadClass(dot);\n"
6.121 + " vm[cls] = exports[cls];\n"
6.122 + " return vm[cls](inst);\n"
6.123 @@ -481,8 +497,7 @@
6.124
6.125 @Override
6.126 protected String generateClass(String className) throws IOException {
6.127 - ClassData classData = classDataCache.getClassData(className);
6.128 - if (classData == null) {
6.129 + if (isExternalClass(className)) {
6.130 out.append("\n").append(assignClass(
6.131 className.replace('/', '_')))
6.132 .append("function() {\n return link('")
6.133 @@ -493,12 +508,17 @@
6.134 return null;
6.135 }
6.136
6.137 - return compile(classData);
6.138 + return super.generateClass(className);
6.139 }
6.140
6.141 @Override
6.142 protected String getExportsObject() {
6.143 return "exports";
6.144 }
6.145 +
6.146 + @Override
6.147 + protected boolean isExternalClass(String className) {
6.148 + return !extensionClasses.contains(className);
6.149 + }
6.150 }
6.151 }