Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions runtime/array.c
Original file line number Diff line number Diff line change
Expand Up @@ -315,13 +315,26 @@ 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)
{
if (!Bool_val(far)) {
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);

Expand Down
17 changes: 17 additions & 0 deletions testsuite/tests/lib-array/far_float_array.ml
Original file line number Diff line number Diff line change
@@ -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
Loading