[WASM] Support nullable types for external functions
This commit is contained in:
@@ -0,0 +1,161 @@
|
||||
// IGNORE_BACKEND: JS_IR, JS
|
||||
|
||||
inline fun checkNPE(body: () -> Unit) {
|
||||
var throwed = false
|
||||
try {
|
||||
body()
|
||||
} catch (e: NullPointerException) {
|
||||
throwed = true
|
||||
}
|
||||
check(throwed)
|
||||
}
|
||||
|
||||
@JsFun("() => 'abc'")
|
||||
external fun notNullString(): String
|
||||
|
||||
@JsFun("() => null")
|
||||
external fun notNull2String(): String
|
||||
|
||||
@JsFun("() => 'abc'")
|
||||
external fun nullString(): String?
|
||||
|
||||
@JsFun("() => null")
|
||||
external fun null2String(): String?
|
||||
|
||||
fun testString() {
|
||||
check(notNullString() == "abc")
|
||||
checkNPE { notNull2String() }
|
||||
check(nullString() == "abc")
|
||||
check(null2String() == null)
|
||||
}
|
||||
|
||||
external interface ExternRef
|
||||
|
||||
@JsFun("() => 'abc'")
|
||||
external fun notNullExternRef(): ExternRef
|
||||
|
||||
@JsFun("() => null")
|
||||
external fun notNull2ExternRef(): ExternRef
|
||||
|
||||
@JsFun("() => 'abc'")
|
||||
external fun nullExternRef(): ExternRef?
|
||||
|
||||
@JsFun("() => null")
|
||||
external fun null2ExternRef(): ExternRef?
|
||||
|
||||
|
||||
fun testExterRef() {
|
||||
check(notNullExternRef() != null)
|
||||
checkNPE { notNull2ExternRef() }
|
||||
check(nullExternRef() != null)
|
||||
check(null2ExternRef() == null)
|
||||
}
|
||||
|
||||
class DataRef
|
||||
|
||||
@JsFun("(x) => x")
|
||||
external fun notNullDataRef(x: DataRef): DataRef
|
||||
|
||||
@JsFun("(x) => null")
|
||||
external fun notNull2DataRef(x: DataRef): DataRef
|
||||
|
||||
@JsFun("(x) => x")
|
||||
external fun nullDataRef(x: DataRef): DataRef?
|
||||
|
||||
@JsFun("(x) => null")
|
||||
external fun null2DataRef(x: DataRef): DataRef?
|
||||
|
||||
fun testDataRef() {
|
||||
val dataRef = DataRef()
|
||||
check(notNullDataRef(dataRef) == dataRef)
|
||||
checkNPE { notNull2DataRef(dataRef) }
|
||||
check (nullDataRef(dataRef) == dataRef)
|
||||
check (null2DataRef(dataRef) == null)
|
||||
}
|
||||
|
||||
@JsFun("() => 123")
|
||||
external fun notNullInt(): Int
|
||||
|
||||
@JsFun("() => null")
|
||||
external fun notNull2Int(): Int
|
||||
|
||||
@JsFun("() => 123")
|
||||
external fun nullInt(): Int?
|
||||
|
||||
@JsFun("() => null")
|
||||
external fun null2Int(): Int?
|
||||
|
||||
fun testInt() {
|
||||
check(notNullInt() == 123)
|
||||
check(notNull2Int() == 0)
|
||||
check(nullInt() == 123)
|
||||
check(null2Int() == null)
|
||||
}
|
||||
|
||||
@JsFun("() => true")
|
||||
external fun notNullBoolean(): Boolean
|
||||
|
||||
@JsFun("() => null")
|
||||
external fun notNull2Boolean(): Boolean
|
||||
|
||||
@JsFun("() => true")
|
||||
external fun nullBoolean(): Boolean?
|
||||
|
||||
@JsFun("() => null")
|
||||
external fun null2Boolean(): Boolean?
|
||||
|
||||
fun testBoolean() {
|
||||
check(notNullBoolean() == true)
|
||||
check(notNull2Boolean() == false)
|
||||
check(nullBoolean() == true)
|
||||
check(null2Boolean() == null)
|
||||
}
|
||||
|
||||
@JsFun("() => 123")
|
||||
external fun notNullShort(): Short
|
||||
|
||||
@JsFun("() => null")
|
||||
external fun notNull2Short(): Short
|
||||
|
||||
@JsFun("() => 123")
|
||||
external fun nullShort(): Short?
|
||||
|
||||
@JsFun("() => null")
|
||||
external fun null2Short(): Short?
|
||||
|
||||
fun testShort() {
|
||||
check(notNullShort() == 123.toShort())
|
||||
check(notNull2Short() == 0.toShort())
|
||||
check(nullShort() == 123.toShort())
|
||||
check(null2Short() == null)
|
||||
}
|
||||
|
||||
@JsFun("() => 123.5")
|
||||
external fun notNullFloat(): Float
|
||||
|
||||
@JsFun("() => null")
|
||||
external fun notNull2Float(): Float
|
||||
|
||||
@JsFun("() => 123.5")
|
||||
external fun nullFloat(): Float?
|
||||
|
||||
@JsFun("() => null")
|
||||
external fun null2Float(): Float?
|
||||
|
||||
fun testFloat() {
|
||||
check(notNullFloat() == 123.5f)
|
||||
check(notNull2Float() == 0.0f)
|
||||
check(nullFloat() == 123.5f)
|
||||
check(null2Float() == null)
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
testString()
|
||||
testExterRef()
|
||||
testDataRef()
|
||||
testInt()
|
||||
testBoolean()
|
||||
testShort()
|
||||
testFloat()
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user