diff --git a/src/c/arch/ffi_x86.d b/src/c/arch/ffi_x86.d index db8b756aa..3ec2c1534 100644 --- a/src/c/arch/ffi_x86.d +++ b/src/c/arch/ffi_x86.d @@ -37,6 +37,10 @@ ecl_fficall_push_arg(union ecl_ffi_values *data, enum ecl_ffi_tag type) case ECL_FFI_UNSIGNED_BYTE: i = data->ub; goto INT; case ECL_FFI_SHORT: i = data->s; goto INT; case ECL_FFI_UNSIGNED_SHORT: i = data->us; goto INT; +#ifdef ecl_uint8_t + case ECL_FFI_INT8_T: i = data->i8; goto INT; + case ECL_FFI_UINT8_T: i = data->u8; goto INT; +#endif #ifdef ecl_uint16_t case ECL_FFI_INT16_T: i = data->i16; goto INT; case ECL_FFI_UINT16_T: i = data->u16; goto INT; @@ -123,6 +127,13 @@ ecl_fficall_execute(void *f_ptr, struct ecl_fficall *fficall, enum ecl_ffi_tag r } else if (return_type == ECL_FFI_DOUBLE) { fficall->output.d = ((double (*)())f_ptr)(); } +#ifdef ecl_uint8_t + else if (return_type == ECL_FFI_INT8_T) { + fficall->output.i8 = ((ecl_int8_t (*)())f_ptr)(); + } else if (return_type == ECL_FFI_UINT16_T) { + fficall->output.u8 = ((ecl_uint8_t (*)())f_ptr)(); + } +#endif #ifdef ecl_uint16_t else if (return_type == ECL_FFI_INT16_T) { fficall->output.i16 = ((ecl_int16_t (*)())f_ptr)(); @@ -202,11 +213,15 @@ ecl_dynamic_callback_execute(cl_object cbk_info, char *arg_buffer) case ECL_FFI_UNSIGNED_CHAR: i = output.uc; goto INT; case ECL_FFI_BYTE: i = output.b; goto INT; case ECL_FFI_UNSIGNED_BYTE: i = output.ub; goto INT; -#ifdef ecl_uint32_t +#ifdef ecl_uint8_t + case ECL_FFI_INT8_T: i = output.i8; goto INT; + case ECL_FFI_UINT8_T: i = output.u8; goto INT; +#endif +#ifdef ecl_uint16_t case ECL_FFI_INT16_T: #endif case ECL_FFI_SHORT: i = output.s; goto INT; -#ifdef ecl_uint32_t +#ifdef ecl_uint16_t case ECL_FFI_UINT16_T: #endif case ECL_FFI_UNSIGNED_SHORT: i = output.us; goto INT; diff --git a/src/c/arch/ffi_x86_64.d b/src/c/arch/ffi_x86_64.d index 7e40bb1f3..8aeabd9cb 100644 --- a/src/c/arch/ffi_x86_64.d +++ b/src/c/arch/ffi_x86_64.d @@ -49,6 +49,10 @@ ecl_fficall_push_arg(union ecl_ffi_values *data, enum ecl_ffi_tag type) switch (type) { case ECL_FFI_CHAR: i = data->c; goto INT; case ECL_FFI_UNSIGNED_CHAR: i = data->uc; goto INT; +#ifdef ecl_uint8_t + case ECL_FFI_INT8_T: i = data->i8; goto INT; + case ECL_FFI_UINT8_T: i = data->u8; goto INT; +#endif case ECL_FFI_BYTE: i = data->b; goto INT; case ECL_FFI_UNSIGNED_BYTE: i = data->ub; goto INT; #ifdef ecl_uint16_t @@ -160,6 +164,13 @@ ecl_fficall_execute(void *_f_ptr, struct ecl_fficall *fficall, enum ecl_ffi_tag } else if (return_type == ECL_FFI_DOUBLE) { fficall->output.d = ((double (*)())f_ptr)(); } +#ifdef ecl_uint8_t + else if (return_type == ECL_FFI_INT8_T) { + fficall->output.i8 = ((ecl_int8_t (*)())f_ptr)(); + } else if (return_type == ECL_FFI_UINT16_T) { + fficall->output.u8 = ((ecl_uint8_t (*)())f_ptr)(); + } +#endif #ifdef ecl_uint16_t else if (return_type == ECL_FFI_INT16_T) { fficall->output.i16 = ((ecl_int16_t (*)())f_ptr)(); @@ -270,6 +281,10 @@ ARG_FROM_STACK: case ECL_FFI_UNSIGNED_CHAR: i = output.uc; goto INT; case ECL_FFI_BYTE: i = output.b; goto INT; case ECL_FFI_UNSIGNED_BYTE: i = output.ub; goto INT; +#ifdef ecl_uint8_t + case ECL_FFI_INT8_T: i = output.i8; goto INT; + case ECL_FFI_UINT8_T: i = output.u8; goto INT; +#endif #ifdef ecl_uint16_t case ECL_FFI_INT16_T: i = output.i16; goto INT; case ECL_FFI_UINT16_T: i = output.u16; goto INT; diff --git a/src/c/ffi.d b/src/c/ffi.d index 0e47fdc84..014b2ecde 100644 --- a/src/c/ffi.d +++ b/src/c/ffi.d @@ -404,6 +404,12 @@ ecl_foreign_data_ref_elt(void *p, enum ecl_ffi_tag tag) return ecl_make_unsigned_integer(*(unsigned int *)p); case ECL_FFI_LONG: return ecl_make_integer(*(long *)p); +#ifdef ecl_uint8_t + case ECL_FFI_INT8_T: + return MAKE_FIXNUM(*(ecl_int8_t *)p); + case ECL_FFI_UINT8_T: + return MAKE_FIXNUM(*(ecl_uint8_t *)p); +#endif #ifdef ecl_uint16_t case ECL_FFI_INT16_T: return ecl_make_int16_t(*(ecl_int16_t *)p); @@ -479,6 +485,12 @@ ecl_foreign_data_set_elt(void *p, enum ecl_ffi_tag tag, cl_object value) case ECL_FFI_UNSIGNED_LONG: *(unsigned long *)p = fixnnint(value); break; +#ifdef ecl_uint8_t + case ECL_FFI_INT8_T: + *(ecl_int8_t *)p = fixint(value); + case ECL_FFI_UINT8_T: + *(ecl_uint8_t *)p = fixnnint(value); +#endif #ifdef ecl_uint16_t case ECL_FFI_INT16_T: *(ecl_int16_t *)p = ecl_to_int16_t(value); diff --git a/src/h/object.h b/src/h/object.h index 002184db4..07b1b148b 100644 --- a/src/h/object.h +++ b/src/h/object.h @@ -786,6 +786,10 @@ union ecl_ffi_values { unsigned short us; long l; unsigned long ul; +#ifdef ecl_uint8_t + ecl_int8_t i8; + ecl_uint8_t u8; +#endif #ifdef ecl_uint16_t ecl_int16_t i16; ecl_uint16_t u16;