eric-milles opened a new pull request, #2372:
URL: https://github.com/apache/groovy/pull/2372

   `MetaClassImpl#invokeStaticMethod` checked for closure property before super 
class method followed by callable property.  As noted in the issue ticket, the 
property check can be expensive.  Therefore, I am proposing: check class for 
method, check super class for method, then check for callable property.
   
   I think this is compatible with STC, which checks for callable property 
here: 
https://github.com/apache/groovy/blob/c8ed37ef49d68b9bd57ef572d8ffea42ff57c70f/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java#L3818
   
   ```java
       public Object invokeStaticMethod(final Object object, final String 
methodName, final Object[] arguments) {
           // initialize and redirect until object class is theClass
   
           Object[] nonNullArguments = arguments != null ? arguments.clone() : 
EMPTY_ARGUMENTS;
   
           MetaMethod method = retrieveStaticMethod(methodName, 
nonNullArguments);
           if (method != null) {
               MetaClassHelper.unwrap(nonNullArguments);
               return method.doMethodInvoke(object, nonNullArguments);
           }
   
           Class<?>[] argumentTypes = 
MetaClassHelper.convertToTypeArray(nonNullArguments);
           MetaClassHelper.unwrap(nonNullArguments);
   
           for (var superClass = theClass.getSuperclass(); superClass != null; 
superClass = superClass.getSuperclass()) {
               MetaClass mc = registry.getMetaClass(superClass);
               method = mc.getStaticMetaMethod(methodName, argumentTypes);
               if (method != null) return method.doMethodInvoke(object, 
nonNullArguments);
           }
   
           Object propertyValue = null; // GROOVY-3284, GROOVY-3422, GROOVY-9779
           try {
               propertyValue = getProperty(theClass, theClass, methodName, 
false, false);
           } catch (MissingPropertyException ignore) {
           }
           if (propertyValue != null) {
               if (propertyValue instanceof Closure closure) {
                   return closure.getMetaClass().invokeMethod(theClass, 
closure, DO_CALL_METHOD, arguments, false, false);
               } else {
                   return 
registry.getMetaClass(propertyValue.getClass()).invokeMethod(propertyValue, 
CALL_METHOD, arguments);
               }
           }
   
           return invokeStaticMissingMethod(theClass, methodName, 
nonNullArguments);
       }
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to