Project

General

Profile

Actions

Feature #2155

closed

improvement of method redefinition warning

Added by nobu (Nobuyoshi Nakada) over 15 years ago. Updated about 14 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-dev:39400]

Description

=begin
なかだです。

メソッド再定義で警告を出すときに、上書きされるほうの定義の場所も
出してはどうでしょうか。


Index: proc.c

--- proc.c (revision 25152)
+++ proc.c (working copy)
@@ -649,6 +649,8 @@ rb_proc_arity(VALUE self)
}

-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;
Index: vm_method.c

--- vm_method.c (revision 25152)
+++ vm_method.c (working copy)
@@ -189,5 +189,24 @@ rb_add_method_def(VALUE klass, ID mid, r
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_class.rb
    ===================================================================
    --- test/ruby/test_class.rb (revision 25152)
    +++ test/ruby/test_class.rb (working copy)
    @@ -115,4 +115,5 @@ class TestClass < Test::Unit::TestCase
    end
    assert_match(/:#{line}: warning: method redefined; discarding old foo/, stderr)

  • assert_match(/:#{line-1}: warning: previous definition of foo/, stderr)

    stderr = EnvUtil.verbose_warning do
    @@ -142,4 +143,5 @@ class TestClass < Test::Unit::TestCase
    end
    assert_match(/:#{line}: warning: method redefined; discarding old foo/, stderr)

  • assert_match(/:#{line-1}: warning: previous definition of foo/, stderr)

    stderr = EnvUtil.verbose_warning do
    Index: test/ruby/test_module.rb
    ===================================================================
    --- test/ruby/test_module.rb (revision 25152)
    +++ test/ruby/test_module.rb (working copy)
    @@ -797,4 +797,5 @@ class TestModule < Test::Unit::TestCase
    end
    assert_match(/:#{line}: warning: method redefined; discarding old foo/, stderr)

  • assert_match(/:#{line-1}: warning: previous definition of foo/, stderr)

    stderr = EnvUtil.verbose_warning do
    @@ -824,4 +825,5 @@ class TestModule < Test::Unit::TestCase
    end
    assert_match(/:#{line}: warning: method redefined; discarding old foo/, stderr)

  • assert_match(/:#{line-1}: warning: previous definition of foo/, stderr)

    stderr = EnvUtil.verbose_warning do

--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦
=end

Actions #1

Updated by matz (Yukihiro Matsumoto) over 15 years ago

=begin
まつもと ゆきひろです

In message "Re: [ruby-dev:39400] [Feature:1.9] improvement of method redefinition warning"
on Tue, 29 Sep 2009 16:05:34 +0900, Nobuyoshi Nakada writes:

|メソッド再定義で警告を出すときに、上書きされるほうの定義の場所も
|出してはどうでしょうか。

いいんじゃないでしょうか。

=end

Actions #2

Updated by nobu (Nobuyoshi Nakada) over 15 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

=begin
Applied in changeset r25169.
=end

Actions

Also available in: Atom PDF

Like0
Like0Like0