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 2020/07/19 14:23:51 UTC

[groovy] 01/01: Minor tweak: create `Lookup` instance according to vm plugin

This is an automated email from the ASF dual-hosted git repository.

sunlan pushed a commit to branch danielsun/tweak-vmplugin
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit a5508545087d7a4b0ed7e150c264caac6952e8af
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sun Jul 19 22:22:53 2020 +0800

    Minor tweak: create `Lookup` instance according to vm plugin
---
 src/main/java/org/codehaus/groovy/vmplugin/v8/Java8.java | 11 ++++++-----
 src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java | 15 +++++----------
 2 files changed, 11 insertions(+), 15 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/vmplugin/v8/Java8.java b/src/main/java/org/codehaus/groovy/vmplugin/v8/Java8.java
index bf865da..c8e2301 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/v8/Java8.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/v8/Java8.java
@@ -141,6 +141,10 @@ public class Java8 implements VMPlugin {
         mn.setAnnotationDefault(true);
     }
 
+    protected MethodHandles.Lookup newLookup(final Class<?> declaringClass) {
+        return of(declaringClass);
+    }
+
     private static Constructor<MethodHandles.Lookup> getLookupConstructor() {
         return LookupHolder.LOOKUP_Constructor;
     }
@@ -618,16 +622,13 @@ public class Java8 implements VMPlugin {
     public Object getInvokeSpecialHandle(Method method, Object receiver) {
         final Class<?> receiverType = receiver.getClass();
         try {
-            return of(receiverType).unreflectSpecial(method, receiverType).bindTo(receiver);
+            return newLookup(receiverType).unreflectSpecial(method, receiverType).bindTo(receiver);
         } catch (ReflectiveOperationException e) {
             return getInvokeSpecialHandleFallback(method, receiver);
         }
     }
 
     private Object getInvokeSpecialHandleFallback(Method method, Object receiver) {
-        if (getLookupConstructor() == null) {
-            throw new GroovyBugError("getInvokeSpecialHandle requires at least JDK 7 for private access to Lookup");
-        }
         if (!method.isAccessible()) {
             AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
                 ReflectionUtils.trySetAccessible(method);
@@ -636,7 +637,7 @@ public class Java8 implements VMPlugin {
         }
         Class<?> declaringClass = method.getDeclaringClass();
         try {
-            return getLookupConstructor().newInstance(declaringClass, -1).
+            return newLookup(declaringClass).
                     unreflectSpecial(method, declaringClass).
                     bindTo(receiver);
         } catch (ReflectiveOperationException e) {
diff --git a/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java b/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java
index 9249449..90a21c2 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java
@@ -156,6 +156,11 @@ public class Java9 extends Java8 {
         }
     }
 
+    @Override
+    protected MethodHandles.Lookup newLookup(final Class<?> declaringClass) {
+        return of(declaringClass);
+    }
+
     private static Constructor<MethodHandles.Lookup> getLookupConstructor() {
         return LookupHolder.LOOKUP_Constructor;
     }
@@ -188,16 +193,6 @@ public class Java9 extends Java8 {
         return 9;
     }
 
-    @Override
-    public Object getInvokeSpecialHandle(Method method, Object receiver) {
-        final Class<?> receiverType = receiver.getClass();
-        try {
-            return of(receiverType).unreflectSpecial(method, receiverType).bindTo(receiver);
-        } catch (ReflectiveOperationException e) {
-            return super.getInvokeSpecialHandle(method, receiver);
-        }
-    }
-
     /**
      * This method may be used by a caller in class C to check whether to enable access to a member of declaring class D successfully
      * if {@link Java8#checkCanSetAccessible(java.lang.reflect.AccessibleObject, java.lang.Class)} returns true and any of the following hold: