summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorfleuria <[email protected]>2013-07-24 18:15:22 +0800
committerfleuria <[email protected]>2013-07-24 18:22:53 +0800
commit88eb0f54e9f484ded22c8aca6a33351217d824e0 (patch)
tree54cf88c579c9ea66d33c09f9f9dd8196b0ef3c45
parentbe419485ba048c1545fdbc10f75aaf3a0a8f082c (diff)
downloadmruby-88eb0f54e9f484ded22c8aca6a33351217d824e0.tar.gz
mruby-88eb0f54e9f484ded22c8aca6a33351217d824e0.zip
introduce gc_mark_gray_list(), and cleanup redaunt code with it
-rw-r--r--src/gc.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/src/gc.c b/src/gc.c
index cfe48df68..bc0623be1 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -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);
}