diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-04-05 08:15:22 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-04-05 08:15:22 +0000 |
commit | a491508753ce9d5a47ea6738f49b028270010e08 (patch) | |
tree | 08d7d188ff00998a8fb3a0854792d28f9b3efeda | |
parent | eee2769c0d99cc08928813786d46365b013916fd (diff) | |
download | ruby-a491508753ce9d5a47ea6738f49b028270010e08.tar.gz |
string.c: rb_str_concat_literals
* string.c (rb_str_concat_literals): concatenate literal string
fragments.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54490 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | insns.def | 8 | ||||
-rw-r--r-- | string.c | 23 | ||||
-rw-r--r-- | vm.c | 2 |
3 files changed, 19 insertions, 14 deletions
@@ -365,13 +365,7 @@ concatstrings (...) (VALUE val) // inc += 1 - num; { - rb_num_t i = num - 1; - - val = rb_str_resurrect(TOPN(i)); - while (i-- > 0) { - const VALUE v = TOPN(i); - rb_str_append_literal(val, v); - } + val = rb_str_concat_literals(num, &TOPN(num-1)); POPN(num); } @@ -2677,13 +2677,24 @@ rb_str_append(VALUE str, VALUE str2) } VALUE -rb_str_append_literal(VALUE str, VALUE str2) +rb_str_concat_literals(size_t num, const VALUE *strary) { - int encidx = rb_enc_get_index(str2); - rb_str_buf_append(str, str2); - if (encidx != ENCINDEX_US_ASCII) { - if (rb_enc_get_index(str) == ENCINDEX_US_ASCII) - rb_enc_associate_index(str, encidx); + VALUE str; + size_t i; + + if (!num) return rb_str_new(0, 0); + str = rb_str_resurrect(strary[0]); + for (i = 1; i < num; ++i) { + const VALUE v = strary[i]; + int encidx = ENCODING_GET(v); + + rb_enc_cr_str_buf_cat(str, RSTRING_PTR(v), RSTRING_LEN(v), + encidx, ENC_CODERANGE(v), NULL); + OBJ_INFECT_RAW(str, v); + if (encidx != ENCINDEX_US_ASCII) { + if (ENCODING_GET_INLINED(str) == ENCINDEX_US_ASCII) + rb_enc_set_index(str, encidx); + } } return str; } @@ -23,7 +23,7 @@ #include "probes.h" #include "probes_helper.h" -VALUE rb_str_append_literal(VALUE str, VALUE str2); +VALUE rb_str_concat_literals(size_t, const VALUE*); static inline VALUE * VM_EP_LEP(VALUE *ep) |