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

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

commit 9f63675fa132a6776df7a25b9230c9861f9d2c36
Author: Daniel Sun <[email protected]>
AuthorDate: Sat Jan 30 00:54:34 2021 +0800

    GROOVY-9921: Replace legacy data structure with Java 
collection(SingleKeyHashMap)
---
 src/main/java/groovy/lang/MetaClassImpl.java        | 21 ++++++---------------
 .../groovy/runtime/metaclass/MetaMethodIndex.java   | 18 ++++++------------
 2 files changed, 12 insertions(+), 27 deletions(-)

diff --git a/src/main/java/groovy/lang/MetaClassImpl.java 
b/src/main/java/groovy/lang/MetaClassImpl.java
index cdf6865..67f9e15 100644
--- a/src/main/java/groovy/lang/MetaClassImpl.java
+++ b/src/main/java/groovy/lang/MetaClassImpl.java
@@ -3858,21 +3858,12 @@ public class MetaClassImpl implements MetaClass, 
MutableMetaClass {
 
     private abstract class MethodIndexAction {
         public void iterate() {
-            final ComplexKeyHashMap.Entry[] table = 
metaMethodIndex.methodHeaders.getTable();
-            int len = table.length;
-            for (int i = 0; i != len; ++i) {
-                for (SingleKeyHashMap.Entry classEntry = 
(SingleKeyHashMap.Entry) table[i];
-                     classEntry != null;
-                     classEntry = (SingleKeyHashMap.Entry) classEntry.next) {
-
-                    Class clazz = (Class) classEntry.getKey();
-
-                    if (skipClass(clazz)) continue;
-
-                    MetaMethodIndex.Header header = (MetaMethodIndex.Header) 
classEntry.getValue();
-                    for (MetaMethodIndex.Entry nameEntry = header.head; 
nameEntry != null; nameEntry = nameEntry.nextClassEntry) {
-                        methodNameAction(clazz, nameEntry);
-                    }
+            for (Map.Entry<Class, MetaMethodIndex.Header> classEntry : 
metaMethodIndex.methodHeaders.entrySet()) {
+                Class clazz = classEntry.getKey();
+                if (skipClass(clazz)) continue;
+                MetaMethodIndex.Header header = classEntry.getValue();
+                for (MetaMethodIndex.Entry nameEntry = header.head; nameEntry 
!= null; nameEntry = nameEntry.nextClassEntry) {
+                    methodNameAction(clazz, nameEntry);
                 }
             }
         }
diff --git 
a/src/main/java/org/codehaus/groovy/runtime/metaclass/MetaMethodIndex.java 
b/src/main/java/org/codehaus/groovy/runtime/metaclass/MetaMethodIndex.java
index 5720f53..c1a86bf 100644
--- a/src/main/java/org/codehaus/groovy/runtime/metaclass/MetaMethodIndex.java
+++ b/src/main/java/org/codehaus/groovy/runtime/metaclass/MetaMethodIndex.java
@@ -22,14 +22,15 @@ import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.GeneratedMetaMethod;
 import org.codehaus.groovy.util.FastArray;
-import org.codehaus.groovy.util.SingleKeyHashMap;
 
 import java.util.Arrays;
+import java.util.IdentityHashMap;
+import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Objects;
 
 public class MetaMethodIndex {
-    public SingleKeyHashMap methodHeaders = new SingleKeyHashMap();
+    public final Map<Class, Header> methodHeaders = new IdentityHashMap<>();
 
     public static class Header {
         public Entry head;
@@ -85,13 +86,11 @@ public class MetaMethodIndex {
         CachedClass last = null;
         if (!theCachedClass.isInterface()) {
             for (CachedClass c = theCachedClass; c != null; c = 
c.getCachedSuperClass()) {
-                final SingleKeyHashMap.Entry e = 
methodHeaders.getOrPut(c.getTheClass());
-                e.value = new Header(c.getTheClass(), last == null ? null : 
last.getTheClass());
+                methodHeaders.put(c.getTheClass(), new Header(c.getTheClass(), 
last == null ? null : last.getTheClass()));
                 last = c;
             }
         } else {
-            final SingleKeyHashMap.Entry e = 
methodHeaders.getOrPut(Object.class);
-            e.value = new Header(Object.class, theCachedClass.getTheClass());
+            methodHeaders.put(Object.class, new Header(Object.class, 
theCachedClass.getTheClass()));
         }
     }
 
@@ -237,12 +236,7 @@ public class MetaMethodIndex {
     }
 
     public Header getHeader(final Class cls) {
-        SingleKeyHashMap.Entry head = methodHeaders.getOrPut(cls);
-        if (head.value == null) {
-            head.value = new Header(cls);
-        }
-        Header header = (Header) head.value;
-        return header;
+        return methodHeaders.computeIfAbsent(cls, k -> new Header(cls));
     }
 
     public void copyNonPrivateMethods(final Class from, final Class to) {

Reply via email to