Rename foreignKotlinClass -> getOrCreateKotlinClass
Previously this cache contained only Java (hence 'foreign') classes, that is not the case anymore
This commit is contained in:
@@ -905,12 +905,11 @@ public class AsmUtil {
|
||||
}
|
||||
|
||||
public static void wrapJavaClassIntoKClass(@NotNull InstructionAdapter v) {
|
||||
v.invokestatic(REFLECTION, "foreignKotlinClass", Type.getMethodDescriptor(K_CLASS_TYPE, getType(Class.class)), false);
|
||||
v.invokestatic(REFLECTION, "getOrCreateKotlinClass", Type.getMethodDescriptor(K_CLASS_TYPE, getType(Class.class)), false);
|
||||
}
|
||||
|
||||
|
||||
public static void wrapJavaClassesIntoKClasses(@NotNull InstructionAdapter v) {
|
||||
v.invokestatic(REFLECTION, "foreignKotlinClasses", Type.getMethodDescriptor(K_CLASS_ARRAY_TYPE, getType(Class[].class)), false);
|
||||
v.invokestatic(REFLECTION, "getOrCreateKotlinClasses", Type.getMethodDescriptor(K_CLASS_ARRAY_TYPE, getType(Class[].class)), false);
|
||||
}
|
||||
|
||||
public static int getReceiverIndex(@NotNull CodegenContext context, @NotNull CallableMemberDescriptor descriptor) {
|
||||
|
||||
@@ -41,8 +41,8 @@ public class ReflectionFactoryImpl extends ReflectionFactory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public KClass foreignKotlinClass(Class javaClass) {
|
||||
return InternalPackage.foreignKotlinClass(javaClass);
|
||||
public KClass getOrCreateKotlinClass(Class javaClass) {
|
||||
return InternalPackage.getOrCreateKotlinClass(javaClass);
|
||||
}
|
||||
|
||||
// Functions
|
||||
@@ -85,4 +85,11 @@ public class ReflectionFactoryImpl extends ReflectionFactory {
|
||||
// TODO: support member extension property references
|
||||
return p;
|
||||
}
|
||||
|
||||
// Deprecated
|
||||
|
||||
@Override
|
||||
public KClass foreignKotlinClass(Class javaClass) {
|
||||
return getOrCreateKotlinClass(javaClass);
|
||||
}
|
||||
}
|
||||
|
||||
+5
-5
@@ -24,12 +24,12 @@ import kotlin.reflect.jvm.internal.pcollections.HashPMap
|
||||
// Arrays are needed because the same class can be loaded by different class loaders, which results in different Class instances.
|
||||
// This variable is not volatile intentionally: we don't care if there's a data race on it and some KClass instances will be lost.
|
||||
// We do care however about general performance on read access to it, thus no synchronization is done here whatsoever
|
||||
private var FOREIGN_K_CLASSES = HashPMap.empty<String, Any>()
|
||||
private var K_CLASS_CACHE = HashPMap.empty<String, Any>()
|
||||
|
||||
// This function is invoked on each reflection access to Java classes, properties, etc. Performance is critical here.
|
||||
fun <T : Any> foreignKotlinClass(jClass: Class<T>): KClassImpl<T> {
|
||||
fun <T : Any> getOrCreateKotlinClass(jClass: Class<T>): KClassImpl<T> {
|
||||
val name = jClass.getName()
|
||||
val cached = FOREIGN_K_CLASSES[name]
|
||||
val cached = K_CLASS_CACHE[name]
|
||||
if (cached is WeakReference<*>) {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
val kClass = cached.get() as KClassImpl<T>?
|
||||
@@ -56,11 +56,11 @@ fun <T : Any> foreignKotlinClass(jClass: Class<T>): KClassImpl<T> {
|
||||
System.arraycopy(cached, 0, newArray, 0, size)
|
||||
val newKClass = KClassImpl(jClass)
|
||||
newArray[size] = WeakReference(newKClass)
|
||||
FOREIGN_K_CLASSES = FOREIGN_K_CLASSES.plus(name, newArray)
|
||||
K_CLASS_CACHE = K_CLASS_CACHE.plus(name, newArray)
|
||||
return newKClass
|
||||
}
|
||||
|
||||
val newKClass = KClassImpl(jClass)
|
||||
FOREIGN_K_CLASSES = FOREIGN_K_CLASSES.plus(name, WeakReference(newKClass))
|
||||
K_CLASS_CACHE = K_CLASS_CACHE.plus(name, WeakReference(newKClass))
|
||||
return newKClass
|
||||
}
|
||||
@@ -39,18 +39,12 @@ public class Reflection {
|
||||
factory = impl != null ? impl : new ReflectionFactory();
|
||||
}
|
||||
|
||||
private static final KClass[] EMPTY_K_CLASS_ARRAY = new KClass[0];
|
||||
|
||||
public static KClass createKotlinClass(Class javaClass) {
|
||||
return factory.createKotlinClass(javaClass);
|
||||
}
|
||||
|
||||
public static KClass[] foreignKotlinClasses(Class[] javaClasses) {
|
||||
KClass[] kClasses = new KClass[javaClasses.length];
|
||||
for (int i = 0; i < javaClasses.length; i++) {
|
||||
kClasses[i] = foreignKotlinClass(javaClasses[i]);
|
||||
}
|
||||
return kClasses;
|
||||
}
|
||||
|
||||
public static KPackage createKotlinPackage(Class javaClass) {
|
||||
return factory.createKotlinPackage(javaClass);
|
||||
}
|
||||
@@ -59,8 +53,18 @@ public class Reflection {
|
||||
return factory.createKotlinPackage(javaClass, moduleName);
|
||||
}
|
||||
|
||||
public static KClass foreignKotlinClass(Class javaClass) {
|
||||
return factory.foreignKotlinClass(javaClass);
|
||||
public static KClass getOrCreateKotlinClass(Class javaClass) {
|
||||
return factory.getOrCreateKotlinClass(javaClass);
|
||||
}
|
||||
|
||||
public static KClass[] getOrCreateKotlinClasses(Class[] javaClasses) {
|
||||
int size = javaClasses.length;
|
||||
if (size == 0) return EMPTY_K_CLASS_ARRAY;
|
||||
KClass[] kClasses = new KClass[size];
|
||||
for (int i = 0; i < size; i++) {
|
||||
kClasses[i] = getOrCreateKotlinClass(javaClasses[i]);
|
||||
}
|
||||
return kClasses;
|
||||
}
|
||||
|
||||
// Functions
|
||||
@@ -94,4 +98,16 @@ public class Reflection {
|
||||
public static KMutableProperty2 mutableProperty2(MutablePropertyReference2 p) {
|
||||
return factory.mutableProperty2(p);
|
||||
}
|
||||
|
||||
// Deprecated
|
||||
|
||||
@Deprecated
|
||||
public static KClass foreignKotlinClass(Class javaClass) {
|
||||
return getOrCreateKotlinClass(javaClass);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static KClass[] foreignKotlinClasses(Class[] javaClasses) {
|
||||
return getOrCreateKotlinClasses(javaClasses);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ public class ReflectionFactory {
|
||||
return null;
|
||||
}
|
||||
|
||||
public KClass foreignKotlinClass(Class javaClass) {
|
||||
public KClass getOrCreateKotlinClass(Class javaClass) {
|
||||
return new ClassReference(javaClass);
|
||||
}
|
||||
|
||||
@@ -66,4 +66,11 @@ public class ReflectionFactory {
|
||||
public KMutableProperty2 mutableProperty2(MutablePropertyReference2 p) {
|
||||
return p;
|
||||
}
|
||||
|
||||
// Deprecated
|
||||
|
||||
@Deprecated
|
||||
public KClass foreignKotlinClass(Class javaClass) {
|
||||
return new ClassReference(javaClass);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user