[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