From 15ee363dd9639dc321d4e080bdc527fc2aaac620 Mon Sep 17 00:00:00 2001 From: Yaroslav Heriatovych Date: Wed, 30 Nov 2016 16:09:19 +0000 Subject: [PATCH] Remove LambdaForm.Hidden annotation from emitted code --- .../orfjackal/retrolambda/Transformers.java | 1 + .../lambdas/RemoveLambdaHiddenReferences.java | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 retrolambda/src/main/java/net/orfjackal/retrolambda/lambdas/RemoveLambdaHiddenReferences.java diff --git a/retrolambda/src/main/java/net/orfjackal/retrolambda/Transformers.java b/retrolambda/src/main/java/net/orfjackal/retrolambda/Transformers.java index 62733b19..6b912ea3 100644 --- a/retrolambda/src/main/java/net/orfjackal/retrolambda/Transformers.java +++ b/retrolambda/src/main/java/net/orfjackal/retrolambda/Transformers.java @@ -116,6 +116,7 @@ private byte[] transform(String className, Consumer reader, ClassV if (targetVersion < Opcodes.V1_7) { next = new SwallowSuppressedExceptions(next); next = new RemoveMethodHandlesLookupReferences(next); + next = new RemoveLambdaHiddenReferences(next); next = new RequireNonNull(next); } next = new FixInvokeStaticOnInterfaceMethod(next); diff --git a/retrolambda/src/main/java/net/orfjackal/retrolambda/lambdas/RemoveLambdaHiddenReferences.java b/retrolambda/src/main/java/net/orfjackal/retrolambda/lambdas/RemoveLambdaHiddenReferences.java new file mode 100644 index 00000000..5fb3044d --- /dev/null +++ b/retrolambda/src/main/java/net/orfjackal/retrolambda/lambdas/RemoveLambdaHiddenReferences.java @@ -0,0 +1,31 @@ +// Copyright © 2013-2016 Esko Luontola and other Retrolambda contributors +// This software is released under the Apache License 2.0. +// The license text is at http://www.apache.org/licenses/LICENSE-2.0 + +package net.orfjackal.retrolambda.lambdas; + +import org.objectweb.asm.*; + +import static org.objectweb.asm.Opcodes.ASM5; + +public class RemoveLambdaHiddenReferences extends ClassVisitor { + + private static final String LAMBDA_FORM_HIDDEN_NAME = "Ljava/lang/invoke/LambdaForm$Hidden;"; + + public RemoveLambdaHiddenReferences(ClassVisitor next) { + super(ASM5, next); + } + + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { + return new MethodVisitor(ASM5, super.visitMethod(access, name, desc, signature, exceptions)) { + @Override + public AnnotationVisitor visitAnnotation(String desc, boolean visible) { + if (LAMBDA_FORM_HIDDEN_NAME.equals(desc)) { + return null; + } + return super.visitAnnotation(desc, visible); + } + }; + } +}