[macruby-changes] [4525] MacRuby/trunk/objc.m

source_changes at macosforge.org source_changes at macosforge.org
Fri Sep 17 14:57:00 PDT 2010


Revision: 4525
          http://trac.macosforge.org/projects/ruby/changeset/4525
Author:   lsansonetti at apple.com
Date:     2010-09-17 14:56:59 -0700 (Fri, 17 Sep 2010)
Log Message:
-----------
better/faster handling of NSDates

Modified Paths:
--------------
    MacRuby/trunk/objc.m

Modified: MacRuby/trunk/objc.m
===================================================================
--- MacRuby/trunk/objc.m	2010-09-17 21:38:19 UTC (rev 4524)
+++ MacRuby/trunk/objc.m	2010-09-17 21:56:59 UTC (rev 4525)
@@ -580,10 +580,15 @@
     abort();
 }
 
+static SEL sel_at = 0;
+
 VALUE
 rb_objc_convert_immediate(id obj)
 {
-    Class k = object_getClass(obj); // might be an immediate
+    const bool is_immediate = ((unsigned long)obj & 0x1) == 0x1;
+
+    Class orig_k = object_getClass(obj); // might be an immediate
+    Class k = orig_k;
     do {
 	if (k == (Class)rb_cNSNumber) {
 	    // TODO: this could be optimized in case the object is an immediate.
@@ -599,17 +604,23 @@
 	    }
 	}
 	else if (k == (Class)rb_cNSDate) {
-	    CFAbsoluteTime time = CFDateGetAbsoluteTime((CFDateRef)obj);
-	    return rb_funcall(rb_cTime, rb_intern("at"), 1, DBL2NUM(time + CF_REFERENCE_DATE));
+	    @try {
+		CFAbsoluteTime time = CFDateGetAbsoluteTime((CFDateRef)obj);
+		VALUE arg = DBL2NUM(time + CF_REFERENCE_DATE);
+		return rb_vm_call(rb_cTime, sel_at, 1, &arg);
+	    }
+	    @catch (NSException *e) {
+		// Some NSDates might return an exception (example: uninitialized objects).
+		break;
+	    }
 	}
 	k = class_getSuperclass(k);
     }
     while (k != NULL);
 
-    if (((unsigned long)obj & 0x1) == 0x1) {
-	rb_bug("unknown Objective-C immediate: %p\n", obj);
+    if (is_immediate) {
+	rb_bug("unknown Objective-C immediate: %p (%s)\n", obj, class_getName(orig_k));
     }
-
     return (VALUE)obj;
 }
 
@@ -784,6 +795,8 @@
 void
 Init_ObjC(void)
 {
+    sel_at = sel_registerName("at:");
+
     rb_objc_define_module_function(rb_mKernel, "load_bridge_support_file", rb_objc_load_bs, 1);
     rb_objc_define_module_function(rb_mKernel, "load_plist", rb_objc_load_plist, 1);
     
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100917/bcb50905/attachment-0001.html>


More information about the macruby-changes mailing list