Revision
2701
Author
lsansonetti@apple.com
Date
2009-10-01 14:14:49 -0700 (Thu, 01 Oct 2009)

Log Message

fixed bytestring promotion

Modified Paths

Diff

Modified: MacRuby/trunk/string.c (2700 => 2701)


--- MacRuby/trunk/string.c	2009-10-01 20:36:45 UTC (rev 2700)
+++ MacRuby/trunk/string.c	2009-10-01 21:14:49 UTC (rev 2701)
@@ -34,6 +34,11 @@
 VALUE rb_cSymbol;
 VALUE rb_cByteString;
 
+typedef struct {
+    struct RBasic basic;
+    CFMutableDataRef data;
+} rb_bstr_t;
+
 VALUE
 rb_str_freeze(VALUE str)
 {
@@ -785,13 +790,17 @@
 	}
 	else {
 	    // Promoting as bytestring!
-	    CFDataRef data = CFStringCreateExternalRepresentation(NULL, (CFStringRef)str,
-		    kCFStringEncodingUTF8, 0);
+	    CFDataRef data = CFStringCreateExternalRepresentation(NULL,
+		    (CFStringRef)str, kCFStringEncodingUTF8, 0);
 	    assert(data != NULL);
 	    CFMutableDataRef mdata = CFDataCreateMutableCopy(NULL, 0, data);
 	    CFRelease(data);
-	    *(VALUE *)str = rb_cByteString;
-	    *(void **)((char *)str + sizeof(void *)) = (void *)mdata;
+
+	    rb_bstr_t *bstr = (rb_bstr_t *)str;
+	    bstr->basic.klass = rb_cByteString;
+	    bstr->basic.flags = 0;
+	    GC_WB(&bstr->data, mdata);
+
 	    CFMakeCollectable(mdata);
 	}
     }
@@ -5379,11 +5388,6 @@
 
 #undef INSTALL_METHOD
 
-typedef struct {
-    struct RBasic basic;
-    CFMutableDataRef data;
-} rb_bstr_t;
-
 CFMutableDataRef 
 rb_bytestring_wrapped_data(VALUE bstr)
 {