| // TARGET_BACKEND: WASM |
| // WITH_STDLIB |
| |
| // 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 |
| |
| fun getNull(): EI? = |
| js("null") |
| |
| fun getUndefined(): EI? = |
| js("undefined") |
| |
| fun isJsNull(ref: EI?): Boolean = |
| js("ref === null") |
| |
| fun isJsUndefined(ref: EI?): Boolean = |
| js("ref === undefined") |
| |
| fun getJsNullAsNonNullable(): EI = |
| js("null") |
| |
| fun getJsUndefinedAsNonNullable(): EI = |
| js("undefined") |
| |
| inline fun checkNPE(body: () -> Unit) { |
| var throwed = false |
| try { |
| body() |
| } catch (e: NullPointerException) { |
| throwed = true |
| } |
| assertTrue(throwed) |
| } |
| |
| 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)) |
| |
| checkNPE(::getJsNullAsNonNullable) |
| checkNPE(::getJsUndefinedAsNonNullable) |
| |
| return "OK" |
| } |