diff options
author | Peter Zhu <[email protected]> | 2022-11-02 15:21:50 -0400 |
---|---|---|
committer | Peter Zhu <[email protected]> | 2022-11-03 09:09:11 -0400 |
commit | 0468136a1b07d693cf60abd0c5ccd125fc361039 (patch) | |
tree | 8d4226ee9ee09c4745740840729b607403df2a1a /string.c | |
parent | 7b6c5f9b5b16d244268f700aa5cd60bdde3e34d6 (diff) |
Make str_alloc_heap return a STR_NOEMBED string
This commit refactors str_alloc_heap to return a string with the
STR_NOEMBED flag set.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/6663
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 53 |
1 files changed, 24 insertions, 29 deletions
@@ -878,29 +878,28 @@ must_not_null(const char *ptr) } static inline VALUE -str_alloc(VALUE klass, size_t size) -{ - assert(size > 0); - RVARGC_NEWOBJ_OF(str, struct RString, klass, - T_STRING | (RGENGC_WB_PROTECTED_STRING ? FL_WB_PROTECTED : 0), size); - return (VALUE)str; -} - -static inline VALUE str_alloc_embed(VALUE klass, size_t capa) { size_t size = rb_str_embed_size(capa); + assert(size > 0); assert(rb_gc_size_allocatable_p(size)); #if !USE_RVARGC assert(size <= sizeof(struct RString)); #endif - return str_alloc(klass, size); + + RVARGC_NEWOBJ_OF(str, struct RString, klass, + T_STRING | (RGENGC_WB_PROTECTED_STRING ? FL_WB_PROTECTED : 0), size); + + return (VALUE)str; } static inline VALUE str_alloc_heap(VALUE klass) { - return str_alloc(klass, sizeof(struct RString)); + RVARGC_NEWOBJ_OF(str, struct RString, klass, + T_STRING | STR_NOEMBED | (RGENGC_WB_PROTECTED_STRING ? FL_WB_PROTECTED : 0), sizeof(struct RString)); + + return (VALUE)str; } static inline VALUE @@ -937,7 +936,6 @@ str_new0(VALUE klass, const char *ptr, long len, int termlen) * mul_add_mul can be reverted to a simple ALLOC_N. */ RSTRING(str)->as.heap.ptr = rb_xmalloc_mul_add_mul(sizeof(char), len, sizeof(char), termlen); - STR_SET_NOEMBED(str); } if (ptr) { memcpy(RSTRING_PTR(str), ptr, len); @@ -1044,7 +1042,6 @@ str_new_static(VALUE klass, const char *ptr, long len, int encindex) RSTRING(str)->as.heap.len = len; RSTRING(str)->as.heap.ptr = (char *)ptr; RSTRING(str)->as.heap.aux.capa = len; - STR_SET_NOEMBED(str); RBASIC(str)->flags |= STR_NOFREE; } rb_enc_associate_index(str, encindex); @@ -1441,7 +1438,6 @@ heap_str_make_shared(VALUE klass, VALUE orig) assert(!STR_SHARED_P(orig)); VALUE str = str_alloc_heap(klass); - STR_SET_NOEMBED(str); RSTRING(str)->as.heap.len = RSTRING_LEN(orig); RSTRING(str)->as.heap.ptr = RSTRING_PTR(orig); RSTRING(str)->as.heap.aux.capa = RSTRING(orig)->as.heap.aux.capa; @@ -1542,7 +1538,6 @@ rb_str_buf_new(long capa) capa = STR_BUF_MIN_SIZE; } #endif - FL_SET(str, STR_NOEMBED); RSTRING(str)->as.heap.aux.capa = capa; RSTRING(str)->as.heap.ptr = ALLOC_N(char, (size_t)capa + 1); RSTRING(str)->as.heap.ptr[0] = '\0'; @@ -1722,29 +1717,28 @@ str_replace(VALUE str, VALUE str2) } static inline VALUE -ec_str_alloc(struct rb_execution_context_struct *ec, VALUE klass, size_t size) -{ - assert(size > 0); - RB_RVARGC_EC_NEWOBJ_OF(ec, str, struct RString, klass, - T_STRING | (RGENGC_WB_PROTECTED_STRING ? FL_WB_PROTECTED : 0), size); - return (VALUE)str; -} - -static inline VALUE ec_str_alloc_embed(struct rb_execution_context_struct *ec, VALUE klass, size_t capa) { size_t size = rb_str_embed_size(capa); + assert(size > 0); assert(rb_gc_size_allocatable_p(size)); #if !USE_RVARGC assert(size <= sizeof(struct RString)); #endif - return ec_str_alloc(ec, klass, size); + + RB_RVARGC_EC_NEWOBJ_OF(ec, str, struct RString, klass, + T_STRING | (RGENGC_WB_PROTECTED_STRING ? FL_WB_PROTECTED : 0), size); + + return (VALUE)str; } static inline VALUE ec_str_alloc_heap(struct rb_execution_context_struct *ec, VALUE klass) { - return ec_str_alloc(ec, klass, sizeof(struct RString)); + RB_RVARGC_EC_NEWOBJ_OF(ec, str, struct RString, klass, + T_STRING | STR_NOEMBED | (RGENGC_WB_PROTECTED_STRING ? FL_WB_PROTECTED : 0), sizeof(struct RString)); + + return (VALUE)str; } static inline VALUE @@ -1762,6 +1756,7 @@ str_duplicate_setup(VALUE klass, VALUE str, VALUE dup) if (STR_EMBED_P(str)) { long len = RSTRING_EMBED_LEN(str); + assert(STR_EMBED_P(dup)); assert(str_embed_capa(dup) >= len + 1); STR_SET_EMBED_LEN(dup, len); MEMCPY(RSTRING(dup)->as.embed.ary, RSTRING(str)->as.embed.ary, char, len + 1); @@ -1782,6 +1777,7 @@ str_duplicate_setup(VALUE klass, VALUE str, VALUE dup) else if (STR_EMBED_P(root)) { MEMCPY(RSTRING(dup)->as.embed.ary, RSTRING(root)->as.embed.ary, char, RSTRING_EMBED_LEN_MAX + 1); + FL_UNSET(dup, STR_NOEMBED); } #endif else { @@ -1805,7 +1801,7 @@ static inline VALUE ec_str_duplicate(struct rb_execution_context_struct *ec, VALUE klass, VALUE str) { VALUE dup; - if (!USE_RVARGC || FL_TEST(str, STR_NOEMBED)) { + if (FL_TEST(str, STR_NOEMBED)) { dup = ec_str_alloc_heap(ec, klass); } else { @@ -1819,7 +1815,7 @@ static inline VALUE str_duplicate(VALUE klass, VALUE str) { VALUE dup; - if (!USE_RVARGC || FL_TEST(str, STR_NOEMBED)) { + if (FL_TEST(str, STR_NOEMBED)) { dup = str_alloc_heap(klass); } else { @@ -2307,7 +2303,6 @@ rb_str_times(VALUE str, VALUE times) str2 = str_alloc_heap(rb_cString); RSTRING(str2)->as.heap.aux.capa = len; RSTRING(str2)->as.heap.ptr = ZALLOC_N(char, (size_t)len + 1); - STR_SET_NOEMBED(str2); } STR_SET_LEN(str2, len); rb_enc_copy(str2, str); |