summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-07-23 05:14:35 (GMT)
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-07-23 05:14:35 (GMT)
commit8ea11e8e1e8e13328efcd55941e5d5108511ef76 (patch)
tree6dae369c5136045d5d729e14ae7722df1ae8fcd1 /string.c
parent21dbe868f8d0445ed28f58bd4e9efce21551b040 (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.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/string.c b/string.c
index 8b11cc6..5d07da1 100644
--- a/string.c
+++ b/string.c
@@ -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);