diff options
author | Nobuyoshi Nakada <[email protected]> | 2022-08-30 18:12:08 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2022-08-31 17:27:59 +0900 |
commit | 576bdec03f0d58847690a0607c788ada433ce60f (patch) | |
tree | da8277b325bfa1c033c2572662a6e781b589ae0f /string.c | |
parent | 9dc60653db186b1ae9400ed75b413a07728ce6ff (diff) |
[Bug #18973] Promote US-ASCII to ASCII-8BIT when adding 8-bit char
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/6306
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 32 |
1 files changed, 24 insertions, 8 deletions
@@ -3481,17 +3481,13 @@ rb_str_concat(VALUE str1, VALUE str2) return rb_str_append(str1, str2); } - encidx = rb_enc_to_index(enc); - if (encidx == ENCINDEX_ASCII_8BIT || encidx == ENCINDEX_US_ASCII) { - /* US-ASCII automatically extended to ASCII-8BIT */ + encidx = rb_ascii8bit_appendable_encoding_index(enc, code); + if (encidx >= 0) { char buf[1]; buf[0] = (char)code; - if (code > 0xFF) { - rb_raise(rb_eRangeError, "%u out of char range", code); - } rb_str_cat(str1, buf, 1); - if (encidx == ENCINDEX_US_ASCII && code > 127) { - rb_enc_associate_index(str1, ENCINDEX_ASCII_8BIT); + if (encidx != rb_enc_to_index(enc)) { + rb_enc_associate_index(str1, encidx); ENC_CODERANGE_SET(str1, ENC_CODERANGE_VALID); } } @@ -3524,6 +3520,26 @@ rb_str_concat(VALUE str1, VALUE str2) return str1; } +int +rb_ascii8bit_appendable_encoding_index(rb_encoding *enc, unsigned int code) +{ + int encidx = rb_enc_to_index(enc); + + if (encidx == ENCINDEX_ASCII_8BIT || encidx == ENCINDEX_US_ASCII) { + /* US-ASCII automatically extended to ASCII-8BIT */ + if (code > 0xFF) { + rb_raise(rb_eRangeError, "%u out of char range", code); + } + if (encidx == ENCINDEX_US_ASCII && code > 127) { + return ENCINDEX_ASCII_8BIT; + } + return encidx; + } + else { + return -1; + } +} + /* * call-seq: * prepend(*other_strings) -> string |