* 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
This commit is contained in:
ko1 2013-06-21 10:14:04 +00:00
parent 6e19e1b876
commit 9296bd49da
3 changed files with 11 additions and 4 deletions

View File

@ -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.

View File

@ -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

6
re.c
View File

@ -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;