summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-09-21 22:50:32 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-09-21 22:50:32 +0000
commit5b950717b7bbcf8fa3b9362060c02badd87d2b5a (patch)
treeffddd2dbe36962b102e61c0cd23b5241a395db90 /string.c
parente4800cabfbc85b6f581de1e111bd61602ed9f406 (diff)
* string.c (str_new3): embed shorter strings more eagerly.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10991 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r--string.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/string.c b/string.c
index 64da8f337f..a8ff285c7d 100644
--- a/string.c
+++ b/string.c
@@ -191,11 +191,18 @@ str_new3(VALUE klass, VALUE str)
{
VALUE str2 = str_alloc(klass);
- FL_SET(str2, STR_NOEMBED);
- RSTRING(str2)->as.heap.len = RSTRING_LEN(str);
- RSTRING(str2)->as.heap.ptr = RSTRING_PTR(str);
- RSTRING(str2)->as.heap.aux.shared = str;
- FL_SET(str2, ELTS_SHARED);
+ if (RSTRING_LEN(str) <= RSTRING_EMBED_LEN_MAX) {
+ STR_SET_EMBED(str);
+ memcpy(RSTRING_PTR(str2), RSTRING_PTR(str), RSTRING_LEN(str)+1);
+ STR_SET_EMBED_LEN(str2, RSTRING_LEN(str));
+ }
+ else {
+ FL_SET(str2, STR_NOEMBED);
+ RSTRING(str2)->as.heap.len = RSTRING_LEN(str);
+ RSTRING(str2)->as.heap.ptr = RSTRING_PTR(str);
+ RSTRING(str2)->as.heap.aux.shared = str;
+ FL_SET(str2, ELTS_SHARED);
+ }
OBJ_INFECT(str2, str);
return str2;