// FILE: 1.kt // WITH_RUNTIME // KJS_WITH_FULL_RUNTIME class My(val value: Int) inline fun T.performWithFail(job: (T)-> R, failJob : (T) -> R) : R { try { return job(this) } catch (e: RuntimeException) { return failJob(this) } } inline fun T.performWithFail2(job: (T)-> R, failJob : (e: RuntimeException, T) -> R) : R { try { return job(this) } catch (e: RuntimeException) { return failJob(e, this) } } public inline fun String.toInt2() : Int = this.toInt() // FILE: 2.kt fun test1(): Int { val res = My(111).performWithFail( { throw RuntimeException() }, { it.value }) return res } fun test11(): Int { val res = My(111).performWithFail2( { try { throw RuntimeException("1") } catch (e: RuntimeException) { throw RuntimeException("2") } }, { ex, thizz -> if (ex.message == "2") { thizz.value } else { -11111 } }) return res } fun test2(): Int { val res = My(111).performWithFail( { it.value }, { it.value + 1 }) return res } fun test22(): Int { val res = My(111).performWithFail2( { try { throw RuntimeException("1") } catch (e: RuntimeException) { it.value 111 } }, { ex, thizz -> -11111 }) return res } fun test3(): Int { try { val res = My(111).performWithFail( { throw RuntimeException("-1") }, { throw RuntimeException("-2") }) return res } catch (e: RuntimeException) { return e.message?.toInt2()!! } } fun test33(): Int { try { val res = My(111).performWithFail2( { try { throw RuntimeException("-1") } catch (e: RuntimeException) { throw RuntimeException("-2") } }, { ex, thizz -> if (ex.message == "-2") { throw RuntimeException("-3") } else { -11111 } }) return res } catch (e: RuntimeException) { return e.message!!.toInt2()!! } } fun box(): String { if (test1() != 111) return "test1: ${test1()}" if (test11() != 111) return "test11: ${test11()}" if (test2() != 111) return "test2: ${test2()}" if (test22() != 111) return "test22: ${test22()}" if (test3() != -2) return "test3: ${test3()}" if (test33() != -3) return "test33: ${test33()}" return "OK" }