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 2019/05/10 13:47:21 UTC
[groovy] branch master updated: GROOVY-9111: Reduce the cost of
transforming meta method(closes #925)
This is an automated email from the ASF dual-hosted git repository.
sunlan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new 7753124 GROOVY-9111: Reduce the cost of transforming meta method(closes #925)
7753124 is described below
commit 7753124d05ef0b390853bb775afd25a0694bc3d1
Author: Daniel Sun <su...@apache.org>
AuthorDate: Fri May 10 21:47:03 2019 +0800
GROOVY-9111: Reduce the cost of transforming meta method(closes #925)
---
src/main/groovy/groovy/lang/MetaClassImpl.java | 2 +-
.../java/org/codehaus/groovy/runtime/callsite/CallSiteHelper.java | 7 ++++++-
src/main/java/org/codehaus/groovy/vmplugin/VMPlugin.java | 7 +++++--
src/main/java/org/codehaus/groovy/vmplugin/v5/Java5.java | 7 -------
src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java | 5 ++++-
5 files changed, 16 insertions(+), 12 deletions(-)
diff --git a/src/main/groovy/groovy/lang/MetaClassImpl.java b/src/main/groovy/groovy/lang/MetaClassImpl.java
index 171bf7c..84c806e 100644
--- a/src/main/groovy/groovy/lang/MetaClassImpl.java
+++ b/src/main/groovy/groovy/lang/MetaClassImpl.java
@@ -1276,7 +1276,7 @@ public class MetaClassImpl implements MetaClass, MutableMetaClass {
}
if (method != null) {
- MetaMethod transformedMetaMethod = CallSiteHelper.transformMetaMethod(this, method, MetaClassHelper.convertToTypeArray(arguments), MetaClassImpl.class);
+ MetaMethod transformedMetaMethod = CallSiteHelper.transformMetaMethod(this, method, () -> MetaClassHelper.convertToTypeArray(arguments), MetaClassImpl.class);
return transformedMetaMethod.doMethodInvoke(object, arguments);
} else {
return invokePropertyOrMissing(object, methodName, originalArguments, fromInsideClass, isCallToSuper);
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteHelper.java b/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteHelper.java
index 016c537..1d6cdef 100644
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteHelper.java
+++ b/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteHelper.java
@@ -23,11 +23,16 @@ import groovy.lang.MetaMethod;
import org.codehaus.groovy.vmplugin.VMPlugin;
import org.codehaus.groovy.vmplugin.VMPluginFactory;
+import java.util.function.Supplier;
+
public class CallSiteHelper {
private static final VMPlugin VM_PLUGIN = VMPluginFactory.getPlugin();
public static MetaMethod transformMetaMethod(MetaClass metaClass, MetaMethod metaMethod, Class<?>[] params, Class<?> caller) {
- return VM_PLUGIN.transformMetaMethod(metaClass, metaMethod, params, caller);
+ return transformMetaMethod(metaClass, metaMethod, () -> params, caller);
}
+ public static MetaMethod transformMetaMethod(MetaClass metaClass, MetaMethod metaMethod, Supplier<Class<?>[]> paramsSupplier, Class<?> caller) {
+ return VM_PLUGIN.transformMetaMethod(metaClass, metaMethod, paramsSupplier, caller);
+ }
}
diff --git a/src/main/java/org/codehaus/groovy/vmplugin/VMPlugin.java b/src/main/java/org/codehaus/groovy/vmplugin/VMPlugin.java
index 2848615..170d5a1 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/VMPlugin.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/VMPlugin.java
@@ -26,6 +26,7 @@ import org.codehaus.groovy.ast.CompileUnit;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Method;
+import java.util.function.Supplier;
/**
* Interface to access VM version based actions.
@@ -88,9 +89,11 @@ public interface VMPlugin {
*
* @param metaClass meta class
* @param metaMethod the original meta method
- * @param params parameter types
+ * @param paramsSupplier parameter types supplier
* @param caller caller type
* @return the transformed meta method
*/
- MetaMethod transformMetaMethod(MetaClass metaClass, MetaMethod metaMethod, Class<?>[] params, Class<?> caller);
+ default MetaMethod transformMetaMethod(MetaClass metaClass, MetaMethod metaMethod, Supplier<Class<?>[]> paramsSupplier, Class<?> caller) {
+ return metaMethod;
+ }
}
diff --git a/src/main/java/org/codehaus/groovy/vmplugin/v5/Java5.java b/src/main/java/org/codehaus/groovy/vmplugin/v5/Java5.java
index b8182d1..58c6ea3 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/v5/Java5.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/v5/Java5.java
@@ -18,8 +18,6 @@
*/
package org.codehaus.groovy.vmplugin.v5;
-import groovy.lang.MetaClass;
-import groovy.lang.MetaMethod;
import org.codehaus.groovy.GroovyBugError;
import org.codehaus.groovy.ast.AnnotatedNode;
import org.codehaus.groovy.ast.AnnotationNode;
@@ -584,11 +582,6 @@ public class Java5 implements VMPlugin {
}
}
- @Override
- public MetaMethod transformMetaMethod(MetaClass metaClass, MetaMethod metaMethod, Class<?>[] params, Class<?> caller) {
- return metaMethod;
- }
-
private static final Permission ACCESS_PERMISSION = new ReflectPermission("suppressAccessChecks");
}
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 882d900..c348121 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java
@@ -50,6 +50,7 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
+import java.util.function.Supplier;
import java.util.stream.Collectors;
/**
@@ -172,7 +173,7 @@ public class Java9 extends Java8 {
}
@Override
- public MetaMethod transformMetaMethod(MetaClass metaClass, MetaMethod metaMethod, Class<?>[] params, Class<?> caller) {
+ public MetaMethod transformMetaMethod(MetaClass metaClass, MetaMethod metaMethod, Supplier<Class<?>[]> paramsSupplier, Class<?> caller) {
if (!(metaMethod instanceof CachedMethod)) {
return metaMethod;
}
@@ -203,6 +204,7 @@ public class Java9 extends Java8 {
classList.add(theClass);
classList.addAll(superclassList);
+ Class<?>[] params = paramsSupplier.get();
for (Class<?> sc : classList) {
Optional<MetaMethod> optionalMetaMethod = getAccessibleMetaMethod(metaMethod, params, caller, sc);
if (optionalMetaMethod.isPresent()) {
@@ -219,6 +221,7 @@ public class Java9 extends Java8 {
// e.g. StringBuilder sb = new StringBuilder(); sb.setLength(0);
// `setLength` is the method of `AbstractStringBuilder`, which is `package-private`
if (declaringClass.isAssignableFrom(theClass)) {
+ Class<?>[] params = paramsSupplier.get();
Optional<MetaMethod> optionalMetaMethod = getAccessibleMetaMethod(metaMethod, params, caller, theClass);
if (optionalMetaMethod.isPresent()) {
return optionalMetaMethod.get();