From 2a592c65a31ed0b8da81a9ce0ad375d5c17aa8b9 Mon Sep 17 00:00:00 2001 From: akr Date: Sat, 28 Jun 2008 12:25:45 +0000 Subject: * 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: http://svn.ruby-lang.org/repos/ruby/trunk@17635 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- include/ruby/ruby.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'include/ruby/ruby.h') diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h index d2b9f4c8b..2d602d4a4 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; -- cgit