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 2022/05/14 05:38:17 UTC
[groovy] 01/01: Tweak guards for receiver and parameters
This is an automated email from the ASF dual-hosted git repository.
sunlan pushed a commit to branch danielsun/lab-indy-20220514
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 95aa884023de2ea4e5850bbf066e433ee627233d
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sat May 14 13:33:23 2022 +0800
Tweak guards for receiver and parameters
---
.../v8/IndyGuardsFiltersAndSignatures.java | 21 +++++++++++++++-
.../org/codehaus/groovy/vmplugin/v8/Selector.java | 29 ++++------------------
2 files changed, 25 insertions(+), 25 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/vmplugin/v8/IndyGuardsFiltersAndSignatures.java b/src/main/java/org/codehaus/groovy/vmplugin/v8/IndyGuardsFiltersAndSignatures.java
index b358d6e4b9..2ab2767124 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/v8/IndyGuardsFiltersAndSignatures.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/v8/IndyGuardsFiltersAndSignatures.java
@@ -59,7 +59,7 @@ public class IndyGuardsFiltersAndSignatures {
INVOKER = MethodType.methodType(Object.class, Object.class, String.class, Object[].class);
protected static final MethodHandle
- SAME_CLASS, SAME_MC, IS_NULL,
+ SAME_CLASS, SAME_CLASSES, SAME_MC, IS_NULL,
UNWRAP_METHOD, UNWRAP_EXCEPTION,
HAS_CATEGORY_IN_CURRENT_THREAD_GUARD,
META_METHOD_INVOKER, GROOVY_OBJECT_INVOKER, GROOVY_OBJECT_GET_PROPERTY,
@@ -78,6 +78,7 @@ public class IndyGuardsFiltersAndSignatures {
static {
try {
SAME_CLASS = LOOKUP.findStatic(IndyGuardsFiltersAndSignatures.class, "sameClass", MethodType.methodType(boolean.class, Class.class, Object.class));
+ SAME_CLASSES = LOOKUP.findStatic(IndyGuardsFiltersAndSignatures.class, "sameClasses", MethodType.methodType(boolean.class, Object[].class, Object[].class));
SAME_MC = LOOKUP.findStatic(IndyGuardsFiltersAndSignatures.class, "isSameMetaClass", MethodType.methodType(boolean.class, MetaClass.class, Object.class));
IS_NULL = LOOKUP.findStatic(IndyGuardsFiltersAndSignatures.class, "isNull", OBJECT_GUARD);
UNWRAP_METHOD = LOOKUP.findStatic(IndyGuardsFiltersAndSignatures.class, "unwrap", OBJECT_FILTER);
@@ -196,4 +197,22 @@ public class IndyGuardsFiltersAndSignatures {
if (o == null) return false;
return o.getClass() == c;
}
+
+ /**
+ * Guard to check if the provided objects have the same
+ * class as the other provided objects.
+ */
+ public static boolean sameClasses(Object[] cs, Object[] os) {
+ for (int i = 0; i < cs.length; i++) {
+ Object c = cs[i];
+ if (null == c) continue;
+
+ Object o = os[i];
+ if (null == o) return false;
+
+ if (o.getClass() != c.getClass())
+ return false;
+ }
+ return true;
+ }
}
diff --git a/src/main/java/org/codehaus/groovy/vmplugin/v8/Selector.java b/src/main/java/org/codehaus/groovy/vmplugin/v8/Selector.java
index 713810f68a..99a67ea3b5 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/v8/Selector.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/v8/Selector.java
@@ -85,7 +85,7 @@ import static org.codehaus.groovy.vmplugin.v8.IndyGuardsFiltersAndSignatures.MOP
import static org.codehaus.groovy.vmplugin.v8.IndyGuardsFiltersAndSignatures.MOP_INVOKE_CONSTRUCTOR;
import static org.codehaus.groovy.vmplugin.v8.IndyGuardsFiltersAndSignatures.MOP_INVOKE_METHOD;
import static org.codehaus.groovy.vmplugin.v8.IndyGuardsFiltersAndSignatures.NULL_REF;
-import static org.codehaus.groovy.vmplugin.v8.IndyGuardsFiltersAndSignatures.SAME_CLASS;
+import static org.codehaus.groovy.vmplugin.v8.IndyGuardsFiltersAndSignatures.SAME_CLASSES;
import static org.codehaus.groovy.vmplugin.v8.IndyGuardsFiltersAndSignatures.SAME_MC;
import static org.codehaus.groovy.vmplugin.v8.IndyGuardsFiltersAndSignatures.SAM_CONVERSION;
import static org.codehaus.groovy.vmplugin.v8.IndyGuardsFiltersAndSignatures.UNWRAP_EXCEPTION;
@@ -923,29 +923,10 @@ public abstract class Selector {
// guards for receiver and parameter
Class<?>[] pt = handle.type().parameterArray();
- for (int i = 0; i < args.length; i++) {
- Object arg = args[i];
- Class<?> paramType = pt[i];
- MethodHandle test;
-
- if (arg == null) {
- test = IS_NULL.asType(MethodType.methodType(boolean.class, paramType));
- if (LOG_ENABLED) LOG.info("added null argument check at pos " + i);
- } else {
- if (Modifier.isFinal(paramType.getModifiers())) {
- // primitive types are also `final`
- continue;
- }
- test = SAME_CLASS.
- bindTo(arg.getClass()).
- asType(MethodType.methodType(boolean.class, paramType));
- if (LOG_ENABLED) LOG.info("added same class check at pos " + i);
- }
- Class<?>[] drops = new Class[i];
- System.arraycopy(pt, 0, drops, 0, drops.length);
- test = MethodHandles.dropArguments(test, 0, drops);
- handle = MethodHandles.guardWithTest(test, handle, fallback);
- }
+ MethodHandle test = SAME_CLASSES.bindTo(args)
+ .asCollector(Object[].class, pt.length)
+ .asType(MethodType.methodType(boolean.class, pt));
+ handle = MethodHandles.guardWithTest(test, handle, fallback);
}
/**