[macruby-changes] [162] MacRuby/trunk/string.c

source_changes at macosforge.org source_changes at macosforge.org
Tue Apr 22 14:17:16 PDT 2008


Revision: 162
          http://trac.macosforge.org/projects/ruby/changeset/162
Author:   lsansonetti at apple.com
Date:     2008-04-22 14:17:15 -0700 (Tue, 22 Apr 2008)

Log Message:
-----------
better bytestring sync behavior, fixed buf cat

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

Modified: MacRuby/trunk/string.c
===================================================================
--- MacRuby/trunk/string.c	2008-04-22 21:16:39 UTC (rev 161)
+++ MacRuby/trunk/string.c	2008-04-22 21:17:15 UTC (rev 162)
@@ -200,19 +200,30 @@
 void
 rb_str_bytesync(VALUE str)
 {
-    CFDataRef data;
-    data = (CFDataRef)rb_str_cfdata2(str);
-    if (data != NULL) {
+    struct rb_objc_str_struct *s;
+
+    s = rb_objc_str_get_struct2(str);
+    if (s != NULL && s->cfdata != NULL) {
+	CFDataRef data;
 	CFIndex datalen;
+	const UInt8 *dataptr;
+	CFStringRef bytestr;
+
+	data = (CFDataRef)s->cfdata;
 	datalen = CFDataGetLength(data);
-	CFStringRef bytestr = CFStringCreateWithBytesNoCopy(
+	dataptr = CFDataGetBytePtr(data);
+	bytestr = CFStringCreateWithBytesNoCopy(
 		NULL,
-		CFDataGetBytePtr((CFDataRef)data),
+		dataptr,
 		datalen,
 		kCFStringEncodingUTF8,
 		false,
 		kCFAllocatorNull);
 	CFStringReplaceAll((CFMutableStringRef)str, (CFStringRef)bytestr);
+        if (memcmp((const char *)dataptr, (const char *)RSTRING_CPTR(str), 
+	    datalen) == 0) {
+	    s->cfdata = NULL;
+	}
     }
 }
 
@@ -1974,8 +1985,13 @@
 rb_enc_str_buf_cat(VALUE str, const char *ptr, long len, rb_encoding *ptr_enc)
 {
 #if WITH_OBJC
-    VALUE s = rb_enc_str_new(ptr, len, ptr_enc);
-    CFStringAppend((CFMutableStringRef)str, (CFStringRef)s);
+    if (strlen(ptr) != len) {
+	char *tmp = (char *)alloca(len);
+	strncpy(tmp, ptr, len);
+	tmp[len] = '\0';
+	ptr = tmp;
+    }
+    CFStringAppendCString((CFMutableStringRef)str, ptr, kCFStringEncodingUTF8);
     return str;
 #else
     return rb_enc_cr_str_buf_cat(str, ptr, len,
@@ -3658,6 +3674,7 @@
 #endif
 	rb_str_modify(str);
 #if WITH_OBJC
+	RSTRING_SYNC(str);
 	rb_str_splice_0(str, BEG(0), END(0) - BEG(0), repl);
 	if (rb_obj_tainted(repl))
 	    rb_str_taint(str);

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080422/a23c6e9d/attachment-0001.html


More information about the macruby-changes mailing list