Improve performance of $kotlinClass field initializer
Don't load annotations reflectively in each class' <clinit>
This commit is contained in:
@@ -475,7 +475,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
||||
return;
|
||||
}
|
||||
|
||||
generateReflectionObjectField(state, classAsmType, v, method("kClass", K_CLASS_IMPL_TYPE, getType(Class.class)),
|
||||
generateReflectionObjectField(state, classAsmType, v, method("kClassFromKotlin", K_CLASS_IMPL_TYPE, getType(Class.class)),
|
||||
JvmAbi.KOTLIN_CLASS_FIELD_NAME, createOrGetClInitCodegen().v);
|
||||
}
|
||||
|
||||
|
||||
@@ -29,11 +29,13 @@ enum class KClassOrigin {
|
||||
private val KOTLIN_CLASS_ANNOTATION_CLASS = javaClass<KotlinClass>()
|
||||
private val KOTLIN_SYNTHETIC_CLASS_ANNOTATION_CLASS = javaClass<KotlinSyntheticClass>()
|
||||
|
||||
class KClassImpl<out T>(val jClass: Class<T>) : KClass<T> {
|
||||
class KClassImpl<out T>(val jClass: Class<T>, isKnownToBeKotlin: Boolean) : KClass<T> {
|
||||
// TODO: write metadata to local classes
|
||||
val origin: KClassOrigin =
|
||||
if (jClass.isAnnotationPresent(KOTLIN_CLASS_ANNOTATION_CLASS) ||
|
||||
jClass.isAnnotationPresent(KOTLIN_SYNTHETIC_CLASS_ANNOTATION_CLASS)) {
|
||||
private val origin: KClassOrigin =
|
||||
if (isKnownToBeKotlin ||
|
||||
jClass.isAnnotationPresent(KOTLIN_CLASS_ANNOTATION_CLASS) ||
|
||||
jClass.isAnnotationPresent(KOTLIN_SYNTHETIC_CLASS_ANNOTATION_CLASS)
|
||||
) {
|
||||
KClassOrigin.KOTLIN
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -19,7 +19,10 @@ package kotlin.reflect.jvm.internal
|
||||
import kotlin.reflect.*
|
||||
|
||||
fun <T> kClass(jClass: Class<T>): KClassImpl<T> =
|
||||
KClassImpl<T>(jClass)
|
||||
KClassImpl<T>(jClass, false)
|
||||
|
||||
fun <T> kClassFromKotlin(jClass: Class<T>): KClassImpl<T> =
|
||||
KClassImpl<T>(jClass, true)
|
||||
|
||||
fun kPackage(jClass: Class<*>): KPackageImpl =
|
||||
KPackageImpl(jClass)
|
||||
|
||||
@@ -53,13 +53,13 @@ fun <T> foreignKotlinClass(jClass: Class<T>): KClassImpl<T> {
|
||||
val newArray = arrayOfNulls<WeakReference<KClassImpl<*>>>(size + 1)
|
||||
// Don't use Arrays.copyOf because it works reflectively
|
||||
System.arraycopy(cached, 0, newArray, 0, size)
|
||||
val newKClass = KClassImpl<T>(jClass)
|
||||
val newKClass = kClass<T>(jClass)
|
||||
newArray[size] = WeakReference(newKClass)
|
||||
FOREIGN_K_CLASSES = FOREIGN_K_CLASSES.plus(name, newArray)
|
||||
return newKClass
|
||||
}
|
||||
|
||||
val newKClass = KClassImpl<T>(jClass)
|
||||
val newKClass = kClass<T>(jClass)
|
||||
FOREIGN_K_CLASSES = FOREIGN_K_CLASSES.plus(name, WeakReference(newKClass))
|
||||
return newKClass
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user