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 Thu Mar 03 06:03:06 2016 +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 }