47 if (ecif->
cif->rtype->type == FFI_TYPE_STRUCT && ecif->
cif->rtype->size > 8)
49 *(
void **) argp = ecif->
rvalue;
53 avn = ecif->
cif->nargs;
56 for (
i = ecif->
cif->nargs, p_arg = ecif->
cif->arg_types;
57 (
i != 0) && (avn != 0);
63 if (((*p_arg)->alignment - 1) & (
unsigned) argp)
64 argp = (
char *)
ALIGN (argp, (*p_arg)->alignment);
74 switch ((*p_arg)->type)
77 *(
signed int *) argp = (
signed int)*(SINT8 *)(* p_argv);
81 *(
unsigned int *) argp = (
unsigned int)*(UINT8 *)(* p_argv);
85 *(
signed int *) argp = (
signed int)*(SINT16 *)(* p_argv);
89 *(
unsigned int *) argp = (
unsigned int)*(UINT16 *)(* p_argv);
94 if ((*p_arg)->alignment != 1)
97 memcpy (argp + 4 - z, *p_argv, z);
105 else if (z ==
sizeof (
int))
107 *(
unsigned int *) argp = (
unsigned int)*(UINT32 *)(* p_argv);
111 if ((*p_arg)->type == FFI_TYPE_STRUCT)
115 *(
unsigned int *) argp = (
unsigned int)(
void *)(* p_argv);
127 memcpy (argp, *p_argv, z);
143 switch (cif->rtype->type)
146 cif->flags = (
unsigned) cif->rtype->type;
149 case FFI_TYPE_STRUCT:
150 if (cif->rtype->size <= 4)
151 cif->flags = FFI_TYPE_INT;
153 else if (cif->rtype->size <= 8)
154 cif->flags = FFI_TYPE_DOUBLE;
157 cif->flags = (
unsigned) cif->rtype->type;
160 case FFI_TYPE_SINT64:
161 case FFI_TYPE_UINT64:
162 case FFI_TYPE_DOUBLE:
163 cif->flags = FFI_TYPE_DOUBLE;
168 cif->flags = FFI_TYPE_INT;
176 unsigned,
unsigned,
unsigned *,
void (*fn)(
void));
178 void ffi_call(ffi_cif *cif,
void (*fn)(
void),
void *rvalue,
void **avalue)
187 if ((rvalue ==
NULL) &&
188 (cif->rtype->type == FFI_TYPE_STRUCT))
199 cif->flags, ecif.
rvalue, fn);
200 if (cif->rtype->type == FFI_TYPE_STRUCT)
202 int size = cif->rtype->size;
203 int align = cif->rtype->alignment;
208 *(
unsigned long *)(ecif.
rvalue) <<= (4 -
size) * 8;