Skip to content

Commit 29c95ee

Browse files
committed
stop using a mark array
1 parent b85d836 commit 29c95ee

File tree

4 files changed

+24
-29
lines changed

4 files changed

+24
-29
lines changed

compile.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8625,7 +8625,8 @@ ibf_dump_iseq_each(struct ibf_dump *dump, const rb_iseq_t *iseq)
86258625
dump_body.is_entries = NULL;
86268626
dump_body.ci_entries = ibf_dump_ci_entries(dump, iseq);
86278627
dump_body.cc_entries = NULL;
8628-
dump_body.mark_ary = ISEQ_FLIP_CNT(iseq);
8628+
dump_body.variable.coverage = Qnil;
8629+
dump_body.variable.original_iseq = Qnil;
86298630

86308631
return ibf_dump_write(dump, &dump_body, sizeof(dump_body));
86318632
}
@@ -8657,7 +8658,7 @@ ibf_load_iseq_each(const struct ibf_load *load, rb_iseq_t *iseq, ibf_offset_t of
86578658
load_body->ci_kw_size = body->ci_kw_size;
86588659
load_body->insns_info.size = body->insns_info.size;
86598660

8660-
RB_OBJ_WRITE(iseq, &load_body->mark_ary, iseq_mark_ary_create((int)body->mark_ary));
8661+
iseq_mark_ary_create(iseq, (int)body->variable.flip_count);
86618662

86628663
{
86638664
VALUE realpath = Qnil, path = ibf_load_object(load, body->location.pathobj);

iseq.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,8 @@ rb_iseq_mark(const rb_iseq_t *iseq)
216216
const struct rb_iseq_constant_body *body = iseq->body;
217217

218218
rb_iseq_each_value(iseq, each_insn_value, NULL);
219-
RUBY_MARK_UNLESS_NULL(body->mark_ary);
219+
rb_gc_mark(body->variable.coverage);
220+
rb_gc_mark(body->variable.original_iseq);
220221
rb_gc_mark(body->location.label);
221222
rb_gc_mark(body->location.base_label);
222223
rb_gc_mark(body->location.pathobj);
@@ -425,7 +426,7 @@ prepare_iseq_build(rb_iseq_t *iseq,
425426
if (iseq != iseq->body->local_iseq) {
426427
RB_OBJ_WRITE(iseq, &iseq->body->location.base_label, iseq->body->local_iseq->body->location.label);
427428
}
428-
RB_OBJ_WRITE(iseq, &iseq->body->mark_ary, iseq_mark_ary_create(0));
429+
iseq_mark_ary_create(iseq, 0);
429430

430431
ISEQ_COMPILE_DATA_ALLOC(iseq);
431432
RB_OBJ_WRITE(iseq, &ISEQ_COMPILE_DATA(iseq)->err_info, err_info);

iseq.h

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -28,59 +28,48 @@ rb_call_info_kw_arg_bytes(int keyword_len)
2828
return sizeof(struct rb_call_info_kw_arg) + sizeof(VALUE) * (keyword_len - 1);
2929
}
3030

31-
enum iseq_mark_ary_index {
32-
ISEQ_MARK_ARY_COVERAGE,
33-
ISEQ_MARK_ARY_FLIP_CNT,
34-
ISEQ_MARK_ARY_ORIGINAL_ISEQ,
35-
ISEQ_MARK_ARY_INITIAL_SIZE
36-
};
37-
38-
static inline VALUE
39-
iseq_mark_ary_create(int flip_cnt)
31+
static inline void
32+
iseq_mark_ary_create(rb_iseq_t *iseq, int flip_cnt)
4033
{
41-
VALUE ary = rb_ary_tmp_new(ISEQ_MARK_ARY_INITIAL_SIZE);
42-
rb_ary_push(ary, Qnil); /* ISEQ_MARK_ARY_COVERAGE */
43-
rb_ary_push(ary, INT2FIX(flip_cnt)); /* ISEQ_MARK_ARY_FLIP_CNT */
44-
rb_ary_push(ary, Qnil); /* ISEQ_MARK_ARY_ORIGINAL_ISEQ */
45-
return ary;
34+
RB_OBJ_WRITE(iseq, &iseq->body->variable.coverage, Qnil);
35+
RB_OBJ_WRITE(iseq, &iseq->body->variable.original_iseq, Qnil);
36+
iseq->body->variable.flip_count = flip_cnt;
4637
}
4738

48-
#define ISEQ_MARK_ARY(iseq) (iseq)->body->mark_ary
49-
50-
#define ISEQ_COVERAGE(iseq) RARRAY_AREF(ISEQ_MARK_ARY(iseq), ISEQ_MARK_ARY_COVERAGE)
51-
#define ISEQ_COVERAGE_SET(iseq, cov) RARRAY_ASET(ISEQ_MARK_ARY(iseq), ISEQ_MARK_ARY_COVERAGE, cov)
39+
#define ISEQ_COVERAGE(iseq) iseq->body->variable.coverage
40+
#define ISEQ_COVERAGE_SET(iseq, cov) RB_OBJ_WRITE(iseq, &iseq->body->variable.coverage, cov)
5241
#define ISEQ_LINE_COVERAGE(iseq) RARRAY_AREF(ISEQ_COVERAGE(iseq), COVERAGE_INDEX_LINES)
5342
#define ISEQ_BRANCH_COVERAGE(iseq) RARRAY_AREF(ISEQ_COVERAGE(iseq), COVERAGE_INDEX_BRANCHES)
5443

55-
#define ISEQ_FLIP_CNT(iseq) FIX2INT(RARRAY_AREF(ISEQ_MARK_ARY(iseq), ISEQ_MARK_ARY_FLIP_CNT))
44+
#define ISEQ_FLIP_CNT(iseq) (iseq)->body->variable.flip_count
5645

5746
static inline int
5847
ISEQ_FLIP_CNT_INCREMENT(const rb_iseq_t *iseq)
5948
{
60-
int cnt = ISEQ_FLIP_CNT(iseq);
61-
RARRAY_ASET(ISEQ_MARK_ARY(iseq), ISEQ_MARK_ARY_FLIP_CNT, INT2FIX(cnt+1));
49+
int cnt = iseq->body->variable.flip_count;
50+
iseq->body->variable.flip_count += 1;
6251
return cnt;
6352
}
6453

6554
static inline VALUE *
6655
ISEQ_ORIGINAL_ISEQ(const rb_iseq_t *iseq)
6756
{
68-
VALUE str = RARRAY_AREF(ISEQ_MARK_ARY(iseq), ISEQ_MARK_ARY_ORIGINAL_ISEQ);
57+
VALUE str = iseq->body->variable.original_iseq;
6958
if (RTEST(str)) return (VALUE *)RSTRING_PTR(str);
7059
return NULL;
7160
}
7261

7362
static inline void
7463
ISEQ_ORIGINAL_ISEQ_CLEAR(const rb_iseq_t *iseq)
7564
{
76-
RARRAY_ASET(ISEQ_MARK_ARY(iseq), ISEQ_MARK_ARY_ORIGINAL_ISEQ, Qnil);
65+
RB_OBJ_WRITE(iseq, &iseq->body->variable.original_iseq, Qnil);
7766
}
7867

7968
static inline VALUE *
8069
ISEQ_ORIGINAL_ISEQ_ALLOC(const rb_iseq_t *iseq, long size)
8170
{
8271
VALUE str = rb_str_tmp_new(size * sizeof(VALUE));
83-
RARRAY_ASET(ISEQ_MARK_ARY(iseq), ISEQ_MARK_ARY_ORIGINAL_ISEQ, str);
72+
RB_OBJ_WRITE(iseq, &iseq->body->variable.original_iseq, str);
8473
return (VALUE *)RSTRING_PTR(str);
8574
}
8675

vm_core.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,11 @@ struct rb_iseq_constant_body {
407407
*/
408408
struct rb_call_cache *cc_entries; /* size is ci_size = ci_kw_size */
409409

410-
VALUE mark_ary; /* Array: includes operands which should be GC marked */
410+
struct {
411+
rb_num_t flip_count;
412+
VALUE coverage;
413+
VALUE original_iseq;
414+
} variable;
411415

412416
unsigned int local_table_size;
413417
unsigned int is_size;

0 commit comments

Comments
 (0)