[ https://issues.apache.org/jira/browse/GROOVY-7647?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16677034#comment-16677034 ]
Eric Milles edited comment on GROOVY-7647 at 11/6/18 5:30 PM: -------------------------------------------------------------- If {{StatementWriter.writeBlockStatement}} is patched instead of {{writeIfElse}}, methods and constructors will have step on line of closing brace. This should also help GROOVY-4063 and GROOVY-8742. {code:java} public void writeBlockStatement(BlockStatement block) { writeStatementLabel(block); int mark = controller.getOperandStack().getStackLength(); CompileStack compileStack = controller.getCompileStack(); compileStack.pushVariableScope(block.getVariableScope()); for (Statement statement : block.getStatements()) { statement.visit(controller.getAcg()); } compileStack.pop(); // GRECLIPSE add if (block.getLastLineNumber() > 0) { MethodVisitor mv = controller.getMethodVisitor(); Label blockEnd = new Label(); mv.visitLabel(blockEnd); mv.visitLineNumber(block.getLastLineNumber(), blockEnd); } // GRECLIPSE end controller.getOperandStack().popDownTo(mark); } {code} was (Author: emilles): If {{StatementWriter.writeBlockStatement}} is patched instead of {{writeIfElse}}, methods and constructors will have step on line of closing brace. This should also help GROOVY-4063. {code:java} public void writeBlockStatement(BlockStatement block) { writeStatementLabel(block); int mark = controller.getOperandStack().getStackLength(); CompileStack compileStack = controller.getCompileStack(); compileStack.pushVariableScope(block.getVariableScope()); for (Statement statement : block.getStatements()) { statement.visit(controller.getAcg()); } compileStack.pop(); // GRECLIPSE add if (block.getLastLineNumber() > 0) { MethodVisitor mv = controller.getMethodVisitor(); Label blockEnd = new Label(); mv.visitLabel(blockEnd); mv.visitLineNumber(block.getLastLineNumber(), blockEnd); } // GRECLIPSE end controller.getOperandStack().popDownTo(mark); } {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)