diff options
author | Damien Doligez <damien.doligez-inria.fr> | 2007-02-09 13:31:15 +0000 |
---|---|---|
committer | Damien Doligez <damien.doligez-inria.fr> | 2007-02-09 13:31:15 +0000 |
commit | f700284aac3f9bcafa29b40e4cedeadd6703d782 (patch) | |
tree | 463f0f8e3165cc294c17cb1677870947741a2ce6 /byterun/alloc.c | |
parent | e1757faddcd080cc6a1d71a2aebd999399c5ab17 (diff) | |
download | ocaml-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.c | 27 |
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; } |