Hello,
2012/1/26 Charlton Wang charlton.wang@gmail.com:
def foo(*args, &block)
p block.source_location
end
foo(1,
2,
3) do
end
Under ruby 1.9.1-p243: ["-", 8]
Under ruby 1.9.2-p136 and newer: ["-", 5]
It seems with newer versions of ruby, it reports it based on the line on which the function is called instead of where the actual block is. I believe the old behaviour is actually the correct behaviour.
Do you really like the old behavior? Line 8 points
the end of the block. I prefer the beginning (Line 7).
IOW, a result I expect is: ["-", 7]
The following patch works for me, and passes test-all,
though I'm not sure if the fix is right. I'll commit
it if there is no objection.
diff --git a/parse.y b/parse.y
index 1ad9d62..428b942 100644
--- a/parse.y
+++ b/parse.y
@@ -2798,7 +2798,6 @@ primary : literal
/%%%/
$2->nd_iter = NEW_FCALL($1, 0);
$$ = $2;
-
fixpos($2->nd_iter, $2);
/*%
$$ = method_arg(dispatch1(fcall, $1), arg_new());
$$ = method_add_block($$, $2);
@@ -2811,7 +2810,6 @@ primary : literal
block_dup_check($1->nd_args, $2);
$2->nd_iter = $1;
$$ = $2;
diff --git a/test/ruby/test_proc.rb b/test/ruby/test_proc.rb
index 686db84..3deb5c0 100644
--- a/test/ruby/test_proc.rb
+++ b/test/ruby/test_proc.rb
@@ -1059,6 +1059,20 @@ class TestProc < Test::Unit::TestCase
assert_equal(@@line_of_attr_accessor_source_location_test, lineno)
end
- def block_source_location_test(*args, &block)
- block.source_location
- end
-
- def test_block_source_location
- exp_lineno = LINE + 3
- file, lineno = block_source_location_test(1,
-
2,
-
3) do
-
end
- assert_match(/^#{ Regexp.quote(FILE) }$/, file)
- assert_equal(exp_lineno, lineno)
- end
- def test_splat_without_respond_to
def (obj = Object.new).respond_to?(m,*); false end
[obj].each do |a, b|
--
Yusuke Endoh mame@tsg.ne.jp