rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java
branchclosure
changeset 1094 36961c9a009f
parent 1087 d868b5a67b9b
child 1143 22beb858e00a
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Wed May 08 17:47:47 2013 +0200
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java	Mon May 13 18:54:50 2013 +0200
     1.3 @@ -58,8 +58,14 @@
     1.4      }
     1.5      
     1.6      static void compile(Appendable out, Bck2Brwsr.Resources l, StringArray names, boolean extension) throws IOException {
     1.7 -        VM vm = extension ? new Extension(out, l) : new Standalone(out, l);
     1.8 -        vm.doCompile(names);
     1.9 +        VM vm = extension ? new Extension(out, l, names.toArray())
    1.10 +                          : new Standalone(out, l);
    1.11 +
    1.12 +        final StringArray fixedNames =
    1.13 +                StringArray.asList(Class.class.getName().replace('.', '/'),
    1.14 +                                   VM.class.getName().replace('.', '/'));
    1.15 +
    1.16 +        vm.doCompile(fixedNames.addAndNew(names.toArray()));
    1.17      }
    1.18  
    1.19      private void doCompile(StringArray names) throws IOException {
    1.20 @@ -85,10 +91,9 @@
    1.21  
    1.22      protected abstract void generateEpilogue() throws IOException;
    1.23  
    1.24 -    protected abstract String generateClass(String className)
    1.25 -            throws IOException;
    1.26 +    protected abstract String getExportsObject();
    1.27  
    1.28 -    protected abstract String getExportsObject();
    1.29 +    protected abstract boolean isExternalClass(String className);
    1.30  
    1.31      @Override
    1.32      protected final void declaredClass(ClassData classData, String mangledName)
    1.33 @@ -102,6 +107,14 @@
    1.34          }
    1.35      }
    1.36  
    1.37 +    protected String generateClass(String className) throws IOException {
    1.38 +        ClassData classData = classDataCache.getClassData(className);
    1.39 +        if (classData == null) {
    1.40 +            throw new IOException("Can't find class " + className);
    1.41 +        }
    1.42 +        return compile(classData);
    1.43 +    }
    1.44 +
    1.45      @Override
    1.46      protected void declaredField(FieldData fieldData,
    1.47                                   String destObject,
    1.48 @@ -314,6 +327,7 @@
    1.49                                            fieldInfoName[2]);
    1.50  
    1.51          if ((method != null)
    1.52 +                && !isExternalClass(method.cls.getClassName())
    1.53                  && (((method.access & ByteCodeParser.ACC_FINAL) != 0)
    1.54                          || ((referencedClass.getAccessFlags()
    1.55                                   & ByteCodeParser.ACC_FINAL) != 0)
    1.56 @@ -353,11 +367,13 @@
    1.57          return (exportedMethodFinder.getFound() != null);
    1.58      }
    1.59  
    1.60 -    private static String accessNonVirtualMember(String object,
    1.61 -                                                 String mangledName,
    1.62 -                                                 ClassData declaringClass) {
    1.63 -        return (declaringClass != null) ? object + "." + mangledName
    1.64 -                                        : object + "['" + mangledName + "']";
    1.65 +    private String accessNonVirtualMember(String object,
    1.66 +                                          String mangledName,
    1.67 +                                          ClassData declaringClass) {
    1.68 +        return ((declaringClass != null)
    1.69 +                    && !isExternalClass(declaringClass.getClassName()))
    1.70 +                            ? object + "." + mangledName
    1.71 +                            : object + "['" + mangledName + "']";
    1.72      }
    1.73  
    1.74      private static final class ExportedMethodFinder
    1.75 @@ -440,23 +456,23 @@
    1.76          }
    1.77  
    1.78          @Override
    1.79 -        protected String generateClass(String className) throws IOException {
    1.80 -            ClassData classData = classDataCache.getClassData(className);
    1.81 -            if (classData == null) {
    1.82 -                throw new IOException("Can't find class " + className);
    1.83 -            }
    1.84 -            return compile(classData);
    1.85 +        protected String getExportsObject() {
    1.86 +            return "vm";
    1.87          }
    1.88  
    1.89          @Override
    1.90 -        protected String getExportsObject() {
    1.91 -            return "vm";
    1.92 +        protected boolean isExternalClass(String className) {
    1.93 +            return false;
    1.94          }
    1.95      }
    1.96  
    1.97      private static final class Extension extends VM {
    1.98 -        private Extension(Appendable out, Bck2Brwsr.Resources resources) {
    1.99 +        private final StringArray extensionClasses;
   1.100 +
   1.101 +        private Extension(Appendable out, Bck2Brwsr.Resources resources,
   1.102 +                          String[] extClassesArray) {
   1.103              super(out, resources);
   1.104 +            this.extensionClasses = StringArray.asList(extClassesArray);
   1.105          }
   1.106  
   1.107          @Override
   1.108 @@ -464,10 +480,10 @@
   1.109              out.append("bck2brwsr.registerExtension(function(exports) {\n"
   1.110                             + "  var vm = {};\n");
   1.111              out.append("  function link(n, inst) {\n"
   1.112 -                           + "    var cls = n.replace__Ljava_lang_String_2CC("
   1.113 -                                                  + "'/', '_').toString();\n"
   1.114 -                           + "    var dot = n.replace__Ljava_lang_String_2CC("
   1.115 -                                                  + "'/', '.').toString();\n"
   1.116 +                           + "    var cls = n['replace__Ljava_lang_String_2CC']"
   1.117 +                                                  + "('/', '_').toString();\n"
   1.118 +                           + "    var dot = n['replace__Ljava_lang_String_2CC']"
   1.119 +                                                  + "('/', '.').toString();\n"
   1.120                             + "    exports.loadClass(dot);\n"
   1.121                             + "    vm[cls] = exports[cls];\n"
   1.122                             + "    return vm[cls](inst);\n"
   1.123 @@ -481,8 +497,7 @@
   1.124  
   1.125          @Override
   1.126          protected String generateClass(String className) throws IOException {
   1.127 -            ClassData classData = classDataCache.getClassData(className);
   1.128 -            if (classData == null) {
   1.129 +            if (isExternalClass(className)) {
   1.130                  out.append("\n").append(assignClass(
   1.131                                              className.replace('/', '_')))
   1.132                     .append("function() {\n  return link('")
   1.133 @@ -493,12 +508,17 @@
   1.134                  return null;
   1.135              }
   1.136  
   1.137 -            return compile(classData);
   1.138 +            return super.generateClass(className);
   1.139          }
   1.140  
   1.141          @Override
   1.142          protected String getExportsObject() {
   1.143              return "exports";
   1.144          }
   1.145 +
   1.146 +        @Override
   1.147 +        protected boolean isExternalClass(String className) {
   1.148 +            return !extensionClasses.contains(className);
   1.149 +        }
   1.150      }
   1.151  }