diff options
author | Damien Doligez <damien.doligez-inria.fr> | 2014-03-31 17:58:53 +0000 |
---|---|---|
committer | Damien Doligez <damien.doligez-inria.fr> | 2014-03-31 17:58:53 +0000 |
commit | 8643356b8542e0dcab358716f1e04d47b08b1a6d (patch) | |
tree | e10cc5a03f7ead69a2d4ed563cbd021df5770ef2 /byterun/array.c | |
parent | cd1bf4b9fc898cee2f4886ed18ddf6271ec522e8 (diff) | |
parent | 989ac0b2635443b9c0f183ee6343b663c854f4ea (diff) | |
download | ocaml-ephemeron.tar.gz |
merge with trunk at rev 14512ephemeron
git-svn-id: http://caml.inria.fr/svn/ocaml/branches/ephemeron@14514 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'byterun/array.c')
-rw-r--r-- | byterun/array.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/byterun/array.c b/byterun/array.c index a8830d58ed..327f2b5647 100644 --- a/byterun/array.c +++ b/byterun/array.c @@ -137,12 +137,23 @@ CAMLprim value caml_array_unsafe_set(value array, value index, value newval) CAMLprim value caml_make_float_vect(value len) { - mlsize_t wsize = Long_val(len) * Double_wosize; - if (wsize == 0) + mlsize_t wosize = Long_val(len) * Double_wosize; + value result; + if (wosize == 0) return Atom(0); - if (wsize > Max_wosize) - caml_invalid_argument("Array.make"); - return caml_alloc(wsize, Double_array_tag); + else if (wosize <= Max_young_wosize){ +#define Setup_for_gc +#define Restore_after_gc + Alloc_small (result, wosize, Double_array_tag); +#undef Setup_for_gc +#undef Restore_after_gc + }else if (wosize > Max_wosize) + caml_invalid_argument("Array.make_float"); + else { + result = caml_alloc_shr (wosize, Double_array_tag); + result = caml_check_urgent_gc (result); + } + return result; } CAMLprim value caml_make_vect(value len, value init) |