parrotcode: The Parrot Extension System | |
Contents | Documentation |
docs/pdds/pdd11_extending.pod - The Parrot Extension System
The extension API for Parrot is a simple, somewhat abstract, interface to Parrot for code written in C or other compiled languages. It provides about the same level of access to Parrot that bytecode programs have.
The API presents to C programs roughly the same interface presented to bytecode programs--that is, a C extension can see everything that a bytecode program can see, including Parrot's base architecture, registers, stacks, and whatnot. This view isn't required, however, and often extension code won't need or want to know what Parrot's internal structures look like. For this reason the functions in the extension API are divided into two broad groups, one that has no particular knowledge of the internals and one that does.
The stability of the two API groups is guaranteed separately. Group 1, the internals unaware group, should be good basically forever. Group 2, the internals aware group, is only guaranteed for the lifetime of the current architecture. (It's likely that both groups will last equally long; however, the Group 1 interface could reasonably be emulated on a different engine, while the Group 2 interface is more closely tied to Parrot).
Note: The extension API has not yet been completely specified. New functions may be added, and those described below may change or be removed. You have been warned...
These functions are the ones that are largely unaware of the structure and architecture of Parrot. They deal mainly in data as abstract entities, and Parrot itself as a black box that, at best, can make subroutine or method calls. This is sufficient for many extensions which act as black box processing units and in turn treat Parrot itself as a black box.
The following functions are for storing and retrieving data inside PMCs. Note that use of the _keyed functions with non-aggregate PMCs will generally just result in Parrot throwing an exception.
Parrot_PMC_get_string(interp, pmc)
Parrot_PMC_get_string_intkey(interp, pmc, Parrot_Int key)
Parrot_PMC_get_string
.
Returns a Parrot_String representing the string value of whatever is stored at the element of the PMC indexed by key
.Parrot_PMC_get_pointer(interp, pmc)
Parrot_PMC_get_pointer_intkey(interp, pmc, Parrot_Int key)
Parrot_PMC_get_pointer
.
Returns the pointer value of whatever is stored at the element of the PMC indexed by key
.Parrot_PMC_get_intval(interp, pmc)
Parrot_PMC_get_intval_intkey(interp, pmc, Parrot_Int key)
Parrot_PMC_get_intval
.
Returns the integer value of whatever is stored at the element of the PMC indexed by key
.Parrot_PMC_get_numval(interp, pmc)
Parrot_PMC_get_numval_intkey(interp, pmc, Parrot_Int key)
Parrot_PMC_get_numval
.
Returns the numeric value of whatever is stored at the element of the PMC indexed by key
.Parrot_PMC_get_cstring(interp, pmc)
free
.
It must be returned with Parrot_free_cstring
.Parrot_PMC_get_cstring_intkey(interp, pmc, Parrot_Int key)
Parrot_PMC_get_cstring
.
Returns a C-string representing the string value of whatever is stored at the element of the PMC indexed by key
.Parrot_PMC_get_cstringn(interp, pmc, &len)
len
parameter is the address of an integer that will get the length of the string as Parrot knows it.free
.
It must be returned with Parrot_free_cstring
.Parrot_PMC_get_cstringn_intkey(interp, pmc, &len, Parrot_Int key)
Parrot_PMC_get_cstringn
.
Returns a C-string representing the string value of whatever is stored at the element of the PMC indexed by key
.
Stores the length of the string in len
.Parrot_PMC_get_pmc_intkey(interp, pmc, Parrot_Int key)
key
.Parrot_PMC_set_string(interp, pmc, Parrot_String value)
Parrot_PMC_set_string_intkey(interp, pmc, Parrot_String value, Parrot_Int key)
Parrot_PMC_set_string
.
Assigns value
to the PMC stored at element <key> of the passed-in PMC.Parrot_PMC_set_pointer(interp, pmc, void *value)
Parrot_PMC_set_pointer_intkey(interp, pmc, void *value, Parrot_Int key)
Parrot_PMC_set_pointer
.
Assigns value
to the PMC stored at element <key> of the passed-in PMC.Parrot_PMC_set_pmc_intkey(interp, pmc, Parrot_PMC value, Parrot_Int key)
value
to the PMC stored at element <key> of the passed-in PMC.Parrot_PMC_set_intval(interp, pmc, Parrot_Int value)
Parrot_PMC_set_intval_intkey(interp, pmc, Parrot_Int value, Parrot_Int key)
Parrot_PMC_set_intval
.
Assigns value
to the PMC stored at element <key> of the passed-in PMC.Parrot_PMC_set_numval(interp, pmc, Parrot_Float value)
Parrot_PMC_set_numval_intkey(interp, pmc, Parrot_Float value, Parrot_Int key)
Parrot_PMC_set_numval
.
Assigns value
to the PMC stored at element <key> of the passed-in PMC.Parrot_PMC_set_cstring(interp, pmc, const char *value)
Parrot_PMC_set_cstring_intkey(interp, pmc, const char *value, Parrot_Int key)
Parrot_PMC_set_cstring
.
Converts value
to a Parrot_String and assigns it to the PMC stored at element <key> of the passed-in PMC.Parrot_PMC_set_cstringn(interp, pmc, const char *value, Parrot_Int length)
length
and assign it to the passed-in PMC.
If value
is longer than length
,
then only the first length
characters will be converted.
If value
is shorter than length
,
then the extra characters in the Parrot_String should be assumed to contain garbage.Parrot_PMC_set_cstringn_intkey(interp, pmc, const char *value, Parrot_int length, Parrot_Int key)
Parrot_PMC_set_cstringn
.
Converts the first length
characters of value
to a Parrot_String and assigns the resulting string to the PMC stored at element <key> of the passed-in PMC.Functions used to create and destroy PMCs, Parrot_Strings, etc.
Parrot_PMC_new(interp, Parrot_Int typenum)
typenum
is an integer identifier that specifies the type of PMC required.
The typenum
corresponding to a particular PMC class name can be found using Parrot_PMC_typenum
.Parrot_PMC_typenum(interp, const char *class)
class
.Parrot_PMC_null()
NULL
PMC.Parrot_new_string(interp, char *buffer, int length, Parrot_Encoding encoding, Parrot_CharType charset, Parrot_Language language, Parrot_Int flags)
encoding
,
charset
,
or language
are unspecified (i.e.
if you pass in 0),
then the defaults are used.
Otherwise,
the functions Parrot_find_encoding
,
Parrot_find_chartype
and Parrot_find_language
(all described below) can be used to find the appropriate values for a particular choice of encoding,
chartype or language.Parrot_find_encoding(interp, char *encoding_name)
Parrot_find_chartype(interp, char *chartype)
Parrot_find_language(interp, char *language)
Parrot_free_cstring(char *string)
Parrot_PMC_get_cstring
and Parrot_PMC_get_cstringn
,
as these will not be reclaimed by the garbage collector.
It should not be used to deallocate strings that do not come from Parrot.Parrot_register_pmc(interp, pmc)
Parrot_unregister_pmc(interp, pmc)
Functions to call Parrot subroutines and methods
Parrot_call_sub(interp, Parrot_PMC sub, Parrot_Int argcount, ...)
argcount
PMC parameters.
This function sets up Parrot's registers in line with the Parrot calling conventions; see pdd03_calling_conventions.pod for more details.Parrot_call_method(interp, Parrot_PMC sub, Parrot_String method, Parrot_Int argcount, ...)
method
with argcount
PMC parameters.
NB.
This is not yet implemented and may change.The internals-aware functions are for those extensions that need to query or alter the state of Parrot's internals in some way.
Register access functions
The following functions allow the values stored in Parrot's registers to be accessed. An attempt to access a non-existent register (e.g. string register -123) will cause the function to throw an exception (well, it will once we actually implement some bounds-checking...). The value stored in an uninitialized register is undefined; it may well be zero (or NULL), but do not rely on this being the case.
Parrot_get_intreg(interp, Parrot_Int regnum)
Parrot_get_numreg(interp, Parrot_Int regnum)
Parrot_get_strreg(interp, Parrot_Int regnum)
Parrot_get_pmcreg(interp, Parrot_Int regnum)
None.
None.
Maintainer:
Class: Internals
PDD Number: 11
Version: 1.0
Status: Developing
Last Modified: February 20, 2004
PDD Format: 1
Language: English
|