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/