rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
branchclosure
changeset 869 151f4ccd7673
parent 861 f41a1fef7738
child 880 32eb44c74e1e
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Tue Mar 19 13:18:02 2013 +0100
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu Mar 21 18:48:46 2013 +0100
     1.3 @@ -28,9 +28,16 @@
     1.4  abstract class ByteCodeToJavaScript {
     1.5      private ClassData jc;
     1.6      final Appendable out;
     1.7 +    final ObfuscationDelegate obfuscationDelegate;
     1.8  
     1.9      protected ByteCodeToJavaScript(Appendable out) {
    1.10 +        this(out, ObfuscationDelegate.NULL);
    1.11 +    }
    1.12 +
    1.13 +    protected ByteCodeToJavaScript(
    1.14 +            Appendable out, ObfuscationDelegate obfuscationDelegate) {
    1.15          this.out = out;
    1.16 +        this.obfuscationDelegate = obfuscationDelegate;
    1.17      }
    1.18      
    1.19      /* Collects additional required resources.
    1.20 @@ -58,7 +65,9 @@
    1.21      /* protected */ String accessClass(String classOperation) {
    1.22          return classOperation;
    1.23      }
    1.24 -    
    1.25 +
    1.26 +    abstract String getVMObject();
    1.27 +
    1.28      /** Prints out a debug message. 
    1.29       * 
    1.30       * @param msg the message
    1.31 @@ -138,6 +147,8 @@
    1.32                      append(className).append('_').append(v.getName())
    1.33                     .append("; };");
    1.34              }
    1.35 +
    1.36 +            obfuscationDelegate.exportField(out, "c", "_" + v.getName(), v);
    1.37          }
    1.38          for (MethodData m : jc.getMethods()) {
    1.39              byte[] onlyArr = m.findAnnotationData(true);
    1.40 @@ -152,33 +163,39 @@
    1.41                  }
    1.42                  continue;
    1.43              }
    1.44 -            String prefix;
    1.45 +            String destObject;
    1.46              String mn;
    1.47 +            out.append("\n    ");
    1.48              if (m.isStatic()) {
    1.49 -                prefix = "\n    c.";
    1.50 -                mn = generateStaticMethod(prefix, m, toInitilize);
    1.51 +                destObject = "c";
    1.52 +                mn = generateStaticMethod(destObject, m, toInitilize);
    1.53              } else {
    1.54                  if (m.isConstructor()) {
    1.55 -                    prefix = "\n    CLS.";
    1.56 -                    mn = generateInstanceMethod(prefix, m);
    1.57 +                    destObject = "CLS";
    1.58 +                    mn = generateInstanceMethod(destObject, m);
    1.59                  } else {
    1.60 -                    prefix = "\n    c.";
    1.61 -                    mn = generateInstanceMethod(prefix, m);
    1.62 +                    destObject = "c";
    1.63 +                    mn = generateInstanceMethod(destObject, m);
    1.64                  }
    1.65              }
    1.66 +            obfuscationDelegate.exportMethod(out, destObject, mn, m);
    1.67              byte[] runAnno = m.findAnnotationData(false);
    1.68              if (runAnno != null) {
    1.69 -                out.append(prefix).append(mn).append(".anno = {");
    1.70 +                out.append("\n    ").append(destObject).append(".").append(mn).append(".anno = {");
    1.71                  generateAnno(jc, out, runAnno);
    1.72                  out.append("\n    };");
    1.73              }
    1.74 -            out.append(prefix).append(mn).append(".access = " + m.getAccess()).append(";");
    1.75 -            out.append(prefix).append(mn).append(".cls = CLS;");
    1.76 +            out.append("\n    ").append(destObject).append(".").append(mn).append(".access = " + m.getAccess()).append(";");
    1.77 +            out.append("\n    ").append(destObject).append(".").append(mn).append(".cls = CLS;");
    1.78          }
    1.79          out.append("\n    c.constructor = CLS;");
    1.80 -        out.append("\n    c.$instOf_").append(className).append(" = true;");
    1.81 +        String instOfName = "$instOf_" + className;
    1.82 +        out.append("\n    c.").append(instOfName).append(" = true;");
    1.83 +        obfuscationDelegate.exportJSProperty(out, "c", instOfName);
    1.84          for (String superInterface : jc.getSuperInterfaces()) {
    1.85 -            out.append("\n    c.$instOf_").append(superInterface.replace('/', '_')).append(" = true;");
    1.86 +            instOfName = "$instOf_" + superInterface.replace('/', '_');
    1.87 +            out.append("\n    c.").append(instOfName).append(" = true;");
    1.88 +            obfuscationDelegate.exportJSProperty(out, "c", instOfName);
    1.89          }
    1.90          out.append("\n    CLS.$class = 'temp';");
    1.91          out.append("\n    CLS.$class = ");
    1.92 @@ -224,14 +241,17 @@
    1.93          out.append("\n  }");
    1.94          out.append("\n  return arguments[0] ? new CLS() : CLS.prototype;");
    1.95          out.append("\n};");
    1.96 +
    1.97 +        obfuscationDelegate.exportClass(out, getVMObject(), className, jc);
    1.98 +
    1.99  //        StringBuilder sb = new StringBuilder();
   1.100  //        for (String init : toInitilize.toArray()) {
   1.101  //            sb.append("\n").append(init).append("();");
   1.102  //        }
   1.103          return "";
   1.104      }
   1.105 -    private String generateStaticMethod(String prefix, MethodData m, StringArray toInitilize) throws IOException {
   1.106 -        String jsb = javaScriptBody(prefix, m, true);
   1.107 +    private String generateStaticMethod(String destObject, MethodData m, StringArray toInitilize) throws IOException {
   1.108 +        String jsb = javaScriptBody(destObject, m, true);
   1.109          if (jsb != null) {
   1.110              return jsb;
   1.111          }
   1.112 @@ -239,28 +259,28 @@
   1.113          if (mn.equals("class__V")) {
   1.114              toInitilize.add(accessClass(className(jc)) + "(false)." + mn);
   1.115          }
   1.116 -        generateMethod(prefix, mn, m);
   1.117 +        generateMethod(destObject, mn, m);
   1.118          return mn;
   1.119      }
   1.120  
   1.121 -    private String generateInstanceMethod(String prefix, MethodData m) throws IOException {
   1.122 -        String jsb = javaScriptBody(prefix, m, false);
   1.123 +    private String generateInstanceMethod(String destObject, MethodData m) throws IOException {
   1.124 +        String jsb = javaScriptBody(destObject, m, false);
   1.125          if (jsb != null) {
   1.126              return jsb;
   1.127          }
   1.128          final String mn = findMethodName(m, new StringBuilder());
   1.129 -        generateMethod(prefix, mn, m);
   1.130 +        generateMethod(destObject, mn, m);
   1.131          return mn;
   1.132      }
   1.133  
   1.134 -    private void generateMethod(String prefix, String name, MethodData m)
   1.135 +    private void generateMethod(String destObject, String name, MethodData m)
   1.136              throws IOException {
   1.137          final StackMapIterator stackMapIterator = m.createStackMapIterator();
   1.138          TrapDataIterator trap = m.getTrapDataIterator();
   1.139          final LocalsMapper lmapper =
   1.140                  new LocalsMapper(stackMapIterator.getArguments());
   1.141  
   1.142 -        out.append(prefix).append(name).append(" = function(");
   1.143 +        out.append(destObject).append(".").append(name).append(" = function(");
   1.144          lmapper.outputArguments(out, m.isStatic());
   1.145          out.append(") {").append("\n");
   1.146  
   1.147 @@ -1546,7 +1566,7 @@
   1.148          return s;
   1.149      }
   1.150  
   1.151 -    private String javaScriptBody(String prefix, MethodData m, boolean isStatic) throws IOException {
   1.152 +    private String javaScriptBody(String destObject, MethodData m, boolean isStatic) throws IOException {
   1.153          byte[] arr = m.findAnnotationData(true);
   1.154          if (arr == null) {
   1.155              return null;
   1.156 @@ -1581,7 +1601,7 @@
   1.157          }
   1.158          StringBuilder cnt = new StringBuilder();
   1.159          final String mn = findMethodName(m, cnt);
   1.160 -        out.append(prefix).append(mn);
   1.161 +        out.append(destObject).append(".").append(mn);
   1.162          out.append(" = function(");
   1.163          String space = "";
   1.164          int index = 0;