summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--string.c6
-rw-r--r--test/ruby/test_encoding.rb2
2 files changed, 8 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;
}
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