diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-06-28 12:25:45 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-06-28 12:25:45 +0000 |
commit | 340cd503a7d0f73bb1ca6446f78793f968a5d5bf (patch) | |
tree | 6ef0adfb397248308136bd096c7dc3241b782809 /include | |
parent | 4c766e1713eda038b5118e1ebfbb6e26545966cd (diff) | |
download | ruby-340cd503a7d0f73bb1ca6446f78793f968a5d5bf.tar.gz |
* 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 'include')
-rw-r--r-- | include/ruby/ruby.h | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h index d2b9f4c8b3..2d602d4a46 100644 --- a/include/ruby/ruby.h +++ b/include/ruby/ruby.h @@ -522,9 +522,12 @@ struct RArray { struct RRegexp { struct RBasic basic; struct re_pattern_buffer *ptr; - long len; - char *str; + VALUE src; + unsigned long usecnt; }; +#define RREGEXP_SRC(r) RREGEXP(r)->src +#define RREGEXP_SRC_PTR(r) RSTRING_PTR(RREGEXP(r)->src) +#define RREGEXP_SRC_LEN(r) RSTRING_LEN(RREGEXP(r)->src) struct RHash { struct RBasic basic; |