summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2024-05-28 16:24:21 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2024-05-28 16:24:21 +0900
commit0a92c9f2b011c4cfcd1b894dccfd4e8c36cadd57 (patch)
tree74fe1ac5a46492f62f7f7ecc80175358cb68001b
parent43798e0f6d72a8f1c624eba74c4a068ff9b21c84 (diff)
Set empty strings to ASCII-only
-rw-r--r--string.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/string.c b/string.c
index 98dbf1b706..83539ec8f4 100644
--- a/string.c
+++ b/string.c
@@ -931,6 +931,7 @@ empty_str_alloc(VALUE klass)
RUBY_DTRACE_CREATE_HOOK(STRING, 0);
VALUE str = str_alloc_embed(klass, 0);
memset(RSTRING(str)->as.embed.ary, 0, str_embed_capa(str));
+ ENC_CODERANGE_SET(str, ENC_CODERANGE_7BIT);
return str;
}
@@ -1552,6 +1553,7 @@ str_new_frozen_buffer(VALUE klass, VALUE orig, int copy_encoding)
STR_SET_EMBED(str);
memcpy(RSTRING_PTR(str), RSTRING_PTR(orig), RSTRING_LEN(orig));
STR_SET_LEN(str, RSTRING_LEN(orig));
+ ENC_CODERANGE_SET(str, ENC_CODERANGE(orig));
TERM_FILL(RSTRING_END(str), TERM_LEN(orig));
}
else {
@@ -3199,7 +3201,11 @@ rb_str_set_len(VALUE str, long len)
}
int cr = ENC_CODERANGE(str);
- if (cr == ENC_CODERANGE_UNKNOWN) {
+ if (len == 0) {
+ /* Empty string does not contain non-ASCII */
+ ENC_CODERANGE_SET(str, ENC_CODERANGE_7BIT);
+ }
+ else if (cr == ENC_CODERANGE_UNKNOWN) {
/* Leave unknown. */
}
else if (len > RSTRING_LEN(str)) {