summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2022-08-30 18:12:08 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2022-08-31 17:27:59 +0900
commit576bdec03f0d58847690a0607c788ada433ce60f (patch)
treeda8277b325bfa1c033c2572662a6e781b589ae0f /string.c
parent9dc60653db186b1ae9400ed75b413a07728ce6ff (diff)
downloadruby-576bdec03f0d58847690a0607c788ada433ce60f.tar.gz
[Bug #18973] Promote US-ASCII to ASCII-8BIT when adding 8-bit char
Diffstat (limited to 'string.c')
-rw-r--r--string.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/string.c b/string.c
index 564812ae51..951aeca6dd 100644
--- a/string.c
+++ b/string.c
@@ -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