Skip to content

Commit 4cd884f

Browse files
Implement Write Barrier
StringScanner holds the string being scanned, and a regex for methods like `match?`. Triggering the write barrier for those allows us to mark this as WB protected.
1 parent d4d9b10 commit 4cd884f

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

ext/strscan/strscan.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ strscan_memsize(const void *ptr)
209209
static const rb_data_type_t strscanner_type = {
210210
"StringScanner",
211211
{strscan_mark, strscan_free, strscan_memsize},
212-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
212+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED
213213
};
214214

215215
static VALUE
@@ -273,7 +273,7 @@ strscan_initialize(int argc, VALUE *argv, VALUE self)
273273
p->fixed_anchor_p = false;
274274
}
275275
StringValue(str);
276-
p->str = str;
276+
RB_OBJ_WRITE(self, &p->str, str);
277277

278278
return self;
279279
}
@@ -303,7 +303,7 @@ strscan_init_copy(VALUE vself, VALUE vorig)
303303
orig = check_strscan(vorig);
304304
if (self != orig) {
305305
self->flags = orig->flags;
306-
self->str = orig->str;
306+
RB_OBJ_WRITE(vself, &self->str, orig->str);
307307
self->prev = orig->prev;
308308
self->curr = orig->curr;
309309
if (rb_reg_region_copy(&self->regs, &orig->regs))
@@ -467,7 +467,7 @@ strscan_set_string(VALUE self, VALUE str)
467467
struct strscanner *p = check_strscan(self);
468468

469469
StringValue(str);
470-
p->str = str;
470+
RB_OBJ_WRITE(self, &p->str, str);
471471
p->curr = 0;
472472
CLEAR_MATCH_STATUS(p);
473473
return str;
@@ -712,7 +712,7 @@ strscan_do_scan(VALUE self, VALUE pattern, int succptr, int getstr, int headonly
712712

713713
if (RB_TYPE_P(pattern, T_REGEXP)) {
714714
OnigPosition ret;
715-
p->regex = pattern;
715+
RB_OBJ_WRITE(self, &p->regex, pattern);
716716
ret = rb_reg_onig_match(p->regex,
717717
p->str,
718718
headonly ? strscan_match : strscan_search,

0 commit comments

Comments
 (0)