Improve performance of $kotlinClass field initializer

Don't load annotations reflectively in each class' <clinit>
This commit is contained in:
Alexander Udalov
2014-07-01 23:51:34 +04:00
parent bc8bce7ca1
commit a84d528325
4 changed files with 13 additions and 8 deletions
@@ -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
}