OVERVIEW
This is a build directory for custom PMCs with a sample foo.pmc providing the Foo PMC class.
CREATING A DYNAMIC PMC
- Edit/create your foo.pmc source - For details on creating PMCs, see tools/dev/gen_class.pl
- Edit
../../config/gen/makefiles/dynpmc.in
and append your PMC(s) to the build target. The dynpmc.in file is processed by Configure.pl to create the real makefiles. So, invoke the configure script, then make: - If anything changes inside parrot, be sure to:
There are some differences you have to be aware of when creating dynamic PMCs.
When declaring the dynamic PMC,
you must specify the dynpmc
flag,
as in:
pmclass TclString extends TclObject dynpmc ... { ... }
Note that regular (non-dynamic) PMCs have a type id enum_class_PMCNAME
, but dynamic PMCs obviously cannot use the same thing. Instead, a dynamically-chosen value is assigned at runtime - so, when you refer to the type of the class , you must dynamically determine the PMC type. So, while scalar
(a builtin) has the luxury of knowing at compile time what the class number of its child String
is -- for example:
if (type == enum_class_String) { ...
a dynamic PMC such as TclInt
must instead perform a runtime lookup of its corresponding TclString
PMC, resulting in the more complicated:
static INTVAL dynpmc_TclString; pmclass TclInt extends TclObject extends Integer dynpmc group tcl_group { void class_init() { if (pass) { dynpmc_TclString = Parrot_PMC_typenum(interp,"TclString"); } } }
Finally, if you have a group of PMCs that are interdependent, use the group GROUPNAME
syntax to trigger a group library to be built. You will use the group name as the name of the library to load using the PASM op loadlib
.
pmclass Match extends Hash dynpmc group match_group { ... }
and then in your .pir or .pasm file:
loadlib $P0, "match_group"
$ perl Configure.pl $ make
$ make dynpmc-clean