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

emilles 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 0da8faffd3 remove layers
0da8faffd3 is described below

commit 0da8faffd3f86de3db5c13a40314e8eb84b1a0ae
Author: Eric Milles <[email protected]>
AuthorDate: Thu Feb 5 14:29:12 2026 -0600

    remove layers
---
 .../codehaus/groovy/vmplugin/v8/IndyInterface.java | 63 ++++++++--------------
 1 file changed, 22 insertions(+), 41 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/vmplugin/v8/IndyInterface.java 
b/src/main/java/org/codehaus/groovy/vmplugin/v8/IndyInterface.java
index 485c12cc85..b680af15db 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/v8/IndyInterface.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/v8/IndyInterface.java
@@ -23,7 +23,6 @@ import org.apache.groovy.util.SystemUtil;
 import org.codehaus.groovy.GroovyBugError;
 import org.codehaus.groovy.reflection.ClassInfo;
 import org.codehaus.groovy.runtime.GeneratedClosure;
-import org.codehaus.groovy.runtime.NullObject;
 
 import java.lang.invoke.CallSite;
 import java.lang.invoke.ConstantCallSite;
@@ -33,7 +32,6 @@ import java.lang.invoke.MethodType;
 import java.lang.invoke.MutableCallSite;
 import java.lang.invoke.SwitchPoint;
 import java.util.Map;
-import java.util.function.BiFunction;
 import java.util.function.Function;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -227,7 +225,8 @@ public class IndyInterface {
                 sender = sender.getEnclosingClass(); // GROOVY-2433
             }
         }
-        MethodHandle mh = makeAdapter(mc, sender, name, callID, type, safe, 
thisCall, spreadCall);
+        // make an adapter for method selection, i.e. get cached method handle 
(fast path) or fall back
+        MethodHandle mh = makeBootHandle(mc, sender, name, callID, type, safe, 
thisCall, spreadCall, FROM_CACHE_HANDLE_METHOD);
         mc.setTarget(mh);
         mc.setDefaultTarget(mh);
         mc.setFallbackTarget(makeFallBack(mc, sender, name, callID, type, 
safe, thisCall, spreadCall));
@@ -242,13 +241,6 @@ public class IndyInterface {
         return makeBootHandle(mc, sender, name, callID, type, safeNavigation, 
thisCall, spreadCall, SELECT_METHOD_HANDLE_METHOD);
     }
 
-    /**
-     * Makes an adapter method for method selection, i.e. get the cached 
method handle (fast path) or fallback.
-     */
-    private static MethodHandle makeAdapter(MutableCallSite mc, Class<?> 
sender, String name, int callID, MethodType type, boolean safeNavigation, 
boolean thisCall, boolean spreadCall) {
-        return makeBootHandle(mc, sender, name, callID, type, safeNavigation, 
thisCall, spreadCall, FROM_CACHE_HANDLE_METHOD);
-    }
-
     private static MethodHandle makeBootHandle(MutableCallSite mc, Class<?> 
sender, String name, int callID, MethodType type, boolean safeNavigation, 
boolean thisCall, boolean spreadCall, MethodHandle fromCacheOrSelectMethod) {
         final Object dummyReceiver = 1;
         // Step 1: bind site-constant arguments
@@ -328,22 +320,21 @@ public class IndyInterface {
     private static MethodHandle fromCacheHandle(CacheableCallSite callSite, 
Class<?> sender, String methodName, int callID, Boolean safeNavigation, Boolean 
thisCall, Boolean spreadCall, Object dummyReceiver, Object[] arguments) throws 
Throwable {
         FallbackSupplier fallbackSupplier = new FallbackSupplier(callSite, 
sender, methodName, callID, safeNavigation, thisCall, spreadCall, 
dummyReceiver, arguments);
 
-        MethodHandleWrapper mhw =
-                bypassCache(spreadCall, arguments)
-                    ? NULL_METHOD_HANDLE_WRAPPER
-                    : doWithCallSite(
-                            callSite, arguments,
-                            (cs, receiver) ->
-                                    cs.getAndPut(
-                                            receiver.getClass().getName(),
-                                            c -> {
-                                                MethodHandleWrapper fbMhw = 
fallbackSupplier.get();
-                                                return fbMhw.isCanSetTarget() 
? fbMhw : NULL_METHOD_HANDLE_WRAPPER;
-                                            }
-                                    )
-                    );
-
-        if (NULL_METHOD_HANDLE_WRAPPER == mhw) {
+        MethodHandleWrapper mhw;
+        if (bypassCache(spreadCall, arguments)) {
+            mhw = NULL_METHOD_HANDLE_WRAPPER;
+        } else {
+            Object receiver = arguments[0];
+            String receiverClassName = receiver != null ? 
receiver.getClass().getName() : "org.codehaus.groovy.runtime.NullObject";
+
+            mhw = callSite.getAndPut(receiverClassName, (theName) -> {
+                MethodHandleWrapper fallback = fallbackSupplier.get();
+                if (fallback.isCanSetTarget()) return fallback;
+                return NULL_METHOD_HANDLE_WRAPPER;
+            });
+        }
+
+        if (mhw == NULL_METHOD_HANDLE_WRAPPER) {
             mhw = fallbackSupplier.get();
         }
 
@@ -366,8 +357,8 @@ public class IndyInterface {
 
     private static boolean bypassCache(Boolean spreadCall, Object[] arguments) 
{
         if (spreadCall) return true;
-        final Object receiver = arguments[0];
-        return null != receiver && 
ClassInfo.getClassInfo(receiver.getClass()).hasPerInstanceMetaClasses();
+        Object receiver = arguments[0];
+        return receiver != null && 
ClassInfo.getClassInfo(receiver.getClass()).hasPerInstanceMetaClasses();
     }
 
     /**
@@ -397,7 +388,9 @@ public class IndyInterface {
         if (callSite.getTarget() == defaultTarget) {
             // correct the stale methodHandle in the inline cache of callsite
             // it is important but impacts the performance somehow when cache 
misses frequently
-            doWithCallSite(callSite, arguments, (cs, receiver) -> 
cs.put(receiver.getClass().getName(), mhw));
+            Object receiver = arguments[0];
+            String key = receiver != null ? receiver.getClass().getName() : 
"org.codehaus.groovy.runtime.NullObject";
+            callSite.put(key, mhw);
         }
 
         return mhw.getCachedMethodHandle();
@@ -414,18 +407,6 @@ public class IndyInterface {
         );
     }
 
-    private static <T> T doWithCallSite(MutableCallSite callSite, Object[] 
arguments, BiFunction<? super CacheableCallSite, ? super Object, ? extends T> 
f) {
-        if (callSite instanceof CacheableCallSite cacheableCallSite) {
-            Object receiver = arguments[0];
-
-            if (null == receiver) receiver = NullObject.getNullObject();
-
-            return f.apply(cacheableCallSite, receiver);
-        }
-
-        throw new GroovyBugError("CacheableCallSite is expected, but the 
actual callsite is: " + callSite);
-    }
-
     /**
      * @since 2.5.0
      */

Reply via email to