From 9296bd49da1b75731e4ccf48e6517c59d21a700b Mon Sep 17 00:00:00 2001 From: ko1 Date: Fri, 21 Jun 2013 10:14:04 +0000 Subject: * include/ruby/ruby.h, re.c: support write barrier for T_REGEXP. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41530 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 ++++ include/ruby/ruby.h | 5 ++++- re.c | 6 +++--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4fd2c21ae7..ffd39177e9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Fri Jun 21 19:11:56 2013 Koichi Sasada + + * include/ruby/ruby.h, re.c: support write barrier for T_REGEXP. + Fri Jun 21 18:56:58 2013 Tanaka Akira * bignum.c (bigsub_int): Use bdigit_roomof. diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h index f681f7b4c2..32e7e196e7 100644 --- a/include/ruby/ruby.h +++ b/include/ruby/ruby.h @@ -715,6 +715,9 @@ VALUE rb_obj_setup(VALUE obj, VALUE klass, VALUE type); #ifndef RGENGC_WB_PROTECTED_OBJECT #define RGENGC_WB_PROTECTED_OBJECT 1 #endif +#ifndef RGENGC_WB_PROTECTED_REGEXP +#define RGENGC_WB_PROTECTED_REGEXP 1 +#endif #ifndef RGENGC_WB_PROTECTED_CLASS #define RGENGC_WB_PROTECTED_CLASS 1 #endif @@ -971,7 +974,7 @@ struct RArray { struct RRegexp { struct RBasic basic; struct re_pattern_buffer *ptr; - VALUE src; + const VALUE src; unsigned long usecnt; }; #define RREGEXP_SRC(r) RREGEXP(r)->src diff --git a/re.c b/re.c index dbcbeb474c..cd1f997784 100644 --- a/re.c +++ b/re.c @@ -2438,7 +2438,7 @@ rb_reg_initialize(VALUE obj, const char *s, long len, rb_encoding *enc, options & ARG_REG_OPTION_MASK, err, sourcefile, sourceline); if (!re->ptr) return -1; - re->src = rb_enc_str_new(s, len, enc); + OBJ_WRITE(obj, (VALUE *)&re->src, rb_enc_str_new(s, len, enc)); OBJ_FREEZE(re->src); RB_GC_GUARD(unescaped); return 0; @@ -2470,10 +2470,10 @@ rb_reg_initialize_str(VALUE obj, VALUE str, int options, onig_errmsg_buffer err, static VALUE rb_reg_s_alloc(VALUE klass) { - NEWOBJ_OF(re, struct RRegexp, klass, T_REGEXP); + NEWOBJ_OF(re, struct RRegexp, klass, T_REGEXP | (RGENGC_WB_PROTECTED_REGEXP ? FL_WB_PROTECTED : 0)); re->ptr = 0; - re->src = 0; + OBJ_WRITE(re, (VALUE *)&re->src, 0); re->usecnt = 0; return (VALUE)re; -- cgit v1.2.3