[macruby-changes] [3343] MacRuby/trunk/numeric.c

source_changes at macosforge.org source_changes at macosforge.org
Tue Jan 26 15:18:11 PST 2010


Revision: 3343
          http://trac.macosforge.org/projects/ruby/changeset/3343
Author:   lsansonetti at apple.com
Date:     2010-01-26 15:18:08 -0800 (Tue, 26 Jan 2010)
Log Message:
-----------
fixnum and float boxes must honor -copyWithZone:

Modified Paths:
--------------
    MacRuby/trunk/numeric.c

Modified: MacRuby/trunk/numeric.c
===================================================================
--- MacRuby/trunk/numeric.c	2010-01-26 21:58:58 UTC (rev 3342)
+++ MacRuby/trunk/numeric.c	2010-01-26 23:18:08 UTC (rev 3343)
@@ -94,8 +94,7 @@
 VALUE rb_eZeroDivError;
 VALUE rb_eFloatDomainError;
 
-static CFMutableDictionaryRef fixnum_dict = NULL;
-static struct RFixnum *fixnum_cache = NULL;
+static CFMutableDictionaryRef fixnum_cache = NULL;
 
 static inline VALUE
 rb_box_fixfloat0(double v)
@@ -112,40 +111,33 @@
     return rb_box_fixfloat0(NUM2DBL(fixfloat));
 }
 
-VALUE
-rb_box_fixnum(VALUE fixnum)
+static inline VALUE
+rb_box_fixnum0(long value)
 {
-    struct RFixnum *val;
-    long value;
-
-    if (fixnum_dict == NULL)
-	fixnum_dict = CFDictionaryCreateMutable(kCFAllocatorMalloc, 0, NULL, NULL); 
-
-    value = FIX2LONG(fixnum);
-
-    if (value >= 0 && value <= 1000000) {
-	if (fixnum_cache == NULL) {
-	   fixnum_cache = (struct RFixnum *)calloc(1, sizeof(struct RFixnum) * 1000000);
-	}
-	val = &fixnum_cache[value];
-	if (val->klass == 0) {
-	    val->klass = rb_cFixnum;
-	    val->value = value;
-	}
-	return (VALUE)val;
+    if (fixnum_cache == NULL) {
+	fixnum_cache = CFDictionaryCreateMutable(NULL, 0, NULL,
+		&kCFTypeDictionaryValueCallBacks);
     }
 
-    val = (struct RFixnum *)CFDictionaryGetValue(fixnum_dict, (const void *)fixnum);
+    struct RFixnum *val = (struct RFixnum *)CFDictionaryGetValue(fixnum_cache,
+	    (const void *)value);
     if (val == NULL) {
-	val = (struct RFixnum *)malloc(sizeof(struct RFixnum));
-	val->klass = rb_cFixnum;
-	val->value = FIX2LONG(fixnum);
-	CFDictionarySetValue(fixnum_dict, (const void *)fixnum, (const void *)val);
+	NEWOBJ(fixval, struct RFixnum);
+	fixval->klass = rb_cFixnum;
+	fixval->value = value;
+	val = fixval;
+	CFDictionarySetValue(fixnum_cache, (const void *)value, val);
     }
 
     return (VALUE)val;
 }
 
+VALUE
+rb_box_fixnum(VALUE fixnum)
+{
+    return rb_box_fixnum0(FIX2LONG(fixnum));
+}
+
 void
 rb_num_zerodiv(void)
 {
@@ -3305,7 +3297,19 @@
     return Qtrue;
 }
 
+static VALUE
+imp_rb_float_copyWithZone(void *rcv, SEL sel, void *zone)
+{
+    // XXX honor zone?
+    return rb_box_fixfloat0(RFLOAT_VALUE(rcv));
+}
 
+static VALUE
+imp_rb_fixnum_copyWithZone(void *rcv, SEL sel, void *zone)
+{
+    // XXX honor zone?
+    return rb_box_fixnum0(RFIXNUM(rcv)->value);
+}
 
 static const char *
 imp_rb_float_objCType(void *rcv, SEL sel)
@@ -3366,12 +3370,16 @@
     Class klass;
   
     klass = (Class)rb_cFloat;
+    rb_objc_install_method2(klass, "copyWithZone:",
+	    (IMP)imp_rb_float_copyWithZone);
     rb_objc_install_method2(klass, "objCType", (IMP)imp_rb_float_objCType);
     rb_objc_install_method2(klass, "getValue:", (IMP)imp_rb_float_getValue);
     rb_objc_install_method2(klass, "doubleValue", 
 	    (IMP)imp_rb_float_doubleValue);
 
     klass = (Class)rb_cFixnum;
+    rb_objc_install_method2(klass, "copyWithZone:",
+	    (IMP)imp_rb_fixnum_copyWithZone);
     rb_objc_install_method2(klass, "objCType", (IMP)imp_rb_fixnum_objCType);
     rb_objc_install_method2(klass, "getValue:", (IMP)imp_rb_fixnum_getValue);
     rb_objc_install_method2(klass, "longValue", (IMP)imp_rb_fixnum_longValue);
@@ -3513,7 +3521,7 @@
     rb_objc_define_method(rb_cFixnum, "odd?", fix_odd_p, 0);
     rb_objc_define_method(rb_cFixnum, "even?", fix_even_p, 0);
     rb_objc_define_method(rb_cFixnum, "succ", fix_succ, 0);
-	rb_objc_define_method(rb_cFixnum, "popcnt", fix_popcnt, 0);
+    rb_objc_define_method(rb_cFixnum, "popcnt", fix_popcnt, 0);
 
     rb_cFloat  = rb_define_class("Float", rb_cNumeric);
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100126/973d0cdb/attachment.html>


More information about the macruby-changes mailing list