summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagachika <nagachika@ruby-lang.org>2024-07-15 11:08:50 +0900
committernagachika <nagachika@ruby-lang.org>2024-07-15 11:08:50 +0900
commitb5e554d03a0bd34f260e783e84f4d8a16de39a61 (patch)
tree1b282c2e1c29a370fe4c168b19569cb35beadffb
parent8051a6d3854687c008d69d3d198a16d0d1c5dac1 (diff)
Revert "merge revision(s) e04146129ec6898dd6a9739dad2983c6e9b68056, d5080f6e8b77364483ff6727b1065e45e180f05d: [Backport #20292]"
This reverts commit a54c717c7a74b91a3cdf20742c355e3ea42052d1.
-rw-r--r--string.c18
-rw-r--r--test/ruby/test_string.rb7
-rw-r--r--version.h2
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"