From 5f2ba70745d93d97357dd3617953237ed47e736a Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Mon, 17 Oct 2016 13:44:51 +0300 Subject: [PATCH] KJS: use cached KClass instead create new each time when getting it from JsClass --- js/js.libraries/src/reflect/JsClass.kt | 3 ++- js/js.libraries/src/reflect/reflection.kt | 4 ++-- js/js.translator/testData/_commonFiles/asserts.kt | 7 +++++++ .../testData/box/reflection/kClassToAndFromJsClass.kt | 8 ++++---- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/js/js.libraries/src/reflect/JsClass.kt b/js/js.libraries/src/reflect/JsClass.kt index a373ab74ecd..7f4fddceccc 100644 --- a/js/js.libraries/src/reflect/JsClass.kt +++ b/js/js.libraries/src/reflect/JsClass.kt @@ -16,6 +16,7 @@ package kotlin.js +import getKClass import kotlin.reflect.KClass import kotlin.reflect.js.internal.KClassImpl @@ -36,4 +37,4 @@ val KClass.js: JsClass get() = (this as KClassImpl).jClass val JsClass.kotlin: KClass - get() = KClassImpl(this) + get() = getKClass(this) diff --git a/js/js.libraries/src/reflect/reflection.kt b/js/js.libraries/src/reflect/reflection.kt index e5ed63f3c04..00bbe42f367 100644 --- a/js/js.libraries/src/reflect/reflection.kt +++ b/js/js.libraries/src/reflect/reflection.kt @@ -20,9 +20,9 @@ import kotlin.reflect.KClass import kotlin.reflect.js.internal.KClassImpl @JsName("getKClass") -private fun getKClass(jClass: JsClass): KClass = getOrCreateKClass(jClass) +internal fun getKClass(jClass: JsClass): KClass = getOrCreateKClass(jClass) @JsName("getKClassFromExpression") -private fun getKClassFromExpression(e: T): KClass = getOrCreateKClass(e.jsClass) +internal fun getKClassFromExpression(e: T): KClass = getOrCreateKClass(e.jsClass) private fun getOrCreateKClass(jClass: JsClass): KClass { val metadata = jClass.asDynamic().`$metadata$` diff --git a/js/js.translator/testData/_commonFiles/asserts.kt b/js/js.translator/testData/_commonFiles/asserts.kt index 374b30db350..a5668657f19 100644 --- a/js/js.translator/testData/_commonFiles/asserts.kt +++ b/js/js.translator/testData/_commonFiles/asserts.kt @@ -18,6 +18,13 @@ fun assertNotEquals(illegal: T, actual: T, message: String? = null) { } } +fun assertSame(expected: T, actual: T, message: String? = null) { + if (expected !== actual) { + val msg = if (message == null) "" else (" message = '" + message + "',") + fail("Expected same instances, got expected = '$expected', actual = '$actual'") + } +} + fun assertArrayEquals(expected: Array, actual: Array, message: String? = null) { if (!arraysEqual(expected, actual)) { val msg = if (message == null) "" else (" message = '" + message + "',") diff --git a/js/js.translator/testData/box/reflection/kClassToAndFromJsClass.kt b/js/js.translator/testData/box/reflection/kClassToAndFromJsClass.kt index f6ce557c530..f629a1a86d2 100644 --- a/js/js.translator/testData/box/reflection/kClassToAndFromJsClass.kt +++ b/js/js.translator/testData/box/reflection/kClassToAndFromJsClass.kt @@ -6,10 +6,10 @@ fun check(k: KClass<*>, j: JsClass<*>) { assertNotEquals(null, k) assertNotEquals(null, j) - assertEquals(k.js, j) - assertEquals(k, j.kotlin) - assertEquals(j, j.kotlin.js) - assertEquals(k, k.js.kotlin) + assertSame(k.js, j) + assertSame(k, j.kotlin) + assertSame(j, j.kotlin.js) + assertSame(k, k.js.kotlin) } fun jsClassbyName(name: String) = js("JS_TESTS").foo[name]