[
https://issues.apache.org/jira/browse/GROOVY-7647?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16674570#comment-16674570
]
Eric Milles commented on GROOVY-7647:
-------------------------------------
If I make the following additions to StatementWriter -- a call to
{{mv.visitLineNumber}} immediately following each {{mv.visitLabel}} -- the end
brace is the next step line after the condition line in case of false. Can
anyone confirm this is the right approach?
{code:java}
public void writeIfElse(IfStatement ifElse) {
controller.getAcg().onLineNumber(ifElse,"visitIfElse");
writeStatementLabel(ifElse);
MethodVisitor mv = controller.getMethodVisitor();
ifElse.getBooleanExpression().visit(controller.getAcg());
Label l0 = controller.getOperandStack().jump(IFEQ);
// if-else is here handled as a special version
// of a boolean expression
controller.getCompileStack().pushBooleanExpression();
ifElse.getIfBlock().visit(controller.getAcg());
controller.getCompileStack().pop();
if (ifElse.getElseBlock()==EmptyStatement.INSTANCE) {
mv.visitLabel(l0);
// GRECLIPSE add
mv.visitLineNumber(ifElse.getLastLineNumber(), l0);
// GRECLIPSE end
} else {
Label l1 = new Label();
mv.visitJumpInsn(GOTO, l1);
mv.visitLabel(l0);
// GRECLIPSE add
mv.visitLineNumber(ifElse.getIfBlock().getLastLineNumber(), l0);
// GRECLIPSE end
controller.getCompileStack().pushBooleanExpression();
ifElse.getElseBlock().visit(controller.getAcg());
controller.getCompileStack().pop();
mv.visitLabel(l1);
// GRECLIPSE add
mv.visitLineNumber(ifElse.getLastLineNumber(), l1);
// GRECLIPSE end
}
}
{code}
> Incorrect line information for debug
> ------------------------------------
>
> Key: GROOVY-7647
> URL: https://issues.apache.org/jira/browse/GROOVY-7647
> Project: Groovy
> Issue Type: Bug
> Components: class generator, Compiler
> Affects Versions: 2.4.5
> Reporter: Egor Ushakov
> Priority: Major
>
> Try to debug the code:
> {code}
> boolean boolVar = false; //line 15
> if (boolVar) { // set breakpoint here and step over //line 16
> print "ok"; //line 17
> } // end of file //line 18
> {code}
> It steps over to the line with print even though it is not executed.
> Seems that compiler does not generate line info for the last block (line 18):
> {code}
> public java.lang.Object run();
> descriptor: ()Ljava/lang/Object;
> flags: ACC_PUBLIC
> Code:
> stack=3, locals=3, args_size=1
> 0: invokestatic #18 // Method
> $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
> 3: astore_1
> 4: iconst_0
> 5: istore_2
> 6: iload_2
> 7: pop
> 8: iload_2
> 9: ifeq 28
> 12: aload_1
> 13: ldc #41 // int 1
> 15: aaload
> 16: aload_0
> 17: ldc #43 // String ok
> 19: invokeinterface #47, 3 // InterfaceMethod
> org/codehaus/groovy/runtime/callsite/CallSite.callCurrent:(Lgroovy/lang/GroovyObject;Ljava/lang/Object;)Ljava/lang/Object;
> 24: areturn
> 25: goto 30
> 28: aconst_null
> 29: areturn
> 30: aconst_null
> 31: areturn
> LocalVariableTable:
> Start Length Slot Name Signature
> 0 30 0 this Lsdfklajsdlkjas/test;
> 6 24 2 boolVar Z
> LineNumberTable:
> line 15: 4
> line 16: 8
> line 17: 12
> {code}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)