2 * Copyright (C) 2003, 2004, 2005, 2006, 2007
3 * Robert Lougher <rob@lougher.org.uk>.
5 * This file is part of JamVM.
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2,
10 * or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 /* Must be included first to get configure options */
30 ffi_type
*sig2ffi(char sig
) {
35 type
= &ffi_type_void
;
38 type
= &ffi_type_double
;
41 type
= &ffi_type_sint64
;
44 type
= &ffi_type_float
;
47 type
= &ffi_type_pointer
;
54 int nativeExtraArg(MethodBlock
*mb
) {
58 SCAN_SIG(sig
, count
++, count
++);
64 *types_pntr++ = sig2ffi(*sig);\
65 *values_pntr++ = opntr; \
69 *types_pntr++ = sig2ffi(*sig);\
70 *values_pntr++ = opntr++
72 uintptr_t *callJNIMethod(void *env
, Class
*class, char *sig
, int num_args
, uintptr_t *ostack
,
73 unsigned char *func
) {
75 void *values
[num_args
];
76 ffi_type
*types
[num_args
];
77 uintptr_t *opntr
= ostack
;
78 void **values_pntr
= &values
[2];
79 ffi_type
**types_pntr
= &types
[2];
81 types
[0] = &ffi_type_pointer
;
84 types
[1] = &ffi_type_pointer
;
85 values
[1] = class ? &class : (void*)opntr
++;
87 SCAN_SIG(sig
, DOUBLE
, SINGLE
);
89 if(ffi_prep_cif(&cif
, FFI_DEFAULT_ABI
, num_args
, sig2ffi(*sig
), types
) == FFI_OK
) {
90 ffi_call(&cif
, FFI_FN(func
), ostack
, values
);
92 if(*sig
== 'J' || *sig
== 'D')