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: