diff options
| author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2024-05-28 16:24:21 +0900 |
|---|---|---|
| committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2024-05-28 16:24:21 +0900 |
| commit | 0a92c9f2b011c4cfcd1b894dccfd4e8c36cadd57 (patch) | |
| tree | 74fe1ac5a46492f62f7f7ecc80175358cb68001b | |
| parent | 43798e0f6d72a8f1c624eba74c4a068ff9b21c84 (diff) | |
Set empty strings to ASCII-only
| -rw-r--r-- | string.c | 8 |
1 files changed, 7 insertions, 1 deletions
@@ -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)) { |
