annotate libffi/src/java_raw_api.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* -----------------------------------------------------------------------
kono
parents:
diff changeset
2 java_raw_api.c - Copyright (c) 1999, 2007, 2008 Red Hat, Inc.
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 Cloned from raw_api.c
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 Raw_api.c author: Kresten Krab Thorup <krab@gnu.org>
kono
parents:
diff changeset
7 Java_raw_api.c author: Hans-J. Boehm <hboehm@hpl.hp.com>
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 $Id $
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 Permission is hereby granted, free of charge, to any person obtaining
kono
parents:
diff changeset
12 a copy of this software and associated documentation files (the
kono
parents:
diff changeset
13 ``Software''), to deal in the Software without restriction, including
kono
parents:
diff changeset
14 without limitation the rights to use, copy, modify, merge, publish,
kono
parents:
diff changeset
15 distribute, sublicense, and/or sell copies of the Software, and to
kono
parents:
diff changeset
16 permit persons to whom the Software is furnished to do so, subject to
kono
parents:
diff changeset
17 the following conditions:
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 The above copyright notice and this permission notice shall be included
kono
parents:
diff changeset
20 in all copies or substantial portions of the Software.
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
kono
parents:
diff changeset
23 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
kono
parents:
diff changeset
24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
kono
parents:
diff changeset
25 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
kono
parents:
diff changeset
26 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
kono
parents:
diff changeset
27 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kono
parents:
diff changeset
28 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
kono
parents:
diff changeset
29 DEALINGS IN THE SOFTWARE.
kono
parents:
diff changeset
30 ----------------------------------------------------------------------- */
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 /* This defines a Java- and 64-bit specific variant of the raw API. */
kono
parents:
diff changeset
33 /* It assumes that "raw" argument blocks look like Java stacks on a */
kono
parents:
diff changeset
34 /* 64-bit machine. Arguments that can be stored in a single stack */
kono
parents:
diff changeset
35 /* stack slots (longs, doubles) occupy 128 bits, but only the first */
kono
parents:
diff changeset
36 /* 64 bits are actually used. */
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 #include <ffi.h>
kono
parents:
diff changeset
39 #include <ffi_common.h>
kono
parents:
diff changeset
40 #include <stdlib.h>
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 #if !defined(NO_JAVA_RAW_API)
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 size_t
kono
parents:
diff changeset
45 ffi_java_raw_size (ffi_cif *cif)
kono
parents:
diff changeset
46 {
kono
parents:
diff changeset
47 size_t result = 0;
kono
parents:
diff changeset
48 int i;
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 ffi_type **at = cif->arg_types;
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 for (i = cif->nargs-1; i >= 0; i--, at++)
kono
parents:
diff changeset
53 {
kono
parents:
diff changeset
54 switch((*at) -> type) {
kono
parents:
diff changeset
55 case FFI_TYPE_UINT64:
kono
parents:
diff changeset
56 case FFI_TYPE_SINT64:
kono
parents:
diff changeset
57 case FFI_TYPE_DOUBLE:
kono
parents:
diff changeset
58 result += 2 * FFI_SIZEOF_JAVA_RAW;
kono
parents:
diff changeset
59 break;
kono
parents:
diff changeset
60 case FFI_TYPE_STRUCT:
kono
parents:
diff changeset
61 /* No structure parameters in Java. */
kono
parents:
diff changeset
62 abort();
kono
parents:
diff changeset
63 case FFI_TYPE_COMPLEX:
kono
parents:
diff changeset
64 /* Not supported yet. */
kono
parents:
diff changeset
65 abort();
kono
parents:
diff changeset
66 default:
kono
parents:
diff changeset
67 result += FFI_SIZEOF_JAVA_RAW;
kono
parents:
diff changeset
68 }
kono
parents:
diff changeset
69 }
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 return result;
kono
parents:
diff changeset
72 }
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 void
kono
parents:
diff changeset
76 ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args)
kono
parents:
diff changeset
77 {
kono
parents:
diff changeset
78 unsigned i;
kono
parents:
diff changeset
79 ffi_type **tp = cif->arg_types;
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 #if WORDS_BIGENDIAN
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 for (i = 0; i < cif->nargs; i++, tp++, args++)
kono
parents:
diff changeset
84 {
kono
parents:
diff changeset
85 switch ((*tp)->type)
kono
parents:
diff changeset
86 {
kono
parents:
diff changeset
87 case FFI_TYPE_UINT8:
kono
parents:
diff changeset
88 case FFI_TYPE_SINT8:
kono
parents:
diff changeset
89 *args = (void*) ((char*)(raw++) + 3);
kono
parents:
diff changeset
90 break;
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 case FFI_TYPE_UINT16:
kono
parents:
diff changeset
93 case FFI_TYPE_SINT16:
kono
parents:
diff changeset
94 *args = (void*) ((char*)(raw++) + 2);
kono
parents:
diff changeset
95 break;
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 #if FFI_SIZEOF_JAVA_RAW == 8
kono
parents:
diff changeset
98 case FFI_TYPE_UINT64:
kono
parents:
diff changeset
99 case FFI_TYPE_SINT64:
kono
parents:
diff changeset
100 case FFI_TYPE_DOUBLE:
kono
parents:
diff changeset
101 *args = (void *)raw;
kono
parents:
diff changeset
102 raw += 2;
kono
parents:
diff changeset
103 break;
kono
parents:
diff changeset
104 #endif
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 case FFI_TYPE_POINTER:
kono
parents:
diff changeset
107 *args = (void*) &(raw++)->ptr;
kono
parents:
diff changeset
108 break;
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 case FFI_TYPE_COMPLEX:
kono
parents:
diff changeset
111 /* Not supported yet. */
kono
parents:
diff changeset
112 abort();
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 default:
kono
parents:
diff changeset
115 *args = raw;
kono
parents:
diff changeset
116 raw +=
kono
parents:
diff changeset
117 ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw);
kono
parents:
diff changeset
118 }
kono
parents:
diff changeset
119 }
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 #else /* WORDS_BIGENDIAN */
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 #if !PDP
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 /* then assume little endian */
kono
parents:
diff changeset
126 for (i = 0; i < cif->nargs; i++, tp++, args++)
kono
parents:
diff changeset
127 {
kono
parents:
diff changeset
128 #if FFI_SIZEOF_JAVA_RAW == 8
kono
parents:
diff changeset
129 switch((*tp)->type) {
kono
parents:
diff changeset
130 case FFI_TYPE_UINT64:
kono
parents:
diff changeset
131 case FFI_TYPE_SINT64:
kono
parents:
diff changeset
132 case FFI_TYPE_DOUBLE:
kono
parents:
diff changeset
133 *args = (void*) raw;
kono
parents:
diff changeset
134 raw += 2;
kono
parents:
diff changeset
135 break;
kono
parents:
diff changeset
136 case FFI_TYPE_COMPLEX:
kono
parents:
diff changeset
137 /* Not supported yet. */
kono
parents:
diff changeset
138 abort();
kono
parents:
diff changeset
139 default:
kono
parents:
diff changeset
140 *args = (void*) raw++;
kono
parents:
diff changeset
141 }
kono
parents:
diff changeset
142 #else /* FFI_SIZEOF_JAVA_RAW != 8 */
kono
parents:
diff changeset
143 *args = (void*) raw;
kono
parents:
diff changeset
144 raw +=
kono
parents:
diff changeset
145 ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw);
kono
parents:
diff changeset
146 #endif /* FFI_SIZEOF_JAVA_RAW == 8 */
kono
parents:
diff changeset
147 }
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 #else
kono
parents:
diff changeset
150 #error "pdp endian not supported"
kono
parents:
diff changeset
151 #endif /* ! PDP */
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 #endif /* WORDS_BIGENDIAN */
kono
parents:
diff changeset
154 }
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 void
kono
parents:
diff changeset
157 ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw)
kono
parents:
diff changeset
158 {
kono
parents:
diff changeset
159 unsigned i;
kono
parents:
diff changeset
160 ffi_type **tp = cif->arg_types;
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 for (i = 0; i < cif->nargs; i++, tp++, args++)
kono
parents:
diff changeset
163 {
kono
parents:
diff changeset
164 switch ((*tp)->type)
kono
parents:
diff changeset
165 {
kono
parents:
diff changeset
166 case FFI_TYPE_UINT8:
kono
parents:
diff changeset
167 #if WORDS_BIGENDIAN
kono
parents:
diff changeset
168 *(UINT32*)(raw++) = *(UINT8*) (*args);
kono
parents:
diff changeset
169 #else
kono
parents:
diff changeset
170 (raw++)->uint = *(UINT8*) (*args);
kono
parents:
diff changeset
171 #endif
kono
parents:
diff changeset
172 break;
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 case FFI_TYPE_SINT8:
kono
parents:
diff changeset
175 #if WORDS_BIGENDIAN
kono
parents:
diff changeset
176 *(SINT32*)(raw++) = *(SINT8*) (*args);
kono
parents:
diff changeset
177 #else
kono
parents:
diff changeset
178 (raw++)->sint = *(SINT8*) (*args);
kono
parents:
diff changeset
179 #endif
kono
parents:
diff changeset
180 break;
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 case FFI_TYPE_UINT16:
kono
parents:
diff changeset
183 #if WORDS_BIGENDIAN
kono
parents:
diff changeset
184 *(UINT32*)(raw++) = *(UINT16*) (*args);
kono
parents:
diff changeset
185 #else
kono
parents:
diff changeset
186 (raw++)->uint = *(UINT16*) (*args);
kono
parents:
diff changeset
187 #endif
kono
parents:
diff changeset
188 break;
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 case FFI_TYPE_SINT16:
kono
parents:
diff changeset
191 #if WORDS_BIGENDIAN
kono
parents:
diff changeset
192 *(SINT32*)(raw++) = *(SINT16*) (*args);
kono
parents:
diff changeset
193 #else
kono
parents:
diff changeset
194 (raw++)->sint = *(SINT16*) (*args);
kono
parents:
diff changeset
195 #endif
kono
parents:
diff changeset
196 break;
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 case FFI_TYPE_UINT32:
kono
parents:
diff changeset
199 #if WORDS_BIGENDIAN
kono
parents:
diff changeset
200 *(UINT32*)(raw++) = *(UINT32*) (*args);
kono
parents:
diff changeset
201 #else
kono
parents:
diff changeset
202 (raw++)->uint = *(UINT32*) (*args);
kono
parents:
diff changeset
203 #endif
kono
parents:
diff changeset
204 break;
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 case FFI_TYPE_SINT32:
kono
parents:
diff changeset
207 #if WORDS_BIGENDIAN
kono
parents:
diff changeset
208 *(SINT32*)(raw++) = *(SINT32*) (*args);
kono
parents:
diff changeset
209 #else
kono
parents:
diff changeset
210 (raw++)->sint = *(SINT32*) (*args);
kono
parents:
diff changeset
211 #endif
kono
parents:
diff changeset
212 break;
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 case FFI_TYPE_FLOAT:
kono
parents:
diff changeset
215 (raw++)->flt = *(FLOAT32*) (*args);
kono
parents:
diff changeset
216 break;
kono
parents:
diff changeset
217
kono
parents:
diff changeset
218 #if FFI_SIZEOF_JAVA_RAW == 8
kono
parents:
diff changeset
219 case FFI_TYPE_UINT64:
kono
parents:
diff changeset
220 case FFI_TYPE_SINT64:
kono
parents:
diff changeset
221 case FFI_TYPE_DOUBLE:
kono
parents:
diff changeset
222 raw->uint = *(UINT64*) (*args);
kono
parents:
diff changeset
223 raw += 2;
kono
parents:
diff changeset
224 break;
kono
parents:
diff changeset
225 #endif
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 case FFI_TYPE_POINTER:
kono
parents:
diff changeset
228 (raw++)->ptr = **(void***) args;
kono
parents:
diff changeset
229 break;
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231 default:
kono
parents:
diff changeset
232 #if FFI_SIZEOF_JAVA_RAW == 8
kono
parents:
diff changeset
233 FFI_ASSERT(0); /* Should have covered all cases */
kono
parents:
diff changeset
234 #else
kono
parents:
diff changeset
235 memcpy ((void*) raw->data, (void*)*args, (*tp)->size);
kono
parents:
diff changeset
236 raw +=
kono
parents:
diff changeset
237 ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw);
kono
parents:
diff changeset
238 #endif
kono
parents:
diff changeset
239 }
kono
parents:
diff changeset
240 }
kono
parents:
diff changeset
241 }
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 #if !FFI_NATIVE_RAW_API
kono
parents:
diff changeset
244
kono
parents:
diff changeset
245 static void
kono
parents:
diff changeset
246 ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue)
kono
parents:
diff changeset
247 {
kono
parents:
diff changeset
248 #if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8
kono
parents:
diff changeset
249 switch (cif->rtype->type)
kono
parents:
diff changeset
250 {
kono
parents:
diff changeset
251 case FFI_TYPE_UINT8:
kono
parents:
diff changeset
252 case FFI_TYPE_UINT16:
kono
parents:
diff changeset
253 case FFI_TYPE_UINT32:
kono
parents:
diff changeset
254 *(UINT64 *)rvalue <<= 32;
kono
parents:
diff changeset
255 break;
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 case FFI_TYPE_SINT8:
kono
parents:
diff changeset
258 case FFI_TYPE_SINT16:
kono
parents:
diff changeset
259 case FFI_TYPE_SINT32:
kono
parents:
diff changeset
260 case FFI_TYPE_INT:
kono
parents:
diff changeset
261 #if FFI_SIZEOF_JAVA_RAW == 4
kono
parents:
diff changeset
262 case FFI_TYPE_POINTER:
kono
parents:
diff changeset
263 #endif
kono
parents:
diff changeset
264 *(SINT64 *)rvalue <<= 32;
kono
parents:
diff changeset
265 break;
kono
parents:
diff changeset
266
kono
parents:
diff changeset
267 case FFI_TYPE_COMPLEX:
kono
parents:
diff changeset
268 /* Not supported yet. */
kono
parents:
diff changeset
269 abort();
kono
parents:
diff changeset
270
kono
parents:
diff changeset
271 default:
kono
parents:
diff changeset
272 break;
kono
parents:
diff changeset
273 }
kono
parents:
diff changeset
274 #endif
kono
parents:
diff changeset
275 }
kono
parents:
diff changeset
276
kono
parents:
diff changeset
277 static void
kono
parents:
diff changeset
278 ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue)
kono
parents:
diff changeset
279 {
kono
parents:
diff changeset
280 #if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8
kono
parents:
diff changeset
281 switch (cif->rtype->type)
kono
parents:
diff changeset
282 {
kono
parents:
diff changeset
283 case FFI_TYPE_UINT8:
kono
parents:
diff changeset
284 case FFI_TYPE_UINT16:
kono
parents:
diff changeset
285 case FFI_TYPE_UINT32:
kono
parents:
diff changeset
286 *(UINT64 *)rvalue >>= 32;
kono
parents:
diff changeset
287 break;
kono
parents:
diff changeset
288
kono
parents:
diff changeset
289 case FFI_TYPE_SINT8:
kono
parents:
diff changeset
290 case FFI_TYPE_SINT16:
kono
parents:
diff changeset
291 case FFI_TYPE_SINT32:
kono
parents:
diff changeset
292 case FFI_TYPE_INT:
kono
parents:
diff changeset
293 *(SINT64 *)rvalue >>= 32;
kono
parents:
diff changeset
294 break;
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 case FFI_TYPE_COMPLEX:
kono
parents:
diff changeset
297 /* Not supported yet. */
kono
parents:
diff changeset
298 abort();
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 default:
kono
parents:
diff changeset
301 break;
kono
parents:
diff changeset
302 }
kono
parents:
diff changeset
303 #endif
kono
parents:
diff changeset
304 }
kono
parents:
diff changeset
305
kono
parents:
diff changeset
306 /* This is a generic definition of ffi_raw_call, to be used if the
kono
parents:
diff changeset
307 * native system does not provide a machine-specific implementation.
kono
parents:
diff changeset
308 * Having this, allows code to be written for the raw API, without
kono
parents:
diff changeset
309 * the need for system-specific code to handle input in that format;
kono
parents:
diff changeset
310 * these following couple of functions will handle the translation forth
kono
parents:
diff changeset
311 * and back automatically. */
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 void ffi_java_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue,
kono
parents:
diff changeset
314 ffi_java_raw *raw)
kono
parents:
diff changeset
315 {
kono
parents:
diff changeset
316 void **avalue = (void**) alloca (cif->nargs * sizeof (void*));
kono
parents:
diff changeset
317 ffi_java_raw_to_ptrarray (cif, raw, avalue);
kono
parents:
diff changeset
318 ffi_call (cif, fn, rvalue, avalue);
kono
parents:
diff changeset
319 ffi_java_rvalue_to_raw (cif, rvalue);
kono
parents:
diff changeset
320 }
kono
parents:
diff changeset
321
kono
parents:
diff changeset
322 #if FFI_CLOSURES /* base system provides closures */
kono
parents:
diff changeset
323
kono
parents:
diff changeset
324 static void
kono
parents:
diff changeset
325 ffi_java_translate_args (ffi_cif *cif, void *rvalue,
kono
parents:
diff changeset
326 void **avalue, void *user_data)
kono
parents:
diff changeset
327 {
kono
parents:
diff changeset
328 ffi_java_raw *raw = (ffi_java_raw*)alloca (ffi_java_raw_size (cif));
kono
parents:
diff changeset
329 ffi_raw_closure *cl = (ffi_raw_closure*)user_data;
kono
parents:
diff changeset
330
kono
parents:
diff changeset
331 ffi_java_ptrarray_to_raw (cif, avalue, raw);
kono
parents:
diff changeset
332 (*cl->fun) (cif, rvalue, (ffi_raw*)raw, cl->user_data);
kono
parents:
diff changeset
333 ffi_java_raw_to_rvalue (cif, rvalue);
kono
parents:
diff changeset
334 }
kono
parents:
diff changeset
335
kono
parents:
diff changeset
336 ffi_status
kono
parents:
diff changeset
337 ffi_prep_java_raw_closure_loc (ffi_java_raw_closure* cl,
kono
parents:
diff changeset
338 ffi_cif *cif,
kono
parents:
diff changeset
339 void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
kono
parents:
diff changeset
340 void *user_data,
kono
parents:
diff changeset
341 void *codeloc)
kono
parents:
diff changeset
342 {
kono
parents:
diff changeset
343 ffi_status status;
kono
parents:
diff changeset
344
kono
parents:
diff changeset
345 status = ffi_prep_closure_loc ((ffi_closure*) cl,
kono
parents:
diff changeset
346 cif,
kono
parents:
diff changeset
347 &ffi_java_translate_args,
kono
parents:
diff changeset
348 codeloc,
kono
parents:
diff changeset
349 codeloc);
kono
parents:
diff changeset
350 if (status == FFI_OK)
kono
parents:
diff changeset
351 {
kono
parents:
diff changeset
352 cl->fun = fun;
kono
parents:
diff changeset
353 cl->user_data = user_data;
kono
parents:
diff changeset
354 }
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 return status;
kono
parents:
diff changeset
357 }
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 /* Again, here is the generic version of ffi_prep_raw_closure, which
kono
parents:
diff changeset
360 * will install an intermediate "hub" for translation of arguments from
kono
parents:
diff changeset
361 * the pointer-array format, to the raw format */
kono
parents:
diff changeset
362
kono
parents:
diff changeset
363 ffi_status
kono
parents:
diff changeset
364 ffi_prep_java_raw_closure (ffi_java_raw_closure* cl,
kono
parents:
diff changeset
365 ffi_cif *cif,
kono
parents:
diff changeset
366 void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
kono
parents:
diff changeset
367 void *user_data)
kono
parents:
diff changeset
368 {
kono
parents:
diff changeset
369 return ffi_prep_java_raw_closure_loc (cl, cif, fun, user_data, cl);
kono
parents:
diff changeset
370 }
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 #endif /* FFI_CLOSURES */
kono
parents:
diff changeset
373 #endif /* !FFI_NATIVE_RAW_API */
kono
parents:
diff changeset
374 #endif /* !NO_JAVA_RAW_API */