JS: fix behaviour of char-returning functions with multiple inheritance

See KT-19772
This commit is contained in:
Alexey Andreev
2017-09-26 12:55:53 +03:00
parent 13d6e96c2f
commit 46526db8f0
17 changed files with 401 additions and 17 deletions
+32
View File
@@ -0,0 +1,32 @@
// SKIP_MINIFICATION
fun foo(): Char = '1'
val p1: Char = '2'
var p2: Char = '3'
var p3: Char = '4'
get() = field + 1
set(value) {
field = value + 1
}
fun box(): String {
var root = eval("_")
var r = typeOf(root.foo())
if (r !== "number") return "fail1: $r"
r = typeOf(root.p1)
if (r !== "number") return "fail2: $r"
r = typeOf(root.p2)
if (r !== "number") return "fail3: $r"
r = typeOf(root.p3)
if (r !== "number") return "fail4: $r"
return "OK"
}
fun typeOf(x: dynamic): String = js("typeof x")
@@ -0,0 +1,24 @@
// EXPECTED_REACHABLE_NODES: 1099
private inline fun typeOf(x: dynamic): String = js("typeof x").unsafeCast<String>()
fun box(): String {
val arr = charArrayOf('A')
var r = typeOf(arr.iterator().asDynamic().nextChar())
if (r != "number") return "fail1: $r"
r = typeOf(arr.iterator().asDynamic().next())
if (r != "object") return "fail1a: $r"
var progression = 'A'..'Z'
r = typeOf(progression.asDynamic().first)
if (r != "number") return "fail2: $r"
r = typeOf(progression.asDynamic().last)
if (r != "number") return "fail3: $r"
r = typeOf(Char.asDynamic().MIN_HIGH_SURROGATE)
if (r != "number") return "fail4: $r"
return "OK"
}
fun getInt() = 65
+41
View File
@@ -0,0 +1,41 @@
// EXPECTED_REACHABLE_NODES: 1039
open class A {
fun foo(): Char = 'X'
}
interface I {
fun foo(): Any
}
class B : A(), I
fun typeOf(x: dynamic): String = js("typeof x")
fun box(): String {
val b = B()
val i: I = B()
val a: A = B()
val r1 = typeOf(b.asDynamic().foo())
if (r1 != "object") return "fail1: $r1"
val r2 = typeOf(i.asDynamic().foo())
if (r2 != "object") return "fail2: $r2"
val r3 = typeOf(a.asDynamic().foo())
if (r3 != "object") return "fail3: $r3"
val x4 = b.foo()
val r4 = typeOf(x4)
if (r4 != "number") return "fail4: $r4"
val x5 = i.foo()
val r5 = typeOf(x5)
if (r5 != "object") return "fail5: $r5"
val x6 = a.foo()
val r6 = typeOf(x6)
if (r6 != "number") return "fail6: $r6"
return "OK"
}
@@ -0,0 +1,70 @@
// EXPECTED_REACHABLE_NODES: 1039
open class A {
val foo: Char
get() = 'X'
var bar: Char = 'Y'
val baz: Char = 'Q'
var mutable: Char = 'W'
get() {
typeOfMutable += typeOf(field.asDynamic()) + ";"
return field + 1
}
set(value) {
typeOfMutable += typeOf(js("value")) + ";" + typeOf(value)
field = value
}
}
interface I {
val foo: Any
val bar: Any
val baz: Any
val mutable: Any
}
class B : A(), I
fun typeOf(x: dynamic): String = js("typeof x")
var typeOfMutable = ""
fun box(): String {
val a = B()
val b: I = B()
val r1 = typeOf(a.foo)
if (r1 != "number") return "fail1: $r1"
val r2 = typeOf(b.foo)
if (r2 != "object") return "fail2: $r2"
val r3 = typeOf(a.asDynamic().foo)
if (r3 != "object") return "fail3: $r3"
val r4 = typeOf(a.asDynamic().bar)
if (r4 != "object") return "fail4: $r4"
val r5 = typeOf(a.asDynamic().baz)
if (r5 != "object") return "fail5: $r5"
a.bar++
val r6 = typeOf(a.asDynamic().bar)
if (r6 != "object") return "fail6: $r6"
val r7 = typeOf(a.asDynamic().mutable)
if (r7 != "object") return "fail7: $r7"
a.mutable = 'E'
if (typeOfMutable != "number;object;number") return "fail8: $typeOfMutable"
val r9 = typeOf(a.mutable)
if (r9 != "number") return "fail9: $r9"
return "OK"
}
@@ -6,7 +6,8 @@ class CC(val s: CharSequence) : CharSequence by s, MyCharSequence {}
interface MyCharSequence {
val length: Int
operator fun get(index: Int): Char
// TODO: uncomment when it's possible to implement bridges for get/charCodeAt
//operator fun get(index: Int): Char
fun subSequence(startIndex: Int, endIndex: Int): CharSequence
}
@@ -25,17 +26,17 @@ fun box(): String {
val cc: CharSequence = CC(kotlin)
if (cc.length != 6) return "Fail 3: ${cc.length}"
if (cc.subSequence(0, 3) != kot) return "Fail 4"
if (cc[2] != 't') return "Fail 5: ${cc[2]}"
//if (cc[2] != 't') return "Fail 5: ${cc[2]}"
val mcc: MyCharSequence = CC(kotlin)
if (mcc.length != 6) return "Fail 6: ${mcc.length}"
if (mcc.subSequence(0, 3) != kot) return "Fail 7"
if (mcc[2] != 't') return "Fail 8: ${mcc[2]}"
//if (mcc[2] != 't') return "Fail 8: ${mcc[2]}"
val ccc = CC(cc)
if (ccc.length != 6) return "Fail 6: ${ccc.length}"
if (ccc.subSequence(0, 3) != kot) return "Fail 7"
if (ccc[2] != 't') return "Fail 8: ${ccc[2]}"
//if (ccc[2] != 't') return "Fail 8: ${ccc[2]}"
return "OK"
}