Skip to content

Commit 48c5321

Browse files
committed
constify pointer from RARRAY_PTR to detect potential write barrier bugs.
if you see compiler errors due to this commit, you'd better to use array-modifying functions, e.g. mrb_ary_set() or mrb_ary_push(), otherwise you might see nasty GC bugs in the future. if you are sure what you are doing, replace `RARRAY_PTR(ary)` by `mrb_ary_ptr(ary)->ptr`. but be warned.
1 parent 7ea8803 commit 48c5321

5 files changed

Lines changed: 24 additions & 24 deletions

File tree

include/mruby/array.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ struct RArray {
3232
#define RARRAY(v) ((struct RArray*)(mrb_ptr(v)))
3333

3434
#define RARRAY_LEN(a) (RARRAY(a)->len)
35-
#define RARRAY_PTR(a) (RARRAY(a)->ptr)
35+
#define RARRAY_PTR(a) ((const mrb_value*)RARRAY(a)->ptr)
3636
#define MRB_ARY_SHARED 256
3737
#define ARY_SHARED_P(a) ((a)->flags & MRB_ARY_SHARED)
3838
#define ARY_SET_SHARED_FLAG(a) ((a)->flags |= MRB_ARY_SHARED)

mrbgems/mruby-random/src/random.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,8 @@ mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary)
221221
j = mrb_fixnum(mrb_random_mt_rand(mrb, random, mrb_fixnum_value(RARRAY_LEN(ary))));
222222

223223
tmp = RARRAY_PTR(ary)[i];
224-
RARRAY_PTR(ary)[i] = RARRAY_PTR(ary)[j];
225-
RARRAY_PTR(ary)[j] = tmp;
224+
mrb_ary_ptr(ary)->ptr[i] = RARRAY_PTR(ary)[j];
225+
mrb_ary_ptr(ary)->ptr[j] = tmp;
226226
}
227227
}
228228

@@ -305,11 +305,10 @@ mrb_ary_sample(mrb_state *mrb, mrb_value ary)
305305
}
306306
break;
307307
}
308-
RARRAY_PTR(result)[i] = mrb_fixnum_value(r);
309-
RARRAY_LEN(result)++;
308+
mrb_ary_push(mrb, result, mrb_fixnum_value(r));
310309
}
311310
for (i=0; i<n; i++) {
312-
RARRAY_PTR(result)[i] = RARRAY_PTR(ary)[mrb_fixnum(RARRAY_PTR(result)[i])];
311+
mrb_ary_set(mrb, result, i, RARRAY_PTR(ary)[mrb_fixnum(RARRAY_PTR(result)[i])]);
313312
}
314313
return result;
315314
}

mrbgems/mruby-struct/src/struct.c

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
#include "mruby/hash.h"
1515
#include "mruby/range.h"
1616

17-
#define RSTRUCT_LEN(st) RARRAY_LEN(st)
18-
#define RSTRUCT_PTR(st) RARRAY_PTR(st)
17+
#define RSTRUCT_LEN(st) mrb_ary_ptr(st)->len
18+
#define RSTRUCT_PTR(st) mrb_ary_ptr(st)->ptr
1919

2020
static struct RClass *
2121
struct_class(mrb_state *mrb)
@@ -72,15 +72,10 @@ static mrb_value
7272
mrb_struct_s_members_m(mrb_state *mrb, mrb_value klass)
7373
{
7474
mrb_value members, ary;
75-
mrb_value *p, *pend;
7675

7776
members = mrb_struct_s_members(mrb, klass);
7877
ary = mrb_ary_new_capa(mrb, RARRAY_LEN(members));
79-
p = RARRAY_PTR(members); pend = p + RARRAY_LEN(members);
80-
while (p < pend) {
81-
mrb_ary_push(mrb, ary, *p);
82-
p++;
83-
}
78+
mrb_ary_replace(mrb, ary, members);
8479
return ary;
8580
}
8681

@@ -106,7 +101,8 @@ mrb_struct_members_m(mrb_state *mrb, mrb_value obj)
106101
static mrb_value
107102
mrb_struct_getmember(mrb_state *mrb, mrb_value obj, mrb_sym id)
108103
{
109-
mrb_value members, slot, *ptr, *ptr_members;
104+
mrb_value members, slot, *ptr;
105+
const mrb_value *ptr_members;
110106
mrb_int i, len;
111107

112108
ptr = RSTRUCT_PTR(obj);
@@ -181,7 +177,8 @@ mrb_struct_set(mrb_state *mrb, mrb_value obj, mrb_value val)
181177
const char *name;
182178
mrb_int i, len, slen;
183179
mrb_sym mid;
184-
mrb_value members, slot, *ptr, *ptr_members;
180+
mrb_value members, slot, *ptr;
181+
const mrb_value *ptr_members;
185182

186183
/* get base id */
187184
name = mrb_sym2name_len(mrb, mrb->c->ci->mid, &slen);
@@ -227,7 +224,7 @@ is_const_id(mrb_state *mrb, const char *name)
227224
static void
228225
make_struct_define_accessors(mrb_state *mrb, mrb_value members, struct RClass *c)
229226
{
230-
mrb_value *ptr_members = RARRAY_PTR(members);
227+
const mrb_value *ptr_members = RARRAY_PTR(members);
231228
mrb_int i;
232229
mrb_int len = RARRAY_LEN(members);
233230
int ai = mrb_gc_arena_save(mrb);
@@ -359,7 +356,7 @@ mrb_struct_s_def(mrb_state *mrb, mrb_value klass)
359356
}
360357
for (i=0; i<RARRAY_LEN(rest); i++) {
361358
id = mrb_obj_to_sym(mrb, RARRAY_PTR(rest)[i]);
362-
RARRAY_PTR(rest)[i] = mrb_symbol_value(id);
359+
mrb_ary_set(mrb, rest, i, mrb_symbol_value(id));
363360
}
364361
}
365362
st = make_struct(mrb, name, rest, struct_class(mrb));
@@ -420,7 +417,8 @@ inspect_struct(mrb_state *mrb, mrb_value s, mrb_bool recur)
420417
{
421418
const char *cn = mrb_class_name(mrb, mrb_obj_class(mrb, s));
422419
mrb_value members, str = mrb_str_new_lit(mrb, "#<struct ");
423-
mrb_value *ptr, *ptr_members;
420+
mrb_value *ptr;
421+
const mrb_value *ptr_members;
424422
mrb_int i, len;
425423

426424
if (cn) {
@@ -506,7 +504,8 @@ mrb_struct_init_copy(mrb_state *mrb, mrb_value copy)
506504
static mrb_value
507505
struct_aref_sym(mrb_state *mrb, mrb_value s, mrb_sym id)
508506
{
509-
mrb_value *ptr, members, *ptr_members;
507+
mrb_value *ptr, members;
508+
const mrb_value *ptr_members;
510509
mrb_int i, len;
511510

512511
ptr = RSTRUCT_PTR(s);
@@ -579,7 +578,8 @@ mrb_struct_aref(mrb_state *mrb, mrb_value s)
579578
static mrb_value
580579
mrb_struct_aset_sym(mrb_state *mrb, mrb_value s, mrb_sym id, mrb_value val)
581580
{
582-
mrb_value members, *ptr, *ptr_members;
581+
mrb_value members, *ptr;
582+
const mrb_value *ptr_members;
583583
mrb_int i, len;
584584

585585
members = mrb_struct_members(mrb, s);

src/array.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val
574574
{
575575
struct RArray *a = mrb_ary_ptr(ary);
576576
mrb_int tail, size;
577-
mrb_value *argv;
577+
const mrb_value *argv;
578578
mrb_int i, argc;
579579

580580
ary_modify(mrb, a);

src/hash.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -698,12 +698,13 @@ mrb_hash_keys(mrb_state *mrb, mrb_value hash)
698698
{
699699
khash_t(ht) *h = RHASH_TBL(hash);
700700
khiter_t k;
701-
mrb_value ary, *p;
701+
mrb_value ary;
702+
mrb_value *p;
702703

703704
if (!h || kh_size(h) == 0) return mrb_ary_new(mrb);
704705
ary = mrb_ary_new_capa(mrb, kh_size(h));
705706
mrb_ary_set(mrb, ary, kh_size(h)-1, mrb_nil_value());
706-
p = RARRAY_PTR(ary);
707+
p = mrb_ary_ptr(ary)->ptr;
707708
for (k = kh_begin(h); k != kh_end(h); k++) {
708709
if (kh_exist(h, k)) {
709710
mrb_value kv = kh_key(h, k);

0 commit comments

Comments
 (0)