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) {
