Revision: 4496 http://trac.macosforge.org/projects/ruby/changeset/4496 Author: martinlagardette@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) {
participants (1)
-
source_changes@macosforge.org