summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2026-01-17 14:19:15 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2026-01-17 14:19:15 +0900
commit78b7646bdb91285873ac26bca060591e06c45afe (patch)
tree769227a92b9a221c8e398122cbae46a4b5f99f8a /string.c
parent8ca2f6489bc2b04902472c544edd69664cef0c4e (diff)
[Bug #21842] Let `rb_interned_str` return US-ASCII if possible
Diffstat (limited to 'string.c')
-rw-r--r--string.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/string.c b/string.c
index 6f4ea03fb3..2d74c46a36 100644
--- a/string.c
+++ b/string.c
@@ -12709,7 +12709,15 @@ VALUE
rb_interned_str(const char *ptr, long len)
{
struct RString fake_str = {RBASIC_INIT};
- return register_fstring(setup_fake_str(&fake_str, ptr, len, ENCINDEX_US_ASCII), true, false);
+ int encidx = ENCINDEX_US_ASCII;
+ int coderange = ENC_CODERANGE_7BIT;
+ if (len > 0 && search_nonascii(ptr, ptr + len)) {
+ encidx = ENCINDEX_ASCII_8BIT;
+ coderange = ENC_CODERANGE_VALID;
+ }
+ VALUE str = setup_fake_str(&fake_str, ptr, len, encidx);
+ ENC_CODERANGE_SET(str, coderange);
+ return register_fstring(str, true, false);
}
VALUE