summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--byterun/major_gc.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/byterun/major_gc.c b/byterun/major_gc.c
index cc1059b77..c5f792470 100644
--- a/byterun/major_gc.c
+++ b/byterun/major_gc.c
@@ -189,11 +189,14 @@ static void mark_slice (long work)
sz = Wosize_hd (hd);
for (i = 1; i < sz; i++){
curfield = Field (cur, i);
+ weak_again:
if (curfield != 0 && Is_block (curfield) && Is_in_heap (curfield)){
if (Tag_val (curfield) == Forward_tag){
- Field (cur, i) = Forward_val (curfield);
+ curfield = Forward_val (curfield);
+ Field (cur, i) = curfield;
+ goto weak_again;
}
- else if (Is_white_val (curfield)){
+ if (Is_white_val (curfield)){
Field (cur, i) = 0;
}
}