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
246 ffi_java_rvalue_to_raw (ffi_cif *cif,
void *rvalue)
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:
278 ffi_java_raw_to_rvalue (ffi_cif *cif,
void *rvalue)
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*));
319 ffi_java_rvalue_to_raw (cif, rvalue);
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);
333 ffi_java_raw_to_rvalue (cif, rvalue);
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);