diff --git a/runtime/array.c b/runtime/array.c index 9574cdfc1be3..d53928824068 100644 --- a/runtime/array.c +++ b/runtime/array.c @@ -315,6 +315,8 @@ CAMLprim value caml_array_make(value len, value init) return caml_uniform_array_make(len, init); } +CAMLprim value caml_array_create_float_far(value far, value len); + /* [len] is a [value] representing number of words or floats */ CAMLprim value caml_array_make_far(value far, value len, value init) { @@ -322,6 +324,17 @@ CAMLprim value caml_array_make_far(value far, value len, value init) return caml_array_make(len, init); } +#ifdef FLAT_FLOAT_ARRAY + if (Is_block(init) && Tag_val(init) == Double_tag) { + mlsize_t size = Long_val(len); + double d = Double_val(init); + value arr = caml_array_create_float_far(far, len); + for (mlsize_t i = 0; i < size; i++) + Store_double_flat_field(arr, i, d); + return arr; + } +#endif + mlsize_t wosize = Long_val(len); if (wosize == 0) return Atom(0); diff --git a/testsuite/tests/lib-array/far_float_array.ml b/testsuite/tests/lib-array/far_float_array.ml new file mode 100644 index 000000000000..ca8f19264e7c --- /dev/null +++ b/testsuite/tests/lib-array/far_float_array.ml @@ -0,0 +1,17 @@ +(* TEST *) + +let () = + let near = Array.make 16 2.0 in + let far = Array.make ~far:true 16 2.0 in + for i = 0 to 15 do + assert (far.(i) = 2.0) + done; + assert (Obj.tag (Obj.repr far) = Obj.tag (Obj.repr near)); + Array.fill far 0 16 3.0; + for i = 0 to 15 do + assert (far.(i) = 3.0) + done; + let ints = Array.make ~far:true 16 7 in + for i = 0 to 15 do + assert (ints.(i) = 7) + done