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 2021/02/01 12:15:51 UTC

[groovy] branch master updated: GROOVY-9921: Replace legacy data structure with Java collection(SingleKeyHashMap)

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

sunlan 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 7355590  GROOVY-9921: Replace legacy data structure with Java collection(SingleKeyHashMap)
7355590 is described below

commit 735559099506a548dc283cbe750cc35f1c56b6cb
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sat Jan 30 23:16:38 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 03126e2..6eba269 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.LinkedHashMap;
+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 LinkedHashMap<>(32);
 
     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) {