summaryrefslogtreecommitdiffstats
path: root/otherlibs/bigarray/bigarray_stubs.c
diff options
context:
space:
mode:
Diffstat (limited to 'otherlibs/bigarray/bigarray_stubs.c')
-rw-r--r--otherlibs/bigarray/bigarray_stubs.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/otherlibs/bigarray/bigarray_stubs.c b/otherlibs/bigarray/bigarray_stubs.c
index f30fa4cc9..b8c768afa 100644
--- a/otherlibs/bigarray/bigarray_stubs.c
+++ b/otherlibs/bigarray/bigarray_stubs.c
@@ -50,7 +50,8 @@ int caml_ba_element_size[] =
2 /*SINT16*/, 2 /*UINT16*/,
4 /*INT32*/, 8 /*INT64*/,
sizeof(value) /*CAML_INT*/, sizeof(value) /*NATIVE_INT*/,
- 8 /*COMPLEX32*/, 16 /*COMPLEX64*/
+ 8 /*COMPLEX32*/, 16 /*COMPLEX64*/,
+ 1 /*CHAR*/
};
/* Compute the number of bytes for the elements of a big array */
@@ -141,7 +142,7 @@ caml_ba_alloc(int flags, int num_dims, void * data, intnat * dim)
intnat dimcopy[CAML_BA_MAX_NUM_DIMS];
Assert(num_dims >= 1 && num_dims <= CAML_BA_MAX_NUM_DIMS);
- Assert((flags & CAML_BA_KIND_MASK) <= CAML_BA_COMPLEX64);
+ Assert((flags & CAML_BA_KIND_MASK) <= CAML_BA_CHAR);
for (i = 0; i < num_dims; i++) dimcopy[i] = dim[i];
size = 0;
if (data == NULL) {
@@ -203,7 +204,7 @@ CAMLprim value caml_ba_create(value vkind, value vlayout, value vdim)
if (dim[i] < 0)
caml_invalid_argument("Bigarray.create: negative dimension");
}
- flags = Int_val(vkind) | Int_val(vlayout);
+ flags = Caml_ba_kind_val(vkind) | Caml_ba_layout_val(vlayout);
return caml_ba_alloc(flags, num_dims, NULL, dim);
}
@@ -291,6 +292,8 @@ value caml_ba_get_N(value vb, value * vind, int nind)
case CAML_BA_COMPLEX64:
{ double * p = ((double *) b->data) + offset * 2;
return copy_two_doubles(p[0], p[1]); }
+ case CAML_BA_CHAR:
+ return Val_int(((char *) b->data)[offset]);
}
}
@@ -439,6 +442,7 @@ static value caml_ba_set_aux(value vb, value * vind, intnat nind, value newval)
((float *) b->data)[offset] = Double_val(newval); break;
case CAML_BA_FLOAT64:
((double *) b->data)[offset] = Double_val(newval); break;
+ case CAML_BA_CHAR:
case CAML_BA_SINT8:
case CAML_BA_UINT8:
((int8 *) b->data)[offset] = Int_val(newval); break;
@@ -649,14 +653,15 @@ CAMLprim value caml_ba_dim_3(value vb)
CAMLprim value caml_ba_kind(value vb)
{
- return Val_int(Caml_ba_array_val(vb)->flags & CAML_BA_KIND_MASK);
+ return Val_caml_ba_kind(Caml_ba_array_val(vb)->flags & CAML_BA_KIND_MASK);
}
/* Return the layout of a big array */
CAMLprim value caml_ba_layout(value vb)
{
- return Val_int(Caml_ba_array_val(vb)->flags & CAML_BA_LAYOUT_MASK);
+ int layout = Caml_ba_array_val(vb)->flags & CAML_BA_LAYOUT_MASK;
+ return Val_caml_ba_layout(layout);
}
/* Finalization of a big array */
@@ -749,6 +754,8 @@ static int caml_ba_compare(value v1, value v2)
num_elts *= 2; /*fallthrough*/
case CAML_BA_FLOAT64:
DO_FLOAT_COMPARISON(double);
+ case CAML_BA_CHAR:
+ DO_INTEGER_COMPARISON(char);
case CAML_BA_SINT8:
DO_INTEGER_COMPARISON(int8);
case CAML_BA_UINT8:
@@ -799,6 +806,7 @@ static intnat caml_ba_hash(value v)
h = 0;
switch (b->flags & CAML_BA_KIND_MASK) {
+ case CAML_BA_CHAR:
case CAML_BA_SINT8:
case CAML_BA_UINT8: {
uint8 * p = b->data;
@@ -917,6 +925,7 @@ static void caml_ba_serialize(value v,
for (i = 0; i < b->num_dims; i++) num_elts = num_elts * b->dim[i];
/* Serialize elements */
switch (b->flags & CAML_BA_KIND_MASK) {
+ case CAML_BA_CHAR:
case CAML_BA_SINT8:
case CAML_BA_UINT8:
caml_serialize_block_1(b->data, num_elts); break;
@@ -980,7 +989,7 @@ uintnat caml_ba_deserialize(void * dst)
/* Compute total number of elements */
num_elts = caml_ba_num_elts(b);
/* Determine element size in bytes */
- if ((b->flags & CAML_BA_KIND_MASK) > CAML_BA_COMPLEX64)
+ if ((b->flags & CAML_BA_KIND_MASK) > CAML_BA_CHAR)
caml_deserialize_error("input_value: bad bigarray kind");
elt_size = caml_ba_element_size[b->flags & CAML_BA_KIND_MASK];
/* Allocate room for data */
@@ -989,6 +998,7 @@ uintnat caml_ba_deserialize(void * dst)
caml_deserialize_error("input_value: out of memory for bigarray");
/* Read data */
switch (b->flags & CAML_BA_KIND_MASK) {
+ case CAML_BA_CHAR:
case CAML_BA_SINT8:
case CAML_BA_UINT8:
caml_deserialize_block_1(b->data, num_elts); break;
@@ -1173,6 +1183,7 @@ CAMLprim value caml_ba_fill(value vb, value vinit)
for (p = b->data; num_elts > 0; p++, num_elts--) *p = init;
break;
}
+ case CAML_BA_CHAR:
case CAML_BA_SINT8:
case CAML_BA_UINT8: {
int init = Int_val(vinit);