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

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/

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