jacodb icon indicating copy to clipboard operation
jacodb copied to clipboard

Wrong IR or JVM bytecode generation with empty try

Open DaniilStepanov opened this issue 2 years ago • 2 comments

Example:

    var lambda: (() -> String)? = null

    fun f() {
        try {
        } finally {
            lambda = { "OK" }
        }
    }
    @JvmStatic
    fun box(): String {
        f()
        return lambda?.let { it() } ?: "fail"
    }

DaniilStepanov avatar Sep 07 '23 12:09 DaniilStepanov

One more test for try/catch/finally:

fun test1() : String {
    var s = "";
    try {
        try {
            s += "Try";
            throw Exception()
        } catch (x : Exception) {
            s += "Catch";
            throw x
        } finally {
            s += "Finally";
        }
    } catch (x : Exception) {
        return s
    }
}

fun test2() : String {
    var s = "";

    try {
        s += "Try";
        throw Exception()
    } catch (x : Exception) {
        s += "Catch";
    } finally {
        s += "Finally";
    }

    return s
}



fun box() : String {
    if (test1() != "TryCatchFinally") return "fail1: ${test1()}"

    if (test2() != "TryCatchFinally") return "fail2: ${test2()}"

    return "OK"
}

DaniilStepanov avatar Sep 08 '23 11:09 DaniilStepanov

More:

fun unsupportedEx() {
    if (true) throw UnsupportedOperationException()
}

fun runtimeEx() {
    if (true) throw RuntimeException()
}

fun test1WithFinally() : String {
    var s = "";
    try {
        try {
            s += "Try";
            unsupportedEx()
        } finally {
            s += "Finally"
        }
    } catch (x : RuntimeException) {
        return s
    }
    return s + "Failed"
}


fun test2WithFinally() : String {
    var s = "";
    try {
        try {
            s += "Try";
            unsupportedEx()
            return s
        } finally {
            s += "Finally"
        }
    } catch (x : RuntimeException) {
        return s
    }
}

fun box() : String {
    if (test1WithFinally() != "TryFinally") return "fail2: ${test1WithFinally()}"

    if (test2WithFinally() != "TryFinally") return "fail4: ${test2WithFinally()}"
    return "OK"
}

DaniilStepanov avatar Sep 08 '23 11:09 DaniilStepanov