[macruby-changes] [3953] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Wed Apr 21 14:34:27 PDT 2010


Revision: 3953
          http://trac.macosforge.org/projects/ruby/changeset/3953
Author:   lsansonetti at apple.com
Date:     2010-04-21 14:34:24 -0700 (Wed, 21 Apr 2010)
Log Message:
-----------
fixed the NSNumber conversion (which broke NSProxy), moved the support forwarding check from the dispatcher into objc.m

Modified Paths:
--------------
    MacRuby/trunk/dispatcher.cpp
    MacRuby/trunk/objc.h
    MacRuby/trunk/objc.m

Modified: MacRuby/trunk/dispatcher.cpp
===================================================================
--- MacRuby/trunk/dispatcher.cpp	2010-04-21 17:37:17 UTC (rev 3952)
+++ MacRuby/trunk/dispatcher.cpp	2010-04-21 21:34:24 UTC (rev 3953)
@@ -471,21 +471,6 @@
     rcache.node = node;
 }
 
-static bool
-can_forwardInvocation(VALUE recv, SEL sel)
-{
-    if (!SPECIAL_CONST_P(recv)) {
-	static SEL methodSignatureForSelector = 0;
-	if (methodSignatureForSelector == 0) {
-	    methodSignatureForSelector =
-		sel_registerName("methodSignatureForSelector:");	
-	}
-	return objc_msgSend((id)recv, methodSignatureForSelector, (id)sel)
-	    != nil;
-    }
-    return false;
-}
-
 static void
 fill_ocache(struct mcache *cache, VALUE self, Class klass, IMP imp, SEL sel,
 	    Method method, int argc)
@@ -635,7 +620,8 @@
 	    }
 
 	    // Does the receiver implements -forwardInvocation:?
-	    if (opt != DISPATCH_SUPER && can_forwardInvocation(self, sel)) {
+	    if (opt != DISPATCH_SUPER
+		    && rb_objc_supports_forwarding(self, sel)) {
 		fill_ocache(cache, self, klass, (IMP)objc_msgSend, sel, NULL,
 			argc);
 		goto dispatch;

Modified: MacRuby/trunk/objc.h
===================================================================
--- MacRuby/trunk/objc.h	2010-04-21 17:37:17 UTC (rev 3952)
+++ MacRuby/trunk/objc.h	2010-04-21 21:34:24 UTC (rev 3953)
@@ -18,6 +18,8 @@
 bool rb_objc_get_types(VALUE recv, Class klass, SEL sel, Method m,
 	bs_element_method_t *bs_method, char *buf, size_t buflen);
 
+bool rb_objc_supports_forwarding(VALUE recv, SEL sel);
+
 void rb_objc_define_kvo_setter(VALUE klass, ID mid);
 VALUE rb_vm_set_kvo_ivar(VALUE obj, ID name, VALUE val);
 
@@ -192,7 +194,19 @@
     return (id)obj;
 }
 
-extern CFTypeID __CFNumberTypeID;
+static inline bool
+rb_objc_obj_is_nsnumber(id obj)
+{
+    Class k = object_getClass(obj); // might be an immediate
+    do {
+	if (k == (Class)rb_cNSNumber) {
+	    return true;
+	}
+	k = class_getSuperclass(k);
+    }
+    while (k != NULL);
+    return false;
+}
 
 static inline VALUE
 rb_ocid_to_rval(id obj)
@@ -207,7 +221,7 @@
 	return Qnil;
     }
 
-    if (CFGetTypeID(obj) == __CFNumberTypeID) {
+    if (rb_objc_obj_is_nsnumber(obj)) {
 	// TODO: this could be optimized in case the object is an immediate.
 	if (CFNumberIsFloatType((CFNumberRef)obj)) {
 	    double v = 0;

Modified: MacRuby/trunk/objc.m
===================================================================
--- MacRuby/trunk/objc.m	2010-04-21 17:37:17 UTC (rev 3952)
+++ MacRuby/trunk/objc.m	2010-04-21 21:34:24 UTC (rev 3953)
@@ -25,8 +25,6 @@
 # include "bs.h"
 #endif
 
-CFTypeID __CFNumberTypeID = 0;
-
 static inline const char *
 rb_get_bs_method_type(bs_element_method_t *bs_method, int arg)
 {
@@ -122,6 +120,15 @@
     return false;
 }
 
+bool
+rb_objc_supports_forwarding(VALUE recv, SEL sel)
+{
+    if (!SPECIAL_CONST_P(recv)) {
+	return [(id)recv methodSignatureForSelector:sel] != nil;
+    }
+    return false;
+}
+
 static id _symbolicator = nil;
 #define SYMBOLICATION_FRAMEWORK @"/System/Library/PrivateFrameworks/Symbolication.framework"
 
@@ -685,9 +692,6 @@
 void
 Init_ObjC(void)
 {
-    __CFNumberTypeID = CFNumberGetTypeID();
-    assert(__CFNumberTypeID > 0);
-
     rb_objc_define_method(rb_mKernel, "load_bridge_support_file",
 	    rb_objc_load_bs, 1);
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100421/15605781/attachment.html>


More information about the macruby-changes mailing list