60 lines
1.3 KiB
Kotlin
Vendored
60 lines
1.3 KiB
Kotlin
Vendored
// EXPECTED_REACHABLE_NODES: 1462
|
|
// KJS_WITH_FULL_RUNTIME
|
|
|
|
// Reproduction of KT-37563
|
|
// Test stack trace capturing in various kinds of constructors
|
|
|
|
public open class MyExceptionPrimary(message: String) : Exception(message, null) {
|
|
constructor() : this("empty")
|
|
}
|
|
|
|
public open class MyExceptionSecondary : MyExceptionPrimary {
|
|
constructor(message: String) : super(message)
|
|
}
|
|
|
|
@JsName("foo__0") // Need a stable name to test stack trace text.
|
|
fun foo__0() {
|
|
throw Exception("msg", null)
|
|
}
|
|
|
|
@JsName("foo__1")
|
|
fun foo__1() {
|
|
throw MyExceptionPrimary("primary")
|
|
}
|
|
|
|
@JsName("foo__2")
|
|
fun foo__2(): Throwable {
|
|
throw MyExceptionPrimary()
|
|
}
|
|
|
|
@JsName("foo__3")
|
|
fun foo__3(): Throwable {
|
|
throw MyExceptionSecondary("secondaryOnly")
|
|
}
|
|
|
|
fun box(): String {
|
|
val functions = listOf(
|
|
::foo__0,
|
|
::foo__1,
|
|
::foo__2,
|
|
::foo__3
|
|
)
|
|
|
|
var count = 0
|
|
for ((i, f) in functions.withIndex()) {
|
|
try {
|
|
f()
|
|
} catch (e: Throwable) {
|
|
count++
|
|
val stack = e.asDynamic().stack as String
|
|
|
|
// Even though stack trace format is not stadard,
|
|
// it should contain names of the functions.
|
|
if (!stack.contains("foo__$i")) return "fail $i"
|
|
}
|
|
}
|
|
|
|
if (count != functions.size) return "fail count"
|
|
|
|
return "OK"
|
|
} |