[ 
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)

Reply via email to