[macruby-changes] [3752] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Fri Mar 12 19:27:20 PST 2010


Revision: 3752
          http://trac.macosforge.org/projects/ruby/changeset/3752
Author:   lsansonetti at 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;
 }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100312/2c192783/attachment.html>


More information about the macruby-changes mailing list