From 8cd496556cba054b82c1cbced2f8544320423d0c Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Mon, 23 Mar 2015 17:22:00 +0300 Subject: [PATCH] Generate local var table --- .../kotlin/codegen/inline/InlineCodegenUtil.java | 2 +- .../kotlin/codegen/inline/LocalVarRemapper.java | 9 +++++++-- .../jetbrains/kotlin/codegen/inline/MethodInliner.java | 2 +- .../checkLocalVariablesTable/inlineLambdaWithParam.kt | 1 + 4 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 385bd9f6416..b7bf3d6635e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegenUtil.java @@ -63,7 +63,7 @@ import static org.jetbrains.kotlin.resolve.DescriptorUtils.getFqName; import static org.jetbrains.kotlin.resolve.DescriptorUtils.isTrait; public class InlineCodegenUtil { - public static final boolean GENERATE_SMAP = false; + public static final boolean GENERATE_SMAP = true; public static final int API = Opcodes.ASM5; public static final String INVOKE = "invoke"; diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/LocalVarRemapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/LocalVarRemapper.java index dd4d248264f..07684fa44c9 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/LocalVarRemapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/LocalVarRemapper.java @@ -97,9 +97,14 @@ public class LocalVarRemapper { public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index, MethodVisitor mv) { RemapInfo info = doRemap(index); + //add entries only for shifted vars if (SHIFT == info.status) { - //add entries only for shifted vars - mv.visitLocalVariable(name, desc, signature, start, end, ((StackValue.Local) info.value).index); + int newIndex = ((StackValue.Local) info.value).index; + if (newIndex != 0 && "this".equals(name)) { + /*skip additional this for now*/ + return; + } + mv.visitLocalVariable(name, desc, signature, start, end, newIndex); } } 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 9849ff3f5a3..33e26a11e2e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java @@ -340,7 +340,7 @@ public class MethodInliner { public void visitLocalVariable( @NotNull String name, @NotNull String desc, String signature, @NotNull Label start, @NotNull Label end, int index ) { - if (isInliningLambda) { + if (isInliningLambda || InlineCodegenUtil.GENERATE_SMAP) { super.visitLocalVariable(name, desc, signature, start, end, getNewIndex(index)); } } diff --git a/compiler/testData/checkLocalVariablesTable/inlineLambdaWithParam.kt b/compiler/testData/checkLocalVariablesTable/inlineLambdaWithParam.kt index 1923bdb064d..2654aa11666 100644 --- a/compiler/testData/checkLocalVariablesTable/inlineLambdaWithParam.kt +++ b/compiler/testData/checkLocalVariablesTable/inlineLambdaWithParam.kt @@ -17,4 +17,5 @@ class A { // VARIABLE : NAME=l TYPE=I INDEX=3 // VARIABLE : NAME=zzz TYPE=I INDEX=4 // VARIABLE : NAME=l TYPE=I INDEX=3 +// VARIABLE : NAME=p TYPE=I INDEX=2 // VARIABLE : NAME=this TYPE=LA; INDEX=0