summaryrefslogtreecommitdiffhomepage
path: root/src/gc.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-07-22 14:25:01 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2020-07-22 15:01:54 +0900
commitc99bb756c4d57df5466d4ff0b4749397041aab1a (patch)
tree93972210fea07183b148fd17b0a1a798ac115f67 /src/gc.c
parent097f525817d0825f12780adfc8542bb7f3db1302 (diff)
downloadmruby-c99bb756c4d57df5466d4ff0b4749397041aab1a.tar.gz
mruby-c99bb756c4d57df5466d4ff0b4749397041aab1a.zip
Move `gray_list` update from `gc_mark_children`.
The responsibility moved to caller to avoid confusion. Currently the function is called from only 2 places, so it is relatively easy to ensure not to update `gray_list` in the caller. But the assumption may change in the future.
Diffstat (limited to 'src/gc.c')
-rw-r--r--src/gc.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/src/gc.c b/src/gc.c
index 135d7416d..d21b7f9fc 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -667,7 +667,6 @@ gc_mark_children(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj)
{
mrb_assert(is_gray(obj));
paint_black(obj);
- gc->gray_list = obj->gcnext;
mrb_gc_mark(mrb, (struct RBasic*)obj->c);
switch (obj->tt) {
case MRB_TT_ICLASS:
@@ -1043,10 +1042,9 @@ gc_gray_counts(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj)
static void
gc_mark_gray_list(mrb_state *mrb, mrb_gc *gc) {
while (gc->gray_list) {
- if (is_gray(gc->gray_list))
- gc_mark_children(mrb, gc, gc->gray_list);
- else
- gc->gray_list = gc->gray_list->gcnext;
+ struct RBasic *obj = gc->gray_list;
+ gc->gray_list = obj->gcnext;
+ gc_mark_children(mrb, gc, obj);
}
}
@@ -1058,6 +1056,7 @@ incremental_marking_phase(mrb_state *mrb, mrb_gc *gc, size_t limit)
while (gc->gray_list && tried_marks < limit) {
struct RBasic *obj = gc->gray_list;
+ gc->gray_list = obj->gcnext;
gc_mark_children(mrb, gc, obj);
tried_marks += gc_gray_counts(mrb, gc, obj);
}