diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-07-24 23:47:52 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-07-24 23:47:52 +0900 |
| commit | 5146219cbdb47b6619640fb9386fb27bbe799183 (patch) | |
| tree | 5064b3432dc6f021119e7af6d23f7a8770468cb9 /src/gc.c | |
| parent | 4ad4ce6cafb2d408f0d539362d60ad1620698037 (diff) | |
| download | mruby-5146219cbdb47b6619640fb9386fb27bbe799183.tar.gz mruby-5146219cbdb47b6619640fb9386fb27bbe799183.zip | |
revise gc_mark_gray_list() not to cause SEGV on Ubuntu 32bit
Diffstat (limited to 'src/gc.c')
| -rw-r--r-- | src/gc.c | 18 |
1 files changed, 10 insertions, 8 deletions
@@ -776,14 +776,14 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj) static void -gc_mark_gray_list(mrb_state *mrb, struct RBasic **gray_list) { +gc_mark_gray_list(mrb_state *mrb) { struct RBasic *obj; - while ((obj = *gray_list)) { - if (is_gray(obj)) { - gc_mark_children(mrb, obj); - } - *gray_list = obj->gcnext; + 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; } } @@ -804,9 +804,11 @@ static void final_marking_phase(mrb_state *mrb) { mark_context_stack(mrb, mrb->root_c); - gc_mark_gray_list(mrb, &mrb->gray_list); - gc_mark_gray_list(mrb, &mrb->atomic_gray_list); + gc_mark_gray_list(mrb); gc_assert(mrb->gray_list == NULL); + mrb->gray_list = mrb->atomic_gray_list; + mrb->atomic_gray_list = NULL; + gc_mark_gray_list(mrb); gc_assert(mrb->gray_list == NULL); } |
