Revision: 3934 http://trac.macosforge.org/projects/ruby/changeset/3934 Author: lsansonetti@apple.com Date: 2010-04-14 19:00:40 -0700 (Wed, 14 Apr 2010) Log Message: ----------- always auto-convert NSNumbers Modified Paths: -------------- MacRuby/trunk/objc.h MacRuby/trunk/objc.m Modified: MacRuby/trunk/objc.h =================================================================== --- MacRuby/trunk/objc.h 2010-04-14 20:04:13 UTC (rev 3933) +++ MacRuby/trunk/objc.h 2010-04-15 02:00:40 UTC (rev 3934) @@ -174,6 +174,8 @@ return (id)kCFNull; } if (FIXNUM_P(obj)) { + // TODO: this could be optimized in case we can fit the fixnum + // into an immediate NSNumber directly. long val = FIX2LONG(obj); CFNumberRef number = CFNumberCreate(NULL, kCFNumberLongType, &val); CFMakeCollectable(number); @@ -190,6 +192,8 @@ return (id)obj; } +extern CFTypeID __CFNumberTypeID; + static inline VALUE rb_ocid_to_rval(id obj) { @@ -202,35 +206,25 @@ if (obj == (id)kCFNull || obj == nil) { return Qnil; } -#if MAC_OS_X_VERSION_MAX_ALLOWED < 1070 - if (true) { -#else - if (((unsigned long)obj & 0x1) == 0x1) { -#endif - // An Objective-C immediate! We only recognize NSNumbers for now. - Class k = object_getClass(obj); - while (k != NULL) { - if (k == (Class)rb_cNSNumber) { - if (CFNumberIsFloatType((CFNumberRef)obj)) { - // Will likely not happen, but just in case... - double v; - assert(CFNumberGetValue((CFNumberRef)obj, - kCFNumberDoubleType, &v)); - return DOUBLE2NUM(v); - } - else { - long v; - assert(CFNumberGetValue((CFNumberRef)obj, - kCFNumberLongType, &v)); - return LONG2FIX(v); - } - } - k = class_getSuperclass(k); + + if (CFGetTypeID(obj) == __CFNumberTypeID) { + // 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); } -#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 + 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); -#endif } + return (VALUE)obj; } Modified: MacRuby/trunk/objc.m =================================================================== --- MacRuby/trunk/objc.m 2010-04-14 20:04:13 UTC (rev 3933) +++ MacRuby/trunk/objc.m 2010-04-15 02:00:40 UTC (rev 3934) @@ -25,6 +25,8 @@ # include "bs.h" #endif +CFTypeID __CFNumberTypeID = 0; + static inline const char * rb_get_bs_method_type(bs_element_method_t *bs_method, int arg) { @@ -663,6 +665,9 @@ void Init_ObjC(void) { + __CFNumberTypeID = CFNumberGetTypeID(); + assert(__CFNumberTypeID > 0); + rb_objc_define_method(rb_mKernel, "load_bridge_support_file", rb_objc_load_bs, 1);
participants (1)
-
source_changes@macosforge.org