This is an automated email from the ASF dual-hosted git repository. paulk 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 bd73ba82dc partial cleanup of reflection cache bd73ba82dc is described below commit bd73ba82dcb9b68ded7ee6aee25032468a5ce064 Author: Jochen Theodorou <blackd...@gmx.org> AuthorDate: Wed Dec 20 23:01:45 2023 +0100 partial cleanup of reflection cache --- src/main/java/groovy/lang/MetaClassImpl.java | 3 +- .../codehaus/groovy/reflection/CachedClass.java | 42 +++++++++----- .../codehaus/groovy/reflection/ParameterTypes.java | 3 +- .../groovy/reflection/ReflectionCache.java | 67 ---------------------- .../reflection/stdclasses/CachedSAMClass.java | 3 +- .../reflection/stdclasses/StringCachedClass.java | 3 +- .../groovy/runtime/DefaultGroovyMethods.java | 2 +- .../codehaus/groovy/runtime/MetaClassHelper.java | 9 +-- .../typehandling/DefaultTypeTransformation.java | 8 +-- 9 files changed, 42 insertions(+), 98 deletions(-) diff --git a/src/main/java/groovy/lang/MetaClassImpl.java b/src/main/java/groovy/lang/MetaClassImpl.java index 184ba97618..c253e2b5f0 100644 --- a/src/main/java/groovy/lang/MetaClassImpl.java +++ b/src/main/java/groovy/lang/MetaClassImpl.java @@ -117,7 +117,6 @@ import static groovy.lang.Tuple.tuple; import static java.lang.Character.isUpperCase; import static org.apache.groovy.util.Arrays.concat; import static org.codehaus.groovy.ast.tools.GeneralUtils.inSamePackage; -import static org.codehaus.groovy.reflection.ReflectionCache.isAssignableFrom; import static org.codehaus.groovy.reflection.ReflectionUtils.checkAccessible; /** @@ -597,7 +596,7 @@ public class MetaClassImpl implements MetaClass, MutableMetaClass { boolean skip = false; // skip DGM methods on an interface if the class already has the method // but don't skip for GroovyObject-related methods as it breaks things :-( - if (method instanceof GeneratedMetaMethod && !isAssignableFrom(GroovyObject.class, method.getDeclaringClass().getTheClass())) { + if (method instanceof GeneratedMetaMethod && !GroovyObject.class.isAssignableFrom(method.getDeclaringClass().getTheClass())) { final String generatedMethodName = method.getName(); final CachedClass[] generatedMethodParameterTypes = method.getParameterTypes(); for (Method m : (null == theClassMethods ? theClassMethods = theClass.getMethods() : theClassMethods)) { diff --git a/src/main/java/org/codehaus/groovy/reflection/CachedClass.java b/src/main/java/org/codehaus/groovy/reflection/CachedClass.java index 52f215d6ae..a80d27ceb4 100644 --- a/src/main/java/org/codehaus/groovy/reflection/CachedClass.java +++ b/src/main/java/org/codehaus/groovy/reflection/CachedClass.java @@ -242,14 +242,6 @@ public class CachedClass { modifiers = klazz.getModifiers(); isInterface = klazz.isInterface(); isNumber = Number.class.isAssignableFrom(klazz); - - for (CachedClass inf : getInterfaces()) { - ReflectionCache.isAssignableFrom(klazz, inf.cachedClass); - } - - for (CachedClass cur = this; cur != null; cur = cur.getCachedSuperClass()) { - ReflectionCache.setAssignableFrom(cur.cachedClass, klazz); - } } public CachedClass getCachedSuperClass() { @@ -282,7 +274,7 @@ public class CachedClass { CachedMethod res = null; for (CachedMethod m : methods) { if (m.getName().equals(name) - && ReflectionCache.arrayContentsEq(parameterTypes, m.getParameterTypes()) + && arrayContentsEq(parameterTypes, m.getParameterTypes()) && (res == null || res.getReturnType().isAssignableFrom(m.getReturnType()))) res = m; } @@ -290,6 +282,28 @@ public class CachedClass { return res; } + private static boolean arrayContentsEq(Object[] a1, Object[] a2) { + if (a1 == null) { + return a2 == null || a2.length == 0; + } + + if (a2 == null) { + return a1.length == 0; + } + + if (a1.length != a2.length) { + return false; + } + + for (int i = 0; i < a1.length; i++) { + if (a1[i] != a2[i]) { + return false; + } + } + + return true; + } + public int getModifiers() { return modifiers; } @@ -339,7 +353,7 @@ public class CachedClass { return BytecodeHelper.getTypeDescription(getTheClass()); } - public final Class getTheClass() { + public final Class<?> getTheClass() { return cachedClass; } @@ -470,18 +484,18 @@ public class CachedClass { res.addAll(Arrays.asList(classInfo.newMetaMethods)); res.addAll(arr); classInfo.newMetaMethods = res.toArray(MetaMethod.EMPTY_ARRAY); - Class theClass = classInfo.getCachedClass().getTheClass(); + var theClass = classInfo.getCachedClass().getTheClass(); if (theClass == Closure.class || theClass == Class.class) { ClosureMetaClass.resetCachedMetaClasses(); } } - public boolean isAssignableFrom(Class argument) { - return argument == null || ReflectionCache.isAssignableFrom(getTheClass(), argument); + public boolean isAssignableFrom(Class<?> argument) { + return argument == null || getTheClass().isAssignableFrom(argument); } public boolean isDirectlyAssignable(Object argument) { - return ReflectionCache.isAssignableFrom(getTheClass(), argument.getClass()); + return getTheClass().isAssignableFrom(argument.getClass()); } public CallSiteClassLoader getCallSiteLoader() { diff --git a/src/main/java/org/codehaus/groovy/reflection/ParameterTypes.java b/src/main/java/org/codehaus/groovy/reflection/ParameterTypes.java index f5b442b497..d610cc0aea 100644 --- a/src/main/java/org/codehaus/groovy/reflection/ParameterTypes.java +++ b/src/main/java/org/codehaus/groovy/reflection/ParameterTypes.java @@ -19,6 +19,7 @@ package org.codehaus.groovy.reflection; import org.codehaus.groovy.GroovyBugError; +import org.codehaus.groovy.classgen.asm.util.TypeUtil; import org.codehaus.groovy.runtime.MetaClassHelper; import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation; import org.codehaus.groovy.runtime.wrappers.Wrapper; @@ -181,7 +182,7 @@ public class ParameterTypes { MetaClassHelper.unwrap(unwrappedArguments); // get type of each vargs element -- arguments are not primitive - vaType = ReflectionCache.autoboxType(vaType.getComponentType()); + vaType = TypeUtil.autoboxType(vaType.getComponentType()); if (aCount == pCount - 1) { // one argument is missing, so fill it with an empty array diff --git a/src/main/java/org/codehaus/groovy/reflection/ReflectionCache.java b/src/main/java/org/codehaus/groovy/reflection/ReflectionCache.java index 36795f29b7..fe4d4f59c0 100644 --- a/src/main/java/org/codehaus/groovy/reflection/ReflectionCache.java +++ b/src/main/java/org/codehaus/groovy/reflection/ReflectionCache.java @@ -18,73 +18,7 @@ */ package org.codehaus.groovy.reflection; -import org.codehaus.groovy.classgen.asm.util.TypeUtil; -import org.codehaus.groovy.util.TripleKeyHashMap; - public class ReflectionCache { - public static Class autoboxType(Class type) { - return TypeUtil.autoboxType(type); - } - - @Deprecated - static TripleKeyHashMap mopNames = new TripleKeyHashMap(); - - @Deprecated // the method is never called - public static String getMOPMethodName(CachedClass declaringClass, String name, boolean useThis) { - TripleKeyHashMap.Entry mopNameEntry = mopNames.getOrPut(declaringClass, name, useThis); - if (mopNameEntry.value == null) { - mopNameEntry.value = (useThis ? "this$" : "super$") + declaringClass.getSuperClassDistance() + "$" + name; - } - return (String) mopNameEntry.value; - } - - static final CachedClass STRING_CLASS = getCachedClass(String.class); - - public static boolean isArray(Class klazz) { - return klazz.isArray(); - } - - static void setAssignableFrom(Class klazz, Class aClass) { - // FIXME no implementation? -// SoftDoubleKeyMap.Entry val = (SoftDoubleKeyMap.Entry) assignableMap.getOrPut(klazz, aClass, null); -// if (val.getValue() == null) { -// val.setValue(Boolean.TRUE); -// } - } - - public static boolean isAssignableFrom(Class klazz, Class aClass) { - if (klazz == aClass) - return true; - -// SoftDoubleKeyMap.Entry val = (SoftDoubleKeyMap.Entry) assignableMap.getOrPut(klazz, aClass, null); -// if (val.getValue() == null) { -// val.setValue(Boolean.valueOf(klazz.isAssignableFrom(aClass))); -// } -// return ((Boolean)val.getValue()).booleanValue(); - return klazz.isAssignableFrom(aClass); - } - - static boolean arrayContentsEq(Object[] a1, Object[] a2) { - if (a1 == null) { - return a2 == null || a2.length == 0; - } - - if (a2 == null) { - return a1.length == 0; - } - - if (a1.length != a2.length) { - return false; - } - - for (int i = 0; i < a1.length; i++) { - if (a1[i] != a2[i]) { - return false; - } - } - - return true; - } public static final CachedClass OBJECT_CLASS = getCachedClass(Object.class); @@ -96,5 +30,4 @@ public class ReflectionCache { return ClassInfo.getClassInfo(klazz).getCachedClass(); } - } diff --git a/src/main/java/org/codehaus/groovy/reflection/stdclasses/CachedSAMClass.java b/src/main/java/org/codehaus/groovy/reflection/stdclasses/CachedSAMClass.java index e75b9eb5e8..e8329ab4cf 100644 --- a/src/main/java/org/codehaus/groovy/reflection/stdclasses/CachedSAMClass.java +++ b/src/main/java/org/codehaus/groovy/reflection/stdclasses/CachedSAMClass.java @@ -23,7 +23,6 @@ import groovy.util.ProxyGenerator; import org.codehaus.groovy.GroovyBugError; import org.codehaus.groovy.reflection.CachedClass; import org.codehaus.groovy.reflection.ClassInfo; -import org.codehaus.groovy.reflection.ReflectionCache; import org.codehaus.groovy.runtime.ConvertedClosure; import org.codehaus.groovy.transform.trait.Traits; @@ -55,7 +54,7 @@ public class CachedSAMClass extends CachedClass { public boolean isAssignableFrom(Class argument) { return argument == null || Closure.class.isAssignableFrom(argument) - || ReflectionCache.isAssignableFrom(getTheClass(), argument); + || getTheClass().isAssignableFrom(argument); } @Override diff --git a/src/main/java/org/codehaus/groovy/reflection/stdclasses/StringCachedClass.java b/src/main/java/org/codehaus/groovy/reflection/stdclasses/StringCachedClass.java index 37b2e90270..47d01262cf 100644 --- a/src/main/java/org/codehaus/groovy/reflection/stdclasses/StringCachedClass.java +++ b/src/main/java/org/codehaus/groovy/reflection/stdclasses/StringCachedClass.java @@ -21,7 +21,6 @@ package org.codehaus.groovy.reflection.stdclasses; import groovy.lang.GString; import org.codehaus.groovy.reflection.CachedClass; import org.codehaus.groovy.reflection.ClassInfo; -import org.codehaus.groovy.reflection.ReflectionCache; public class StringCachedClass extends CachedClass { private static final Class STRING_CLASS = String.class; @@ -40,7 +39,7 @@ public class StringCachedClass extends CachedClass { public boolean isAssignableFrom(Class classToTransformFrom) { return classToTransformFrom == null || classToTransformFrom == STRING_CLASS - || ReflectionCache.isAssignableFrom(GSTRING_CLASS,classToTransformFrom); + || GSTRING_CLASS.isAssignableFrom(classToTransformFrom); } @Override diff --git a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java index 555b54231b..f14b2dc077 100644 --- a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java +++ b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java @@ -1258,7 +1258,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport { return (T) stack; } - if (clazz!=String[].class && ReflectionCache.isArray(clazz)) { + if (clazz!=String[].class && clazz.isArray()) { try { return (T) asArrayType(col, clazz); } catch (GroovyCastException e) { diff --git a/src/main/java/org/codehaus/groovy/runtime/MetaClassHelper.java b/src/main/java/org/codehaus/groovy/runtime/MetaClassHelper.java index 18ecedd3b8..44cb3f4e45 100644 --- a/src/main/java/org/codehaus/groovy/runtime/MetaClassHelper.java +++ b/src/main/java/org/codehaus/groovy/runtime/MetaClassHelper.java @@ -25,6 +25,7 @@ import groovy.lang.GroovyRuntimeException; import groovy.lang.MetaClass; import groovy.lang.MetaMethod; import org.apache.groovy.util.BeanUtils; +import org.codehaus.groovy.classgen.asm.util.TypeUtil; import org.codehaus.groovy.reflection.CachedClass; import org.codehaus.groovy.reflection.ParameterTypes; import org.codehaus.groovy.reflection.ReflectionCache; @@ -344,7 +345,7 @@ public class MetaClassHelper { } Method sam; - for (Class<?> c = ReflectionCache.autoboxType(argument); c != null && c != parameterClass; c = c.getSuperclass()) { + for (Class<?> c = TypeUtil.autoboxType(argument); c != null && c != parameterClass; c = c.getSuperclass()) { if (c == Closure.class && parameterClass.isInterface() && (sam = getSAMMethod(parameterClass)) != null) { // In the case of multiple overloads, give preference to equal parameter count // with fuzzy matching of length for implicit arg Closures @@ -745,8 +746,8 @@ public class MetaClassHelper { return true; } - classToTransformTo = ReflectionCache.autoboxType(classToTransformTo); - classToTransformFrom = ReflectionCache.autoboxType(classToTransformFrom); + classToTransformTo = TypeUtil.autoboxType(classToTransformTo); + classToTransformFrom = TypeUtil.autoboxType(classToTransformFrom); if (classToTransformTo == classToTransformFrom) return true; // note: there is no coercion for boolean and char. Range matters, precision doesn't @@ -793,7 +794,7 @@ public class MetaClassHelper { } } - return ReflectionCache.isAssignableFrom(classToTransformTo, classToTransformFrom); + return classToTransformTo.isAssignableFrom(classToTransformFrom); } private static boolean isIntegerLongShortByte(Class classToTransformFrom) { diff --git a/src/main/java/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java b/src/main/java/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java index 30238c2212..f48d1143ef 100644 --- a/src/main/java/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java +++ b/src/main/java/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java @@ -21,7 +21,7 @@ package org.codehaus.groovy.runtime.typehandling; import groovy.lang.Closure; import groovy.lang.GString; import groovy.lang.GroovyRuntimeException; -import org.codehaus.groovy.reflection.ReflectionCache; +import org.codehaus.groovy.classgen.asm.util.TypeUtil; import org.codehaus.groovy.reflection.stdclasses.CachedSAMClass; import org.codehaus.groovy.runtime.DefaultGroovyMethods; import org.codehaus.groovy.runtime.FormatHelper; @@ -60,8 +60,6 @@ import java.util.stream.DoubleStream; import java.util.stream.IntStream; import java.util.stream.LongStream; -import static org.codehaus.groovy.reflection.ReflectionCache.isArray; - /** * Class providing various type conversions, coercions and boxing/unboxing operations. */ @@ -235,7 +233,7 @@ public class DefaultTypeTransformation { return object; } - if (isArray(type)) { + if (type.isArray()) { return asArray(object, type); } else if (type.isEnum()) { return ShortTypeHandling.castToEnum(object, type); @@ -743,7 +741,7 @@ public class DefaultTypeTransformation { public static Object[] primitiveArrayBox(Object array) { int size = Array.getLength(array); - Object[] ret = (Object[]) Array.newInstance(ReflectionCache.autoboxType(array.getClass().getComponentType()), size); + Object[] ret = (Object[]) Array.newInstance(TypeUtil.autoboxType(array.getClass().getComponentType()), size); for (int i = 0; i < size; i++) { ret[i] = Array.get(array, i); }