summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamien Doligez <damien.doligez-inria.fr>2008-07-28 12:03:55 +0000
committerDamien Doligez <damien.doligez-inria.fr>2008-07-28 12:03:55 +0000
commitdf023f535b9b4bb051cbce6dc39ea3b835bb80f1 (patch)
tree9cb3f00be19a0a1c8b5d64e382a7e4666b777bad
parentc4d8f39fc28a6ef6909e07bb6f7bf76069f8f96e (diff)
lazy: do not short-circuit to pointers outside the heap
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@8954 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r--VERSION2
-rw-r--r--byterun/extern.c6
-rw-r--r--byterun/finalise.c6
-rw-r--r--byterun/major_gc.c12
-rw-r--r--byterun/minor_gc.c10
5 files changed, 20 insertions, 16 deletions
diff --git a/VERSION b/VERSION
index 418f43856..cf357e140 100644
--- a/VERSION
+++ b/VERSION
@@ -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);