[macruby-changes] [3041] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Mon Nov 23 01:46:14 PST 2009


Revision: 3041
          http://trac.macosforge.org/projects/ruby/changeset/3041
Author:   lsansonetti at apple.com
Date:     2009-11-23 01:46:14 -0800 (Mon, 23 Nov 2009)
Log Message:
-----------
fixed Module#method_defined?

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-23 09:22:22 UTC (rev 3040)
+++ MacRuby/trunk/dispatcher.cpp	2009-11-23 09:46:14 UTC (rev 3041)
@@ -1784,9 +1784,15 @@
 extern IMP basic_respond_to_imp; // vm_method.c
 
 bool
-RoxorCore::respond_to(VALUE obj, SEL sel, bool priv, bool check_override)
+RoxorCore::respond_to(VALUE obj, VALUE klass, SEL sel, bool priv,
+	bool check_override)
 {
-    VALUE klass = CLASS_OF(obj);
+    if (klass == Qnil) {
+	klass = CLASS_OF(obj);
+    }
+    else {
+	assert(!check_override);
+    }
 
     const bool overriden = check_override
 	? (class_getMethodImplementation((Class)klass, selRespondTo)
@@ -1844,21 +1850,22 @@
 }
 
 static bool
-respond_to(VALUE obj, SEL sel, bool priv, bool check_override)
+respond_to(VALUE obj, VALUE klass, SEL sel, bool priv, bool check_override)
 {
-    return GET_CORE()->respond_to(obj, sel, priv, check_override);
+    return GET_CORE()->respond_to(obj, klass, sel, priv, check_override);
 }
 
 extern "C"
 bool
 rb_vm_respond_to(VALUE obj, SEL sel, bool priv)
 {
-    return respond_to(obj, sel, priv, true);
+    return respond_to(obj, Qnil, sel, priv, true);
 }
 
 extern "C"
 bool
-rb_vm_respond_to2(VALUE obj, SEL sel, bool priv, bool check_override)
+rb_vm_respond_to2(VALUE obj, VALUE klass, SEL sel, bool priv,
+	bool check_override)
 {
-    return respond_to(obj, sel, priv, check_override);
+    return respond_to(obj, klass, sel, priv, check_override);
 } 

Modified: MacRuby/trunk/vm.h
===================================================================
--- MacRuby/trunk/vm.h	2009-11-23 09:22:22 UTC (rev 3040)
+++ MacRuby/trunk/vm.h	2009-11-23 09:46:14 UTC (rev 3041)
@@ -302,7 +302,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);
+bool rb_vm_respond_to2(VALUE obj, VALUE klass, 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));
@@ -800,7 +800,7 @@
 	void invalidate_respond_to_cache(void) {
 	    respond_to_cache.clear();
 	}
-	bool respond_to(VALUE obj, SEL sel, bool priv, bool check_override);
+	bool respond_to(VALUE obj, VALUE klass, SEL sel, bool priv, bool check_override);
 
     private:
 	bool register_bs_boxed(bs_element_type_t type, void *value);

Modified: MacRuby/trunk/vm_method.c
===================================================================
--- MacRuby/trunk/vm_method.c	2009-11-23 09:22:22 UTC (rev 3040)
+++ MacRuby/trunk/vm_method.c	2009-11-23 09:46:14 UTC (rev 3041)
@@ -347,11 +347,25 @@
  *     C.method_defined? "method4"   #=> false
  */
 
+static bool
+rb_obj_respond_to2(VALUE obj, VALUE klass, ID id, bool priv, bool check_override)
+{
+    const char *id_name = rb_id2name(id);
+    SEL sel = sel_registerName(id_name);
+    if (!rb_vm_respond_to2(obj, klass, sel, priv, check_override)) {
+	char buf[100];
+	snprintf(buf, sizeof buf, "%s:", id_name);
+	sel = sel_registerName(buf);
+	return rb_vm_respond_to2(obj, klass, sel, priv, check_override);
+    }
+    return true;
+}
+
 static VALUE
 rb_mod_method_defined(VALUE mod, SEL sel, VALUE mid)
 {
     ID id = rb_to_id(mid);
-    return rb_obj_respond_to(mod, id, true) ? Qtrue : Qfalse;
+    return rb_obj_respond_to2(Qnil, mod, id, true, false) ? Qtrue : Qfalse;
 }
 
 #define VISI_CHECK(x,f) (((x)&NOEX_MASK) == (f))
@@ -736,26 +750,10 @@
  *  optional second parameter evaluates to +true+.
  */
 
-//static NODE *basic_respond_to = 0;
-
-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_to2(obj, sel, priv, check_override)) {
-	char buf[100];
-	snprintf(buf, sizeof buf, "%s:", id_name);
-	sel = sel_registerName(buf);
-	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);
+    return rb_obj_respond_to2(obj, Qnil, id, priv, true);
 }
 
 bool
@@ -781,7 +779,7 @@
 
     rb_scan_args(argc, argv, "11", &mid, &priv);
     id = rb_to_id(mid);
-    return rb_obj_respond_to2(obj, id, RTEST(priv), false) ? Qtrue : Qfalse;
+    return rb_obj_respond_to2(obj, Qnil, 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/20091123/24521308/attachment-0001.html>


More information about the macruby-changes mailing list