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/08/07 08:51:49 UTC

[groovy] 01/01: Avoid unnecessary checking for object methods

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

sunlan pushed a commit to branch danielsun/minor-tweak-object-methods-check-20220807
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit f55bd7e239e1bbef1c8b1d69012e5af26860e7d2
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sun Aug 7 16:49:08 2022 +0800

    Avoid unnecessary checking for object methods
---
 src/main/java/org/codehaus/groovy/ast/ClassHelper.java | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/ClassHelper.java b/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
index d4daf9face..8b0d289a43 100644
--- a/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
+++ b/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
@@ -64,11 +64,13 @@ import java.lang.ref.SoftReference;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.implementsInterfaceOrIsSubclassOf;
@@ -566,7 +568,12 @@ public class ClassHelper {
             for (MethodNode mn : type.getAbstractMethods()) {
                 // ignore methods that will have an implementation
                 if (Traits.hasDefaultImplementation(mn)) continue;
-                if (OBJECT_TYPE.getDeclaredMethod(mn.getName(), mn.getParameters()) != null) continue;
+
+                final String name = mn.getName();
+                if (OBJECT_METHOD_NAME_SET.contains(name)) {
+                    // Avoid unnecessary checking for object methods as possible as we could
+                    if (OBJECT_TYPE.getDeclaredMethod(name, mn.getParameters()) != null) continue;
+                }
 
                 // we have two methods, so no SAM
                 if (sam != null) return null;
@@ -629,4 +636,7 @@ public class ClassHelper {
 
         return source.getUnresolvedSuperClass();
     }
+
+    private static final Set<String> OBJECT_METHOD_NAME_SET =
+            Collections.unmodifiableSet(OBJECT_TYPE.getAllDeclaredMethods().stream().map(m -> m.getName()).collect(Collectors.toSet()));
 }