diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/CapturedVarsOptimizationMethodTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/CapturedVarsOptimizationMethodTransformer.kt index 9ca20a69b04..04349f30c90 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/CapturedVarsOptimizationMethodTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/CapturedVarsOptimizationMethodTransformer.kt @@ -57,6 +57,8 @@ class CapturedVarsOptimizationMethodTransformer : MethodTransformer() { override fun onUseAsTainted() { hazard = true } + + fun canRewrite() = !hazard && initCallInsn != null } private class Transformer(private val internalClassName: String, private val methodNode: MethodNode) { @@ -72,7 +74,7 @@ class CapturedVarsOptimizationMethodTransformer : MethodTransformer() { assignLocalVars(frames) for (refValue in refValues) { - if (!refValue.hazard) { + if (refValue.canRewrite()) { rewriteRefValue(refValue) } } diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 68f7a6846f5..cbb63b930f1 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -5793,6 +5793,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/kt44347.kt"); } + @Test + @TestMetadata("kt45446.kt") + public void testKt45446() throws Exception { + runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/kt45446.kt"); + } + @Test @TestMetadata("sharedSlotsWithCapturedVars.kt") public void testSharedSlotsWithCapturedVars() throws Exception { diff --git a/compiler/testData/codegen/box/closures/capturedVarsOptimization/kt45446.kt b/compiler/testData/codegen/box/closures/capturedVarsOptimization/kt45446.kt new file mode 100644 index 00000000000..1b5ae20d76d --- /dev/null +++ b/compiler/testData/codegen/box/closures/capturedVarsOptimization/kt45446.kt @@ -0,0 +1,25 @@ +// DONT_TARGET_EXACT_BACKEND: WASM +// WASM_MUTE_REASON: EXCEPTIONS_NOT_IMPLEMENTED +// This test checks that bytecode optimizer doesn't crash on unreachable code. + +fun box(): String { + try { + remove() + } + catch (e: Exception) { + return e.message!! + } + return "Should fail with exception" +} + +fun remove() { + throw Exception("OK") + var captured = 0 + debug { + captured = 1 + } +} + +private fun debug(f: () -> Unit) { + f() +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index befbae5646a..5de0698a2a1 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -5793,6 +5793,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/kt44347.kt"); } + @Test + @TestMetadata("kt45446.kt") + public void testKt45446() throws Exception { + runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/kt45446.kt"); + } + @Test @TestMetadata("sharedSlotsWithCapturedVars.kt") public void testSharedSlotsWithCapturedVars() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 0b782385c59..0a1909a3219 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -5793,6 +5793,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/kt44347.kt"); } + @Test + @TestMetadata("kt45446.kt") + public void testKt45446() throws Exception { + runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/kt45446.kt"); + } + @Test @TestMetadata("sharedSlotsWithCapturedVars.kt") public void testSharedSlotsWithCapturedVars() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index b97b42275f2..d77278c26d4 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -5051,6 +5051,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/kt44347.kt"); } + @TestMetadata("kt45446.kt") + public void testKt45446() throws Exception { + runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/kt45446.kt"); + } + @TestMetadata("sharedSlotsWithCapturedVars.kt") public void testSharedSlotsWithCapturedVars() throws Exception { runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/sharedSlotsWithCapturedVars.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index 4672796171d..067e7ac0a2f 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -4041,6 +4041,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/kt44347.kt"); } + @TestMetadata("kt45446.kt") + public void testKt45446() throws Exception { + runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/kt45446.kt"); + } + @TestMetadata("sharedSlotsWithCapturedVars.kt") public void testSharedSlotsWithCapturedVars() throws Exception { runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/sharedSlotsWithCapturedVars.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 35b60ca3cdf..199478175a4 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -4041,6 +4041,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/kt44347.kt"); } + @TestMetadata("kt45446.kt") + public void testKt45446() throws Exception { + runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/kt45446.kt"); + } + @TestMetadata("sharedSlotsWithCapturedVars.kt") public void testSharedSlotsWithCapturedVars() throws Exception { runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/sharedSlotsWithCapturedVars.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 5aa8f1fbb88..065703803c1 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -4041,6 +4041,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/kt44347.kt"); } + @TestMetadata("kt45446.kt") + public void testKt45446() throws Exception { + runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/kt45446.kt"); + } + @TestMetadata("sharedSlotsWithCapturedVars.kt") public void testSharedSlotsWithCapturedVars() throws Exception { runTest("compiler/testData/codegen/box/closures/capturedVarsOptimization/sharedSlotsWithCapturedVars.kt");