Added retrolambda.javaHacks configuration option by lyubomyr-shaydariv · Pull Request #143 · luontola/retrolambda

In some cases javac may produce incorrect but executable byte code that cannot be translated with ASM therefore making class downgrade impossible. This pull request enables:

  • -Dretrolambda.javacHacks support for the tool
  • <javaHacks> support for the Maven plugin

I could downgrade the code using a patched 2.5.5-SNAPSHOT version and the downgraded code seems to work correctly. The option name javaHacks is a possible subject to change or rename. For example, enabling the key will allow to downgrade the following code that cannot be processed with Retrolambda 2.5.4:

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.util.function.Consumer;

@SuppressWarnings("all")
final class JavacBug
                implements Consumer<Iterable<?>> {

        @Target(ElementType.TYPE_USE)
        @interface A {
        }

        @Override
        public void accept(final Iterable<?> t) {
                final @A Object o = null;
                assert o != null;
        }

}

As of Retrolambda 2.5.4 the code above fails with even for the latest JDK 1.8 javac (1.8.0_181):

java.lang.RuntimeException: Failed to backport class: JavaBug
	at net.orfjackal.retrolambda.Transformers.transform(Transformers.java:129)
	at net.orfjackal.retrolambda.Transformers.transform(Transformers.java:107)
	at net.orfjackal.retrolambda.Transformers.backportClass(Transformers.java:47)
	at net.orfjackal.retrolambda.Retrolambda.run(Retrolambda.java:92)
	at net.orfjackal.retrolambda.Main.main(Main.java:28)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 21
	at net.orfjackal.retrolambda.asm.ClassReader.readLabel(ClassReader.java:2251)
	at net.orfjackal.retrolambda.asm.ClassReader.readTypeAnnotations(ClassReader.java:1678)
	at net.orfjackal.retrolambda.asm.ClassReader.readCode(ClassReader.java:1210)
	at net.orfjackal.retrolambda.asm.ClassReader.readMethod(ClassReader.java:1032)
	at net.orfjackal.retrolambda.asm.ClassReader.accept(ClassReader.java:708)
	at net.orfjackal.retrolambda.asm.ClassReader.accept(ClassReader.java:521)
	at net.orfjackal.retrolambda.Transformers.lambda$transform$4(Transformers.java:107)
	at net.orfjackal.retrolambda.Transformers.transform(Transformers.java:125)

Please note that JDK 1.8 may be a must, for example when using tools like Checker Framework. Please see https://gitlab.ow2.org/asm/asm/issues/317845 for more details.