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;