diff options
author | Jean Boussier <jean.boussier@gmail.com> | 2022-07-25 10:21:38 +0200 |
---|---|---|
committer | Jean Boussier <jean.boussier@gmail.com> | 2022-08-18 10:09:08 +0200 |
commit | b0b9f7201acab05c2a3ad92c3043a1f01df3e17f (patch) | |
tree | fe3445ca10f4254baab7e5c182eaccb1943e3b3b /string.c | |
parent | fe61cad7490da8a879597f851f4a89856d44838e (diff) |
rb_str_resize: Only clear coderange on truncation
If we are expanding the string or only stripping extra capacity
then coderange won't change, so clearing it is wasteful.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/6178
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 13 |
1 files changed, 6 insertions, 7 deletions
@@ -2498,7 +2498,6 @@ rb_str_modify_expand(VALUE str, long expand) else if (expand > 0) { RESIZE_CAPA_TERM(str, len + expand, termlen); } - ENC_CODERANGE_CLEAR(str); } /* As rb_str_modify(), but don't clear coderange */ @@ -3073,16 +3072,16 @@ rb_str_set_len(VALUE str, long len) VALUE rb_str_resize(VALUE str, long len) { - long slen; - int independent; - if (len < 0) { rb_raise(rb_eArgError, "negative string size (or size too big)"); } - independent = str_independent(str); - ENC_CODERANGE_CLEAR(str); - slen = RSTRING_LEN(str); + int independent = str_independent(str); + long slen = RSTRING_LEN(str); + + if (slen > len && ENC_CODERANGE(str) != ENC_CODERANGE_7BIT) { + ENC_CODERANGE_CLEAR(str); + } { long capa; |