From b5e554d03a0bd34f260e783e84f4d8a16de39a61 Mon Sep 17 00:00:00 2001 From: nagachika Date: Mon, 15 Jul 2024 11:08:50 +0900 Subject: Revert "merge revision(s) e04146129ec6898dd6a9739dad2983c6e9b68056, d5080f6e8b77364483ff6727b1065e45e180f05d: [Backport #20292]" This reverts commit a54c717c7a74b91a3cdf20742c355e3ea42052d1. --- string.c | 18 +++++++++++++----- test/ruby/test_string.rb | 7 ------- version.h | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/string.c b/string.c index 5af25b875e..6a9eebd687 100644 --- a/string.c +++ b/string.c @@ -1934,13 +1934,21 @@ rb_str_init(int argc, VALUE *argv, VALUE str) if (orig == str) n = 0; } str_modifiable(str); - if (STR_EMBED_P(str) || FL_TEST(str, STR_SHARED|STR_NOFREE)) { - /* make noembed always */ + if (STR_EMBED_P(str)) { /* make noembed always */ + char *new_ptr = ALLOC_N(char, (size_t)capa + termlen); +#if USE_RVARGC + assert(RSTRING(str)->as.embed.len + 1 <= str_embed_capa(str)); + memcpy(new_ptr, RSTRING(str)->as.embed.ary, RSTRING(str)->as.embed.len + 1); +#else + memcpy(new_ptr, RSTRING(str)->as.embed.ary, RSTRING_EMBED_LEN_MAX + 1); +#endif + RSTRING(str)->as.heap.ptr = new_ptr; + } + else if (FL_TEST(str, STR_SHARED|STR_NOFREE)) { const size_t size = (size_t)capa + termlen; const char *const old_ptr = RSTRING_PTR(str); - const size_t osize = RSTRING_LEN(str) + TERM_LEN(str); - char *new_ptr = ALLOC_N(char, size); - if (STR_EMBED_P(str)) RUBY_ASSERT((long)osize <= str_embed_capa(str)); + const size_t osize = RSTRING(str)->as.heap.len + TERM_LEN(str); + char *new_ptr = ALLOC_N(char, (size_t)capa + termlen); memcpy(new_ptr, old_ptr, osize < size ? osize : size); FL_UNSET_RAW(str, STR_SHARED|STR_NOFREE); RSTRING(str)->as.heap.ptr = new_ptr; diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb index 3a2cc6b4a7..24527a527f 100644 --- a/test/ruby/test_string.rb +++ b/test/ruby/test_string.rb @@ -80,13 +80,6 @@ class TestString < Test::Unit::TestCase assert_equal("mystring", str.__send__(:initialize, "mystring", capacity: 1000)) str = S("mystring") assert_equal("mystring", str.__send__(:initialize, str, capacity: 1000)) - - if @cls == String - 100.times { - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa". - __send__(:initialize, capacity: -1) - } - end end def test_initialize_shared diff --git a/version.h b/version.h index 4e331c6d6e..5ad9307193 100644 --- a/version.h +++ b/version.h @@ -11,7 +11,7 @@ # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 4 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 190 +#define RUBY_PATCHLEVEL 191 #include "ruby/version.h" #include "ruby/internal/abi.h" -- cgit v1.2.3