diff options
| author | fleuria <[email protected]> | 2013-07-24 18:15:22 +0800 |
|---|---|---|
| committer | fleuria <[email protected]> | 2013-07-24 18:22:53 +0800 |
| commit | 88eb0f54e9f484ded22c8aca6a33351217d824e0 (patch) | |
| tree | 54cf88c579c9ea66d33c09f9f9dd8196b0ef3c45 /src | |
| parent | be419485ba048c1545fdbc10f75aaf3a0a8f082c (diff) | |
| download | mruby-88eb0f54e9f484ded22c8aca6a33351217d824e0.tar.gz mruby-88eb0f54e9f484ded22c8aca6a33351217d824e0.zip | |
introduce gc_mark_gray_list(), and cleanup redaunt code with it
Diffstat (limited to 'src')
| -rw-r--r-- | src/gc.c | 30 |
1 files changed, 16 insertions, 14 deletions
@@ -774,6 +774,20 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj) return children; } + +static void +gc_mark_gray_list(mrb_state *mrb, struct RBasic **gray_list) { + struct RBasic *obj; + + while (obj = *gray_list) { + if (is_gray(obj)) { + gc_mark_children(mrb, obj); + } + *gray_list = obj->gcnext; + } +} + + static size_t incremental_marking_phase(mrb_state *mrb, size_t limit) { @@ -790,21 +804,9 @@ static void final_marking_phase(mrb_state *mrb) { mark_context_stack(mrb, mrb->root_c); - while (mrb->gray_list) { - if (is_gray(mrb->gray_list)) - gc_mark_children(mrb, mrb->gray_list); - else - mrb->gray_list = mrb->gray_list->gcnext; - } + gc_mark_gray_list(mrb, &mrb->gray_list); + gc_mark_gray_list(mrb, &mrb->variable_gray_list); gc_assert(mrb->gray_list == NULL); - mrb->gray_list = mrb->variable_gray_list; - mrb->variable_gray_list = NULL; - while (mrb->gray_list) { - if (is_gray(mrb->gray_list)) - gc_mark_children(mrb, mrb->gray_list); - else - mrb->gray_list = mrb->gray_list->gcnext; - } gc_assert(mrb->gray_list == NULL); } |
