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

emilles pushed a commit to branch GROOVY-5359
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit b7c0edfdb359c378d86667290351ed2089918d55
Author: Eric Milles <[email protected]>
AuthorDate: Thu Jan 22 20:54:41 2026 -0600

    GROOVY-5359: refactor `MetaClassImpl#invokeStaticMethod`
---
 src/main/java/groovy/lang/MetaClassImpl.java | 74 ++++++++++------------------
 1 file changed, 27 insertions(+), 47 deletions(-)

diff --git a/src/main/java/groovy/lang/MetaClassImpl.java 
b/src/main/java/groovy/lang/MetaClassImpl.java
index 2dcd9c6ca0..a7e53e6ebb 100644
--- a/src/main/java/groovy/lang/MetaClassImpl.java
+++ b/src/main/java/groovy/lang/MetaClassImpl.java
@@ -1468,73 +1468,53 @@ public class MetaClassImpl implements MetaClass, 
MutableMetaClass {
     }
 
     @Override
-    public Object invokeStaticMethod(Object object, String methodName, 
Object[] arguments) {
+    public Object invokeStaticMethod(final Object object, final String 
methodName, final Object[] arguments) {
         checkInitalised();
 
-        final Class sender = object instanceof Class ? (Class) object : 
object.getClass();
-        if (sender != theClass) {
-            MetaClass mc = registry.getMetaClass(sender);
-            return mc.invokeStaticMethod(sender, methodName, arguments);
-        }
-        if (sender == Class.class) {
-            return invokeMethod(object, methodName, arguments);
+        {
+            var sender = object instanceof Class ? (Class<?>) object : 
object.getClass();
+            if (sender != theClass) { MetaClass mc = 
registry.getMetaClass(sender);
+                return mc.invokeStaticMethod(sender, methodName, arguments);
+            }
+            if (sender == Class.class) {
+                return invokeMethod(object, methodName, arguments);
+            }
         }
 
-        if (arguments == null) arguments = EMPTY_ARGUMENTS;
+        Object[] nonNullArguments = arguments != null ? arguments.clone() : 
EMPTY_ARGUMENTS;
 
-        MetaMethod method = retrieveStaticMethod(methodName, arguments);
         // let's try to use the cache to find the method
-
+        MetaMethod method = retrieveStaticMethod(methodName, nonNullArguments);
         if (method != null) {
-            MetaClassHelper.unwrap(arguments);
-            return method.doMethodInvoke(object, arguments);
+            MetaClassHelper.unwrap(nonNullArguments);
+            return method.doMethodInvoke(object, nonNullArguments);
         }
-        Object prop = null;
+
+        Object propertyValue = null;
         try {
-            prop = getProperty(theClass, theClass, methodName, false, false);
+            propertyValue = getProperty(theClass, theClass, methodName, false, 
false);
         } catch (MissingPropertyException mpe) {
             // ignore
         }
-
-        if (prop instanceof Closure) {
-            return invokeStaticClosureProperty(arguments, prop);
+        if (propertyValue instanceof Closure closure) { // GROOVY-3422
+            return closure.getMetaClass().invokeMethod(theClass, closure, 
DO_CALL_METHOD, arguments, false, false);
         }
 
-        Object[] originalArguments = arguments.clone();
-        MetaClassHelper.unwrap(arguments);
+        Class<?>[] argumentTypes = 
MetaClassHelper.convertToTypeArray(nonNullArguments);
+        MetaClassHelper.unwrap(nonNullArguments);
 
-        Class superClass = sender.getSuperclass();
-        Class[] argClasses = MetaClassHelper.convertToTypeArray(arguments);
-        while (superClass != Object.class && superClass != null) {
+        for (var superClass = theClass.getSuperclass(); superClass != null; 
superClass = superClass.getSuperclass()) {
             MetaClass mc = registry.getMetaClass(superClass);
-            method = mc.getStaticMetaMethod(methodName, argClasses);
-            if (method != null) return method.doMethodInvoke(object, 
arguments);
-
-            try {
-                prop = mc.getProperty(superClass, superClass, methodName, 
false, false);
-            } catch (MissingPropertyException mpe) {
-                // ignore
-            }
-
-            if (prop instanceof Closure) {
-                return invokeStaticClosureProperty(originalArguments, prop);
-            }
-
-            superClass = superClass.getSuperclass();
+            method = mc.getStaticMetaMethod(methodName, argumentTypes);
+            if (method != null) return method.doMethodInvoke(object, 
nonNullArguments);
         }
 
-        if (prop != null) {
-            MetaClass propMC = registry.getMetaClass(prop.getClass());
-            return propMC.invokeMethod(prop, CALL_METHOD, arguments);
+        if (propertyValue != null) { // GROOVY-3284, GROOVY-9779
+            MetaClass mc = registry.getMetaClass(propertyValue.getClass());
+            return mc.invokeMethod(propertyValue, CALL_METHOD, 
nonNullArguments);
         }
 
-        return invokeStaticMissingMethod(sender, methodName, arguments);
-    }
-
-    private static Object invokeStaticClosureProperty(Object[] 
originalArguments, Object prop) {
-        Closure closure = (Closure) prop;
-        MetaClass delegateMetaClass = closure.getMetaClass();
-        return delegateMetaClass.invokeMethod(closure.getClass(), closure, 
DO_CALL_METHOD, originalArguments, false, false);
+        return invokeStaticMissingMethod(theClass, methodName, 
nonNullArguments);
     }
 
     private Object invokeStaticMissingMethod(Class sender, String methodName, 
Object[] arguments) {

Reply via email to