Bug #20479
closedEnsure line number in begin...end in method
Description
In the following example:
def foo
begin
rescue
p :rescue
ensure
p :ensure
end
end
the ISEQ has the label: #<ISeq:ensure in [email protected]: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) about 1 year 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) about 1 year 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?
Updated by kddnewton (Kevin Newton) 12 months ago
Just to check back in @mame (Yusuke Endoh) because it's only the first_lineno
field, is that okay to change?
Updated by kddnewton (Kevin Newton) 12 months ago
I've updated it in https://github.com/ruby/ruby/pull/10859. It looks like a pretty minimal change — I only had to change the tests that asserted against first_lineno
. Thank you!
Updated by kddnewton (Kevin Newton) 12 months ago
- Status changed from Open to Closed