Skip to content

Commit 42e0660

Browse files
committed
string.c: str_subseq propagate coderange when it is 7bit
Any substring of a 7bit string will be 7bit.
1 parent 4c659a9 commit 42e0660

1 file changed

Lines changed: 11 additions & 1 deletion

File tree

string.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3140,6 +3140,9 @@ str_subseq(VALUE str, long beg, long len)
31403140
const int termlen = TERM_LEN(str);
31413141
if (!SHARABLE_SUBSTRING_P(beg, len, RSTRING_LEN(str))) {
31423142
str2 = rb_enc_str_new(RSTRING_PTR(str) + beg, len, rb_str_enc_get(str));
3143+
if (ENC_CODERANGE(str) == ENC_CODERANGE_7BIT) {
3144+
ENC_CODERANGE_SET(str2, ENC_CODERANGE_7BIT);
3145+
}
31433146
RB_GC_GUARD(str);
31443147
return str2;
31453148
}
@@ -3152,12 +3155,19 @@ str_subseq(VALUE str, long beg, long len)
31523155
TERM_FILL(ptr2+len, termlen);
31533156

31543157
STR_SET_LEN(str2, len);
3158+
if (ENC_CODERANGE(str) == ENC_CODERANGE_7BIT) {
3159+
ENC_CODERANGE_SET(str2, ENC_CODERANGE_7BIT);
3160+
}
3161+
31553162
RB_GC_GUARD(str);
31563163
}
31573164
else {
31583165
str_replace_shared(str2, str);
31593166
RUBY_ASSERT(!STR_EMBED_P(str2));
3160-
ENC_CODERANGE_CLEAR(str2);
3167+
if (ENC_CODERANGE(str) != ENC_CODERANGE_7BIT) {
3168+
ENC_CODERANGE_CLEAR(str2);
3169+
}
3170+
31613171
RSTRING(str2)->as.heap.ptr += beg;
31623172
if (RSTRING_LEN(str2) > len) {
31633173
STR_SET_LEN(str2, len);

0 commit comments

Comments
 (0)