diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | include/ruby/ruby.h | 5 | ||||
-rw-r--r-- | re.c | 6 |
3 files changed, 11 insertions, 4 deletions
@@ -1,3 +1,7 @@ +Fri Jun 21 19:11:56 2013 Koichi Sasada <ko1@atdot.net> + + * include/ruby/ruby.h, re.c: support write barrier for T_REGEXP. + Fri Jun 21 18:56:58 2013 Tanaka Akira <akr@fsij.org> * 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 @@ -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; |