summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamien Doligez <damien.doligez-inria.fr>2002-07-30 14:00:36 +0000
committerDamien Doligez <damien.doligez-inria.fr>2002-07-30 14:00:36 +0000
commita0552161a67664a11b3a0581e5d890f504ab7946 (patch)
tree5fe7e74f9e8d876c63e354bd71211df40bed9434
parenta839b74ddad21f5f2a9c8785de02504d9802d50a (diff)
boucler si pointeur faible sur lazy recursif, sinon c'est pas correct
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@5059 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-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;
}
}