diff options
author | Damien Doligez <damien.doligez-inria.fr> | 2003-10-16 23:22:23 +0000 |
---|---|---|
committer | Damien Doligez <damien.doligez-inria.fr> | 2003-10-16 23:22:23 +0000 |
commit | e969e8ad9fdce5a8a33946587d45b3e4c22cae90 (patch) | |
tree | 7d7d2282c138d420cb03a5c2c4ba87554bcd6736 /byterun/finalise.c | |
parent | 5320c8fce63acb42f92483a0462e917c32fdf2b6 (diff) |
PR#1878
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@5873 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'byterun/finalise.c')
-rw-r--r-- | byterun/finalise.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/byterun/finalise.c b/byterun/finalise.c index 6fb533276..79e1e01fa 100644 --- a/byterun/finalise.c +++ b/byterun/finalise.c @@ -53,9 +53,16 @@ void final_update (void) struct final f; if (Tag_val (final_table[i].val) == Forward_tag){ - final_table[i].val = Forward_val (final_table[i].val); - if (Is_block (final_table[i].val) && Is_in_heap (final_table[i].val)){ - goto again; + value fv = Forward_val (final_table[i].val); + if (Is_block (fv) && (Is_young (fv) || Is_in_heap (fv)) + && (Tag_val (fv) == Forward_tag || Tag_val (fv) == Lazy_tag + || Tag_val (fv) == Double_tag)){ + /* Do not short-circuit the pointer. */ + }else{ + final_table[i].val = fv; + if (Is_block (final_table[i].val) && Is_in_heap (final_table[i].val)){ + goto again; + } } } f = final_table[i]; |