diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/LambdaTransformer.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/LambdaTransformer.java index eb3d93d43df..29312c2c787 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/LambdaTransformer.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/LambdaTransformer.java @@ -272,6 +272,10 @@ public class LambdaTransformer { } public static String getNewFieldName(String oldName) { + if (oldName.equals("this$0")) { + //"this$0" couldn't clash and we should keep this name invariant for further transformations + return oldName; + } return oldName + "$inlined"; } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/RegeneratedLambdaFieldRemapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/RegeneratedLambdaFieldRemapper.java index bbdbb3e06eb..1431c55cab3 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/RegeneratedLambdaFieldRemapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/RegeneratedLambdaFieldRemapper.java @@ -148,7 +148,7 @@ public class RegeneratedLambdaFieldRemapper extends LambdaFieldRemapper { FieldInsnNode next = (FieldInsnNode) nextInstruction; node.instructions.remove(next.getPrevious()); next.owner = Type.getType(((FieldInsnNode) previous).desc).getInternalName(); - next.name = node.name.equals("this$0") ? node.name : LambdaTransformer.getNewFieldName(next.name); + next.name = LambdaTransformer.getNewFieldName(next.name); return next; } diff --git a/compiler/testData/codegen/boxInline/noInlineLambdaChain/1.kt b/compiler/testData/codegen/boxInline/noInlineLambdaChain/1.kt index 273aa7543c0..d094ac6aa69 100644 --- a/compiler/testData/codegen/boxInline/noInlineLambdaChain/1.kt +++ b/compiler/testData/codegen/boxInline/noInlineLambdaChain/1.kt @@ -31,10 +31,30 @@ fun test2(param: String): String { return result } +fun test3(param: String): String { + var result = "fail" + inlineFun("2") { d -> + inlineFun("1") { c -> + { + inlineFun("2") { a -> + { + { + result = param + c + a + }() + }() + } + }() + } + } + + return result +} + fun box(): String { if (test1("start") != "start12") return "fail1: ${test1("start")}" if (test2("start") != "start2") return "fail2: ${test2("start")}" + if (test3("start") != "start12") return "fail3: ${test3("start")}" return "OK" } \ No newline at end of file