diff options
author | Damien Doligez <damien.doligez-inria.fr> | 2001-08-21 10:00:11 +0000 |
---|---|---|
committer | Damien Doligez <damien.doligez-inria.fr> | 2001-08-21 10:00:11 +0000 |
commit | 593885abd47fb019cfdaf70ccc0e2adb4a3dd19c (patch) | |
tree | b34bf0161bbd8343b4f59692fb52555ef4a47a14 | |
parent | 88b12eb77028d4b281d88e7c2efb7cc60728918d (diff) |
bug make_array et consorts
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@3641 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r-- | byterun/array.c | 8 | ||||
-rw-r--r-- | byterun/major_gc.c | 3 | ||||
-rw-r--r-- | byterun/memory.c | 2 |
3 files changed, 9 insertions, 4 deletions
diff --git a/byterun/array.c b/byterun/array.c index 3239b11de..cec8b9172 100644 --- a/byterun/array.c +++ b/byterun/array.c @@ -137,7 +137,9 @@ value make_vect(value len, value init) /* ML */ if (size == 0) { res = Atom(0); } - else if (Is_block(init) && Tag_val(init) == Double_tag) { + else if (Is_block(init) + && (Is_atom(init) || Is_young(init) || Is_in_heap(init)) + && Tag_val(init) == Double_tag) { d = Double_val(init); wsize = size * Double_wosize; if (wsize > Max_wosize) invalid_argument("Array.make"); @@ -177,7 +179,9 @@ value make_array(value init) /* ML */ CAMLreturn (init); } else { v = Field(init, 0); - if (Is_long(v) || Tag_val(v) != Double_tag) { + if (Is_long(v) + || (!Is_atom(v) && !Is_young(v) && !Is_in_heap(v)) + || Tag_val(v) != Double_tag) { CAMLreturn (init); } else { Assert(size < Max_young_wosize); diff --git a/byterun/major_gc.c b/byterun/major_gc.c index 0925eeba8..8d98f5ebb 100644 --- a/byterun/major_gc.c +++ b/byterun/major_gc.c @@ -203,7 +203,8 @@ static void update_weak_pointers (void) sz = Wosize_val (cur); for (i = 1; i < sz; i++){ curfield = Field (cur, i); - if (curfield != 0 && Is_block (curfield) && Is_white_val (curfield)){ + if (curfield != 0 && Is_block (curfield) && Is_in_heap (curfield) + && Is_white_val (curfield)){ Field (cur, i) = 0; } } diff --git a/byterun/memory.c b/byterun/memory.c index 4d9d3c9b4..1955d91b1 100644 --- a/byterun/memory.c +++ b/byterun/memory.c @@ -296,7 +296,7 @@ void adjust_gc_speed (mlsize_t mem, mlsize_t max) void initialize (value *fp, value val) { *fp = val; - if (Is_in_heap (fp) && Is_block (val) && Is_young (val)){ + if (Is_block (val) && Is_young (val) && Is_in_heap (fp)){ *ref_table_ptr++ = fp; if (ref_table_ptr >= ref_table_limit){ realloc_ref_table (); |