summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-06-28 12:25:45 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-06-28 12:25:45 +0000
commit340cd503a7d0f73bb1ca6446f78793f968a5d5bf (patch)
tree6ef0adfb397248308136bd096c7dc3241b782809 /gc.c
parent4c766e1713eda038b5118e1ebfbb6e26545966cd (diff)
* include/ruby/ruby.h (struct RRegexp): new field usecnt. replace
str and len by src. * gc.c (gc_mark_children): mark src field of regexp. (obj_free): don't free str field. * re.c (REG_BUSY): removed. (rb_reg_initialize): prohibit re-initialize regexp. (rb_reg_search): use usecnt to prevent freeing regexp currently using. this prevents SEGV by: r = /\A((a.)*(a.)*)*b/ r =~ "ab" + "\xc2\xa1".force_encoding("euc-jp") t = Thread.new { r =~ "ab"*8 + "\xc2\xa1".force_encoding("utf-8")} sleep 0.2 r =~ "ab"*8 + "\xc2\xa1".force_encoding("euc-jp") git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17635 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/gc.c b/gc.c
index a888d659e3..966aaa1933 100644
--- a/gc.c
+++ b/gc.c
@@ -1267,6 +1267,9 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
break;
case T_REGEXP:
+ gc_mark(objspace, obj->as.regexp.src, lev);
+ break;
+
case T_FLOAT:
case T_BIGNUM:
break;
@@ -1505,9 +1508,6 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
if (RANY(obj)->as.regexp.ptr) {
onig_free(RANY(obj)->as.regexp.ptr);
}
- if (RANY(obj)->as.regexp.str) {
- xfree(RANY(obj)->as.regexp.str);
- }
break;
case T_DATA:
if (DATA_PTR(obj)) {