summaryrefslogtreecommitdiff
path: root/byterun/alloc.c
diff options
context:
space:
mode:
authorDamien Doligez <damien.doligez-inria.fr>2007-02-09 13:31:15 +0000
committerDamien Doligez <damien.doligez-inria.fr>2007-02-09 13:31:15 +0000
commitf700284aac3f9bcafa29b40e4cedeadd6703d782 (patch)
tree463f0f8e3165cc294c17cb1677870947741a2ce6 /byterun/alloc.c
parente1757faddcd080cc6a1d71a2aebd999399c5ab17 (diff)
downloadocaml-f700284aac3f9bcafa29b40e4cedeadd6703d782.tar.gz
fusion des changements 3.09.3 -> release309_merge310
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@7849 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'byterun/alloc.c')
-rw-r--r--byterun/alloc.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/byterun/alloc.c b/byterun/alloc.c
index 0a1c5499aa..cc19698a8f 100644
--- a/byterun/alloc.c
+++ b/byterun/alloc.c
@@ -153,13 +153,34 @@ CAMLprim value caml_alloc_dummy(value size)
return caml_alloc (wosize, 0);
}
+CAMLprim value caml_alloc_dummy_float (value size)
+{
+ mlsize_t wosize = Int_val(size) * Double_wosize;
+
+ if (wosize == 0) return Atom(0);
+ return caml_alloc (wosize, 0);
+}
+
CAMLprim value caml_update_dummy(value dummy, value newval)
{
mlsize_t size, i;
+ tag_t tag;
+
size = Wosize_val(newval);
+ tag = Tag_val (newval);
Assert (size == Wosize_val(dummy));
- Tag_val(dummy) = Tag_val(newval);
- for (i = 0; i < size; i++)
- caml_modify(&Field(dummy, i), Field(newval, i));
+ Assert (tag < No_scan_tag || tag == Double_array_tag);
+
+ Tag_val(dummy) = tag;
+ if (tag == Double_array_tag){
+ size = Wosize_val (newval) / Double_wosize;
+ for (i = 0; i < size; i++){
+ Store_double_field (dummy, i, Double_field (newval, i));
+ }
+ }else{
+ for (i = 0; i < size; i++){
+ caml_modify (&Field(dummy, i), Field(newval, i));
+ }
+ }
return Val_unit;
}