summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamien Doligez <damien.doligez-inria.fr>2001-08-21 10:00:11 +0000
committerDamien Doligez <damien.doligez-inria.fr>2001-08-21 10:00:11 +0000
commit593885abd47fb019cfdaf70ccc0e2adb4a3dd19c (patch)
treeb34bf0161bbd8343b4f59692fb52555ef4a47a14
parent88b12eb77028d4b281d88e7c2efb7cc60728918d (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.c8
-rw-r--r--byterun/major_gc.c3
-rw-r--r--byterun/memory.c2
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 ();