From 5f0bb43434fe0fe24acf3b68f30962970f4f7376 Mon Sep 17 00:00:00 2001 From: nobu Date: Sun, 4 Oct 2015 02:32:08 +0000 Subject: [PATCH] file.c: get rid of intermediate objects * file.c (rb_str_normalize_ospath): place normalized strings to the result string directly, to get rid of intermediate objects and copying. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52015 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- file.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/file.c b/file.c index d5ad01006b..f2b760aa0c 100644 --- a/file.c +++ b/file.c @@ -259,9 +259,8 @@ rb_str_encode_ospath(VALUE path) #ifdef __APPLE__ static VALUE -rb_str_normalize_ospath0(const char *ptr, long len) +rb_str_append_normalized_ospath(VALUE str, const char *ptr, long len) { - VALUE str; CFIndex buflen = 0; CFRange all; CFStringRef s = CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, @@ -269,14 +268,15 @@ rb_str_normalize_ospath0(const char *ptr, long len) kCFStringEncodingUTF8, FALSE, kCFAllocatorNull); CFMutableStringRef m = CFStringCreateMutableCopy(kCFAllocatorDefault, len, s); + long oldlen = RSTRING_LEN(str); CFStringNormalize(m, kCFStringNormalizationFormC); all = CFRangeMake(0, CFStringGetLength(m)); CFStringGetBytes(m, all, kCFStringEncodingUTF8, '?', FALSE, NULL, 0, &buflen); - str = rb_enc_str_new(0, buflen, rb_utf8_encoding()); - CFStringGetBytes(m, all, kCFStringEncodingUTF8, '?', FALSE, (UInt8 *)RSTRING_PTR(str), - buflen, &buflen); - rb_str_set_len(str, buflen); + rb_str_modify_expand(str, buflen); + CFStringGetBytes(m, all, kCFStringEncodingUTF8, '?', FALSE, + (UInt8 *)(RSTRING_PTR(str) + oldlen), buflen, &buflen); + rb_str_set_len(str, oldlen + buflen); CFRelease(m); CFRelease(s); return str; @@ -297,8 +297,9 @@ rb_str_normalize_ospath(const char *ptr, long len) int r = rb_enc_precise_mbclen(p, e, enc); if (!MBCLEN_CHARFOUND_P(r)) { /* invalid byte shall not happen but */ - rb_str_append(str, rb_str_normalize_ospath0(p1, p-p1)); - rb_str_cat2(str, "\xEF\xBF\xBD"); + static const char invalid[3] = "\xEF\xBF\xBD"; + rb_str_append_normalized_ospath(str, p1, p-p1); + rb_str_cat(str, invalid, sizeof(invalid)); p += 1; p1 = p; continue; @@ -308,7 +309,7 @@ rb_str_normalize_ospath(const char *ptr, long len) if ((0x2000 <= c && c <= 0x2FFF) || (0xF900 <= c && c <= 0xFAFF) || (0x2F800 <= c && c <= 0x2FAFF)) { if (p - p1 > 0) { - rb_str_append(str, rb_str_normalize_ospath0(p1, p-p1)); + rb_str_append_normalized_ospath(str, p1, p-p1); } rb_str_cat(str, p, l); p += l; @@ -319,7 +320,7 @@ rb_str_normalize_ospath(const char *ptr, long len) } } if (p - p1 > 0) { - rb_str_append(str, rb_str_normalize_ospath0(p1, p-p1)); + rb_str_append_normalized_ospath(str, p1, p-p1); } return str;