summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2022-07-25 10:21:38 +0200
committerJean Boussier <jean.boussier@gmail.com>2022-08-18 10:09:08 +0200
commitb0b9f7201acab05c2a3ad92c3043a1f01df3e17f (patch)
treefe3445ca10f4254baab7e5c182eaccb1943e3b3b /string.c
parentfe61cad7490da8a879597f851f4a89856d44838e (diff)
downloadruby-b0b9f7201acab05c2a3ad92c3043a1f01df3e17f.tar.gz
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.
Diffstat (limited to 'string.c')
-rw-r--r--string.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/string.c b/string.c
index e74783cf92..6f211b2005 100644
--- a/string.c
+++ b/string.c
@@ -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;