[Wasm] Imporove external interface support
* Support boxing/unboxing when casting to Any * Support ===, equals, hashCode, toString * Support adapting String in interop boundary
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
// TARGET_BACKEND: WASM
|
||||
// WITH_RUNTIME
|
||||
|
||||
// FILE: externals.js
|
||||
|
||||
function roundTrip(x) { return x; }
|
||||
|
||||
// FILE: externals.kt
|
||||
|
||||
external fun roundTrip(x: EI?): EI?
|
||||
|
||||
fun assertTrue(x: Boolean) {
|
||||
if (!x) error("assertTrue fail")
|
||||
}
|
||||
|
||||
fun assertFalse(x: Boolean) {
|
||||
if (x) error("assertFalse fail")
|
||||
}
|
||||
|
||||
external interface EI
|
||||
|
||||
@JsFun("() => null")
|
||||
external fun getNull(): EI?
|
||||
|
||||
@JsFun("() => undefined")
|
||||
external fun getUndefined(): EI?
|
||||
|
||||
@JsFun("(ref) => ref === null")
|
||||
external fun isJsNull(ref: EI?): Boolean
|
||||
|
||||
@JsFun("(ref) => ref === undefined")
|
||||
external fun isJsUndefined(ref: EI?): Boolean
|
||||
|
||||
@JsFun("() => null")
|
||||
external fun getJsNullAsNonNullable(): EI
|
||||
|
||||
@JsFun("() => undefined")
|
||||
external fun getJsUndefinedAsNonNullable(): EI
|
||||
|
||||
fun box(): String {
|
||||
val jsNull = getNull()
|
||||
val jsUndefined = getUndefined()
|
||||
|
||||
assertTrue(jsNull == null)
|
||||
assertTrue((jsNull as Any?) == null)
|
||||
assertTrue((jsNull as Any?) === null)
|
||||
assertTrue(jsUndefined == null)
|
||||
|
||||
assertTrue(isJsNull(null))
|
||||
assertTrue(isJsNull(null as EI?))
|
||||
assertTrue(isJsNull(null as? EI?))
|
||||
assertTrue(isJsNull(roundTrip(null)))
|
||||
assertTrue(isJsNull(jsNull))
|
||||
|
||||
assertFalse(isJsUndefined(null))
|
||||
assertTrue(isJsUndefined(jsUndefined))
|
||||
|
||||
// TODO: Should these fail?
|
||||
val n2 = getJsNullAsNonNullable()
|
||||
val ud2 = getJsUndefinedAsNonNullable()
|
||||
assertTrue(isJsNull(n2))
|
||||
assertTrue(isJsUndefined(ud2))
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user