This is an automated email from the ASF dual-hosted git repository. sunlan pushed a commit to branch danielsun/tweak-build in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 42009a1d2bf42667fb22f4b47626ec90612ed323 Author: Daniel Sun <sun...@apache.org> AuthorDate: Tue Jun 15 19:16:59 2021 +0800 Add `$getLookup` method --- .../org/codehaus/groovy/classgen/Verifier.java | 38 +++++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/codehaus/groovy/classgen/Verifier.java b/src/main/java/org/codehaus/groovy/classgen/Verifier.java index b2761b0..8a98652 100644 --- a/src/main/java/org/codehaus/groovy/classgen/Verifier.java +++ b/src/main/java/org/codehaus/groovy/classgen/Verifier.java @@ -74,6 +74,7 @@ import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import java.beans.Transient; +import java.lang.invoke.MethodHandles; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; @@ -98,6 +99,11 @@ import static org.apache.groovy.ast.tools.MethodNodeUtils.getCodeAsBlock; import static org.apache.groovy.ast.tools.MethodNodeUtils.getPropertyName; import static org.apache.groovy.ast.tools.MethodNodeUtils.methodDescriptorWithoutReturnType; import static org.codehaus.groovy.ast.AnnotationNode.METHOD_TARGET; +import static org.codehaus.groovy.ast.ClassHelper.isObjectType; +import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveBoolean; +import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveDouble; +import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveLong; +import static org.codehaus.groovy.ast.ClassHelper.isWrapperBoolean; import static org.codehaus.groovy.ast.tools.GeneralUtils.binX; import static org.codehaus.groovy.ast.tools.GeneralUtils.block; import static org.codehaus.groovy.ast.tools.GeneralUtils.bytecodeX; @@ -114,11 +120,6 @@ import static org.codehaus.groovy.ast.tools.GenericsUtils.addMethodGenerics; import static org.codehaus.groovy.ast.tools.GenericsUtils.correctToGenericsSpec; import static org.codehaus.groovy.ast.tools.GenericsUtils.createGenericsSpec; import static org.codehaus.groovy.ast.tools.PropertyNodeUtils.adjustPropertyModifiersForMethod; -import static org.codehaus.groovy.ast.ClassHelper.isObjectType; -import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveBoolean; -import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveDouble; -import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveLong; -import static org.codehaus.groovy.ast.ClassHelper.isWrapperBoolean; /** * Verifies the AST node and adds any default AST code before bytecode generation occurs. @@ -139,6 +140,7 @@ import static org.codehaus.groovy.ast.ClassHelper.isWrapperBoolean; * <li>Property accessor methods</li> * <li>Covariant methods</li> * <li>Additional methods/constructors as needed for default parameters</li> + * <li>{@link java.lang.invoke.MethodHandles.Lookup} getter</li> * </ul> */ public class Verifier implements GroovyClassVisitor, Opcodes { @@ -252,6 +254,8 @@ public class Verifier implements GroovyClassVisitor, Opcodes { addFastPathHelperFieldsAndHelperMethod(node, classInternalName, knownSpecialCase); if (!knownSpecialCase) addGroovyObjectInterfaceAndMethods(node, classInternalName); + + addGetLookupMethod(node); } addDefaultConstructor(node); @@ -354,6 +358,30 @@ public class Verifier implements GroovyClassVisitor, Opcodes { node.addConstructor(constructor); } + private void addGetLookupMethod(final ClassNode node) { + int modifiers = ACC_PUBLIC; + boolean nonStaticInnerClass = null != node.getOuterClass() && !node.isStaticClass(); + if (!nonStaticInnerClass) { + // static method cannot be declared in non-static inner class util Java 16 + modifiers |= ACC_STATIC; + } + + node.addSyntheticMethod( + "$getLookup", + modifiers, + ClassHelper.make(MethodHandles.Lookup.class), + Parameter.EMPTY_ARRAY, + ClassNode.EMPTY_ARRAY, + new BytecodeSequence(new BytecodeInstruction() { + @Override + public void visit(final MethodVisitor mv) { + mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "lookup", "()Ljava/lang/invoke/MethodHandles$Lookup;", false); + mv.visitInsn(ARETURN); + } + }) + ); + } + private void addStaticMetaClassField(final ClassNode node, final String classInternalName) { String _staticClassInfoFieldName = "$staticClassInfo"; while (node.getDeclaredField(_staticClassInfoFieldName) != null)