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?
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.
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?
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!