summaryrefslogtreecommitdiff
path: root/byterun/alloc.c
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>1998-04-06 09:15:55 +0000
committerXavier Leroy <xavier.leroy@inria.fr>1998-04-06 09:15:55 +0000
commitea8fe59ea07cb8da82c8581d8cf0c9d844867375 (patch)
tree61e86e83bf329920d4af220a47867f682a10d099 /byterun/alloc.c
parentd83bfc2f72be1d4861369eb80ecce0a3a29c2f79 (diff)
downloadocaml-ea8fe59ea07cb8da82c8581d8cf0c9d844867375.tar.gz
Adoption des memes representations que dans ocamlopt pour les tableaux de flottants et les fonctions mutuellement recursives.
Simplification de la compilation du let rec de valeurs. git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@1895 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'byterun/alloc.c')
-rw-r--r--byterun/alloc.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/byterun/alloc.c b/byterun/alloc.c
index 4ea4091b5e..d16c39267f 100644
--- a/byterun/alloc.c
+++ b/byterun/alloc.c
@@ -94,7 +94,8 @@ value alloc_array(value (*funct)(char *), char ** arr)
Begin_root(result);
for (n = 0; n < nbr; n++) {
/* The two statements below must be separate because of evaluation
- order. */
+ order (don't take the address &Field(result, n) before
+ calling funct, which may cause a GC and move result). */
v = funct(arr[n]);
modify(&Field(result, n), v);
}
@@ -118,3 +119,28 @@ int convert_flag_list(value list, int *flags)
}
return res;
}
+
+/* For compiling let rec over values */
+
+value alloc_dummy(value size) /* ML */
+{
+ mlsize_t wosize = Int_val(size);
+ value result;
+ mlsize_t i;
+
+ if (wosize == 0) return Atom(0);
+ result = alloc(wosize, 0);
+ for (i = 0; i < wosize; i++) Field(result, i) = Val_int(0);
+ return result;
+}
+
+value update_dummy(value dummy, value newval) /* ML */
+{
+ mlsize_t size, i;
+ size = Wosize_val(newval);
+ Assert (size == Wosize_val(dummy));
+ Tag_val(dummy) = Tag_val(newval);
+ for (i = 0; i < size; i++)
+ modify(&Field(dummy, i), Field(newval, i));
+ return Val_unit;
+}