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

ruby-changes:13399

From: nobu <ko1@a...>
Date: Wed, 30 Sep 2009 13:16:10 +0900 (JST)
Subject: [ruby-changes:13399] Ruby:r25169 (trunk): * vm_method.c (rb_add_method_def): show the location where

nobu	2009-09-30 13:15:46 +0900 (Wed, 30 Sep 2009)

  New Revision: 25169

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

  Log:
    * vm_method.c (rb_add_method_def): show the location where
      overwritten method was defined.  [ruby-dev:39400]

  Modified files:
    trunk/ChangeLog
    trunk/proc.c
    trunk/test/ruby/test_class.rb
    trunk/test/ruby/test_module.rb
    trunk/vm_method.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 25168)
+++ ChangeLog	(revision 25169)
@@ -1,3 +1,8 @@
+Wed Sep 30 13:15:45 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* vm_method.c (rb_add_method_def): show the location where
+	  overwritten method was defined.  [ruby-dev:39400]
+
 Wed Sep 30 00:37:27 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* enumerator.c (enumerator_block_call): extracted.
Index: proc.c
===================================================================
--- proc.c	(revision 25168)
+++ proc.c	(revision 25169)
@@ -648,8 +648,10 @@
     return -1;
 }
 
-static rb_iseq_t *
-get_proc_iseq(VALUE self, int *is_proc)
+#define get_proc_iseq rb_proc_get_iseq
+
+rb_iseq_t *
+rb_proc_get_iseq(VALUE self, int *is_proc)
 {
     rb_proc_t *proc;
     rb_iseq_t *iseq;
@@ -894,7 +896,7 @@
     rb_method_definition_t *def = 0;
 
   again:
-     me = rb_method_entry(klass, id);
+    me = rb_method_entry(klass, id);
     if (UNDEFINED_METHOD_ENTRY_P(me)) {
 	ID rmiss = rb_intern("respond_to_missing?");
 	VALUE sym = ID2SYM(id);
Index: vm_method.c
===================================================================
--- vm_method.c	(revision 25168)
+++ vm_method.c	(revision 25169)
@@ -188,7 +188,26 @@
 	    old_def->alias_count == 0 &&
 	    old_def->type != VM_METHOD_TYPE_UNDEF &&
 	    old_def->type != VM_METHOD_TYPE_ZSUPER) {
+	    extern rb_iseq_t *rb_proc_get_iseq(VALUE proc, int *is_proc);
+	    rb_iseq_t *iseq = 0;
+
 	    rb_warning("method redefined; discarding old %s", rb_id2name(mid));
+	    switch (old_def->type) {
+	      case VM_METHOD_TYPE_ISEQ:
+		iseq = old_def->body.iseq;
+		break;
+	      case VM_METHOD_TYPE_BMETHOD:
+		iseq = rb_proc_get_iseq(old_def->body.proc, 0);
+		break;
+	      default:
+		break;
+	    }
+	    if (iseq && !NIL_P(iseq->filename)) {
+		int line = iseq->insn_info_table ? rb_iseq_first_lineno(iseq) : 0;
+		rb_compile_warning(RSTRING_PTR(iseq->filename), line,
+				   "previous definition of %s was here",
+				   rb_id2name(old_def->original_id));
+	    }
 	}
 	rb_free_method_entry(old_me);
     }
Index: test/ruby/test_module.rb
===================================================================
--- test/ruby/test_module.rb	(revision 25168)
+++ test/ruby/test_module.rb	(revision 25169)
@@ -788,6 +788,8 @@
   end
 
   def test_method_redefinition
+    feature2155 = '[ruby-dev:39400]'
+
     line = __LINE__+4
     stderr = EnvUtil.verbose_warning do
       Module.new do
@@ -796,6 +798,7 @@
       end
     end
     assert_match(/:#{line}: warning: method redefined; discarding old foo/, stderr)
+    assert_match(/:#{line-1}: warning: previous definition of foo/, stderr, feature2155)
 
     stderr = EnvUtil.verbose_warning do
       Module.new do
@@ -823,6 +826,7 @@
       end
     end
     assert_match(/:#{line}: warning: method redefined; discarding old foo/, stderr)
+    assert_match(/:#{line-1}: warning: previous definition of foo/, stderr, feature2155)
 
     stderr = EnvUtil.verbose_warning do
       Module.new do
Index: test/ruby/test_class.rb
===================================================================
--- test/ruby/test_class.rb	(revision 25168)
+++ test/ruby/test_class.rb	(revision 25169)
@@ -106,6 +106,8 @@
   end
 
   def test_method_redefinition
+    feature2155 = '[ruby-dev:39400]'
+
     line = __LINE__+4
     stderr = EnvUtil.verbose_warning do
       Class.new do
@@ -114,6 +116,7 @@
       end
     end
     assert_match(/:#{line}: warning: method redefined; discarding old foo/, stderr)
+    assert_match(/:#{line-1}: warning: previous definition of foo/, stderr, feature2155)
 
     stderr = EnvUtil.verbose_warning do
       Class.new do
@@ -141,6 +144,7 @@
       end
     end
     assert_match(/:#{line}: warning: method redefined; discarding old foo/, stderr)
+    assert_match(/:#{line-1}: warning: previous definition of foo/, stderr, feature2155)
 
     stderr = EnvUtil.verbose_warning do
       Class.new do

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

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