summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2020-02-12 20:09:57 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2020-02-12 20:09:57 +0900
commit160d3165eb095d81ae6e156f832a99728c853b01 (patch)
tree77f6422d7840b9f0011520e11c89f8646d2f4a24 /string.c
parentbdf3032e3542b318c6f52dbe20d1c97cca3d7067 (diff)
Copy non-inlined encoding index
Diffstat (limited to 'string.c')
-rw-r--r--string.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/string.c b/string.c
index 83c4780983..3cfe3adcac 100644
--- a/string.c
+++ b/string.c
@@ -1511,6 +1511,7 @@ str_duplicate(VALUE klass, VALUE str)
;
VALUE flags = FL_TEST_RAW(str, flag_mask);
VALUE dup = str_alloc(klass);
+ int encidx = 0;
MEMCPY(RSTRING(dup)->as.ary, RSTRING(str)->as.ary,
char, embed_size);
if (flags & STR_NOEMBED) {
@@ -1530,7 +1531,12 @@ str_duplicate(VALUE klass, VALUE str)
char, embed_size);
}
}
+ if ((flags & ENCODING_MASK) == (ENCODING_INLINE_MAX<<ENCODING_SHIFT)) {
+ encidx = rb_enc_get_index(str);
+ flags &= ~ENCODING_MASK;
+ }
FL_SET_RAW(dup, flags & ~FL_FREEZE);
+ if (encidx) rb_enc_associate_index(dup, encidx);
return dup;
}