Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
tree: 8896a87ec7

Fetching latest commit…

Cannot retrieve the latest commit at this time

..
Failed to load latest commit information.
Defines.in
README.pod
Rules.in
dynlexpad.pmc
ext.pir
file.pmc
foo.pmc
foo2.pmc
gziphandle.pmc
main.pasm
os.pmc
pccmethod_test.pmc
rational.pmc
rotest.pmc
select.pmc
subproxy.pmc

README.pod

DESCRIPTION

This is a build directory for custom PMCs with a sample foo.pmc providing the Foo PMC class.

CREATING A DYNAMIC PMC

  1. Edit/create your foo.pmc source - For details on creating PMCs, see tools/dev/gen_class.pl

    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_get_type_str(interp,
              Parrot_str_new(interp, "TclString", 0));
          }
        }
      }

    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"
  2. Edit src/dynpmc/Defines.in and src/dynpmc/Rules.in, appending your PMC(s) to the build target. These files are processed by Configure.pl to create the real makefile fragments. Next invoke the configure script, then make:
        $ perl Configure.pl
        $ make
  3. If anything changes inside parrot, be sure to:
        $ make dynpmc-clean
Something went wrong with that request. Please try again.