1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri May 03 18:15:47 2013 +0200
1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon May 06 11:57:29 2013 +0200
1.3 @@ -63,6 +63,16 @@
1.4 throws IOException {
1.5 }
1.6
1.7 + protected void declaredField(FieldData fieldData,
1.8 + String destObject,
1.9 + String mangledName) throws IOException {
1.10 + }
1.11 +
1.12 + protected void declaredMethod(MethodData methodData,
1.13 + String destObject,
1.14 + String mangledName) throws IOException {
1.15 + }
1.16 +
1.17 /** Prints out a debug message.
1.18 *
1.19 * @param msg the message
1.20 @@ -144,7 +154,7 @@
1.21 .append("; };");
1.22 }
1.23
1.24 -// obfuscationDelegate.exportField(out, "c", "_" + v.getName(), v);
1.25 + declaredField(v, "c", "_" + v.getName());
1.26 }
1.27 for (MethodData m : jc.getMethods()) {
1.28 byte[] onlyArr = m.findAnnotationData(true);
1.29 @@ -174,7 +184,7 @@
1.30 mn = generateInstanceMethod(destObject, m);
1.31 }
1.32 }
1.33 -// obfuscationDelegate.exportMethod(out, destObject, mn, m);
1.34 + declaredMethod(m, destObject, mn);
1.35 byte[] runAnno = m.findAnnotationData(false);
1.36 if (runAnno != null) {
1.37 out.append("\n ").append(destObject).append(".").append(mn).append(".anno = {");
2.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java Fri May 03 18:15:47 2013 +0200
2.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java Mon May 06 11:57:29 2013 +0200
2.3 @@ -20,21 +20,12 @@
2.4 import com.google.javascript.jscomp.CommandLineRunner;
2.5 import com.google.javascript.jscomp.SourceFile;
2.6 import java.io.IOException;
2.7 -import java.io.InputStream;
2.8 import java.io.OutputStream;
2.9 import java.io.PrintStream;
2.10 import java.util.ArrayList;
2.11 -import java.util.Arrays;
2.12 -import java.util.Collection;
2.13 import java.util.Collections;
2.14 -import java.util.HashMap;
2.15 import java.util.List;
2.16 -import java.util.Map;
2.17 import org.apidesign.bck2brwsr.core.ExtraJavaScript;
2.18 -import org.apidesign.vm4brwsr.ByteCodeParser.AnnotationParser;
2.19 -import org.apidesign.vm4brwsr.ByteCodeParser.ClassData;
2.20 -import org.apidesign.vm4brwsr.ByteCodeParser.FieldData;
2.21 -import org.apidesign.vm4brwsr.ByteCodeParser.MethodData;
2.22
2.23 /**
2.24 *
2.25 @@ -44,7 +35,6 @@
2.26 final class ClosureWrapper extends CommandLineRunner {
2.27 private static final String[] ARGS = { "--compilation_level", "SIMPLE_OPTIMIZATIONS", "--js", "bck2brwsr-raw.js" /*, "--debug", "--formatting", "PRETTY_PRINT" */ };
2.28
2.29 - private final ClosuresObfuscationDelegate obfuscationDelegate;
2.30 private final Bck2Brwsr.Resources res;
2.31 private final StringArray classes;
2.32
2.33 @@ -53,13 +43,11 @@
2.34
2.35 private ClosureWrapper(Appendable out,
2.36 String compilationLevel,
2.37 - ClosuresObfuscationDelegate obfuscationDelegate,
2.38 Bck2Brwsr.Resources res, StringArray classes) {
2.39 super(
2.40 generateArguments(compilationLevel),
2.41 new PrintStream(new APS(out)), System.err
2.42 );
2.43 - this.obfuscationDelegate = obfuscationDelegate;
2.44 this.res = res;
2.45 this.classes = classes;
2.46 }
2.47 @@ -119,7 +107,7 @@
2.48 getCompiledCode();
2.49
2.50 final StringBuilder sb = new StringBuilder("function RAW() {};\n");
2.51 - for (final String extern: obfuscationDelegate.getExterns()) {
2.52 + for (final String extern: FIXED_EXTERNS) {
2.53 sb.append("RAW.prototype.").append(extern).append(";\n");
2.54 }
2.55 externsCode = sb.toString();
2.56 @@ -162,19 +150,10 @@
2.57 switch (obfuscationLevel) {
2.58 case MINIMAL:
2.59 return new ClosureWrapper(w, "SIMPLE_OPTIMIZATIONS",
2.60 - new SimpleObfuscationDelegate(),
2.61 resources, arr);
2.62 -/*
2.63 - case MEDIUM:
2.64 - return new ClosureWrapper(w, "ADVANCED_OPTIMIZATIONS",
2.65 - new MediumObfuscationDelegate(
2.66 - resources),
2.67 - resources, arr);
2.68 -*/
2.69 +
2.70 case FULL:
2.71 return new ClosureWrapper(w, "ADVANCED_OPTIMIZATIONS",
2.72 - new FullObfuscationDelegate(
2.73 - resources),
2.74 resources, arr);
2.75 default:
2.76 throw new IllegalArgumentException(
2.77 @@ -182,275 +161,49 @@
2.78 }
2.79 }
2.80
2.81 - private static abstract class ClosuresObfuscationDelegate
2.82 - extends ObfuscationDelegate {
2.83 - public abstract Collection<String> getExterns();
2.84 - }
2.85 -
2.86 - private static final class SimpleObfuscationDelegate
2.87 - extends ClosuresObfuscationDelegate {
2.88 - @Override
2.89 - public void exportJSProperty(Appendable out,
2.90 - String destObject,
2.91 - String propertyName) throws IOException {
2.92 - }
2.93 -
2.94 - @Override
2.95 - public void exportClass(Appendable out,
2.96 - String destObject,
2.97 - String mangledName,
2.98 - ClassData classData) throws IOException {
2.99 - }
2.100 -
2.101 - @Override
2.102 - public void exportMethod(Appendable out,
2.103 - String destObject,
2.104 - String mangledName,
2.105 - MethodData methodData) throws IOException {
2.106 - }
2.107 -
2.108 - @Override
2.109 - public void exportField(Appendable out,
2.110 - String destObject,
2.111 - String mangledName,
2.112 - FieldData fieldData) throws IOException {
2.113 - }
2.114 -
2.115 - @Override
2.116 - public Collection<String> getExterns() {
2.117 - return Collections.EMPTY_LIST;
2.118 - }
2.119 - }
2.120 -
2.121 - private static abstract class AdvancedObfuscationDelegate
2.122 - extends ClosuresObfuscationDelegate {
2.123 - private static final String[] INITIAL_EXTERNS = {
2.124 - "bck2brwsr",
2.125 - "$class",
2.126 - "anno",
2.127 - "array",
2.128 - "access",
2.129 - "cls",
2.130 - "vm",
2.131 - "loadClass",
2.132 - "loadBytes",
2.133 - "jvmName",
2.134 - "primitive",
2.135 - "superclass",
2.136 - "cnstr",
2.137 - "add32",
2.138 - "sub32",
2.139 - "mul32",
2.140 - "neg32",
2.141 - "toInt8",
2.142 - "toInt16",
2.143 - "next32",
2.144 - "high32",
2.145 - "toInt32",
2.146 - "toFP",
2.147 - "toLong",
2.148 - "toExactString",
2.149 - "add64",
2.150 - "sub64",
2.151 - "mul64",
2.152 - "and64",
2.153 - "or64",
2.154 - "xor64",
2.155 - "shl64",
2.156 - "shr64",
2.157 - "ushr64",
2.158 - "compare64",
2.159 - "neg64",
2.160 - "div32",
2.161 - "mod32",
2.162 - "div64",
2.163 - "mod64",
2.164 - "at",
2.165 - "getClass__Ljava_lang_Class_2",
2.166 - "clone__Ljava_lang_Object_2"
2.167 - };
2.168 -
2.169 - private final Bck2Brwsr.Resources resources;
2.170 -
2.171 - private final Collection<String> externs;
2.172 - private final Map<Object, Boolean> isMarkedAsExportedCache;
2.173 -
2.174 - protected AdvancedObfuscationDelegate(Bck2Brwsr.Resources resources) {
2.175 - this.resources = resources;
2.176 -
2.177 - externs = new ArrayList<String>(Arrays.asList(INITIAL_EXTERNS));
2.178 - isMarkedAsExportedCache = new HashMap<Object, Boolean>();
2.179 - }
2.180 -
2.181 - @Override
2.182 - public void exportClass(Appendable out,
2.183 - String destObject,
2.184 - String mangledName,
2.185 - ClassData classData) throws IOException {
2.186 - if (isExportedClass(classData)) {
2.187 - exportJSProperty(out, destObject, mangledName);
2.188 - }
2.189 - }
2.190 -
2.191 - @Override
2.192 - public void exportMethod(Appendable out,
2.193 - String destObject,
2.194 - String mangledName,
2.195 - MethodData methodData) throws IOException {
2.196 - if (isAccessible(methodData.access)
2.197 - && isExportedClass(methodData.cls)
2.198 - || isMarkedAsExported(methodData)) {
2.199 - exportJSProperty(out, destObject, mangledName);
2.200 - }
2.201 - }
2.202 -
2.203 - @Override
2.204 - public void exportField(Appendable out,
2.205 - String destObject,
2.206 - String mangledName,
2.207 - FieldData fieldData) throws IOException {
2.208 - if (isAccessible(fieldData.access)
2.209 - && isExportedClass(fieldData.cls)
2.210 - || isMarkedAsExported(fieldData)) {
2.211 - exportJSProperty(out, destObject, mangledName);
2.212 - }
2.213 - }
2.214 -
2.215 - @Override
2.216 - public Collection<String> getExterns() {
2.217 - return externs;
2.218 - }
2.219 -
2.220 - protected void addExtern(String extern) {
2.221 - externs.add(extern);
2.222 - }
2.223 -
2.224 - private boolean isExportedClass(ClassData classData)
2.225 - throws IOException {
2.226 - return classData.isPublic() && isMarkedAsExportedPackage(
2.227 - classData.getPkgName())
2.228 - || isMarkedAsExported(classData);
2.229 - }
2.230 -
2.231 - private boolean isMarkedAsExportedPackage(String pkgName) {
2.232 - if (pkgName == null) {
2.233 - return false;
2.234 - }
2.235 -
2.236 - final Boolean cachedValue = isMarkedAsExportedCache.get(pkgName);
2.237 - if (cachedValue != null) {
2.238 - return cachedValue;
2.239 - }
2.240 -
2.241 - final boolean newValue = resolveIsMarkedAsExportedPackage(pkgName);
2.242 - isMarkedAsExportedCache.put(pkgName, newValue);
2.243 -
2.244 - return newValue;
2.245 - }
2.246 -
2.247 - private boolean isMarkedAsExported(ClassData classData)
2.248 - throws IOException {
2.249 - final Boolean cachedValue = isMarkedAsExportedCache.get(classData);
2.250 - if (cachedValue != null) {
2.251 - return cachedValue;
2.252 - }
2.253 -
2.254 - final boolean newValue =
2.255 - isMarkedAsExported(classData.findAnnotationData(true),
2.256 - classData);
2.257 - isMarkedAsExportedCache.put(classData, newValue);
2.258 -
2.259 - return newValue;
2.260 - }
2.261 -
2.262 - private boolean isMarkedAsExported(MethodData methodData)
2.263 - throws IOException {
2.264 - return isMarkedAsExported(methodData.findAnnotationData(true),
2.265 - methodData.cls);
2.266 - }
2.267 -
2.268 - private boolean isMarkedAsExported(FieldData fieldData)
2.269 - throws IOException {
2.270 - return isMarkedAsExported(fieldData.findAnnotationData(true),
2.271 - fieldData.cls);
2.272 - }
2.273 -
2.274 - private boolean resolveIsMarkedAsExportedPackage(String pkgName) {
2.275 - try {
2.276 - final InputStream is =
2.277 - resources.get(pkgName + "/package-info.class");
2.278 -
2.279 - try {
2.280 - final ClassData pkgInfoClass = new ClassData(is);
2.281 - return isMarkedAsExported(
2.282 - pkgInfoClass.findAnnotationData(true),
2.283 - pkgInfoClass);
2.284 - } finally {
2.285 - is.close();
2.286 - }
2.287 - } catch (final IOException e) {
2.288 - return false;
2.289 - }
2.290 - }
2.291 -
2.292 - private boolean isMarkedAsExported(byte[] arrData, ClassData cd)
2.293 - throws IOException {
2.294 - if (arrData == null) {
2.295 - return false;
2.296 - }
2.297 -
2.298 - final boolean[] found = { false };
2.299 - final AnnotationParser annotationParser =
2.300 - new AnnotationParser(false, false) {
2.301 - @Override
2.302 - protected void visitAnnotationStart(
2.303 - String type,
2.304 - boolean top) {
2.305 - if (top && type.equals("Lorg/apidesign/bck2brwsr"
2.306 - + "/core/Exported;")) {
2.307 - found[0] = true;
2.308 - }
2.309 - }
2.310 - };
2.311 - annotationParser.parse(arrData, cd);
2.312 - return found[0];
2.313 - }
2.314 -
2.315 - private static boolean isAccessible(int access) {
2.316 - return (access & (ByteCodeParser.ACC_PUBLIC
2.317 - | ByteCodeParser.ACC_PROTECTED)) != 0;
2.318 - }
2.319 - }
2.320 -
2.321 - private static final class MediumObfuscationDelegate
2.322 - extends AdvancedObfuscationDelegate {
2.323 - public MediumObfuscationDelegate(Bck2Brwsr.Resources resources) {
2.324 - super(resources);
2.325 - }
2.326 -
2.327 - @Override
2.328 - public void exportJSProperty(Appendable out,
2.329 - String destObject,
2.330 - String propertyName) {
2.331 - addExtern(propertyName);
2.332 - }
2.333 - }
2.334 -
2.335 - private static final class FullObfuscationDelegate
2.336 - extends AdvancedObfuscationDelegate {
2.337 - public FullObfuscationDelegate(Bck2Brwsr.Resources resources) {
2.338 - super(resources);
2.339 - }
2.340 -
2.341 - @Override
2.342 - public void exportJSProperty(Appendable out,
2.343 - String destObject,
2.344 - String propertyName) throws IOException {
2.345 - out.append("\n").append(destObject).append("['")
2.346 - .append(propertyName)
2.347 - .append("'] = ")
2.348 - .append(destObject).append(".").append(propertyName)
2.349 - .append(";\n");
2.350 - }
2.351 - }
2.352 + private static final String[] FIXED_EXTERNS = {
2.353 + "bck2brwsr",
2.354 + "$class",
2.355 + "anno",
2.356 + "array",
2.357 + "access",
2.358 + "cls",
2.359 + "vm",
2.360 + "loadClass",
2.361 + "loadBytes",
2.362 + "jvmName",
2.363 + "primitive",
2.364 + "superclass",
2.365 + "cnstr",
2.366 + "add32",
2.367 + "sub32",
2.368 + "mul32",
2.369 + "neg32",
2.370 + "toInt8",
2.371 + "toInt16",
2.372 + "next32",
2.373 + "high32",
2.374 + "toInt32",
2.375 + "toFP",
2.376 + "toLong",
2.377 + "toExactString",
2.378 + "add64",
2.379 + "sub64",
2.380 + "mul64",
2.381 + "and64",
2.382 + "or64",
2.383 + "xor64",
2.384 + "shl64",
2.385 + "shr64",
2.386 + "ushr64",
2.387 + "compare64",
2.388 + "neg64",
2.389 + "div32",
2.390 + "mod32",
2.391 + "div64",
2.392 + "mod64",
2.393 + "at",
2.394 + "getClass__Ljava_lang_Class_2",
2.395 + "clone__Ljava_lang_Object_2"
2.396 + };
2.397 }
3.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ObfuscationDelegate.java Fri May 03 18:15:47 2013 +0200
3.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
3.3 @@ -1,75 +0,0 @@
3.4 -/**
3.5 - * Back 2 Browser Bytecode Translator
3.6 - * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
3.7 - *
3.8 - * This program is free software: you can redistribute it and/or modify
3.9 - * it under the terms of the GNU General Public License as published by
3.10 - * the Free Software Foundation, version 2 of the License.
3.11 - *
3.12 - * This program is distributed in the hope that it will be useful,
3.13 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
3.14 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3.15 - * GNU General Public License for more details.
3.16 - *
3.17 - * You should have received a copy of the GNU General Public License
3.18 - * along with this program. Look for COPYING file in the top folder.
3.19 - * If not, see http://opensource.org/licenses/GPL-2.0.
3.20 - */
3.21 -package org.apidesign.vm4brwsr;
3.22 -
3.23 -import java.io.IOException;
3.24 -import org.apidesign.vm4brwsr.ByteCodeParser.ClassData;
3.25 -import org.apidesign.vm4brwsr.ByteCodeParser.FieldData;
3.26 -import org.apidesign.vm4brwsr.ByteCodeParser.MethodData;
3.27 -
3.28 -abstract class ObfuscationDelegate {
3.29 - static ObfuscationDelegate NULL =
3.30 - new ObfuscationDelegate() {
3.31 - @Override
3.32 - public void exportJSProperty(Appendable out,
3.33 - String destObject,
3.34 - String propertyName)
3.35 - throws IOException {
3.36 - }
3.37 -
3.38 - @Override
3.39 - public void exportClass(Appendable out,
3.40 - String destObject,
3.41 - String mangledName,
3.42 - ClassData classData)
3.43 - throws IOException {
3.44 - }
3.45 -
3.46 - @Override
3.47 - public void exportMethod(Appendable out,
3.48 - String destObject,
3.49 - String mangledName,
3.50 - MethodData methodData)
3.51 - throws IOException {
3.52 - }
3.53 -
3.54 - @Override
3.55 - public void exportField(Appendable out,
3.56 - String destObject,
3.57 - String mangledName,
3.58 - FieldData fieldData)
3.59 - throws IOException {
3.60 - }
3.61 - };
3.62 -
3.63 - public abstract void exportJSProperty(
3.64 - Appendable out, String destObject, String propertyName)
3.65 - throws IOException;
3.66 -
3.67 - public abstract void exportClass(
3.68 - Appendable out, String destObject, String mangledName,
3.69 - ClassData classData) throws IOException;
3.70 -
3.71 - public abstract void exportMethod(
3.72 - Appendable out, String destObject, String mangledName,
3.73 - MethodData methodData) throws IOException;
3.74 -
3.75 - public abstract void exportField(
3.76 - Appendable out, String destObject, String mangledName,
3.77 - FieldData fieldData) throws IOException;
3.78 -}
4.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Fri May 03 18:15:47 2013 +0200
4.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Mon May 06 11:57:29 2013 +0200
4.3 @@ -20,6 +20,8 @@
4.4 import java.io.IOException;
4.5 import java.io.InputStream;
4.6 import org.apidesign.vm4brwsr.ByteCodeParser.ClassData;
4.7 +import org.apidesign.vm4brwsr.ByteCodeParser.FieldData;
4.8 +import org.apidesign.vm4brwsr.ByteCodeParser.MethodData;
4.9
4.10 /** Generator of JavaScript from bytecode of classes on classpath of the VM.
4.11 *
4.12 @@ -87,6 +89,33 @@
4.13 }
4.14 }
4.15
4.16 + @Override
4.17 + protected void declaredField(FieldData fieldData,
4.18 + String destObject,
4.19 + String mangledName) throws IOException {
4.20 + if (exportedSymbols.isExported(fieldData)) {
4.21 + exportMember(destObject, mangledName);
4.22 + }
4.23 + }
4.24 +
4.25 + @Override
4.26 + protected void declaredMethod(MethodData methodData,
4.27 + String destObject,
4.28 + String mangledName) throws IOException {
4.29 + if (exportedSymbols.isExported(methodData)) {
4.30 + exportMember(destObject, mangledName);
4.31 + }
4.32 + }
4.33 +
4.34 + private void exportMember(String destObject, String memberName)
4.35 + throws IOException {
4.36 + out.append("\n").append(destObject).append("['")
4.37 + .append(memberName)
4.38 + .append("'] = ")
4.39 + .append(destObject).append(".").append(memberName)
4.40 + .append(";\n");
4.41 + }
4.42 +
4.43 private void generateBody(StringArray names) throws IOException {
4.44 StringArray processed = new StringArray();
4.45 StringArray initCode = new StringArray();