diff options
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 16 |
1 files changed, 10 insertions, 6 deletions
@@ -126,6 +126,9 @@ VALUE rb_cSymbol; FL_SET((str), ELTS_SHARED); \ } while (0) +#define STR_HEAP_PTR(str) (RSTRING(str)->as.heap.ptr) +#define STR_HEAP_SIZE(str) (RSTRING(str)->as.heap.aux.capa) + #define is_ascii_string(str) (rb_enc_str_coderange(str) == ENC_CODERANGE_7BIT) #define is_broken_string(str) (rb_enc_str_coderange(str) == ENC_CODERANGE_BROKEN) @@ -880,7 +883,7 @@ rb_str_free(VALUE str) st_delete(frozen_strings, &fstr, NULL); } if (!STR_EMBED_P(str) && !STR_SHARED_P(str)) { - xfree(RSTRING(str)->as.heap.ptr); + ruby_xsizedfree(STR_HEAP_PTR(str), STR_HEAP_SIZE(str)); } } @@ -1463,7 +1466,7 @@ str_discard(VALUE str) { str_modifiable(str); if (!STR_SHARED_P(str) && !STR_EMBED_P(str)) { - xfree(RSTRING_PTR(str)); + ruby_xsizedfree(STR_HEAP_PTR(str), STR_HEAP_SIZE(str)); RSTRING(str)->as.heap.ptr = 0; RSTRING(str)->as.heap.len = 0; } @@ -1980,13 +1983,14 @@ rb_str_resize(VALUE str, long len) STR_SET_NOEMBED(str); } else if (len + termlen <= RSTRING_EMBED_LEN_MAX + 1) { - char *ptr = RSTRING(str)->as.heap.ptr; + char *ptr = STR_HEAP_PTR(str); + size_t size = STR_HEAP_SIZE(str); STR_SET_EMBED(str); if (slen > len) slen = len; if (slen > 0) MEMCPY(RSTRING(str)->as.ary, ptr, char, slen); TERM_FILL(RSTRING(str)->as.ary + len, termlen); STR_SET_EMBED_LEN(str, len); - if (independent) xfree(ptr); + if (independent) ruby_xsizedfree(ptr, size); return str; } else if (!independent) { @@ -5497,7 +5501,7 @@ tr_trans(VALUE str, VALUE src, VALUE repl, int sflag) t += tlen; } if (!STR_EMBED_P(str)) { - xfree(RSTRING(str)->as.heap.ptr); + ruby_xsizedfree(STR_HEAP_PTR(str), STR_HEAP_SIZE(str)); } *t = '\0'; RSTRING(str)->as.heap.ptr = buf; @@ -5573,7 +5577,7 @@ tr_trans(VALUE str, VALUE src, VALUE repl, int sflag) t += tlen; } if (!STR_EMBED_P(str)) { - xfree(RSTRING(str)->as.heap.ptr); + ruby_xsizedfree(STR_HEAP_PTR(str), STR_HEAP_SIZE(str)); } *t = '\0'; RSTRING(str)->as.heap.ptr = buf; |