Project

General

Profile

Actions

Bug #20479

open

Ensure line number in begin...end in method

Added by kddnewton (Kevin Newton) 11 days ago. Updated 10 days ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:117813]

Description

In the following example:

def foo
  begin
  rescue
    p :rescue
  ensure
    p :ensure
  end
end

the ISEQ has the label: #<ISeq:ensure in foo@test.rb:6 (6,4)-(6,13)>, but tracepoint reports that first_lineno is 1. This is coming straight from the AST, which says @ NODE_ENSURE (id: 12, line: 1, location: (2,7)-(6,13)).

This seems incorrect. The rescue knows that its line starts on line 3, but ensure says it starts on line 1. Could we change that to reflect the actual line it's on?

Updated by mame (Yusuke Endoh) 11 days ago

Is the line number in NODE_ENSURE visible to the user?

When I introduced node location, I wanted to match the line number with the first_lineno of the location if possible. However, since lineno has been heuristically tuned and there was already code that depended on it, I could not match it exactly.

If the incompatibility of changing the line number in NODE_ENSURE is not a problem, we can change it.

Updated by kddnewton (Kevin Newton) 10 days ago

It's only visible if you manually RubyVM::InstructionSequence.compile and then specifically ask an ensure ISEQ for first_lineno. This doesn't seem likely, and since RubyVM::ISEQ is private, it should be okay?

Actions

Also available in: Atom PDF

Like0
Like0Like0