tools/build/pmc2c.pl - PMC definition to C compiler
To see the internal data structures please run:
% perl tools/build/pmc2c.pl --c --debug --debug sarray.pmc | less
First, the program determines the names of the .c and .h files from the basename of the .pmc file (e.g. perlint.pmc -> perlint.c and perlint.h).
Next, the file is searched for /pmclass \w*/ which attempts to find the class being declared.
/pmclass \w*/
Once the class is found, all of its superclasses are scanned and their methods added to the methods of the current PMC. PMCs default to inheriting from 'default'. Only single inheritance is supported.
Once the superclass is determined, it is processed and its method names are extracted and saved.
Next, each method body is processed with various directives (see below) getting replaced by their appropriate values.
Finally, the .c and .h files are generated. The appropriate base class header files are included.
If the no_init flag was used, then no init function is generated. Otherwise, one is generated which sets up the vtable and enters it into the vtables array.
no_init
vtables
The .c file is generated by appending the functions after the various directives have been replaced.
The basic syntax of a PMC file is
A preamble, consisting of code to be copied directly to the .c file
The pmclass declaration:
pmclass
pmclass PMCNAME [flags] {
where flags are:
flags
extends PMCPARENT
All methods not defined in PMCNAME are inherited from the PMCPARENT class. If no parent class is defined, methods from default.pmc are used.
abstract
This class cannot be instantiated. Abstract classes are shown with lower case class names in the class tree.
Used with abstract: No class_init code is generated.
class_init
const_too
Classes with this flag get 2 vtables and 2 enums, one pair with read/write set methods, and one with read-only set methods.
need_ext
The class needs a PMC_EXT structure. For instance, any class using PMC_data will have need_ext.
PMC_EXT
PMC_data
does interface
The class 'does' the given interfaces (the collection of methods which the class implements).
The default is "scalar". Other currently used interfaces are:
array : container PMC with numerically-keyed elements event : PMC that can be used with event queue hash : container PMC with string-keyed elements library : PMC that corresponds to a dynamic library ref : PMC that references another PMC string : PMC that behaves similarly to the base string type boolean : PMC that does true/false only. integer : PMC that behaves similarly to the base int type float : PMC that behaves similarly to the base number type scalar : (only used by the sample src/dynpmc/foo.pmc)
This is not a canonical list, but merely a snapshot of what's in use.
dynpmc
The class is a dynamic class. These have a special class_init routine suitable for dynamic loading at runtime. See the src/dynpmc directory for an example.
group GROUP
The class is part of a group of interrelated PMCs that should be compiled together into a single shared library of the given name. Only valid for dynamic PMCs.
lib LIB
The class needs an external library.
hll HLL
The High level language this PMC corresponds to.
maps Type
The basic parrot PMC type that this PMC correspond to for .HLL usage. For example:
.HLL
pmcclass TclInt hll Tcl maps Integer
allows this PMC to automatically be used when autoboxing I registers to PMCs.
I
Requires the hll flag.
hll
A list of vtable method implementations
The final close }
}
The vtable method bodies can use the following substitutions:
SELF
Converted to the current PMC object of type PMC *.
PMC *
INTERP
Converted to the interpreter object.
OtherClass.SELF.method(a,b,c)
Calls the static vtable method 'method' in OtherClass.
OtherClass
SELF.method(a,b,c)
Calls the vtable method 'method' using the static type of SELF (in other words, calls another method defined in the same file).
DYNSELF.method(a,b,c)
Calls the vtable method 'method' using the dynamic type of SELF.
DYNSELF(a,b,c)
Same as above, but calls the current method.
OtherClass.SUPER(a,b,c)
Calls the overridden implementation of the current method in OtherClass.
SUPER(a,b,c)
Calls the overridden implementation of the current method in the nearest superclass, using the static type of SELF.
DYNSUPER(a,b,c)
As above, but uses the actual dynamic type of SELF.
Leopold Toetsch.
Cleaned up by Matt Diephouse.
Many thanks to the author of pmc2c.pl, many useful code pieces got reused.
To install Parrot::Op, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Parrot::Op
CPAN shell
perl -MCPAN -e shell install Parrot::Op
For more information on module installation, please visit the detailed CPAN module installation guide.