Removed ObfuscationDelegate closure
authorLubomir Nerad <lubomir.nerad@oracle.com>
Mon, 06 May 2013 11:57:29 +0200
branchclosure
changeset 10839d6130cb464f
parent 1082 977cc6141083
child 1084 f5c9934a252c
Removed ObfuscationDelegate
rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/ObfuscationDelegate.java
rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java
     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();