JS: cache PropertyMetadata objects in property delegates

Also, remove unused PropertyMetadata instances

See KT-20737, KT-20738
This commit is contained in:
Alexey Andreev
2017-10-17 17:36:38 +03:00
parent 7ebfba3722
commit 88441da131
8 changed files with 96 additions and 4 deletions
@@ -0,0 +1,40 @@
// EXPECTED_REACHABLE_NODES: 1144
import kotlin.reflect.KProperty
var lastGeneratedId = 0
val idMap = mutableMapOf<KProperty<*>, Int>()
class MyDelegate(val value: String) {
operator fun getValue(receiver: Any?, property: KProperty<*>): String {
val id = idMap.getOrPut(property) { lastGeneratedId++ }
return "${property.name}:$value:$id"
}
}
class C {
val foo by MyDelegate("C")
}
val bar by MyDelegate("toplevel")
fun box(): String {
val c = C()
var a = c.foo
var b = c.foo
if (a !== b) return "fail: member property referential equality"
if (!a.startsWith("foo:C:")) return "fail: member property value"
a = bar
b = bar
if (a !== b) return "fail: top level property referential equality"
if (!a.startsWith("bar:toplevel:")) return "fail: top level property value"
val baz by MyDelegate("local")
a = baz
b = baz
if (a !== b) return "fail: local property referential equality"
if (!a.startsWith("baz:local:")) return "fail: local property value"
return "OK"
}
@@ -0,0 +1,12 @@
// EXPECTED_REACHABLE_NODES: 1131
// PROPERTY_NOT_USED: PropertyMetadata
import kotlin.reflect.KProperty
class MyDelegate(val value: String) {
inline operator fun getValue(receiver: Any?, property: KProperty<*>): String = value
}
fun box(): String {
val x by MyDelegate("OK")
return x
}