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 <[email protected]>
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);
}