diff options
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 0a1c5499a..cc19698a8 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; } |