diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-07-23 05:14:35 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-07-23 05:14:35 +0000 |
commit | 8ea11e8e1e8e13328efcd55941e5d5108511ef76 (patch) | |
tree | 6dae369c5136045d5d729e14ae7722df1ae8fcd1 /string.c | |
parent | 21dbe868f8d0445ed28f58bd4e9efce21551b040 (diff) |
string.c: trivial optimizations
* string.c (rb_str_new_frozen, str_make_independent_expand):
trivial peephole optimizations.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51354 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 11 |
1 files changed, 7 insertions, 4 deletions
@@ -973,8 +973,9 @@ rb_str_new_frozen(VALUE orig) else { if (FL_TEST(orig, STR_SHARED)) { VALUE shared = RSTRING(orig)->as.heap.aux.shared; - long ofs = RSTRING_PTR(orig) - RSTRING_PTR(shared); - long rest = RSTRING_LEN(shared) - ofs - RSTRING_LEN(orig); + long ofs = RSTRING(orig)->as.heap.ptr - RSTRING(shared)->as.heap.ptr; + long rest = RSTRING(shared)->as.heap.len - ofs - RSTRING(orig)->as.heap.len; + assert(!STR_EMBED_P(shared)); assert(OBJ_FROZEN(shared)); if ((ofs > 0) || (rest > 0) || @@ -1623,6 +1624,7 @@ static void str_make_independent_expand(VALUE str, long expand) { char *ptr; + const char *oldptr; long len = RSTRING_LEN(str); const int termlen = TERM_LEN(str); long capa = len + expand; @@ -1639,8 +1641,9 @@ str_make_independent_expand(VALUE str, long expand) } ptr = ALLOC_N(char, capa + termlen); - if (RSTRING_PTR(str)) { - memcpy(ptr, RSTRING_PTR(str), len); + oldptr = RSTRING_PTR(str); + if (oldptr) { + memcpy(ptr, oldptr, len); } STR_SET_NOEMBED(str); FL_UNSET(str, STR_SHARED|STR_NOFREE); |