diff options
-rw-r--r-- | string.c | 6 | ||||
-rw-r--r-- | test/ruby/test_encoding.rb | 2 |
2 files changed, 8 insertions, 0 deletions
@@ -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; } diff --git a/test/ruby/test_encoding.rb b/test/ruby/test_encoding.rb index d571dd28c1..80bed39936 100644 --- a/test/ruby/test_encoding.rb +++ b/test/ruby/test_encoding.rb @@ -74,6 +74,8 @@ class TestEncoding < Test::Unit::TestCase e = Encoding.list.last format = "%d".force_encoding(e) assert_equal("0", format % 0) + assert_equal(e, format.dup.encoding) + assert_equal(e, (format*1).encoding) end; end |