Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 367 lines (250 sloc) 8.835 kb
c64e58f pmc docs update 3
Michael Scott authored
1 /*
f1c9ca5 @petdance consting pointers and localizing temp vars
petdance authored
2 Copyright (C) 2001-2011, Parrot Foundation.
c64e58f pmc docs update 3
Michael Scott authored
3
4 =head1 NAME
5
f474cd7 @bschmalhofer [perl #38235] Rename (dyn)?classes to (dyn)?pmc
bschmalhofer authored
6 src/pmc/nci.pmc - Native Call Interface
c64e58f pmc docs update 3
Michael Scott authored
7
8 =head1 DESCRIPTION
9
10 The vtable functions for the native C call functions.
11
12 =head2 Methods
13
14 =over 4
15
16 =cut
17
18 */
2a2c19b Added in code to properly do native calls to library routines loaded via
Dan Sugalski authored
19
6bdd5f9 @petdance headerizer now runs on PMC files
petdance authored
20 /* HEADERIZER HFILE: none */
21 /* HEADERIZER BEGIN: static */
e69d2a4 @petdance Made pcc_params be static. Removed unused arg from build_func. Headerizi...
petdance authored
22 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */
23
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
24 PARROT_IGNORABLE_RESULT
25 static nci_thunk_t /*@alt void@*/
26 build_func(PARROT_INTERP,
b75e23a @bacek Write barriering NCI in build_func.
bacek authored
27 ARGIN(PMC *obj),
a90f6d7 @plobsing switch ffi nci.pmc over to standard signature parser
plobsing authored
28 ARGMOD(Parrot_NCI_attributes *nci))
f631eb3 @plobsing remove private2 (raw) flag from nci-ffi.pmc
plobsing authored
29 __attribute__nonnull__(1)
30 __attribute__nonnull__(2)
b75e23a @bacek Write barriering NCI in build_func.
bacek authored
31 __attribute__nonnull__(3)
a90f6d7 @plobsing switch ffi nci.pmc over to standard signature parser
plobsing authored
32 FUNC_MODIFIES(*nci);
33
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
34 #define ASSERT_ARGS_build_func __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
f631eb3 @plobsing remove private2 (raw) flag from nci-ffi.pmc
plobsing authored
35 PARROT_ASSERT_ARG(interp) \
b75e23a @bacek Write barriering NCI in build_func.
bacek authored
36 , PARROT_ASSERT_ARG(obj) \
a90f6d7 @plobsing switch ffi nci.pmc over to standard signature parser
plobsing authored
37 , PARROT_ASSERT_ARG(nci))
e69d2a4 @petdance Made pcc_params be static. Removed unused arg from build_func. Headerizi...
petdance authored
38 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */
6bdd5f9 @petdance headerizer now runs on PMC files
petdance authored
39 /* HEADERIZER END: static */
40
75d67e7 @plobsing avoid rebuilding the pcc cif every call
plobsing authored
41 /*
42
b75e23a @bacek Write barriering NCI in build_func.
bacek authored
43 =item C<static nci_thunk_t build_func(PARROT_INTERP, PMC *obj,
44 Parrot_NCI_attributes *nci)>
75d67e7 @plobsing avoid rebuilding the pcc cif every call
plobsing authored
45
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
46 Actually build the NCI thunk.
75d67e7 @plobsing avoid rebuilding the pcc cif every call
plobsing authored
47
48 =cut
49
50 */
51
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
52 PARROT_IGNORABLE_RESULT
53 static nci_thunk_t
b75e23a @bacek Write barriering NCI in build_func.
bacek authored
54 build_func(PARROT_INTERP, ARGIN(PMC *obj), ARGMOD(Parrot_NCI_attributes *nci))
f631eb3 @plobsing remove private2 (raw) flag from nci-ffi.pmc
plobsing authored
55 {
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
56 ASSERT_ARGS(build_func)
f631eb3 @plobsing remove private2 (raw) flag from nci-ffi.pmc
plobsing authored
57
a90f6d7 @plobsing switch ffi nci.pmc over to standard signature parser
plobsing authored
58 Parrot_nci_sig_to_pcc(interp, nci->signature,
59 &nci->pcc_params_signature,
60 &nci->pcc_return_signature);
f631eb3 @plobsing remove private2 (raw) flag from nci-ffi.pmc
plobsing authored
61
a90f6d7 @plobsing switch ffi nci.pmc over to standard signature parser
plobsing authored
62 /* Arity is length of the signature minus one (the return type). */
63 nci->arity = VTABLE_elements(interp, nci->signature) - 1;
f631eb3 @plobsing remove private2 (raw) flag from nci-ffi.pmc
plobsing authored
64
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
65 /* Build call function. */
c74300b @plobsing make nci thunk lookup work with signature arrays, not strings
plobsing authored
66 nci->fb_info = build_call_func(interp, nci->signature);
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
67 nci->func = F2DPTR(VTABLE_get_pointer(interp, nci->fb_info));
176db42 @bacek Move WB after we changed NCI guts.
bacek authored
68 PARROT_GC_WRITE_BARRIER(interp, obj);
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
69
70 return (nci_thunk_t)nci->func;
f631eb3 @plobsing remove private2 (raw) flag from nci-ffi.pmc
plobsing authored
71 }
72
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
73
336b07c @bacek Add 'does invokable' to all PMCs with VTABLE_invoke (except Object). Par...
bacek authored
74 pmclass NCI auto_attrs provides invokable {
9d723e0 @plobsing update NCI signature parsing to emit new (half year old) PCC param and r...
plobsing authored
75 /* NCI thunk handling attributes */
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
76 ATTR PMC *signature; /* parsed signature */
77 ATTR void *func; /* function pointer to call */
78 ATTR PMC *fb_info; /* frame-builder info */
79 ATTR void *orig_func; /* pointer to wrapped function */
0c5f9c3 GSoC: The majority of my NCI changes in 1 commit.
John Harrison authored
80
9d723e0 @plobsing update NCI signature parsing to emit new (half year old) PCC param and r...
plobsing authored
81 /* Parrot Sub-ish attributes */
82 ATTR STRING *pcc_params_signature;
83 ATTR STRING *pcc_return_signature;
2d5eeb8 @plobsing eliminate some unnecessary attributes
plobsing authored
84 ATTR INTVAL arity;
9d723e0 @plobsing update NCI signature parsing to emit new (half year old) PCC param and r...
plobsing authored
85
86 /* MMD fields */
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
87 ATTR STRING *long_signature;
88 ATTR PMC *multi_sig;
2a2c19b Added in code to properly do native calls to library routines loaded via
Dan Sugalski authored
89
c64e58f pmc docs update 3
Michael Scott authored
90 /*
91
59661f1 @allisonrandal [pdd17pmc] Merging the pdd17pmc branch into trunk (r24435 to r26307).
allisonrandal authored
92 =item C<METHOD get_multisig()>
1415cda add introspection method get_multisig
Leopold Toetsch authored
93
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
94 Return the MMD signature PMC, if any or C<PMCNULL>.
1415cda add introspection method get_multisig
Leopold Toetsch authored
95
96 =cut
97
98 */
99
59661f1 @allisonrandal [pdd17pmc] Merging the pdd17pmc branch into trunk (r24435 to r26307).
allisonrandal authored
100 METHOD get_multisig() {
26f7d7b @cotto [PMC] replace PMC_pmc_val with an ATTR in the NCI PMC
cotto authored
101 PMC *sig;
102 GET_ATTR_multi_sig(INTERP, SELF, sig);
83dd9f2 @NotFound [core] partial fix for TT #667, examples/namespace/namespace_dump.pir d...
NotFound authored
103 if (PMC_IS_NULL(sig))
26f7d7b @cotto [PMC] replace PMC_pmc_val with an ATTR in the NCI PMC
cotto authored
104 sig = PMCNULL;
59661f1 @allisonrandal [pdd17pmc] Merging the pdd17pmc branch into trunk (r24435 to r26307).
allisonrandal authored
105 RETURN(PMC *sig);
1415cda add introspection method get_multisig
Leopold Toetsch authored
106 }
107
108 /*
109
c64e58f pmc docs update 3
Michael Scott authored
110 =item C<void init()>
111
112 Initializes the NCI with a C<NULL> function pointer.
113
114 =cut
115
116 */
117
59661f1 @allisonrandal [pdd17pmc] Merging the pdd17pmc branch into trunk (r24435 to r26307).
allisonrandal authored
118 VTABLE void init() {
2646951 @tewk [gsoc_nci] gsoc_nci_001 merge
tewk authored
119 PObj_custom_mark_SET(SELF);
f7fc86b nci
Leopold Toetsch authored
120 }
121
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
122 VTABLE void *get_pointer() {
123 return PARROT_NCI(SELF)->orig_func;
124 }
125
c64e58f pmc docs update 3
Michael Scott authored
126 /*
127
73ef4d0 @plobsing add interface to allow creation of NCI objects from Ptr objects from HLL
plobsing authored
128 =item C<void set_pmc_keyed(PMC *key, PMC *p)>
129
130 =item C<void set_pmc_keyed_str(STRING *key, PMC *p)>
131
132 Call the equivalent C<set_pointer*> function.
133
134 =cut
135
136 */
137
138 VTABLE void set_pmc_keyed(PMC *key, PMC *p) {
139 STATICSELF.set_pointer_keyed(key, VTABLE_get_pointer(INTERP, p));
140 }
141
142 VTABLE void set_pmc_keyed_str(STRING *key, PMC *p) {
143 STATICSELF.set_pointer_keyed_str(key, VTABLE_get_pointer(INTERP, p));
144 }
145
146 /*
147
c5334d6 @plobsing eliminate handling of string signatures within NCI objects
plobsing authored
148 =item C<void set_pointer_keyed(PMC *key, void *func)>
c64e58f pmc docs update 3
Michael Scott authored
149
380c0ba fix NCI related DOD problem
Leopold Toetsch authored
150 Sets the specified function pointer and signature (C<*key>).
c64e58f pmc docs update 3
Michael Scott authored
151
c5334d6 @plobsing eliminate handling of string signatures within NCI objects
plobsing authored
152 =item C<void set_pointer_keyed_str(STRING *key, void *func)>
153
154 Sets the specified function pointer and siganture as described in the string C<key>.
155
c64e58f pmc docs update 3
Michael Scott authored
156 =cut
157
158 */
159
c5334d6 @plobsing eliminate handling of string signatures within NCI objects
plobsing authored
160 VTABLE void set_pointer_keyed(PMC *key, void *func) {
62e3049 @petdance consting, and fixed embedded tabs
petdance authored
161 /* Store the original function and signature. */
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
162 SET_ATTR_orig_func(INTERP, SELF, func);
c5334d6 @plobsing eliminate handling of string signatures within NCI objects
plobsing authored
163 SET_ATTR_signature(INTERP, SELF, key);
164 }
c4cd281 @chromatic [PMC] Avoided an unnecessary STRING copying and creation in NCI's
chromatic authored
165
c5334d6 @plobsing eliminate handling of string signatures within NCI objects
plobsing authored
166 VTABLE void set_pointer_keyed_str(STRING *key, void *func) {
167 SELF.set_pointer_keyed(Parrot_nci_parse_signature(INTERP, key), func);
2646951 @tewk [gsoc_nci] gsoc_nci_001 merge
tewk authored
168 }
03918bc @chromatic [PMC] Fixed a read of unitialized memory in NCI PMC reported by Valgrind...
chromatic authored
169
2646951 @tewk [gsoc_nci] gsoc_nci_001 merge
tewk authored
170 /*
171
172 =item C<void mark()>
173
174 Mark any referenced strings and PMCs.
175
176 =cut
177
178 */
179 VTABLE void mark() {
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
180 if (PARROT_NCI(SELF)) {
181 Parrot_NCI_attributes * const nci_info = PARROT_NCI(SELF);
f631eb3 @plobsing remove private2 (raw) flag from nci-ffi.pmc
plobsing authored
182
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
183 Parrot_gc_mark_PMC_alive(interp, nci_info->signature);
184 Parrot_gc_mark_PMC_alive(interp, nci_info->fb_info);
185 Parrot_gc_mark_PMC_alive(interp, nci_info->multi_sig);
f631eb3 @plobsing remove private2 (raw) flag from nci-ffi.pmc
plobsing authored
186
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
187 Parrot_gc_mark_STRING_alive(interp, nci_info->long_signature);
188 Parrot_gc_mark_STRING_alive(interp, nci_info->pcc_params_signature);
189 Parrot_gc_mark_STRING_alive(interp, nci_info->pcc_return_signature);
f631eb3 @plobsing remove private2 (raw) flag from nci-ffi.pmc
plobsing authored
190 }
191 }
192
193 /*
194
c64e58f pmc docs update 3
Michael Scott authored
195 =item C<PMC *clone()>
196
197 Creates and returns a clone of the NCI.
198
199 =cut
200
201 */
202
59661f1 @allisonrandal [pdd17pmc] Merging the pdd17pmc branch into trunk (r24435 to r26307).
allisonrandal authored
203 VTABLE PMC *clone() {
971e997 @NotFound rename pmc attributes struct from Parrot_<type> to Parrot_<type>_attribu...
NotFound authored
204 Parrot_NCI_attributes * const nci_info_self = PARROT_NCI(SELF);
62e3049 @petdance consting, and fixed embedded tabs
petdance authored
205
083213a @Whiteknight start rename of pmc_new to Parrot_pmc_new
Whiteknight authored
206 PMC * const ret = Parrot_pmc_new(INTERP, SELF->vtable->base_type);
f1c9ca5 @petdance consting pointers and localizing temp vars
petdance authored
207 Parrot_NCI_attributes * const nci_info_ret = PARROT_NCI(ret);
82c7cf6 @chromatic [PMC] Minor cleanups and tidyings.
chromatic authored
208
c64e58f pmc docs update 3
Michael Scott authored
209 /* FIXME if data is malloced (JIT/i386!) then we need
210 * the length of data here, to memcpy it
211 * ManagedStruct or Buffer?
212 */
2646951 @tewk [gsoc_nci] gsoc_nci_001 merge
tewk authored
213 nci_info_ret->func = nci_info_self->func;
3b094c7 @plobsing add NCI.fb_info for frame buffer info
plobsing authored
214 nci_info_ret->fb_info = nci_info_self->fb_info;
811a7df @cotto [PMC] make NCI PMCs use ATTRs, with one temporary workaround for i386 ji...
cotto authored
215 nci_info_ret->orig_func = nci_info_self->orig_func;
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
216 nci_info_ret->signature = nci_info_self->signature;
2646951 @tewk [gsoc_nci] gsoc_nci_001 merge
tewk authored
217 nci_info_ret->pcc_params_signature = nci_info_self->pcc_params_signature;
9d723e0 @plobsing update NCI signature parsing to emit new (half year old) PCC param and r...
plobsing authored
218 nci_info_ret->pcc_return_signature = nci_info_self->pcc_params_signature;
2646951 @tewk [gsoc_nci] gsoc_nci_001 merge
tewk authored
219 nci_info_ret->arity = nci_info_self->arity;
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
220 PObj_get_FLAGS(ret) = PObj_get_FLAGS(SELF);
82c7cf6 @chromatic [PMC] Minor cleanups and tidyings.
chromatic authored
221
c64e58f pmc docs update 3
Michael Scott authored
222 return ret;
2a2c19b Added in code to properly do native calls to library routines loaded via
Dan Sugalski authored
223 }
224
c64e58f pmc docs update 3
Michael Scott authored
225 /*
226
227 =item C<INTVAL defined()>
228
229 Returns whether the NCI is defined.
230
231 =cut
232
233 */
234
59661f1 @allisonrandal [pdd17pmc] Merging the pdd17pmc branch into trunk (r24435 to r26307).
allisonrandal authored
235 VTABLE INTVAL defined() {
776e9da @petdance consting and removing unused var
petdance authored
236 const Parrot_NCI_attributes * const nci_info = PARROT_NCI(SELF);
8832378 @chromatic [PMC] Delayed NCI thunk initialization until absolutely necessary. This
chromatic authored
237 return nci_info->orig_func != NULL;
2a2c19b Added in code to properly do native calls to library routines loaded via
Dan Sugalski authored
238 }
239
c64e58f pmc docs update 3
Michael Scott authored
240 /*
241
0ae5d55 @paultcochrane Patch courtesy of Steve Peters <steve at fisharerojo dot org>, his comme...
paultcochrane authored
242 =item C<opcode_t *invoke(void *next)>
c64e58f pmc docs update 3
Michael Scott authored
243
8832378 @chromatic [PMC] Delayed NCI thunk initialization until absolutely necessary. This
chromatic authored
244 Calls the associated C function, returning C<*next>. If the invocant is a
245 class, the PMC arguments are shifted down.
c64e58f pmc docs update 3
Michael Scott authored
246
247 =cut
248
249 */
250
59661f1 @allisonrandal [pdd17pmc] Merging the pdd17pmc branch into trunk (r24435 to r26307).
allisonrandal authored
251 VTABLE opcode_t *invoke(void *next) {
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
252 Parrot_NCI_attributes * const nci_info = PARROT_NCI(SELF);
253 nci_thunk_t func;
254 PMC *fb_info;
811a7df @cotto [PMC] make NCI PMCs use ATTRs, with one temporary workaround for i386 ji...
cotto authored
255 PMC *cont;
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
256
257 func = (nci_thunk_t)D2FPTR(nci_info->func);
258
259 if (!func) {
c64fa8d @plobsing split NCI signature parser out from nci.pmc
plobsing authored
260 /* build the thunk only when necessary */
b75e23a @bacek Write barriering NCI in build_func.
bacek authored
261 func = build_func(interp, SELF, nci_info);
82c7cf6 @chromatic [PMC] Minor cleanups and tidyings.
chromatic authored
262
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
263 if (!func)
c64fa8d @plobsing split NCI signature parser out from nci.pmc
plobsing authored
264 Parrot_ex_throw_from_c_args(INTERP, NULL,
265 EXCEPTION_INVALID_OPERATION,
266 "attempt to call NULL function");
8832378 @chromatic [PMC] Delayed NCI thunk initialization until absolutely necessary. This
chromatic authored
267 }
2646951 @tewk [gsoc_nci] gsoc_nci_001 merge
tewk authored
268
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
269 GET_ATTR_fb_info(INTERP, SELF, fb_info);
f631eb3 @plobsing remove private2 (raw) flag from nci-ffi.pmc
plobsing authored
270
92c390d Fix tailcalls to NCI, #38724
Leopold Toetsch authored
271 cont = INTERP->current_cont;
8b188db @Whiteknight Fix for TT #1029. The return continuation was being mangled in the PIR c...
Whiteknight authored
272 func(INTERP, SELF, fb_info);
273
8838c7f builtins 1 - first shot
Leopold Toetsch authored
274 /*
92c390d Fix tailcalls to NCI, #38724
Leopold Toetsch authored
275 * If the NCI function was tailcalled, the return result
276 * is already passed back to the caller of this frame
277 * - see Parrot_init_ret_nci(). We therefore invoke the
278 * return continuation here, which gets rid of this frame
279 * and returns the real return address
8838c7f builtins 1 - first shot
Leopold Toetsch authored
280 */
8832378 @chromatic [PMC] Delayed NCI thunk initialization until absolutely necessary. This
chromatic authored
281 if (cont && cont != NEED_CONTINUATION
282 && (PObj_get_FLAGS(cont) & SUB_FLAG_TAILCALL)) {
540d4c3 @bacek Merge context_pmc3 branch into trunk.
bacek authored
283 cont = Parrot_pcc_get_continuation(interp, CURRENT_CONTEXT(interp));
92c390d Fix tailcalls to NCI, #38724
Leopold Toetsch authored
284 next = VTABLE_invoke(INTERP, cont, next);
285 }
82c7cf6 @chromatic [PMC] Minor cleanups and tidyings.
chromatic authored
286
e063e49 @chromatic Continuing Parrot/C++ cleanups (Steve Peters, RT #42746).
chromatic authored
287 return (opcode_t *)next;
2a2c19b Added in code to properly do native calls to library routines loaded via
Dan Sugalski authored
288 }
380c0ba fix NCI related DOD problem
Leopold Toetsch authored
289
c64e58f pmc docs update 3
Michael Scott authored
290 /*
291
292 =item C<INTVAL get_integer()>
293
294 Returns the function pointer as an integer.
295
296 =cut
297
298 */
299
59661f1 @allisonrandal [pdd17pmc] Merging the pdd17pmc branch into trunk (r24435 to r26307).
allisonrandal authored
300 VTABLE INTVAL get_integer() {
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
301 Parrot_NCI_attributes * const nci_info = PARROT_NCI(SELF);
302 if (!nci_info->func)
b75e23a @bacek Write barriering NCI in build_func.
bacek authored
303 build_func(INTERP, SELF, nci_info);
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
304 return (INTVAL)nci_info->func;
3168931 Forth can now generate code for words on the fly and execute them.
Dan Sugalski authored
305 }
306
f35b03c @rubys Initial support for sort
rubys authored
307 /*
308
309 =item C<INTVAL get_bool()>
310
311 Returns the boolean value of the pointer.
312
313 =cut
314
315 */
316
59661f1 @allisonrandal [pdd17pmc] Merging the pdd17pmc branch into trunk (r24435 to r26307).
allisonrandal authored
317 VTABLE INTVAL get_bool() {
776e9da @petdance consting and removing unused var
petdance authored
318 const Parrot_NCI_attributes * const nci_info = PARROT_NCI(SELF);
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
319 return (0 != (INTVAL)nci_info->orig_func);
f35b03c @rubys Initial support for sort
rubys authored
320 }
321
6586a2c @jnthn Implement arity method on NCI PMCs, plus a test for it.
jnthn authored
322 /*
323
59661f1 @allisonrandal [pdd17pmc] Merging the pdd17pmc branch into trunk (r24435 to r26307).
allisonrandal authored
324 =item C<METHOD arity()>
6586a2c @jnthn Implement arity method on NCI PMCs, plus a test for it.
jnthn authored
325
01e804c @Util [pmc] Typo corrections
Util authored
326 Return the arity of the NCI (the number of arguments).
6586a2c @jnthn Implement arity method on NCI PMCs, plus a test for it.
jnthn authored
327
328 =cut
329
330 */
59661f1 @allisonrandal [pdd17pmc] Merging the pdd17pmc branch into trunk (r24435 to r26307).
allisonrandal authored
331 METHOD arity() {
971e997 @NotFound rename pmc attributes struct from Parrot_<type> to Parrot_<type>_attribu...
NotFound authored
332 Parrot_NCI_attributes * const nci_info = PARROT_NCI(SELF);
59661f1 @allisonrandal [pdd17pmc] Merging the pdd17pmc branch into trunk (r24435 to r26307).
allisonrandal authored
333
8832378 @chromatic [PMC] Delayed NCI thunk initialization until absolutely necessary. This
chromatic authored
334 if (nci_info) {
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
335 if (!nci_info->func)
b75e23a @bacek Write barriering NCI in build_func.
bacek authored
336 build_func(INTERP, SELF, nci_info);
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
337 if (nci_info->func) {
f1c9ca5 @petdance consting pointers and localizing temp vars
petdance authored
338 const INTVAL arity = nci_info->arity;
c64fa8d @plobsing split NCI signature parser out from nci.pmc
plobsing authored
339 RETURN(INTVAL arity);
8832378 @chromatic [PMC] Delayed NCI thunk initialization until absolutely necessary. This
chromatic authored
340 }
341 }
6586a2c @jnthn Implement arity method on NCI PMCs, plus a test for it.
jnthn authored
342
8832378 @chromatic [PMC] Delayed NCI thunk initialization until absolutely necessary. This
chromatic authored
343 Parrot_ex_throw_from_c_args(INTERP, NULL,
344 EXCEPTION_INVALID_OPERATION,
345 "You cannot get the arity of an undefined NCI.");
59661f1 @allisonrandal [pdd17pmc] Merging the pdd17pmc branch into trunk (r24435 to r26307).
allisonrandal authored
346 }
2a2c19b Added in code to properly do native calls to library routines loaded via
Dan Sugalski authored
347 }
c64e58f pmc docs update 3
Michael Scott authored
348
349 /*
350
351 =back
352
353 =head1 SEE ALSO
354
1e5a8ee @plobsing eliminate use of libffi-specific nci.pmc
plobsing authored
355 F<docs/pdds/pdd03_calling_conventions.pod>.
f631eb3 @plobsing remove private2 (raw) flag from nci-ffi.pmc
plobsing authored
356
c64e58f pmc docs update 3
Michael Scott authored
357 =cut
358
359 */
360
0eb3eb3 added formatting footer and detabbed
Michael Scott authored
361 /*
362 * Local variables:
72575ae @bschmalhofer #40481: [PATCH] C-code coda in pmc files
bschmalhofer authored
363 * c-file-style: "parrot"
0eb3eb3 added formatting footer and detabbed
Michael Scott authored
364 * End:
1d7dded @plobsing update C file vim modelines
plobsing authored
365 * vim: expandtab shiftwidth=4 cinoptions='\:2=2' :
72575ae @bschmalhofer #40481: [PATCH] C-code coda in pmc files
bschmalhofer authored
366 */
Something went wrong with that request. Please try again.