[macruby-changes] [2947] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Mon Nov 2 21:18:36 PST 2009


Revision: 2947
          http://trac.macosforge.org/projects/ruby/changeset/2947
Author:   lsansonetti at apple.com
Date:     2009-11-02 21:18:33 -0800 (Mon, 02 Nov 2009)
Log Message:
-----------
make sure Kernel#respond_to? doesn't call itself stupid^Wrecursively

Modified Paths:
--------------
    MacRuby/trunk/dispatcher.cpp
    MacRuby/trunk/vm.h
    MacRuby/trunk/vm_method.c

Modified: MacRuby/trunk/dispatcher.cpp
===================================================================
--- MacRuby/trunk/dispatcher.cpp	2009-11-03 04:28:58 UTC (rev 2946)
+++ MacRuby/trunk/dispatcher.cpp	2009-11-03 05:18:33 UTC (rev 2947)
@@ -1757,16 +1757,17 @@
 
 extern IMP basic_respond_to_imp; // vm_method.c
 
-extern "C"
-bool
-rb_vm_respond_to(VALUE obj, SEL sel, bool priv)
+static bool
+respond_to(VALUE obj, SEL sel, bool priv, bool check_override)
 {
     VALUE klass = CLASS_OF(obj);
 
-    IMP respond_to_imp = class_getMethodImplementation((Class)klass,
-	    selRespondTo);
+    const bool overriden = check_override
+	? (class_getMethodImplementation((Class)klass, selRespondTo)
+		!= basic_respond_to_imp)
+	: false;
 
-    if (respond_to_imp == basic_respond_to_imp) {
+    if (!overriden) {
 	// FIXME: too slow!
 	bool reject_pure_ruby_methods = false;
 	Method m = class_getInstanceMethod((Class)klass, sel);
@@ -1802,3 +1803,17 @@
 	return rb_vm_call(obj, selRespondTo, n, args, false) == Qtrue;
     }
 }
+
+extern "C"
+bool
+rb_vm_respond_to(VALUE obj, SEL sel, bool priv)
+{
+    return respond_to(obj, sel, priv, true);
+}
+
+extern "C"
+bool
+rb_vm_respond_to2(VALUE obj, SEL sel, bool priv, bool check_override)
+{
+    return respond_to(obj, sel, priv, check_override);
+} 

Modified: MacRuby/trunk/vm.h
===================================================================
--- MacRuby/trunk/vm.h	2009-11-03 04:28:58 UTC (rev 2946)
+++ MacRuby/trunk/vm.h	2009-11-03 05:18:33 UTC (rev 2947)
@@ -300,6 +300,7 @@
 VALUE rb_vm_yield(int argc, const VALUE *argv);
 VALUE rb_vm_yield_under(VALUE klass, VALUE self, int argc, const VALUE *argv);
 bool rb_vm_respond_to(VALUE obj, SEL sel, bool priv);
+bool rb_vm_respond_to2(VALUE obj, SEL sel, bool priv, bool check_override);
 VALUE rb_vm_method_missing(VALUE obj, int argc, const VALUE *argv);
 void rb_vm_push_methods(VALUE ary, VALUE mod, bool include_objc_methods,
 	int (*filter) (VALUE, ID, VALUE));

Modified: MacRuby/trunk/vm_method.c
===================================================================
--- MacRuby/trunk/vm_method.c	2009-11-03 04:28:58 UTC (rev 2946)
+++ MacRuby/trunk/vm_method.c	2009-11-03 05:18:33 UTC (rev 2947)
@@ -769,24 +769,30 @@
 
 //static NODE *basic_respond_to = 0;
 
-bool
-rb_obj_respond_to(VALUE obj, ID id, bool priv)
+static bool
+rb_obj_respond_to2(VALUE obj, ID id, bool priv, bool check_override)
 {
     const char *id_name = rb_id2name(id);
     SEL sel = sel_registerName(id_name);
-    if (!rb_vm_respond_to(obj, sel, priv)) {
+    if (!rb_vm_respond_to2(obj, sel, priv, check_override)) {
 	char buf[100];
 	snprintf(buf, sizeof buf, "%s:", id_name);
 	sel = sel_registerName(buf);
-	return rb_vm_respond_to(obj, sel, priv);
+	return rb_vm_respond_to2(obj, sel, priv, check_override);
     }
     return true;
 }
 
 bool
+rb_obj_respond_to(VALUE obj, ID id, bool priv)
+{
+    return rb_obj_respond_to2(obj, id, priv, true);
+}
+
+bool
 rb_respond_to(VALUE obj, ID id)
 {
-    return rb_obj_respond_to(obj, id, Qfalse);
+    return rb_obj_respond_to(obj, id, false);
 }
 
 /*
@@ -806,7 +812,7 @@
 
     rb_scan_args(argc, argv, "11", &mid, &priv);
     id = rb_to_id(mid);
-    return rb_obj_respond_to(obj, id, RTEST(priv)) ? Qtrue : Qfalse;
+    return rb_obj_respond_to2(obj, id, RTEST(priv), false) ? Qtrue : Qfalse;
 }
 
 IMP basic_respond_to_imp = NULL;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20091102/6ceb2321/attachment-0001.html>


More information about the macruby-changes mailing list