Changed the way the external classes are identified closure
authorLubomir Nerad <lubomir.nerad@oracle.com>
Mon, 13 May 2013 18:54:50 +0200
branchclosure
changeset 109436961c9a009f
parent 1087 d868b5a67b9b
child 1104 47c1fc251d84
Changed the way the external classes are identified
rt/vm/src/main/java/org/apidesign/vm4brwsr/Bck2Brwsr.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/LdrRsrcs.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/Main.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java
     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  }