mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2026-01-13 21:02:47 -08:00
Added more cases to the FFI to handle UINT8/INT8
This commit is contained in:
parent
2b1dd56dfe
commit
c1bc9cd655
4 changed files with 48 additions and 2 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
12
src/c/ffi.d
12
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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue