From 5bf4842c96260416fb7dcfe637ae87be28c5dda9 Mon Sep 17 00:00:00 2001 From: matz Date: Thu, 4 Nov 2004 12:27:57 +0000 Subject: * string.c (str_gsub): string modify check no longer based on tmplock. [ruby-dev:24706] git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@7202 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- string.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'string.c') diff --git a/string.c b/string.c index d36f82ba4..fb56d3063 100644 --- a/string.c +++ b/string.c @@ -464,7 +464,6 @@ str_independent(str) VALUE str; { if (FL_TEST(str, STR_TMPLOCK)) { - FL_UNSET(str, STR_TMPLOCK); rb_raise(rb_eRuntimeError, "can't modify string; temporarily locked"); } if (OBJ_FROZEN(str)) rb_error_frozen("string"); @@ -2045,9 +2044,9 @@ str_gsub(argc, argv, str, bang) VALUE pat, val, repl, match, dest; struct re_registers *regs; long beg, n; - long offset, blen, len; + long offset, blen, slen, len; int iter = 0; - char *buf, *bp, *cp; + char *buf, *bp, *sp, *cp; int tainted = 0; if (argc == 1 && rb_block_given_p()) { @@ -2074,9 +2073,9 @@ str_gsub(argc, argv, str, bang) dest = rb_str_new5(str, 0, blen); buf = RSTRING(dest)->ptr; bp = buf; - cp = RSTRING(str)->ptr; + sp = cp = RSTRING(str)->ptr; + slen = RSTRING(str)->len; - rb_str_locktmp(str); rb_str_locktmp(dest); while (beg >= 0) { n++; @@ -2085,7 +2084,7 @@ str_gsub(argc, argv, str, bang) if (iter) { rb_match_busy(match); val = rb_obj_as_string(rb_yield(rb_reg_nth_match(0, match))); - str_mod_check(dest, buf, blen); + str_mod_check(str, sp, slen); rb_backref_set(match); } else { -- cgit