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 }