summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--include/ruby/ruby.h5
-rw-r--r--re.c6
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 <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
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;