1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Set first line numbers for empty iseqs.

* compile.c (iseq_compile_each): for empty method, block and so on,
  `last_line` is not set so that line number of `putnil` instruction
  will be zero. This patch set `first_lineno` for such `putnil`.

  Problem is reported by deivid-rodriguez via Yuichiro Kaneko.

* test/ruby/test_iseq.rb: add a test for this spec.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61457 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2017-12-25 00:27:17 +00:00
parent 7361587fff
commit 360c00572f
2 changed files with 36 additions and 1 deletions

View file

@ -5413,8 +5413,10 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, const NODE *node, int poppe
{ {
if (node == 0) { if (node == 0) {
if (!popped) { if (!popped) {
int lineno = ISEQ_COMPILE_DATA(iseq)->last_line;
if (lineno == 0) lineno = FIX2INT(rb_iseq_first_lineno(iseq));
debugs("node: NODE_NIL(implicit)\n"); debugs("node: NODE_NIL(implicit)\n");
ADD_INSN(ret, ISEQ_COMPILE_DATA(iseq)->last_line, putnil); ADD_INSN(ret, lineno, putnil);
} }
return COMPILE_OK; return COMPILE_OK;
} }

View file

@ -357,4 +357,37 @@ class TestISeq < Test::Unit::TestCase
[["<class:D>@17", [[17, :class], [["<class:D>@17", [[17, :class],
[18, :end]]]]], collect_iseq.call(sample_iseq) [18, :end]]]]], collect_iseq.call(sample_iseq)
end end
def test_empty_iseq_lineno
iseq = ISeq.compile(<<-EOS)
# 1
# 2
def foo # line 3 empty method
end # line 4
1.time do # line 5 empty block
end # line 6
class C # line 7 empty class
end
EOS
iseq.each_child{|ci|
ary = ci.to_a
type = ary[9]
name = ary[5]
line = ary[13].first
case ary[9]
when :method
assert_equal "foo", name
assert_equal 3, line
when :class
assert_equal '<class:C>', name
assert_equal 7, line
when :block
assert_equal 'block in <compiled>', name
assert_equal 5, line
else
raise "unknown ary: " + ary.inspect
end
}
end
end end