aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--test/ruby/test_lambda.rb19
-rw-r--r--vm_insnhelper.c6
3 files changed, 25 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 62bd6a084b..0b1682fd24 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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),