diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2020-02-12 19:29:18 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2020-02-12 19:58:22 +0900 |
commit | bdf3032e3542b318c6f52dbe20d1c97cca3d7067 (patch) | |
tree | 6923498ebb1907e78207edaad7f2e143e0fc31ee | |
parent | 1b219f1fb26d15d69d4a0cb628f856f6f850eac5 (diff) | |
download | ruby-bdf3032e3542b318c6f52dbe20d1c97cca3d7067.tar.gz |
Make temporary lock string encoding free
As a temporary lock string is hidden, it can not have instance
variables, including non-inlined encoding index.
-rw-r--r-- | sprintf.c | 2 | ||||
-rw-r--r-- | string.c | 11 | ||||
-rw-r--r-- | test/ruby/test_encoding.rb | 2 |
3 files changed, 11 insertions, 4 deletions
@@ -257,7 +257,7 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt) blen = 0; bsiz = 120; result = rb_str_buf_new(bsiz); - rb_enc_copy(result, fmt); + rb_enc_associate(result, enc); buf = RSTRING_PTR(result); memset(buf, 0, bsiz); ENC_CODERANGE_SET(result, coderange); @@ -199,6 +199,7 @@ VALUE rb_cSymbol; static VALUE str_replace_shared_without_enc(VALUE str2, VALUE str); static VALUE str_new_shared(VALUE klass, VALUE str); static VALUE str_new_frozen(VALUE klass, VALUE orig); +static VALUE str_new_frozen_buffer(VALUE klass, VALUE orig, int copy_encoding); static VALUE str_new_static(VALUE klass, const char *ptr, long len, int encindex); static void str_make_independent_expand(VALUE str, long len, long expand, const int termlen); static inline void str_modifiable(VALUE str); @@ -1225,7 +1226,7 @@ VALUE rb_str_tmp_frozen_acquire(VALUE orig) { if (OBJ_FROZEN_RAW(orig)) return orig; - return str_new_frozen(0, orig); + return str_new_frozen_buffer(0, orig, FALSE); } void @@ -1257,6 +1258,12 @@ rb_str_tmp_frozen_release(VALUE orig, VALUE tmp) static VALUE str_new_frozen(VALUE klass, VALUE orig) { + return str_new_frozen_buffer(klass, orig, TRUE); +} + +static VALUE +str_new_frozen_buffer(VALUE klass, VALUE orig, int copy_encoding) +{ VALUE str; if (STR_EMBED_P(orig)) { @@ -1304,7 +1311,7 @@ str_new_frozen(VALUE klass, VALUE orig) } } - rb_enc_cr_str_exact_copy(str, orig); + if (copy_encoding) rb_enc_cr_str_exact_copy(str, orig); OBJ_FREEZE(str); return str; } diff --git a/test/ruby/test_encoding.rb b/test/ruby/test_encoding.rb index 6d0665ae93..d571dd28c1 100644 --- a/test/ruby/test_encoding.rb +++ b/test/ruby/test_encoding.rb @@ -73,7 +73,7 @@ class TestEncoding < Test::Unit::TestCase } e = Encoding.list.last format = "%d".force_encoding(e) - assert_raise(TypeError) {format % 0} + assert_equal("0", format % 0) end; end |