diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | test/ruby/test_lambda.rb | 19 | ||||
-rw-r--r-- | vm_insnhelper.c | 6 |
3 files changed, 25 insertions, 6 deletions
@@ -1,4 +1,8 @@ -Fri Mar 16 11:59:56 2012 Nobuyoshi Nakada <nobu@ruby-lang.org> +Fri Mar 16 12:00:42 2012 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * vm_insnhelper.c (argument_error): use line number at the beginning + of lambda, not the first code ob its body. + [ruby-core:43314][Bug #6151] * iseq.c (rb_iseq_first_lineno): constified. diff --git a/test/ruby/test_lambda.rb b/test/ruby/test_lambda.rb index ae12c6d609..40bd134e2f 100644 --- a/test/ruby/test_lambda.rb +++ b/test/ruby/test_lambda.rb @@ -70,4 +70,23 @@ class TestLambdaParameters < Test::Unit::TestCase BasicObject.new.instance_eval {->() {called = true}.()} assert_equal(true, called, bug5966) end + + def test_location_on_error + bug6151 = '[ruby-core:43314]' + called = 0 + line, f = __LINE__, lambda do + called += 1 + true + end + e = assert_raise(ArgumentError) do + f.call(42) + end + assert_send([e.backtrace.first, :start_with?, "#{__FILE__}:#{line}:"], bug6151) + assert_equal(0, called) + e = assert_raise(ArgumentError) do + 42.times(&f) + end + assert_send([e.backtrace.first, :start_with?, "#{__FILE__}:#{line}:"], bug6151) + assert_equal(0, called) + end end diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 4f24f0f640..68c2a2eae3 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -130,11 +130,7 @@ argument_error(const rb_iseq_t *iseq, int miss_argc, int min_argc, int max_argc) VALUE err_line = 0; if (iseq) { - int line_no = 1; - - if (iseq->line_info_size) { - line_no = iseq->line_info_table[0].line_no; - } + int line_no = rb_iseq_first_lineno(iseq); err_line = rb_sprintf("%s:%d:in `%s'", RSTRING_PTR(iseq->filename), |