Revision: 162 http://trac.macosforge.org/projects/ruby/changeset/162 Author: lsansonetti@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);
participants (1)
-
source_changes@macosforge.org