[macruby-changes] [4496] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Tue Sep 7 20:14:38 PDT 2010


Revision: 4496
          http://trac.macosforge.org/projects/ruby/changeset/4496
Author:   martinlagardette at apple.com
Date:     2010-09-07 20:14:36 -0700 (Tue, 07 Sep 2010)
Log Message:
-----------
Handle NSDate immediate

Modified Paths:
--------------
    MacRuby/trunk/include/ruby/ruby.h
    MacRuby/trunk/objc.h
    MacRuby/trunk/objc.m
    MacRuby/trunk/time.c

Modified: MacRuby/trunk/include/ruby/ruby.h
===================================================================
--- MacRuby/trunk/include/ruby/ruby.h	2010-09-08 00:53:10 UTC (rev 4495)
+++ MacRuby/trunk/include/ruby/ruby.h	2010-09-08 03:14:36 UTC (rev 4496)
@@ -927,6 +927,7 @@
 RUBY_EXTERN VALUE rb_cNSMutableHash;
 RUBY_EXTERN VALUE rb_cRubyHash;
 RUBY_EXTERN VALUE rb_cNSNumber;
+RUBY_EXTERN VALUE rb_cNSDate;
 RUBY_EXTERN VALUE rb_cBoxed;
 RUBY_EXTERN VALUE rb_cPointer;
 RUBY_EXTERN VALUE rb_cTopLevel;

Modified: MacRuby/trunk/objc.h
===================================================================
--- MacRuby/trunk/objc.h	2010-09-08 00:53:10 UTC (rev 4495)
+++ MacRuby/trunk/objc.h	2010-09-08 03:14:36 UTC (rev 4496)
@@ -195,7 +195,7 @@
 }
 
 id rb_objc_numeric2nsnumber(VALUE obj);
-VALUE rb_objc_nsnumber2numeric(id obj);
+VALUE rb_objc_convert_immediate(id obj);
 
 static inline id
 rb_rval_to_ocid(VALUE obj)
@@ -229,7 +229,7 @@
     if (obj == (id)kCFNull || obj == nil) {
 	return Qnil;
     }
-    return rb_objc_nsnumber2numeric(obj);
+    return rb_objc_convert_immediate(obj);
 }
 
 #define RB2OC(obj) (rb_rval_to_ocid((VALUE)obj))
@@ -250,6 +250,9 @@
 	void *ctx);
 #endif
 
+#define SINCE_EPOCH 978307200.0
+#define CF_REFERENCE_DATE SINCE_EPOCH
+
 #if defined(__cplusplus)
 }
 #endif

Modified: MacRuby/trunk/objc.m
===================================================================
--- MacRuby/trunk/objc.m	2010-09-08 00:53:10 UTC (rev 4495)
+++ MacRuby/trunk/objc.m	2010-09-08 03:14:36 UTC (rev 4496)
@@ -580,37 +580,32 @@
     abort();
 }
 
-static inline bool
-rb_objc_obj_is_nsnumber(id obj)
+VALUE
+rb_objc_convert_immediate(id obj)
 {
     Class k = object_getClass(obj); // might be an immediate
     do {
 	if (k == (Class)rb_cNSNumber) {
-	    return true;
+	    // TODO: this could be optimized in case the object is an immediate.
+	    if (CFNumberIsFloatType((CFNumberRef)obj)) {
+		double v = 0;
+		assert(CFNumberGetValue((CFNumberRef)obj, kCFNumberDoubleType, &v));
+		return DOUBLE2NUM(v);
+	    }
+	    else {
+		long v = 0;
+		assert(CFNumberGetValue((CFNumberRef)obj, kCFNumberLongType, &v));
+		return LONG2FIX(v);
+	    }
 	}
+	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));
+	}
 	k = class_getSuperclass(k);
     }
     while (k != NULL);
-    return false;
-}
 
-VALUE
-rb_objc_nsnumber2numeric(id obj)
-{
-    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;
-	    assert(CFNumberGetValue((CFNumberRef)obj, kCFNumberDoubleType, &v));
-	    return DOUBLE2NUM(v);
-	}
-	else {
-	    long v = 0;
-	    assert(CFNumberGetValue((CFNumberRef)obj, kCFNumberLongType, &v));
-	    return LONG2FIX(v);
-	}
-    }
-
     if (((unsigned long)obj & 0x1) == 0x1) {
 	rb_bug("unknown Objective-C immediate: %p\n", obj);
     }

Modified: MacRuby/trunk/time.c
===================================================================
--- MacRuby/trunk/time.c	2010-09-08 00:53:10 UTC (rev 4495)
+++ MacRuby/trunk/time.c	2010-09-08 03:14:36 UTC (rev 4496)
@@ -2335,8 +2335,6 @@
  *  apparently equal when displayed may be different when compared.
  */
 
-#define SINCE_EPOCH 978307200.0
-
 static double
 imp_timeIntervalSinceReferenceDate(void *rcv, SEL sel)
 {
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100907/e32fa033/attachment.html>


More information about the macruby-changes mailing list