rt/aot/src/main/java/org/apidesign/bck2brwsr/aot/RetroLambda.java
changeset 1985 cd1cc103a03c
parent 1787 ea12a3bb4b33
     1.1 --- a/rt/aot/src/main/java/org/apidesign/bck2brwsr/aot/RetroLambda.java	Tue Feb 24 11:12:53 2015 +0100
     1.2 +++ b/rt/aot/src/main/java/org/apidesign/bck2brwsr/aot/RetroLambda.java	Tue Jan 17 07:04:06 2017 +0100
     1.3 @@ -19,15 +19,17 @@
     1.4  
     1.5  import java.io.IOException;
     1.6  import java.io.InputStream;
     1.7 +import java.nio.file.Path;
     1.8  import java.util.Arrays;
     1.9  import java.util.HashMap;
    1.10  import java.util.Map;
    1.11 -import net.orfjackal.retrolambda.LambdaClassBackporter;
    1.12 -import net.orfjackal.retrolambda.LambdaClassDumper;
    1.13 -import net.orfjackal.retrolambda.LambdaClassSaver;
    1.14 -import net.orfjackal.retrolambda.LambdaReifier;
    1.15 -import net.orfjackal.retrolambda.LambdaUsageBackporter;
    1.16 +import net.orfjackal.retrolambda.Transformers;
    1.17 +import net.orfjackal.retrolambda.asm.ClassReader;
    1.18  import net.orfjackal.retrolambda.asm.Opcodes;
    1.19 +import net.orfjackal.retrolambda.files.OutputDirectory;
    1.20 +import net.orfjackal.retrolambda.interfaces.ClassHierarchyAnalyzer;
    1.21 +import net.orfjackal.retrolambda.lambdas.LambdaClassDumper;
    1.22 +import net.orfjackal.retrolambda.lambdas.LambdaClassSaver;
    1.23  import org.apidesign.bck2brwsr.core.ExtraJavaScript;
    1.24  import org.apidesign.vm4brwsr.Bck2Brwsr;
    1.25  
    1.26 @@ -36,24 +38,30 @@
    1.27   * @author Jaroslav Tulach
    1.28   */
    1.29  @ExtraJavaScript(processByteCode = false, resource="")
    1.30 -final class RetroLambda extends LambdaClassSaver implements BytecodeProcessor {
    1.31 +final class RetroLambda extends OutputDirectory implements BytecodeProcessor {
    1.32      private Map<String,byte[]> converted;
    1.33 +    private final Transformers transformers;
    1.34 +    private final LambdaClassSaver saver;
    1.35      
    1.36      public RetroLambda() {
    1.37 -        super(null, Opcodes.V1_7);
    1.38 +        super(null);
    1.39 +        transformers = new Transformers(Opcodes.V1_7, false, new ClassHierarchyAnalyzer());
    1.40 +        saver = new LambdaClassSaver(this, transformers);
    1.41      }
    1.42  
    1.43      @Override
    1.44 -    public void saveIfLambda(String className, byte[] bytecode) {
    1.45 -        if (LambdaReifier.isLambdaClassToReify(className)) {
    1.46 -            try {
    1.47 -                byte[] backportedBytecode = LambdaClassBackporter.transform(bytecode, Opcodes.V1_7);
    1.48 -                putBytecode(className + ".class", backportedBytecode);
    1.49 -            } catch (Throwable t) {
    1.50 -                // print to stdout to keep in sync with other log output
    1.51 -                throw new IllegalStateException("ERROR: Failed to backport lambda class: " + className);
    1.52 -            }
    1.53 +    public void writeFile(Path relativePath, byte[] content) throws IOException {
    1.54 +        throw new UnsupportedOperationException();
    1.55 +    }
    1.56 +
    1.57 +    @Override
    1.58 +    public void writeClass(byte[] bytecode) throws IOException {
    1.59 +        if (bytecode == null) {
    1.60 +            return;
    1.61          }
    1.62 +        ClassReader cr = new ClassReader(bytecode);
    1.63 +        String className = cr.getClassName();
    1.64 +        putBytecode(className + ".class", bytecode);
    1.65      }
    1.66  
    1.67      private void putBytecode(String className, byte[] backportedBytecode) {
    1.68 @@ -75,11 +83,11 @@
    1.69          }
    1.70          
    1.71          ClassLoader prev = Thread.currentThread().getContextClassLoader();
    1.72 -        try (LambdaClassDumper dumper = new LambdaClassDumper(this)) {
    1.73 +        try (LambdaClassDumper dumper = new LambdaClassDumper(saver)) {
    1.74              Thread.currentThread().setContextClassLoader(new ResLdr(resources));
    1.75              dumper.install();
    1.76              
    1.77 -            byte[] newB = LambdaUsageBackporter.transform(byteCode, Opcodes.V1_7);
    1.78 +            byte[] newB = transformers.backportClass(new ClassReader(byteCode));
    1.79              if (!Arrays.equals(newB, byteCode)) {
    1.80                  putBytecode(className, newB);
    1.81              }