Revision: 3752 http://trac.macosforge.org/projects/ruby/changeset/3752 Author: lsansonetti@apple.com Date: 2010-03-12 19:27:20 -0800 (Fri, 12 Mar 2010) Log Message: ----------- support for objc immediates, removed reference to CFNumber Modified Paths: -------------- MacRuby/trunk/include/ruby/ruby.h MacRuby/trunk/numeric.c MacRuby/trunk/objc.h Modified: MacRuby/trunk/include/ruby/ruby.h =================================================================== --- MacRuby/trunk/include/ruby/ruby.h 2010-03-13 03:26:45 UTC (rev 3751) +++ MacRuby/trunk/include/ruby/ruby.h 2010-03-13 03:27:20 UTC (rev 3752) @@ -1092,7 +1092,7 @@ RUBY_EXTERN VALUE rb_cNSHash; RUBY_EXTERN VALUE rb_cNSMutableHash; RUBY_EXTERN VALUE rb_cRubyHash; -RUBY_EXTERN VALUE rb_cCFNumber; +RUBY_EXTERN VALUE rb_cNSNumber; RUBY_EXTERN VALUE rb_cBoxed; RUBY_EXTERN VALUE rb_cPointer; RUBY_EXTERN VALUE rb_cTopLevel; Modified: MacRuby/trunk/numeric.c =================================================================== --- MacRuby/trunk/numeric.c 2010-03-13 03:26:45 UTC (rev 3751) +++ MacRuby/trunk/numeric.c 2010-03-13 03:27:20 UTC (rev 3752) @@ -85,7 +85,6 @@ static ID id_to_i, id_eq; VALUE rb_cNumeric; -VALUE rb_cCFNumber; VALUE rb_cNSNumber; VALUE rb_cFloat; VALUE rb_cInteger; @@ -3411,8 +3410,6 @@ rb_eZeroDivError = rb_define_class("ZeroDivisionError", rb_eStandardError); rb_eFloatDomainError = rb_define_class("FloatDomainError", rb_eRangeError); rb_cNSNumber = (VALUE)objc_getClass("NSNumber"); - rb_cCFNumber = (VALUE)objc_getClass(NSCFNUMBER_CNAME); - assert(rb_cCFNumber != 0); rb_cNumeric = rb_define_class("Numeric", rb_cNSNumber); RCLASS_SET_VERSION_FLAG(rb_cNumeric, RCLASS_IS_OBJECT_SUBCLASS); rb_define_object_special_methods(rb_cNumeric); Modified: MacRuby/trunk/objc.h =================================================================== --- MacRuby/trunk/objc.h 2010-03-13 03:26:45 UTC (rev 3751) +++ MacRuby/trunk/objc.h 2010-03-13 03:27:20 UTC (rev 3752) @@ -205,28 +205,28 @@ if (obj == (id)kCFNull || obj == nil) { return Qnil; } - if (*(Class *)obj == (Class)rb_cFixnum) { - return LONG2FIX(RFIXNUM(obj)->value); - } -#if 0 // XXX this does not seem to be needed - if (*(Class *)obj == (Class)rb_cFloat) { - extern VALUE rb_float_new(double); - return rb_float_new(RFLOAT(obj)->float_value); - } -#endif - if (*(Class *)obj == (Class)rb_cCFNumber) { - /* TODO NSNumber should implement the Numeric primitive methods */ - if (CFNumberIsFloatType((CFNumberRef)obj)) { - double v; - assert(CFNumberGetValue((CFNumberRef)obj, kCFNumberDoubleType, &v)); - extern VALUE rb_float_new(double); - return rb_float_new(v); + if (((unsigned long)obj & 0x1) == 0x1) { + // 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); } - else { - long v; - assert(CFNumberGetValue((CFNumberRef)obj, kCFNumberLongType, &v)); - return LONG2FIX(v); - } + rb_bug("unknown Objective-C immediate: %p\n", obj); } return (VALUE)obj; }
participants (1)
-
source_changes@macosforge.org