tagged release 0.6.4
[parrot.git] / include / parrot / extend.h
blob1b45b59f4b840b7e0d3784aebac8b681b7f99ccd
1 /* extend.h
2 * Copyright (C) 2001-2008, The Perl Foundation.
3 * SVN Info
4 * $Id$
5 * Overview:
6 * This is the Parrot extension mechanism, the face we present to
7 * extension modules and whatnot
8 * Data Structure and Algorithms:
9 * History:
10 * Notes:
11 * References:
12 * extend.c, docs/pdds/pdd11_extending.pod.
15 #ifndef PARROT_EXTEND_H_GUARD
16 #define PARROT_EXTEND_H_GUARD
18 #include <stdarg.h>
19 #include "parrot/config.h" /* PARROT_VERSION, PARROT_JIT_CAPABLE... */
20 #include "parrot/interpreter.h" /* give us the interpreter flags */
21 #include "parrot/warnings.h" /* give us the warnings flags */
23 /* Two versions of each routine, one for when we're building the core
24 and one for when people are writing extensions. If this gets abused
25 we'll split this into two pieces and not install the core version,
26 but that would be really annoying */
27 #if defined(PARROT_IN_CORE)
29 #define Parrot_String STRING *
30 #define Parrot_PMC PMC *
31 #define Parrot_Language Parrot_Int
32 #define Parrot_VTABLE VTABLE *
34 /* Macro to save off the original stack pointer for DOD scanning. If
35 the stacktop was NULL, then set it to the address of the cached
36 pointer, which is on the stack and as good a thing as any to use as
37 an anchor */
38 #define PARROT_CALLIN_START(x) void *oldtop = (x)->lo_var_ptr; \
39 if (!oldtop) (x)->lo_var_ptr = &oldtop;
40 /* Put the stack top back, if what we cached was NULL. Otherwise we
41 leave it alone and assume it's OK */
42 #define PARROT_CALLIN_END(x) if (!oldtop) (x)->lo_var_ptr = NULL;
44 #else
46 typedef void * Parrot_String;
47 typedef void * Parrot_PMC;
48 typedef Parrot_Int Parrot_Language;
49 typedef void * Parrot_Encoding;
50 typedef void * Parrot_CharType;
51 typedef const void * Parrot_Const_Encoding;
52 typedef const void * Parrot_Const_CharType;
53 typedef const void * Parrot_VTABLE;
55 #endif
57 #include "parrot/extend_vtable.h" /* the auto-generated prototypes */
59 /* HEADERIZER BEGIN: src/extend.c */
60 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */
62 PARROT_API
63 PARROT_WARN_UNUSED_RESULT
64 PARROT_CAN_RETURN_NULL
65 void * Parrot_call_method(PARROT_INTERP,
66 Parrot_PMC sub,
67 Parrot_PMC obj,
68 Parrot_String method,
69 ARGIN(const char *signature),
70 ...)
71 __attribute__nonnull__(1)
72 __attribute__nonnull__(5);
74 PARROT_API
75 Parrot_Float Parrot_call_method_ret_float(PARROT_INTERP,
76 Parrot_PMC sub,
77 Parrot_PMC obj,
78 Parrot_String method,
79 ARGIN(const char *signature),
80 ...)
81 __attribute__nonnull__(1)
82 __attribute__nonnull__(5);
84 PARROT_API
85 Parrot_Int Parrot_call_method_ret_int(PARROT_INTERP,
86 Parrot_PMC sub,
87 Parrot_PMC obj,
88 Parrot_String method,
89 ARGIN(const char *signature),
90 ...)
91 __attribute__nonnull__(1)
92 __attribute__nonnull__(5);
94 PARROT_API
95 PARROT_WARN_UNUSED_RESULT
96 PARROT_CAN_RETURN_NULL
97 void* Parrot_call_sub(PARROT_INTERP,
98 Parrot_PMC sub,
99 ARGIN(const char *signature),
100 ...)
101 __attribute__nonnull__(1)
102 __attribute__nonnull__(3);
104 PARROT_API
105 Parrot_Float Parrot_call_sub_ret_float(PARROT_INTERP,
106 Parrot_PMC sub,
107 ARGIN(const char *signature),
108 ...)
109 __attribute__nonnull__(1)
110 __attribute__nonnull__(3);
112 PARROT_API
113 Parrot_Int Parrot_call_sub_ret_int(PARROT_INTERP,
114 Parrot_PMC sub,
115 ARGIN(const char *signature),
116 ...)
117 __attribute__nonnull__(1)
118 __attribute__nonnull__(3);
120 PARROT_API
121 int Parrot_eprintf(NULLOK_INTERP, ARGIN(const char *s), ...)
122 __attribute__nonnull__(2);
124 PARROT_API
125 PARROT_WARN_UNUSED_RESULT
126 Parrot_Language Parrot_find_language(SHIM_INTERP, SHIM(char *language));
128 PARROT_API
129 int Parrot_fprintf(PARROT_INTERP,
130 ARGIN(Parrot_PMC pio),
131 ARGIN(const char *s),
132 ...)
133 __attribute__nonnull__(1)
134 __attribute__nonnull__(2)
135 __attribute__nonnull__(3);
137 PARROT_API
138 void Parrot_free_cstring(ARGIN_NULLOK(char *string));
140 PARROT_API
141 Parrot_Int Parrot_get_intreg(PARROT_INTERP, Parrot_Int regnum)
142 __attribute__nonnull__(1);
144 PARROT_API
145 Parrot_Float Parrot_get_numreg(PARROT_INTERP, Parrot_Int regnum)
146 __attribute__nonnull__(1);
148 PARROT_API
149 Parrot_PMC Parrot_get_pmcreg(PARROT_INTERP, Parrot_Int regnum)
150 __attribute__nonnull__(1);
152 PARROT_API
153 Parrot_String Parrot_get_strreg(PARROT_INTERP, Parrot_Int regnum)
154 __attribute__nonnull__(1);
156 PARROT_API
157 PARROT_PURE_FUNCTION
158 Parrot_VTABLE Parrot_get_vtable(PARROT_INTERP, Parrot_Int id)
159 __attribute__nonnull__(1);
161 PARROT_API
162 PARROT_WARN_UNUSED_RESULT
163 PARROT_CANNOT_RETURN_NULL
164 Parrot_String Parrot_new_string(PARROT_INTERP,
165 ARGIN_NULLOK(const char *buffer),
166 int length,
167 ARGIN_NULLOK(const char * const encoding_name),
168 Parrot_Int flags)
169 __attribute__nonnull__(1);
171 PARROT_API
172 void Parrot_PMC_delete_pmckey(PARROT_INTERP, Parrot_PMC pmc, Parrot_PMC key)
173 __attribute__nonnull__(1);
175 PARROT_API
176 PARROT_MALLOC
177 PARROT_CAN_RETURN_NULL
178 char * Parrot_PMC_get_cstring(PARROT_INTERP, Parrot_PMC pmc)
179 __attribute__nonnull__(1);
181 PARROT_API
182 PARROT_MALLOC
183 PARROT_CAN_RETURN_NULL
184 char * Parrot_PMC_get_cstring_intkey(PARROT_INTERP,
185 Parrot_PMC pmc,
186 Parrot_Int key)
187 __attribute__nonnull__(1);
189 PARROT_API
190 PARROT_MALLOC
191 PARROT_CAN_RETURN_NULL
192 char * Parrot_PMC_get_cstringn(PARROT_INTERP,
193 ARGIN(Parrot_PMC pmc),
194 ARGOUT(Parrot_Int *length))
195 __attribute__nonnull__(1)
196 __attribute__nonnull__(2)
197 __attribute__nonnull__(3)
198 FUNC_MODIFIES(*length);
200 PARROT_API
201 PARROT_MALLOC
202 PARROT_CAN_RETURN_NULL
203 char * Parrot_PMC_get_cstringn_intkey(PARROT_INTERP,
204 ARGIN(Parrot_PMC pmc),
205 ARGOUT(Parrot_Int *length),
206 Parrot_Int key)
207 __attribute__nonnull__(1)
208 __attribute__nonnull__(2)
209 __attribute__nonnull__(3)
210 FUNC_MODIFIES(*length);
212 PARROT_API
213 Parrot_Int Parrot_PMC_get_intval(PARROT_INTERP, Parrot_PMC pmc)
214 __attribute__nonnull__(1);
216 PARROT_API
217 Parrot_Int Parrot_PMC_get_intval_intkey(PARROT_INTERP,
218 Parrot_PMC pmc,
219 Parrot_Int key)
220 __attribute__nonnull__(1);
222 PARROT_API
223 Parrot_Int Parrot_PMC_get_intval_pmckey(PARROT_INTERP,
224 Parrot_PMC pmc,
225 Parrot_PMC key)
226 __attribute__nonnull__(1);
228 PARROT_API
229 Parrot_Float Parrot_PMC_get_numval(PARROT_INTERP, Parrot_PMC pmc)
230 __attribute__nonnull__(1);
232 PARROT_API
233 Parrot_Float Parrot_PMC_get_numval_intkey(PARROT_INTERP,
234 Parrot_PMC pmc,
235 Parrot_Int key)
236 __attribute__nonnull__(1);
238 PARROT_API
239 Parrot_PMC Parrot_PMC_get_pmc_intkey(PARROT_INTERP,
240 Parrot_PMC pmc,
241 Parrot_Int key)
242 __attribute__nonnull__(1);
244 PARROT_API
245 PARROT_WARN_UNUSED_RESULT
246 PARROT_CAN_RETURN_NULL
247 void * Parrot_PMC_get_pointer_intkey(PARROT_INTERP,
248 Parrot_PMC pmc,
249 Parrot_Int key)
250 __attribute__nonnull__(1);
252 PARROT_API
253 Parrot_String Parrot_PMC_get_string_intkey(PARROT_INTERP,
254 Parrot_PMC pmc,
255 Parrot_Int key)
256 __attribute__nonnull__(1);
258 PARROT_API
259 Parrot_PMC Parrot_PMC_new(PARROT_INTERP, Parrot_Int type)
260 __attribute__nonnull__(1);
262 PARROT_API
263 Parrot_PMC Parrot_PMC_null(void);
265 PARROT_API
266 void Parrot_PMC_push_intval(PARROT_INTERP, Parrot_PMC pmc, Parrot_Int value)
267 __attribute__nonnull__(1);
269 PARROT_API
270 void Parrot_PMC_push_numval(PARROT_INTERP,
271 Parrot_PMC pmc,
272 Parrot_Float value)
273 __attribute__nonnull__(1);
275 PARROT_API
276 void Parrot_PMC_set_cstring(PARROT_INTERP,
277 Parrot_PMC pmc,
278 ARGIN_NULLOK(const char *value))
279 __attribute__nonnull__(1);
281 PARROT_API
282 void Parrot_PMC_set_cstring_intkey(PARROT_INTERP,
283 Parrot_PMC pmc,
284 Parrot_Int key,
285 ARGIN_NULLOK(const char *value))
286 __attribute__nonnull__(1);
288 PARROT_API
289 void Parrot_PMC_set_cstringn(PARROT_INTERP,
290 Parrot_PMC pmc,
291 ARGIN_NULLOK(const char *value),
292 Parrot_Int length)
293 __attribute__nonnull__(1);
295 PARROT_API
296 void Parrot_PMC_set_cstringn_intkey(PARROT_INTERP,
297 Parrot_PMC pmc,
298 Parrot_Int key,
299 ARGIN_NULLOK(const char *value),
300 Parrot_Int length)
301 __attribute__nonnull__(1);
303 PARROT_API
304 void Parrot_PMC_set_intval(PARROT_INTERP, Parrot_PMC pmc, Parrot_Int value)
305 __attribute__nonnull__(1);
307 PARROT_API
308 void Parrot_PMC_set_intval_intkey(PARROT_INTERP,
309 Parrot_PMC pmc,
310 Parrot_Int key,
311 Parrot_Int value)
312 __attribute__nonnull__(1);
314 PARROT_API
315 void Parrot_PMC_set_numval(PARROT_INTERP,
316 Parrot_PMC pmc,
317 Parrot_Float value)
318 __attribute__nonnull__(1);
320 PARROT_API
321 void Parrot_PMC_set_numval_intkey(PARROT_INTERP,
322 Parrot_PMC pmc,
323 Parrot_Int key,
324 Parrot_Float value)
325 __attribute__nonnull__(1);
327 PARROT_API
328 void Parrot_PMC_set_pmc_intkey(PARROT_INTERP,
329 Parrot_PMC pmc,
330 Parrot_Int key,
331 Parrot_PMC value)
332 __attribute__nonnull__(1);
334 PARROT_API
335 void Parrot_PMC_set_pmc_pmckey(PARROT_INTERP,
336 Parrot_PMC pmc,
337 Parrot_PMC key,
338 Parrot_PMC value)
339 __attribute__nonnull__(1);
341 PARROT_API
342 void Parrot_PMC_set_pointer_intkey(PARROT_INTERP,
343 ARGIN(Parrot_PMC pmc),
344 Parrot_Int key,
345 ARGIN_NULLOK(void *value))
346 __attribute__nonnull__(1)
347 __attribute__nonnull__(2);
349 PARROT_API
350 void Parrot_PMC_set_string(PARROT_INTERP,
351 Parrot_PMC pmc,
352 Parrot_String value)
353 __attribute__nonnull__(1);
355 PARROT_API
356 void Parrot_PMC_set_string_intkey(PARROT_INTERP,
357 Parrot_PMC pmc,
358 Parrot_Int key,
359 Parrot_String value)
360 __attribute__nonnull__(1);
362 PARROT_API
363 void Parrot_PMC_set_vtable(SHIM_INTERP,
364 Parrot_PMC pmc,
365 Parrot_VTABLE vtable);
367 PARROT_API
368 Parrot_Int Parrot_PMC_typenum(PARROT_INTERP,
369 ARGIN_NULLOK(const char *_class))
370 __attribute__nonnull__(1);
372 PARROT_API
373 int Parrot_printf(NULLOK_INTERP, ARGIN(const char *s), ...)
374 __attribute__nonnull__(2);
376 PARROT_API
377 void Parrot_register_pmc(PARROT_INTERP, Parrot_PMC pmc)
378 __attribute__nonnull__(1);
380 PARROT_API
381 void Parrot_set_intreg(PARROT_INTERP, Parrot_Int regnum, Parrot_Int value)
382 __attribute__nonnull__(1);
384 PARROT_API
385 void Parrot_set_numreg(PARROT_INTERP, Parrot_Int regnum, Parrot_Float value)
386 __attribute__nonnull__(1);
388 PARROT_API
389 void Parrot_set_pmcreg(PARROT_INTERP, Parrot_Int regnum, Parrot_PMC value)
390 __attribute__nonnull__(1);
392 PARROT_API
393 void Parrot_set_strreg(PARROT_INTERP,
394 Parrot_Int regnum,
395 Parrot_String value)
396 __attribute__nonnull__(1);
398 PARROT_API
399 void Parrot_unregister_pmc(PARROT_INTERP, Parrot_PMC pmc)
400 __attribute__nonnull__(1);
402 PARROT_API
403 int Parrot_vfprintf(PARROT_INTERP,
404 ARGIN(Parrot_PMC pio),
405 ARGIN(const char *s),
406 va_list args)
407 __attribute__nonnull__(1)
408 __attribute__nonnull__(2)
409 __attribute__nonnull__(3);
411 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */
412 /* HEADERIZER END: src/extend.c */
414 #endif /* PARROT_EXTEND_H_GUARD */
417 * Local variables:
418 * c-file-style: "parrot"
419 * End:
420 * vim: expandtab shiftwidth=4: