This is a build directory for custom PMCs with a sample foo.pmc providing the Foo PMC class.
Edit/create your foo.pmc source - For details on creating PMCs, see "classes/genclass.pl" in ..
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:
dynpmc
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:
enum_class_PMCNAME
scalar
String
if (type == enum_class_String) { ...
a dynamic PMC such as TclObject must instead perform a runtime lookup of its corresponding TclString PMC, resulting in the more complicated:
TclObject
TclString
if (type == pmc_type( interpreter, string_from_cstring(interpreter, "TclString", 9)) )
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.
group GROUPNAME
loadlib
pmclass Match extends Hash dynpmc group match_group { ... }
and then in your .imc or .pasm file:
loadlib $P0, "match_group"
Edit ../config/gen/makefiles/dynclasses.in and append your PMC(s) to the build target:
../config/gen/makefiles/dynclasses.in
$ make $ make shared $ cd dynclasses; make
Try the sample dynamic class, Foo. Note that the numbers listed here will change over time.
$ ./parrot dynclasses/dynfoo.pasm ok 1 41 ok 2 42
There are two other similar test files: dynmatch.pasm and dyntcl.pasm. They do pretty much the same thing as dynfoo, but they load in PMC group libraries instead of a standalone PMC library.
If anything changes inside parrot, be sure to:
$ cd dynclasses; make clean
1 POD Error
The following errors were encountered while parsing the POD:
=over without closing =back
To install Ruby, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Ruby
CPAN shell
perl -MCPAN -e shell install Ruby
For more information on module installation, please visit the detailed CPAN module installation guide.