You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2021/06/15 13:51:52 UTC
[groovy] 01/01: Add `$getLookup` method
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 <su...@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)