summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-10-11 14:09:49 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-10-11 14:09:49 +0000
commite808b2b18f13fba51c4e2e8b31e83228d26e3f53 (patch)
tree12d9a3fa25526492ed2bd2e9659e22e152c5668d /string.c
parent104d173752b240dd9a52a4edf2f3715f540e629a (diff)
string.c: GC guard
* string.c (rb_str_sub{seq,pos,str}, rb_str_each_{line,codepoint}): prevent String copies from GC. [ruby-core:47881] [Bug #7135] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37143 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r--string.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/string.c b/string.c
index 9281e4cfbb..fa95ee9d09 100644
--- a/string.c
+++ b/string.c
@@ -1632,6 +1632,7 @@ rb_str_subseq(VALUE str, long beg, long len)
}
else {
str2 = rb_str_new5(str, RSTRING_PTR(str)+beg, len);
+ RB_GC_GUARD(str);
}
rb_enc_cr_str_copy_for_substr(str2, str);
@@ -1721,6 +1722,7 @@ rb_str_subpos(VALUE str, long beg, long *lenp)
}
end:
*lenp = len;
+ RB_GC_GUARD(str);
return p;
}
@@ -1741,6 +1743,7 @@ rb_str_substr(VALUE str, long beg, long len)
str2 = rb_str_new5(str, p, len);
rb_enc_cr_str_copy_for_substr(str2, str);
OBJ_INFECT(str2, str);
+ RB_GC_GUARD(str);
}
return str2;
@@ -6206,6 +6209,7 @@ rb_str_each_line(int argc, VALUE *argv, VALUE str)
OBJ_INFECT(line, str);
rb_enc_cr_str_copy_for_substr(line, str);
rb_yield(line);
+ RB_GC_GUARD(str);
}
return orig;
@@ -6332,6 +6336,7 @@ rb_str_each_codepoint(VALUE str)
rb_yield(UINT2NUM(c));
ptr += n;
}
+ RB_GC_GUARD(str);
return orig;
}