Skip to content

Commit 153c09c

Browse files
casperisfinebyroot
andauthored
Implement write barriers for Fiddle::Pointer (#127)
Save from having to mark them on every minor. Co-authored-by: Jean Boussier <jean.boussier@gmail.com>
1 parent f425b55 commit 153c09c

File tree

1 file changed

+13
-8
lines changed

1 file changed

+13
-8
lines changed

ext/fiddle/pointer.c

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,13 @@ fiddle_ptr_memsize(const void *ptr)
8888
}
8989

9090
static const rb_data_type_t fiddle_ptr_data_type = {
91-
"fiddle/pointer",
92-
{fiddle_ptr_mark, fiddle_ptr_free, fiddle_ptr_memsize,},
91+
.wrap_struct_name = "fiddle/pointer",
92+
.function = {
93+
.dmark = fiddle_ptr_mark,
94+
.dfree = fiddle_ptr_free,
95+
.dsize = fiddle_ptr_memsize,
96+
},
97+
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED
9398
};
9499

95100
#ifdef HAVE_RUBY_MEMORY_VIEW_H
@@ -135,8 +140,8 @@ rb_fiddle_ptr_new2(VALUE klass, void *ptr, long size, freefunc_t func, VALUE wra
135140
data->free = func;
136141
data->freed = false;
137142
data->size = size;
138-
data->wrap[0] = wrap0;
139-
data->wrap[1] = wrap1;
143+
RB_OBJ_WRITE(val, &data->wrap[0], wrap0);
144+
RB_OBJ_WRITE(val, &data->wrap[1], wrap1);
140145

141146
return val;
142147
}
@@ -235,8 +240,8 @@ rb_fiddle_ptr_initialize(int argc, VALUE argv[], VALUE self)
235240
/* Free previous memory. Use of inappropriate initialize may cause SEGV. */
236241
(*(data->free))(data->ptr);
237242
}
238-
data->wrap[0] = wrap;
239-
data->wrap[1] = funcwrap;
243+
RB_OBJ_WRITE(self, &data->wrap[0], wrap);
244+
RB_OBJ_WRITE(self, &data->wrap[1], funcwrap);
240245
data->ptr = p;
241246
data->size = s;
242247
data->free = f;
@@ -314,7 +319,7 @@ rb_fiddle_ptr_s_malloc(int argc, VALUE argv[], VALUE klass)
314319
}
315320

316321
obj = rb_fiddle_ptr_malloc(klass, s,f);
317-
if (wrap) RPTR_DATA(obj)->wrap[1] = wrap;
322+
if (wrap) RB_OBJ_WRITE(obj, &RPTR_DATA(obj)->wrap[1], wrap);
318323

319324
if (rb_block_given_p()) {
320325
if (!f) {
@@ -795,7 +800,7 @@ rb_fiddle_ptr_s_to_ptr(VALUE self, VALUE val)
795800
if (num == val) wrap = 0;
796801
ptr = rb_fiddle_ptr_new(NUM2PTR(num), 0, NULL);
797802
}
798-
if (wrap) RPTR_DATA(ptr)->wrap[0] = wrap;
803+
if (wrap) RB_OBJ_WRITE(ptr, &RPTR_DATA(ptr)->wrap[0], wrap);
799804
return ptr;
800805
}
801806

0 commit comments

Comments
 (0)