From a932315bf9f70e297d7a0f65a65f0cb5ebf055d9 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Fri, 27 Nov 2015 16:01:47 +0300 Subject: [PATCH] Rename local vars from inlined function #KT-9798 Fixed --- .../org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java | 1 + .../src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java | 3 ++- .../checkLocalVariablesTable/inlineLambdaWithItParam.kt | 1 + .../testData/checkLocalVariablesTable/inlineLambdaWithParam.kt | 3 ++- compiler/testData/checkLocalVariablesTable/inlineSimple.kt | 1 + .../testData/checkLocalVariablesTable/inlineSimpleChain.kt | 2 ++ .../src/evaluate/singleBreakpoint/parametersOfInlineFun.kt | 3 +-- 7 files changed, 10 insertions(+), 4 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java index ce793699dae..5f643529299 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java @@ -75,6 +75,7 @@ public class InlineCodegenUtil { public static final String INLINE_MARKER_FINALLY_END = "finallyEnd"; public static final String INLINE_TRANSFORMATION_SUFFIX = "$inlined"; public static final String INLINE_FUN_THIS_0_SUFFIX = "$inline_fun"; + public static final String INLINE_FUN_VAR_SUFFIX = "$iv"; @Nullable public static SMAPAndMethodNode getMethodNode( diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java index e07cc90dd9c..fab25972b5b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java @@ -353,7 +353,8 @@ public class MethodInliner { @NotNull String name, @NotNull String desc, String signature, @NotNull Label start, @NotNull Label end, int index ) { if (isInliningLambda || InlineCodegenUtil.GENERATE_SMAP) { - super.visitLocalVariable(name, desc, signature, start, end, getNewIndex(index)); + String varSuffix = inliningContext.isRoot() && !InlineCodegenUtil.isFakeLocalVariableForInline(name) ? INLINE_FUN_VAR_SUFFIX : ""; + super.visitLocalVariable(name + varSuffix, desc, signature, start, end, getNewIndex(index)); } } }; diff --git a/compiler/testData/checkLocalVariablesTable/inlineLambdaWithItParam.kt b/compiler/testData/checkLocalVariablesTable/inlineLambdaWithItParam.kt index 84c8b9879df..dcabfd0ea61 100644 --- a/compiler/testData/checkLocalVariablesTable/inlineLambdaWithItParam.kt +++ b/compiler/testData/checkLocalVariablesTable/inlineLambdaWithItParam.kt @@ -15,5 +15,6 @@ class A { // VARIABLE : NAME=zzz TYPE=I INDEX=3 // VARIABLE : NAME=it TYPE=I INDEX=2 // VARIABLE : NAME=$i$a$1 TYPE=I INDEX=4 +// VARIABLE : NAME=this$iv TYPE=LA; INDEX=1 // VARIABLE : NAME=$i$f$inlineFun TYPE=I INDEX=5 // VARIABLE : NAME=this TYPE=LA; INDEX=0 diff --git a/compiler/testData/checkLocalVariablesTable/inlineLambdaWithParam.kt b/compiler/testData/checkLocalVariablesTable/inlineLambdaWithParam.kt index fd693e66834..a0d02be5dbe 100644 --- a/compiler/testData/checkLocalVariablesTable/inlineLambdaWithParam.kt +++ b/compiler/testData/checkLocalVariablesTable/inlineLambdaWithParam.kt @@ -20,6 +20,7 @@ class A { // VARIABLE : NAME=zzz TYPE=I INDEX=4 // VARIABLE : NAME=l TYPE=I INDEX=3 // VARIABLE : NAME=$i$a$1 TYPE=I INDEX=5 -// VARIABLE : NAME=p TYPE=I INDEX=2 +// VARIABLE : NAME=this$iv TYPE=LA; INDEX=1 +// VARIABLE : NAME=p$iv TYPE=I INDEX=2 // VARIABLE : NAME=$i$f$inlineFun TYPE=I INDEX=6 // VARIABLE : NAME=this TYPE=LA; INDEX=0 diff --git a/compiler/testData/checkLocalVariablesTable/inlineSimple.kt b/compiler/testData/checkLocalVariablesTable/inlineSimple.kt index 6c462f5dde1..2fbb462d7f3 100644 --- a/compiler/testData/checkLocalVariablesTable/inlineSimple.kt +++ b/compiler/testData/checkLocalVariablesTable/inlineSimple.kt @@ -15,6 +15,7 @@ class A { // METHOD : A.foo()V // VARIABLE : NAME=zzz TYPE=I INDEX=3 // VARIABLE : NAME=$i$a$1 TYPE=I INDEX=4 +// VARIABLE : NAME=this$iv TYPE=LA; INDEX=2 // VARIABLE : NAME=$i$f$inlineFun TYPE=I INDEX=5 // VARIABLE : NAME=s TYPE=I INDEX=1 // VARIABLE : NAME=this TYPE=LA; INDEX=0 diff --git a/compiler/testData/checkLocalVariablesTable/inlineSimpleChain.kt b/compiler/testData/checkLocalVariablesTable/inlineSimpleChain.kt index 32a2c1bd871..04cdae0861b 100644 --- a/compiler/testData/checkLocalVariablesTable/inlineSimpleChain.kt +++ b/compiler/testData/checkLocalVariablesTable/inlineSimpleChain.kt @@ -20,9 +20,11 @@ class A { // METHOD : A.foo()V // VARIABLE : NAME=zz2 TYPE=I INDEX=5 // VARIABLE : NAME=$i$a$1 TYPE=I INDEX=6 +// VARIABLE : NAME=this$iv TYPE=LA; INDEX=4 // VARIABLE : NAME=$i$f$inlineFun TYPE=I INDEX=7 // VARIABLE : NAME=z TYPE=I INDEX=3 // VARIABLE : NAME=$i$a$1 TYPE=I INDEX=8 +// VARIABLE : NAME=this$iv TYPE=LA; INDEX=2 // VARIABLE : NAME=$i$f$inlineFun TYPE=I INDEX=9 // VARIABLE : NAME=s TYPE=I INDEX=1 // VARIABLE : NAME=this TYPE=LA; INDEX=0 diff --git a/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/parametersOfInlineFun.kt b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/parametersOfInlineFun.kt index 29fffb79b31..77f01a1d773 100644 --- a/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/parametersOfInlineFun.kt +++ b/idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/parametersOfInlineFun.kt @@ -3,8 +3,6 @@ package parametersOfInlineFun fun main(args: Array) { val a = A(1) - // RESUME: 1 - //Breakpoint! a.foo { 1 + 1 } } @@ -13,6 +11,7 @@ inline fun A.foo(f: (i: Int) -> Unit) { val array = arrayOf(1) val str = "str" val list = listOf("str") + //Breakpoint! f(1) }