[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