[前][次][番号順一覧][スレッド一覧]

ruby-changes:21982

From: nobu <ko1@a...>
Date: Wed, 14 Dec 2011 00:01:37 +0900 (JST)
Subject: [ruby-changes:21982] nobu:r34031 (trunk): * parse.y (primary): point method name line.

nobu	2011-12-14 00:01:20 +0900 (Wed, 14 Dec 2011)

  New Revision: 34031

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=34031

  Log:
    * parse.y (primary): point method name line.  [ruby-core:40936]
      [Bug #5614]

  Modified files:
    trunk/ChangeLog
    trunk/parse.y
    trunk/test/ruby/test_parse.rb
    trunk/test/ruby/test_settracefunc.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 34030)
+++ ChangeLog	(revision 34031)
@@ -1,3 +1,8 @@
+Wed Dec 14 00:01:15 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* parse.y (primary): point method name line.  [ruby-core:40936]
+	  [Bug #5614]
+
 Tue Dec 13 23:43:48 2011  CHIKANAGA Tomoyuki  <nagachika00@g...>
 
 	* error.c (name_err_mesg_to_str): clear rb_thread_t::errinfo when
Index: parse.y
===================================================================
--- parse.y	(revision 34030)
+++ parse.y	(revision 34031)
@@ -3645,33 +3645,51 @@
 		    }
 		;
 
-method_call	: operation paren_args
+method_call	: operation
 		    {
 		    /*%%%*/
-			$$ = NEW_FCALL($1, $2);
-			fixpos($$, $2);
+			$<num>$ = ruby_sourceline;
+		    /*% %*/
+		    }
+		  paren_args
+		    {
+		    /*%%%*/
+			$$ = NEW_FCALL($1, $3);
+			nd_set_line($$, $<num>2);
 		    /*%
-			$$ = method_arg(dispatch1(fcall, $1), $2);
+			$$ = method_arg(dispatch1(fcall, $1), $3);
 		    %*/
 		    }
-		| primary_value '.' operation2 opt_paren_args
+		| primary_value '.' operation2
 		    {
 		    /*%%%*/
-			$$ = NEW_CALL($1, $3, $4);
-			fixpos($$, $1);
+			$<num>$ = ruby_sourceline;
+		    /*% %*/
+		    }
+		  opt_paren_args
+		    {
+		    /*%%%*/
+			$$ = NEW_CALL($1, $3, $5);
+			nd_set_line($$, $<num>4);
 		    /*%
 			$$ = dispatch3(call, $1, ripper_id2sym('.'), $3);
-			$$ = method_optarg($$, $4);
+			$$ = method_optarg($$, $5);
 		    %*/
 		    }
-		| primary_value tCOLON2 operation2 paren_args
+		| primary_value tCOLON2 operation2
 		    {
 		    /*%%%*/
-			$$ = NEW_CALL($1, $3, $4);
-			fixpos($$, $1);
+			$<num>$ = ruby_sourceline;
+		    /*% %*/
+		    }
+		  paren_args
+		    {
+		    /*%%%*/
+			$$ = NEW_CALL($1, $3, $5);
+			nd_set_line($$, $<num>4);
 		    /*%
 			$$ = dispatch3(call, $1, ripper_id2sym('.'), $3);
-			$$ = method_optarg($$, $4);
+			$$ = method_optarg($$, $5);
 		    %*/
 		    }
 		| primary_value tCOLON2 operation3
@@ -3682,26 +3700,38 @@
 			$$ = dispatch3(call, $1, ripper_intern("::"), $3);
 		    %*/
 		    }
-		| primary_value '.' paren_args
+		| primary_value '.'
 		    {
 		    /*%%%*/
-			$$ = NEW_CALL($1, rb_intern("call"), $3);
-			fixpos($$, $1);
+			$<num>$ = ruby_sourceline;
+		    /*% %*/
+		    }
+		  paren_args
+		    {
+		    /*%%%*/
+			$$ = NEW_CALL($1, rb_intern("call"), $4);
+			nd_set_line($$, $<num>3);
 		    /*%
 			$$ = dispatch3(call, $1, ripper_id2sym('.'),
 				       ripper_intern("call"));
-			$$ = method_optarg($$, $3);
+			$$ = method_optarg($$, $4);
 		    %*/
 		    }
-		| primary_value tCOLON2 paren_args
+		| primary_value tCOLON2
 		    {
 		    /*%%%*/
-			$$ = NEW_CALL($1, rb_intern("call"), $3);
-			fixpos($$, $1);
+			$<num>$ = ruby_sourceline;
+		    /*% %*/
+		    }
+		  paren_args
+		    {
+		    /*%%%*/
+			$$ = NEW_CALL($1, rb_intern("call"), $4);
+			nd_set_line($$, $<num>3);
 		    /*%
 			$$ = dispatch3(call, $1, ripper_intern("::"),
 				       ripper_intern("call"));
-			$$ = method_optarg($$, $3);
+			$$ = method_optarg($$, $4);
 		    %*/
 		    }
 		| keyword_super paren_args
Index: test/ruby/test_settracefunc.rb
===================================================================
--- test/ruby/test_settracefunc.rb	(revision 34030)
+++ test/ruby/test_settracefunc.rb	(revision 34031)
@@ -23,7 +23,7 @@
      4: x = 1 + 1
      5: set_trace_func(nil)
     EOF
-    assert_equal(["c-return", 3, :set_trace_func, Kernel],
+    assert_equal(["c-return", 1, :set_trace_func, Kernel],
                  events.shift)
     assert_equal(["line", 4, __method__, self.class],
                  events.shift)
@@ -50,7 +50,7 @@
      7: x = add(1, 1)
      8: set_trace_func(nil)
     EOF
-    assert_equal(["c-return", 3, :set_trace_func, Kernel],
+    assert_equal(["c-return", 1, :set_trace_func, Kernel],
                  events.shift)
     assert_equal(["line", 4, __method__, self.class],
                  events.shift)
@@ -90,7 +90,7 @@
      8: x = Foo.new.bar
      9: set_trace_func(nil)
     EOF
-    assert_equal(["c-return", 3, :set_trace_func, Kernel],
+    assert_equal(["c-return", 1, :set_trace_func, Kernel],
                  events.shift)
     assert_equal(["line", 4, __method__, self.class],
                  events.shift)
@@ -143,7 +143,7 @@
      9: foo(false)
     10: set_trace_func(nil)
     EOF
-    assert_equal(["c-return", 3, :set_trace_func, Kernel],
+    assert_equal(["c-return", 1, :set_trace_func, Kernel],
                  events.shift)
     assert_equal(["line", 4, __method__, self.class],
                  events.shift)
@@ -187,7 +187,7 @@
      8: foo
      9: set_trace_func(nil)
     EOF
-    assert_equal(["c-return", 3, :set_trace_func, Kernel],
+    assert_equal(["c-return", 1, :set_trace_func, Kernel],
                  events.shift)
     assert_equal(["line", 4, __method__, self.class],
                  events.shift)
@@ -224,7 +224,7 @@
      7: end
      8: set_trace_func(nil)
     EOF
-    assert_equal(["c-return", 3, :set_trace_func, Kernel],
+    assert_equal(["c-return", 1, :set_trace_func, Kernel],
                  events.shift)
     assert_equal(["line", 4, __method__, self.class],
                  events.shift)
@@ -273,7 +273,7 @@
      8: set_trace_func(nil)
     EOF
 
-    [["c-return", 3, :set_trace_func, Kernel],
+    [["c-return", 1, :set_trace_func, Kernel],
      ["line", 4, __method__, self.class],
      ["c-call", 4, :any?, Enumerable],
      ["c-call", 4, :each, Array],
@@ -367,7 +367,7 @@
      7: set_trace_func(nil)
     EOF
 
-    [["c-return", 5, :set_trace_func, Kernel],
+    [["c-return", 3, :set_trace_func, Kernel],
      ["line", 6, __method__, self.class],
      ["call", 6, :foobar, FooBar],
      ["return", 6, :foobar, FooBar],
Index: test/ruby/test_parse.rb
===================================================================
--- test/ruby/test_parse.rb	(revision 34030)
+++ test/ruby/test_parse.rb	(revision 34031)
@@ -825,4 +825,18 @@
       c.instance_eval { remove_class_variable(:@var) }
     end
   end
+
+  def test_method_block_location
+    bug5614 = '[ruby-core:40936]'
+    expected = nil
+    e = assert_raise(NoMethodError) do
+      1.times do
+        expected = __LINE__+1
+      end.print do
+        #
+      end
+    end
+    actual = e.backtrace.first[/\A#{Regexp.quote(__FILE__)}:(\d+):/o, 1].to_i
+    assert_equal(expected, actual, bug5614)
+  end
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]