From da9bff40f0da0cc763efa0bfa2267f80c31fa82f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Wed, 5 Aug 2020 11:32:07 +0200 Subject: [PATCH] JVM IR: Don't remove stores to visible locals in DelegatedPropertyOptimizer --- .../backend/jvm/codegen/DelegatedPropertyOptimizer.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/DelegatedPropertyOptimizer.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/DelegatedPropertyOptimizer.kt index da413d09342..a5dae3aafc7 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/DelegatedPropertyOptimizer.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/DelegatedPropertyOptimizer.kt @@ -81,9 +81,18 @@ class DelegatedPropertyOptimizer { } // Remove the unused KProperty loads. + val locals = methodNode.localVariables.mapTo(mutableSetOf()) { it.index } for (kPropertyRanges in variableToDelegatedPropertyIndex.values) { for ((from, to) in kPropertyRanges.ranges) { - methodNode.instructions.removeRange(from, to) + // Stores to variables with LVT entries need to be preserved. We store `null` for + // unused KProperties, for compatibility with the JVM BE. + val storeInsn = to as VarInsnNode + if (storeInsn.`var` !in locals) { + methodNode.instructions.removeRange(from, to) + } else { + methodNode.instructions.removeRange(from, to.previous) + methodNode.instructions.insertBefore(to, InsnNode(Opcodes.ACONST_NULL)) + } } } }