ruby-changes:27037
From: nobu <ko1@a...>
Date: Wed, 6 Feb 2013 13:35:42 +0900 (JST)
Subject: [ruby-changes:27037] nobu:r39089 (trunk): vm_method.c: show respond_to location
nobu 2013-02-06 13:35:23 +0900 (Wed, 06 Feb 2013) New Revision: 39089 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=39089 Log: vm_method.c: show respond_to location * proc.c (rb_method_entry_location, rb_{mod,obj}_method_location): new functions to obtain source location of method definition. * vm_method.c (rb_obj_respond_to): show the location of old style respond_to? method. Modified files: trunk/ChangeLog trunk/method.h trunk/proc.c trunk/vm_method.c Index: method.h =================================================================== --- method.h (revision 39088) +++ method.h (revision 39089) @@ -126,6 +126,10 @@ int rb_method_entry_arity(const rb_metho https://github.com/ruby/ruby/blob/trunk/method.h#L126 int rb_method_entry_eq(const rb_method_entry_t *m1, const rb_method_entry_t *m2); st_index_t rb_hash_method_entry(st_index_t hash, const rb_method_entry_t *me); +VALUE rb_method_entry_location(rb_method_entry_t *me); +VALUE rb_mod_method_location(VALUE mod, ID id); +VALUE rb_obj_method_location(VALUE obj, ID id); + void rb_mark_method_entry(const rb_method_entry_t *me); void rb_free_method_entry(rb_method_entry_t *me); void rb_sweep_method_entry(void *vm); Index: ChangeLog =================================================================== --- ChangeLog (revision 39088) +++ ChangeLog (revision 39089) @@ -1,3 +1,11 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Wed Feb 6 13:35:20 2013 Nobuyoshi Nakada <nobu@r...> + + * proc.c (rb_method_entry_location, rb_{mod,obj}_method_location): new + functions to obtain source location of method definition. + + * vm_method.c (rb_obj_respond_to): show the location of old style + respond_to? method. + Wed Feb 6 13:03:00 2013 Zachary Scott <zachary@z...> * doc/security.rdoc: Add link to CVEs on ruby-lang.org/en/security Index: proc.c =================================================================== --- proc.c (revision 39088) +++ proc.c (revision 39089) @@ -1844,6 +1844,37 @@ rb_method_get_iseq(VALUE method) https://github.com/ruby/ruby/blob/trunk/proc.c#L1844 return method_get_iseq(method_get_def(method)); } +static VALUE +method_def_location(rb_method_definition_t *def) +{ + if (def->type == VM_METHOD_TYPE_ATTRSET || def->type == VM_METHOD_TYPE_IVAR) { + if (!def->body.attr.location) + return Qnil; + return rb_ary_dup(def->body.attr.location); + } + return iseq_location(method_get_iseq(def)); +} + +VALUE +rb_method_entry_location(rb_method_entry_t *me) +{ + if (!me || !me->def) return Qnil; + return method_def_location(me->def); +} + +VALUE +rb_mod_method_location(VALUE mod, ID id) +{ + rb_method_entry_t *me = original_method_entry(mod, id); + return rb_method_entry_location(me); +} + +VALUE +rb_obj_method_location(VALUE obj, ID id) +{ + return rb_mod_method_location(CLASS_OF(obj), id); +} + /* * call-seq: * meth.source_location -> [String, Fixnum] @@ -1856,12 +1887,7 @@ VALUE https://github.com/ruby/ruby/blob/trunk/proc.c#L1887 rb_method_location(VALUE method) { rb_method_definition_t *def = method_get_def(method); - if (def->type == VM_METHOD_TYPE_ATTRSET || def->type == VM_METHOD_TYPE_IVAR) { - if (!def->body.attr.location) - return Qnil; - return rb_ary_dup(def->body.attr.location); - } - return iseq_location(method_get_iseq(def)); + return method_def_location(def); } /* Index: vm_method.c =================================================================== --- vm_method.c (revision 39088) +++ vm_method.c (revision 39089) @@ -1529,13 +1529,22 @@ rb_obj_respond_to(VALUE obj, ID id, int https://github.com/ruby/ruby/blob/trunk/vm_method.c#L1529 if (rb_obj_method_arity(obj, idRespond_to) != 1) { argc = 2; } - else { + else if (!NIL_P(ruby_verbose)) { VALUE klass = CLASS_OF(obj); + VALUE location = rb_mod_method_location(klass, idRespond_to); rb_warn("%"PRIsVALUE"%c""respond_to?(:%"PRIsVALUE") is" " old fashion which takes only one parameter", (FL_TEST(klass, FL_SINGLETON) ? obj : klass), (FL_TEST(klass, FL_SINGLETON) ? '.' : '#'), QUOTE_ID(id)); + if (!NIL_P(location)) { + VALUE path = RARRAY_PTR(location)[0]; + VALUE line = RARRAY_PTR(location)[1]; + if (!NIL_P(path)) { + rb_compile_warn(RSTRING_PTR(path), NUM2INT(line), + "respond_to? is defined here"); + } + } } } return RTEST(rb_funcall2(obj, idRespond_to, argc, args)); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/