diff options
-rw-r--r-- | VERSION | 2 | ||||
-rw-r--r-- | byterun/extern.c | 6 | ||||
-rw-r--r-- | byterun/finalise.c | 6 | ||||
-rw-r--r-- | byterun/major_gc.c | 12 | ||||
-rw-r--r-- | byterun/minor_gc.c | 10 |
5 files changed, 20 insertions, 16 deletions
@@ -1,4 +1,4 @@ -3.11+dev13 Private_abbrevs+natdynlink+lazy_patterns (2008-07-22) +3.11+dev14 Private_abbrevs+natdynlink+lazy_patterns (2008-07-28) # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/byterun/extern.c b/byterun/extern.c index 0578d7dbe..ac7f360b7 100644 --- a/byterun/extern.c +++ b/byterun/extern.c @@ -313,9 +313,9 @@ static void extern_rec(value v) if (tag == Forward_tag) { value f = Forward_val (v); - if (Is_block (f) && Is_in_value_area(f) - && (Tag_val (f) == Forward_tag || Tag_val (f) == Lazy_tag - || Tag_val (f) == Double_tag)){ + if (Is_block (f) + && (!Is_in_value_area(f) || Tag_val (f) == Forward_tag + || Tag_val (f) == Lazy_tag || Tag_val (f) == Double_tag)){ /* Do not short-circuit the pointer. */ }else{ v = f; diff --git a/byterun/finalise.c b/byterun/finalise.c index c55032d4e..1e176dd17 100644 --- a/byterun/finalise.c +++ b/byterun/finalise.c @@ -88,9 +88,9 @@ void caml_final_update (void) value fv; Assert (final_table[i].offset == 0); fv = Forward_val (final_table[i].val); - if (Is_block (fv) && Is_in_value_area(fv) - && (Tag_val (fv) == Forward_tag || Tag_val (fv) == Lazy_tag - || Tag_val (fv) == Double_tag)){ + if (Is_block (fv) + && (!Is_in_value_area(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; diff --git a/byterun/major_gc.c b/byterun/major_gc.c index d12982b1a..312d9a4a2 100644 --- a/byterun/major_gc.c +++ b/byterun/major_gc.c @@ -144,9 +144,9 @@ static void mark_slice (intnat work) hd = Hd_val (child); if (Tag_hd (hd) == Forward_tag){ value f = Forward_val (child); - if (Is_block (f) && Is_in_value_area(f) - && (Tag_val (f) == Forward_tag || Tag_val (f) == Lazy_tag - || Tag_val (f) == Double_tag)){ + if (Is_block (f) + && (!Is_in_value_area(f) || Tag_val (f) == Forward_tag + || Tag_val (f) == Lazy_tag || Tag_val (f) == Double_tag)){ /* Do not short-circuit the pointer. */ }else{ Field (v, i) = f; @@ -215,9 +215,9 @@ static void mark_slice (intnat work) && Is_block (curfield) && Is_in_heap (curfield)){ if (Tag_val (curfield) == Forward_tag){ value f = Forward_val (curfield); - if (Is_block (f) && Is_in_value_area(f)) { - if (Tag_val (f) == Forward_tag || Tag_val (f) == Lazy_tag - || Tag_val (f) == Double_tag){ + if (Is_block (f)) { + if (!Is_in_value_area(f) || Tag_val (f) == Forward_tag + || Tag_val (f) == Lazy_tag || Tag_val (f) == Double_tag){ /* Do not short-circuit the pointer. */ }else{ Field (cur, i) = curfield = f; diff --git a/byterun/minor_gc.c b/byterun/minor_gc.c index 4288f9e96..91aa29799 100644 --- a/byterun/minor_gc.c +++ b/byterun/minor_gc.c @@ -156,12 +156,16 @@ void caml_oldify_one (value v, value *p) }else{ value f = Forward_val (v); tag_t ft = 0; + int vv = 1; Assert (tag == Forward_tag); - if (Is_block (f) && Is_in_value_area(f)) { - ft = Tag_val (Hd_val (f) == 0 ? Field (f, 0) : f); + if (Is_block (f)){ + vv = Is_in_value_area(f); + if (vv) { + ft = Tag_val (Hd_val (f) == 0 ? Field (f, 0) : f); + } } - if (ft == Forward_tag || ft == Lazy_tag || ft == Double_tag){ + if (!vv || ft == Forward_tag || ft == Lazy_tag || ft == Double_tag){ /* Do not short-circuit the pointer. Copy as a normal block. */ Assert (Wosize_hd (hd) == 1); result = caml_alloc_shr (1, Forward_tag); |