Added more cases to the FFI to handle UINT8/INT8

This commit is contained in:
Juan Jose Garcia Ripoll 2010-02-16 10:41:05 +01:00
parent 2b1dd56dfe
commit c1bc9cd655
4 changed files with 48 additions and 2 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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);

View file

@ -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;