diff options
Diffstat (limited to 'src/string.c')
| -rw-r--r-- | src/string.c | 41 |
1 files changed, 7 insertions, 34 deletions
diff --git a/src/string.c b/src/string.c index 9867d014a..e92d76b18 100644 --- a/src/string.c +++ b/src/string.c @@ -488,13 +488,13 @@ str_new4(mrb_state *mrb, enum mrb_vtype ttype, mrb_value str) RSTRING(str2)->buf = RSTRING_PTR(str); if (MRB_STR_SHARED_P(str)) { - mrb_value shared = RSTRING_SHARED(str); + struct RString *shared = RSTRING_SHARED(str); FL_SET(str2, MRB_STR_SHARED); RSTRING_SHARED(str2) = shared; } else { FL_SET(str, MRB_STR_SHARED); - RSTRING_SHARED(str) = str2; + RSTRING_SHARED(str) = mrb_str_ptr(str2); } mrb_enc_cr_str_exact_copy(mrb, str2, str); return str2; @@ -2174,7 +2174,7 @@ str_replace_shared(mrb_state *mrb, mrb_value str2, mrb_value str) str = mrb_str_new_frozen(mrb, str); RSTRING(str2)->len = RSTRING_LEN(str); RSTRING(str2)->buf = RSTRING_PTR(str); - RSTRING_SHARED(str2) = str; + RSTRING_SHARED(str2) = mrb_str_ptr(str); FL_SET(str2, MRB_STR_SHARED); mrb_enc_cr_str_exact_copy(mrb, str2, str); @@ -2209,9 +2209,9 @@ mrb_str_new_frozen(mrb_state *mrb, mrb_value orig) klass = mrb_obj_class(mrb, orig); - if (MRB_STR_SHARED_P(orig) && !mrb_nil_p(RSTRING_SHARED(orig))) { + if (MRB_STR_SHARED_P(orig) && RSTRING_SHARED(orig)) { long ofs; - ofs = RSTRING_LEN(str) - RSTRING_LEN(orig); + ofs = RSTRING_LEN(str) - RSTRING_SHARED(orig)->len; #ifdef INCLUDE_ENCODING if ((ofs > 0) || (klass != RBASIC(str)->c) || ENCODING_GET(mrb, str) != ENCODING_GET(mrb, orig)) { @@ -2765,9 +2765,9 @@ str_replace(mrb_state *mrb, mrb_value str, mrb_value str2) len = RSTRING_LEN(str2); if (MRB_STR_SHARED_P(str2)) { - mrb_value shared = RSTRING_SHARED(str2); + struct RString *shared = RSTRING_SHARED(str2); RSTRING_LEN(str) = len; - RSTRING_PTR(str) = RSTRING_PTR(str2); + RSTRING_PTR(str) = shared->buf; FL_SET(str, MRB_STR_SHARED); RSTRING_SHARED(str) = shared; } @@ -4729,35 +4729,8 @@ mrb_lastline_set(mrb_value val) mrb_value mrb_str_append(mrb_state *mrb, mrb_value str, mrb_value str2) { -#ifdef INCLUDE_ENCODING - mrb_encoding *enc; - int cr, cr2; -#endif //INCLUDE_ENCODING - - //StringValue(str2); mrb_string_value(mrb, &str2); - if (RSTRING_LEN(str2) > 0 /*&& STR_ASSOC_P(str)*/) { - long len = RSTRING_LEN(str)+RSTRING_LEN(str2); -#ifdef INCLUDE_ENCODING - enc = mrb_enc_check(mrb, str, str2); - cr = ENC_CODERANGE(str); - if ((cr2 = ENC_CODERANGE(str2)) > cr) cr = cr2; -#endif //INCLUDE_ENCODING - mrb_str_modify(mrb, str); - REALLOC_N(mrb, RSTRING(str)->buf, char, len+1); - memcpy(RSTRING(str)->buf + RSTRING(str)->len, - RSTRING_PTR(str2), RSTRING_LEN(str2)+1); - RSTRING(str)->len = len; - mrb_enc_associate(mrb, str, enc); - ENC_CODERANGE_SET(str, cr); - - return str; - } -#ifdef INCLUDE_ENCODING return mrb_str_buf_append(mrb, str, str2); -#else - return str; -#endif //INCLUDE_ENCODING } void |
