42 #if !defined(NO_JAVA_RAW_API) 50 ffi_type **at = cif->arg_types;
52 for (i = cif->nargs-1; i >= 0; i--, at++)
54 switch((*at) -> type) {
63 case FFI_TYPE_COMPLEX:
79 ffi_type **tp = cif->arg_types;
83 for (i = 0; i < cif->nargs; i++, tp++, args++)
89 *args = (
void*) ((
char*)(raw++) + 3);
94 *args = (
void*) ((
char*)(raw++) + 2);
97 #if FFI_SIZEOF_JAVA_RAW == 8 100 case FFI_TYPE_DOUBLE:
106 case FFI_TYPE_POINTER:
107 *args = (
void*) &(raw++)->ptr;
110 case FFI_TYPE_COMPLEX:
117 ALIGN ((*tp)->size,
sizeof(ffi_java_raw)) /
sizeof(ffi_java_raw);
126 for (i = 0; i < cif->nargs; i++, tp++, args++)
128 #if FFI_SIZEOF_JAVA_RAW == 8 129 switch((*tp)->type) {
130 case FFI_TYPE_UINT64:
131 case FFI_TYPE_SINT64:
132 case FFI_TYPE_DOUBLE:
136 case FFI_TYPE_COMPLEX:
140 *args = (
void*) raw++;
145 ALIGN ((*tp)->size,
sizeof(ffi_java_raw)) /
sizeof(ffi_java_raw);
150 #error "pdp endian not supported" 160 ffi_type **tp = cif->arg_types;
162 for (i = 0; i < cif->nargs; i++, tp++, args++)
168 *(UINT32*)(raw++) = *(UINT8*) (*args);
170 (raw++)->uint = *(UINT8*) (*args);
176 *(SINT32*)(raw++) = *(SINT8*) (*args);
178 (raw++)->sint = *(SINT8*) (*args);
182 case FFI_TYPE_UINT16:
184 *(UINT32*)(raw++) = *(UINT16*) (*args);
186 (raw++)->uint = *(UINT16*) (*args);
190 case FFI_TYPE_SINT16:
192 *(SINT32*)(raw++) = *(SINT16*) (*args);
194 (raw++)->sint = *(SINT16*) (*args);
198 case FFI_TYPE_UINT32:
200 *(UINT32*)(raw++) = *(UINT32*) (*args);
202 (raw++)->uint = *(UINT32*) (*args);
206 case FFI_TYPE_SINT32:
208 *(SINT32*)(raw++) = *(SINT32*) (*args);
210 (raw++)->sint = *(SINT32*) (*args);
215 (raw++)->flt = *(
FLOAT32*) (*args);
218 #if FFI_SIZEOF_JAVA_RAW == 8 219 case FFI_TYPE_UINT64:
220 case FFI_TYPE_SINT64:
221 case FFI_TYPE_DOUBLE:
222 raw->uint = *(UINT64*) (*args);
227 case FFI_TYPE_POINTER:
228 (raw++)->ptr = **(
void***) args;
232 #if FFI_SIZEOF_JAVA_RAW == 8 235 memcpy ((
void*) raw->data, (
void*)*args, (*tp)->size);
237 ALIGN ((*tp)->size,
sizeof(ffi_java_raw)) /
sizeof(ffi_java_raw);
243 #if !FFI_NATIVE_RAW_API 248 #if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8 249 switch (cif->rtype->type)
252 case FFI_TYPE_UINT16:
253 case FFI_TYPE_UINT32:
254 *(UINT64 *)rvalue <<= 32;
258 case FFI_TYPE_SINT16:
259 case FFI_TYPE_SINT32:
261 #if FFI_SIZEOF_JAVA_RAW == 4 262 case FFI_TYPE_POINTER:
264 *(SINT64 *)rvalue <<= 32;
267 case FFI_TYPE_COMPLEX:
280 #if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8 281 switch (cif->rtype->type)
284 case FFI_TYPE_UINT16:
285 case FFI_TYPE_UINT32:
286 *(UINT64 *)rvalue >>= 32;
290 case FFI_TYPE_SINT16:
291 case FFI_TYPE_SINT32:
293 *(SINT64 *)rvalue >>= 32;
296 case FFI_TYPE_COMPLEX:
316 void **avalue = (
void**)
alloca (cif->nargs * sizeof (
void*));
325 ffi_java_translate_args (ffi_cif *cif,
void *rvalue,
326 void **avalue,
void *user_data)
329 ffi_raw_closure *cl = (ffi_raw_closure*)user_data;
332 (*cl->fun) (cif, rvalue, (ffi_raw*)raw, cl->user_data);
337 ffi_prep_java_raw_closure_loc (ffi_java_raw_closure* cl,
339 void (*fun)(ffi_cif*,
void*,ffi_java_raw*,
void*),
347 &ffi_java_translate_args,
350 if (status == FFI_OK)
353 cl->user_data = user_data;
364 ffi_prep_java_raw_closure (ffi_java_raw_closure* cl,
366 void (*fun)(ffi_cif*,
void*,ffi_java_raw*,
void*),
369 return ffi_prep_java_raw_closure_loc (cl, cif, fun, user_data, cl);
static void ffi_java_rvalue_to_raw(ffi_cif *cif, void *rvalue)
void ffi_java_raw_to_ptrarray(ffi_cif *cif, ffi_java_raw *raw, void **args)
size_t ffi_java_raw_size(ffi_cif *cif)
#define FFI_SIZEOF_JAVA_RAW
ffi_status ffi_prep_closure_loc(ffi_closure *closure, ffi_cif *cif, void(*fun)(ffi_cif *, void *, void **, void *), void *user_data, void *codeloc)
void ffi_java_raw_call(ffi_cif *cif, void(*fn)(void), void *rvalue, ffi_java_raw *raw)
void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue)
void ffi_java_ptrarray_to_raw(ffi_cif *cif, void **args, ffi_java_raw *raw)
static void ffi_java_raw_to_rvalue(ffi_cif *cif, void *rvalue)