// 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 @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 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" }