From 0dcb5b05b627329e0fd6bdb32f7c687caba17073 Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Wed, 17 Dec 2014 15:56:14 +0300 Subject: [PATCH] Local variables should be visible on return statement in debugger #KT-6248 Fixed --- .../jet/codegen/ExpressionCodegen.java | 21 ++++++++++++++----- .../jet/codegen/FunctionCodegen.java | 6 ++++-- .../jet/codegen/context/MethodContext.java | 10 +++++++++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 61fb27d8272..9cedaf4c95f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -496,7 +496,7 @@ public class ExpressionCodegen extends JetVisitor implem statements.addAll(doWhileStatements); statements.add(condition); - conditionValue = generateBlock(statements, false, continueLabel); + conditionValue = generateBlock(statements, false, continueLabel, null); } else { if (body != null) { @@ -1505,11 +1505,20 @@ public class ExpressionCodegen extends JetVisitor implem } /* package */ StackValue generateBlock(@NotNull JetBlockExpression expression, boolean isStatement) { - return generateBlock(expression.getStatements(), isStatement, null); + if (expression.getParent() instanceof JetNamedFunction) { + // For functions end of block should be end of function label + return generateBlock(expression.getStatements(), isStatement, null, context.getMethodEndLabel()); + } + return generateBlock(expression.getStatements(), isStatement, null, null); } - private StackValue generateBlock(List statements, boolean isStatement, Label labelBeforeLastExpression) { - final Label blockEnd = new Label(); + private StackValue generateBlock( + List statements, + boolean isStatement, + Label labelBeforeLastExpression, + @Nullable final Label labelBlockEnd + ) { + final Label blockEnd = labelBlockEnd != null ? labelBlockEnd : new Label(); final List> leaveTasks = Lists.newArrayList(); @@ -1563,7 +1572,9 @@ public class ExpressionCodegen extends JetVisitor implem return new StackValueWithLeaveTask(answer, new ExtensionFunction0() { @Override public Unit invoke(StackValueWithLeaveTask wrapper) { - v.mark(blockEnd); + if (labelBlockEnd == null) { + v.mark(blockEnd); + } for (Function task : Lists.reverse(leaveTasks)) { task.fun(wrapper.getStackValue()); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index 832704fb449..bb022f0fe20 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -320,8 +320,10 @@ public class FunctionCodegen extends ParentCodegenAware { JetTypeMapper typeMapper = parentCodegen.typeMapper; + Label methodEnd; if (context.getParentContext() instanceof PackageFacadeContext) { generatePackageDelegateMethodBody(mv, signature.getAsmMethod(), (PackageFacadeContext) context.getParentContext()); + methodEnd = new Label(); } else { FrameMap frameMap = createFrameMap(parentCodegen.state, functionDescriptor, signature, isStaticMethod(context.getContextKind(), @@ -334,11 +336,11 @@ public class FunctionCodegen extends ParentCodegenAware { if (!JetTypeMapper.isAccessor(functionDescriptor)) { genNotNullAssertionsForParameters(new InstructionAdapter(mv), parentCodegen.state, functionDescriptor, frameMap); } - + methodEnd = new Label(); + context.setMethodEndLabel(methodEnd); strategy.generateBody(mv, frameMap, signature, context, parentCodegen); } - Label methodEnd = new Label(); mv.visitLabel(methodEnd); Type thisType = getThisTypeForFunction(functionDescriptor, context, typeMapper); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/context/MethodContext.java b/compiler/backend/src/org/jetbrains/jet/codegen/context/MethodContext.java index 636bec7ff33..0f66ddd4669 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/context/MethodContext.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/context/MethodContext.java @@ -32,6 +32,7 @@ import org.jetbrains.org.objectweb.asm.Type; public class MethodContext extends CodegenContext { private final boolean isInliningLambda; private Label methodStartLabel; + private Label methodEndLabel; protected MethodContext( @NotNull FunctionDescriptor contextDescriptor, @@ -96,6 +97,15 @@ public class MethodContext extends CodegenContext { this.methodStartLabel = methodStartLabel; } + @Nullable + public Label getMethodEndLabel() { + return methodEndLabel; + } + + public void setMethodEndLabel(@NotNull Label methodEndLabel) { + this.methodEndLabel = methodEndLabel; + } + @Override public String toString() { return "Method: " + getContextDescriptor();