diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 9425d6e31f1..2dc17723740 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -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); } diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt index fa339c7c336..9e8dee8842e 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt @@ -29,11 +29,13 @@ enum class KClassOrigin { private val KOTLIN_CLASS_ANNOTATION_CLASS = javaClass() private val KOTLIN_SYNTHETIC_CLASS_ANNOTATION_CLASS = javaClass() -class KClassImpl(val jClass: Class) : KClass { +class KClassImpl(val jClass: Class, isKnownToBeKotlin: Boolean) : KClass { // 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 { diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/factory.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/factory.kt index 5fa0730bf36..86d5d7d5bcf 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/factory.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/factory.kt @@ -19,7 +19,10 @@ package kotlin.reflect.jvm.internal import kotlin.reflect.* fun kClass(jClass: Class): KClassImpl = - KClassImpl(jClass) + KClassImpl(jClass, false) + +fun kClassFromKotlin(jClass: Class): KClassImpl = + KClassImpl(jClass, true) fun kPackage(jClass: Class<*>): KPackageImpl = KPackageImpl(jClass) diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/foreignKClasses.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/foreignKClasses.kt index adf795c49ce..acf8b1eb01b 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/foreignKClasses.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/foreignKClasses.kt @@ -53,13 +53,13 @@ fun foreignKotlinClass(jClass: Class): KClassImpl { val newArray = arrayOfNulls>>(size + 1) // Don't use Arrays.copyOf because it works reflectively System.arraycopy(cached, 0, newArray, 0, size) - val newKClass = KClassImpl(jClass) + val newKClass = kClass(jClass) newArray[size] = WeakReference(newKClass) FOREIGN_K_CLASSES = FOREIGN_K_CLASSES.plus(name, newArray) return newKClass } - val newKClass = KClassImpl(jClass) + val newKClass = kClass(jClass) FOREIGN_K_CLASSES = FOREIGN_K_CLASSES.plus(name, WeakReference(newKClass)) return newKClass }