# HG changeset patch # User Lubomir Nerad # Date 1367834249 -7200 # Node ID 9d6130cb464faf96445ddc5b6271141f875b2e82 # Parent 977cc6141083023eff95b053d4e287645602cd9d Removed ObfuscationDelegate diff -r 977cc6141083 -r 9d6130cb464f rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri May 03 18:15:47 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon May 06 11:57:29 2013 +0200 @@ -63,6 +63,16 @@ throws IOException { } + protected void declaredField(FieldData fieldData, + String destObject, + String mangledName) throws IOException { + } + + protected void declaredMethod(MethodData methodData, + String destObject, + String mangledName) throws IOException { + } + /** Prints out a debug message. * * @param msg the message @@ -144,7 +154,7 @@ .append("; };"); } -// obfuscationDelegate.exportField(out, "c", "_" + v.getName(), v); + declaredField(v, "c", "_" + v.getName()); } for (MethodData m : jc.getMethods()) { byte[] onlyArr = m.findAnnotationData(true); @@ -174,7 +184,7 @@ mn = generateInstanceMethod(destObject, m); } } -// obfuscationDelegate.exportMethod(out, destObject, mn, m); + declaredMethod(m, destObject, mn); byte[] runAnno = m.findAnnotationData(false); if (runAnno != null) { out.append("\n ").append(destObject).append(".").append(mn).append(".anno = {"); diff -r 977cc6141083 -r 9d6130cb464f rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java Fri May 03 18:15:47 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java Mon May 06 11:57:29 2013 +0200 @@ -20,21 +20,12 @@ import com.google.javascript.jscomp.CommandLineRunner; import com.google.javascript.jscomp.SourceFile; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.apidesign.bck2brwsr.core.ExtraJavaScript; -import org.apidesign.vm4brwsr.ByteCodeParser.AnnotationParser; -import org.apidesign.vm4brwsr.ByteCodeParser.ClassData; -import org.apidesign.vm4brwsr.ByteCodeParser.FieldData; -import org.apidesign.vm4brwsr.ByteCodeParser.MethodData; /** * @@ -44,7 +35,6 @@ final class ClosureWrapper extends CommandLineRunner { private static final String[] ARGS = { "--compilation_level", "SIMPLE_OPTIMIZATIONS", "--js", "bck2brwsr-raw.js" /*, "--debug", "--formatting", "PRETTY_PRINT" */ }; - private final ClosuresObfuscationDelegate obfuscationDelegate; private final Bck2Brwsr.Resources res; private final StringArray classes; @@ -53,13 +43,11 @@ private ClosureWrapper(Appendable out, String compilationLevel, - ClosuresObfuscationDelegate obfuscationDelegate, Bck2Brwsr.Resources res, StringArray classes) { super( generateArguments(compilationLevel), new PrintStream(new APS(out)), System.err ); - this.obfuscationDelegate = obfuscationDelegate; this.res = res; this.classes = classes; } @@ -119,7 +107,7 @@ getCompiledCode(); final StringBuilder sb = new StringBuilder("function RAW() {};\n"); - for (final String extern: obfuscationDelegate.getExterns()) { + for (final String extern: FIXED_EXTERNS) { sb.append("RAW.prototype.").append(extern).append(";\n"); } externsCode = sb.toString(); @@ -162,19 +150,10 @@ switch (obfuscationLevel) { case MINIMAL: return new ClosureWrapper(w, "SIMPLE_OPTIMIZATIONS", - new SimpleObfuscationDelegate(), resources, arr); -/* - case MEDIUM: - return new ClosureWrapper(w, "ADVANCED_OPTIMIZATIONS", - new MediumObfuscationDelegate( - resources), - resources, arr); -*/ + case FULL: return new ClosureWrapper(w, "ADVANCED_OPTIMIZATIONS", - new FullObfuscationDelegate( - resources), resources, arr); default: throw new IllegalArgumentException( @@ -182,275 +161,49 @@ } } - private static abstract class ClosuresObfuscationDelegate - extends ObfuscationDelegate { - public abstract Collection getExterns(); - } - - private static final class SimpleObfuscationDelegate - extends ClosuresObfuscationDelegate { - @Override - public void exportJSProperty(Appendable out, - String destObject, - String propertyName) throws IOException { - } - - @Override - public void exportClass(Appendable out, - String destObject, - String mangledName, - ClassData classData) throws IOException { - } - - @Override - public void exportMethod(Appendable out, - String destObject, - String mangledName, - MethodData methodData) throws IOException { - } - - @Override - public void exportField(Appendable out, - String destObject, - String mangledName, - FieldData fieldData) throws IOException { - } - - @Override - public Collection getExterns() { - return Collections.EMPTY_LIST; - } - } - - private static abstract class AdvancedObfuscationDelegate - extends ClosuresObfuscationDelegate { - private static final String[] INITIAL_EXTERNS = { - "bck2brwsr", - "$class", - "anno", - "array", - "access", - "cls", - "vm", - "loadClass", - "loadBytes", - "jvmName", - "primitive", - "superclass", - "cnstr", - "add32", - "sub32", - "mul32", - "neg32", - "toInt8", - "toInt16", - "next32", - "high32", - "toInt32", - "toFP", - "toLong", - "toExactString", - "add64", - "sub64", - "mul64", - "and64", - "or64", - "xor64", - "shl64", - "shr64", - "ushr64", - "compare64", - "neg64", - "div32", - "mod32", - "div64", - "mod64", - "at", - "getClass__Ljava_lang_Class_2", - "clone__Ljava_lang_Object_2" - }; - - private final Bck2Brwsr.Resources resources; - - private final Collection externs; - private final Map isMarkedAsExportedCache; - - protected AdvancedObfuscationDelegate(Bck2Brwsr.Resources resources) { - this.resources = resources; - - externs = new ArrayList(Arrays.asList(INITIAL_EXTERNS)); - isMarkedAsExportedCache = new HashMap(); - } - - @Override - public void exportClass(Appendable out, - String destObject, - String mangledName, - ClassData classData) throws IOException { - if (isExportedClass(classData)) { - exportJSProperty(out, destObject, mangledName); - } - } - - @Override - public void exportMethod(Appendable out, - String destObject, - String mangledName, - MethodData methodData) throws IOException { - if (isAccessible(methodData.access) - && isExportedClass(methodData.cls) - || isMarkedAsExported(methodData)) { - exportJSProperty(out, destObject, mangledName); - } - } - - @Override - public void exportField(Appendable out, - String destObject, - String mangledName, - FieldData fieldData) throws IOException { - if (isAccessible(fieldData.access) - && isExportedClass(fieldData.cls) - || isMarkedAsExported(fieldData)) { - exportJSProperty(out, destObject, mangledName); - } - } - - @Override - public Collection getExterns() { - return externs; - } - - protected void addExtern(String extern) { - externs.add(extern); - } - - private boolean isExportedClass(ClassData classData) - throws IOException { - return classData.isPublic() && isMarkedAsExportedPackage( - classData.getPkgName()) - || isMarkedAsExported(classData); - } - - private boolean isMarkedAsExportedPackage(String pkgName) { - if (pkgName == null) { - return false; - } - - final Boolean cachedValue = isMarkedAsExportedCache.get(pkgName); - if (cachedValue != null) { - return cachedValue; - } - - final boolean newValue = resolveIsMarkedAsExportedPackage(pkgName); - isMarkedAsExportedCache.put(pkgName, newValue); - - return newValue; - } - - private boolean isMarkedAsExported(ClassData classData) - throws IOException { - final Boolean cachedValue = isMarkedAsExportedCache.get(classData); - if (cachedValue != null) { - return cachedValue; - } - - final boolean newValue = - isMarkedAsExported(classData.findAnnotationData(true), - classData); - isMarkedAsExportedCache.put(classData, newValue); - - return newValue; - } - - private boolean isMarkedAsExported(MethodData methodData) - throws IOException { - return isMarkedAsExported(methodData.findAnnotationData(true), - methodData.cls); - } - - private boolean isMarkedAsExported(FieldData fieldData) - throws IOException { - return isMarkedAsExported(fieldData.findAnnotationData(true), - fieldData.cls); - } - - private boolean resolveIsMarkedAsExportedPackage(String pkgName) { - try { - final InputStream is = - resources.get(pkgName + "/package-info.class"); - - try { - final ClassData pkgInfoClass = new ClassData(is); - return isMarkedAsExported( - pkgInfoClass.findAnnotationData(true), - pkgInfoClass); - } finally { - is.close(); - } - } catch (final IOException e) { - return false; - } - } - - private boolean isMarkedAsExported(byte[] arrData, ClassData cd) - throws IOException { - if (arrData == null) { - return false; - } - - final boolean[] found = { false }; - final AnnotationParser annotationParser = - new AnnotationParser(false, false) { - @Override - protected void visitAnnotationStart( - String type, - boolean top) { - if (top && type.equals("Lorg/apidesign/bck2brwsr" - + "/core/Exported;")) { - found[0] = true; - } - } - }; - annotationParser.parse(arrData, cd); - return found[0]; - } - - private static boolean isAccessible(int access) { - return (access & (ByteCodeParser.ACC_PUBLIC - | ByteCodeParser.ACC_PROTECTED)) != 0; - } - } - - private static final class MediumObfuscationDelegate - extends AdvancedObfuscationDelegate { - public MediumObfuscationDelegate(Bck2Brwsr.Resources resources) { - super(resources); - } - - @Override - public void exportJSProperty(Appendable out, - String destObject, - String propertyName) { - addExtern(propertyName); - } - } - - private static final class FullObfuscationDelegate - extends AdvancedObfuscationDelegate { - public FullObfuscationDelegate(Bck2Brwsr.Resources resources) { - super(resources); - } - - @Override - public void exportJSProperty(Appendable out, - String destObject, - String propertyName) throws IOException { - out.append("\n").append(destObject).append("['") - .append(propertyName) - .append("'] = ") - .append(destObject).append(".").append(propertyName) - .append(";\n"); - } - } + private static final String[] FIXED_EXTERNS = { + "bck2brwsr", + "$class", + "anno", + "array", + "access", + "cls", + "vm", + "loadClass", + "loadBytes", + "jvmName", + "primitive", + "superclass", + "cnstr", + "add32", + "sub32", + "mul32", + "neg32", + "toInt8", + "toInt16", + "next32", + "high32", + "toInt32", + "toFP", + "toLong", + "toExactString", + "add64", + "sub64", + "mul64", + "and64", + "or64", + "xor64", + "shl64", + "shr64", + "ushr64", + "compare64", + "neg64", + "div32", + "mod32", + "div64", + "mod64", + "at", + "getClass__Ljava_lang_Class_2", + "clone__Ljava_lang_Object_2" + }; } diff -r 977cc6141083 -r 9d6130cb464f rt/vm/src/main/java/org/apidesign/vm4brwsr/ObfuscationDelegate.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ObfuscationDelegate.java Fri May 03 18:15:47 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -/** - * Back 2 Browser Bytecode Translator - * Copyright (C) 2012 Jaroslav Tulach - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. Look for COPYING file in the top folder. - * If not, see http://opensource.org/licenses/GPL-2.0. - */ -package org.apidesign.vm4brwsr; - -import java.io.IOException; -import org.apidesign.vm4brwsr.ByteCodeParser.ClassData; -import org.apidesign.vm4brwsr.ByteCodeParser.FieldData; -import org.apidesign.vm4brwsr.ByteCodeParser.MethodData; - -abstract class ObfuscationDelegate { - static ObfuscationDelegate NULL = - new ObfuscationDelegate() { - @Override - public void exportJSProperty(Appendable out, - String destObject, - String propertyName) - throws IOException { - } - - @Override - public void exportClass(Appendable out, - String destObject, - String mangledName, - ClassData classData) - throws IOException { - } - - @Override - public void exportMethod(Appendable out, - String destObject, - String mangledName, - MethodData methodData) - throws IOException { - } - - @Override - public void exportField(Appendable out, - String destObject, - String mangledName, - FieldData fieldData) - throws IOException { - } - }; - - public abstract void exportJSProperty( - Appendable out, String destObject, String propertyName) - throws IOException; - - public abstract void exportClass( - Appendable out, String destObject, String mangledName, - ClassData classData) throws IOException; - - public abstract void exportMethod( - Appendable out, String destObject, String mangledName, - MethodData methodData) throws IOException; - - public abstract void exportField( - Appendable out, String destObject, String mangledName, - FieldData fieldData) throws IOException; -} diff -r 977cc6141083 -r 9d6130cb464f rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Fri May 03 18:15:47 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Mon May 06 11:57:29 2013 +0200 @@ -20,6 +20,8 @@ import java.io.IOException; import java.io.InputStream; import org.apidesign.vm4brwsr.ByteCodeParser.ClassData; +import org.apidesign.vm4brwsr.ByteCodeParser.FieldData; +import org.apidesign.vm4brwsr.ByteCodeParser.MethodData; /** Generator of JavaScript from bytecode of classes on classpath of the VM. * @@ -87,6 +89,33 @@ } } + @Override + protected void declaredField(FieldData fieldData, + String destObject, + String mangledName) throws IOException { + if (exportedSymbols.isExported(fieldData)) { + exportMember(destObject, mangledName); + } + } + + @Override + protected void declaredMethod(MethodData methodData, + String destObject, + String mangledName) throws IOException { + if (exportedSymbols.isExported(methodData)) { + exportMember(destObject, mangledName); + } + } + + private void exportMember(String destObject, String memberName) + throws IOException { + out.append("\n").append(destObject).append("['") + .append(memberName) + .append("'] = ") + .append(destObject).append(".").append(memberName) + .append(";\n"); + } + private void generateBody(StringArray names) throws IOException { StringArray processed = new StringArray(); StringArray initCode = new StringArray();