blob: 51a0a4c97f9910846cd28120bb46a33d2fb6d1cd [file]
// TARGET_BACKEND: WASM
// ^^ For JS_IR and JS_IR_ES6, the test doesn't work since we don't expect that non Error could came to the catch block
private val TEST_JS_STRING = "Test".toJsString()
private val JS_42 = 42.toJsNumber()
fun throwJsPrimitive(): Int = js("{ throw 'Test'; }")
fun throwJsNumber(): Int = js("{ throw 42; }")
fun throwJsNull(): Int = js("{ throw null; }")
fun throwJsTypeError(): Int = js("{ throw new TypeError('Test'); }")
fun throwJsValueBack(v: JsAny?): Nothing = js("{ throw v; }")
fun rtString(): Boolean {
try {
try {
throwJsPrimitive()
} catch (e: Throwable) {
if (e !is JsException) return false
if (e.message != "Exception was thrown while running JavaScript code") return false
if (e.thrownValue != TEST_JS_STRING) return false
throwJsValueBack(e.thrownValue)
}
return false
} catch (e2: Throwable) {
return e2 is JsException &&
e2.message == "Exception was thrown while running JavaScript code" &&
e2.thrownValue == TEST_JS_STRING
}
}
fun rtNumber(): Boolean {
try {
try {
throwJsNumber()
} catch (e: Throwable) {
if (e !is JsException) return false
if (e.thrownValue != JS_42) return false
throwJsValueBack(e.thrownValue)
}
return false
} catch (e2: Throwable) {
return e2 is JsException &&
e2.message == "Exception was thrown while running JavaScript code" &&
e2.thrownValue == JS_42
}
}
fun rtNull(): Boolean {
try {
try {
throwJsNull()
} catch (e: Throwable) {
if (e !is JsException) return false
if (e.thrownValue != null) return false
throwJsValueBack(e.thrownValue)
}
return false
} catch (e2: Throwable) {
return e2 is JsException &&
e2.message == "Exception was thrown while running JavaScript code" &&
e2.thrownValue == null
}
}
fun jsCtorName(v: JsAny?): String? = js("(v && v.constructor && v.constructor.name) || null")
fun rtTypeError(): Boolean {
try {
try {
throwJsTypeError()
} catch (e: Throwable) {
if (e !is JsException) return false
if (e.message != "Test") return false
if (jsCtorName(e.thrownValue) != "TypeError") return false
throwJsValueBack(e.thrownValue)
}
return false
} catch (e2: Throwable) {
return e2 is JsException &&
e2.message == "Test" &&
jsCtorName(e2.thrownValue) == "TypeError"
}
}
fun box(): String {
if (!rtString()) return "rtString failed"
if (!rtNumber()) return "rtNumber failed"
if (!rtNull()) return "rtNull failed"
if (!rtTypeError()) return "rtTypeError failed"
return "OK"
}