[JVM_IR] Keep track of catch variable gaps.
This ensures that catch variables are not visible in duplicated finally blocks generated at an exit within the catch variable scope. ^KT-46449 Fixed
This commit is contained in:
+5
-6
@@ -1159,18 +1159,17 @@ class ExpressionCodegen(
|
||||
val afterStore = markNewLabel()
|
||||
|
||||
val catchBody = clause.result
|
||||
val catchResult = catchBody.accept(this, data)
|
||||
var catchBlockInfo = BlockInfo(data)
|
||||
catchBlockInfo.variables.add(VariableInfo(parameter, index, descriptorType, afterStore))
|
||||
|
||||
val catchResult = catchBody.accept(this, catchBlockInfo)
|
||||
if (savedValue != null) {
|
||||
catchResult.materializeAt(tryAsmType, aTry.type, true)
|
||||
mv.store(savedValue, tryAsmType)
|
||||
} else {
|
||||
catchResult.discard()
|
||||
}
|
||||
|
||||
frameMap.leave(clause.catchParameter)
|
||||
|
||||
val clauseEnd = markNewLabel()
|
||||
mv.visitLocalVariable(parameter.name.asString(), descriptorType.descriptor, null, afterStore, clauseEnd, index)
|
||||
writeLocalVariablesInTable(catchBlockInfo, markNewLabel())
|
||||
|
||||
if (tryInfo is TryWithFinallyInfo) {
|
||||
data.handleBlock { genFinallyBlock(tryInfo, tryCatchBlockEnd, null, data) }
|
||||
|
||||
+2
-2
@@ -11,7 +11,7 @@ fun box(): String {
|
||||
val z = "z"
|
||||
break // TODO: why does the break not have a line number so we can stop on it?
|
||||
} finally {
|
||||
throw RuntimeException("$i") // TODO: `e` should not be visible here
|
||||
throw RuntimeException("$i")
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
@@ -32,5 +32,5 @@ fun box(): String {
|
||||
// test.kt:9 box: i:int=0:int
|
||||
// test.kt:10 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException
|
||||
// test.kt:11 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException, y:java.lang.String="y":java.lang.String
|
||||
// test.kt:14 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException
|
||||
// test.kt:14 box: i:int=0:int
|
||||
// test.kt:18 box:
|
||||
|
||||
+2
-3
@@ -11,7 +11,7 @@ fun box(): String {
|
||||
val z = "z"
|
||||
continue // TODO: why does the continue not have a line number so we stop here?
|
||||
} finally {
|
||||
throw RuntimeException("$i") // TODO: `e` should not be visible here
|
||||
throw RuntimeException("$i")
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
@@ -32,6 +32,5 @@ fun box(): String {
|
||||
// test.kt:9 box: i:int=0:int
|
||||
// test.kt:10 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException
|
||||
// test.kt:11 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException, y:java.lang.String="y":java.lang.String
|
||||
// test.kt:14 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException
|
||||
// test.kt:14 box: i:int=0:int
|
||||
// test.kt:18 box:
|
||||
|
||||
|
||||
+4
-5
@@ -10,11 +10,11 @@ fun box(): String {
|
||||
val y = "y"
|
||||
return "FAIL1"
|
||||
} finally {
|
||||
return "FAIL2" // TODO: `e` should not be visible here.
|
||||
return "FAIL2"
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
return "OK" // TODO: `e` should not be visible here.
|
||||
return "OK"
|
||||
}
|
||||
return "FAIL3"
|
||||
}
|
||||
@@ -31,6 +31,5 @@ fun box(): String {
|
||||
// test.kt:9 box: i:int=0:int
|
||||
// test.kt:10 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException
|
||||
// test.kt:11 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException, y:java.lang.String="y":java.lang.String
|
||||
// test.kt:13 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException
|
||||
// test.kt:17 box: e:java.lang.Exception=java.lang.RuntimeException
|
||||
|
||||
// test.kt:13 box: i:int=0:int
|
||||
// test.kt:17 box:
|
||||
|
||||
+2
-2
@@ -20,7 +20,7 @@ fun compute(): String {
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
x = "OK" // TODO: `e` should not be visible here.
|
||||
x = "OK"
|
||||
}
|
||||
return "FAIL"
|
||||
}
|
||||
@@ -45,7 +45,7 @@ fun box() {
|
||||
// test.kt:18 compute: e:java.lang.Exception=java.lang.RuntimeException, y:int=32:int, j:int=0:int
|
||||
// test.kt:4 compute: e:java.lang.Exception=java.lang.RuntimeException, y:int=32:int, j:int=0:int, $i$f$f:int=0:int
|
||||
// test.kt:19 compute: e:java.lang.Exception=java.lang.RuntimeException, y:int=32:int, j:int=0:int, $i$f$f:int=0:int, $i$a$-f-TestKt$compute$1:int=0:int
|
||||
// test.kt:23 compute: e:java.lang.Exception=java.lang.RuntimeException
|
||||
// test.kt:23 compute:
|
||||
// test.kt:29 box:
|
||||
// test.kt:30 box: result:java.lang.String="NON_LOCAL_RETURN":java.lang.String
|
||||
// test.kt:31 box: result:java.lang.String="NON_LOCAL_RETURN":java.lang.String, localX:java.lang.String="OK":java.lang.String
|
||||
|
||||
Reference in New Issue
Block a user