pmc.ops - PMC Operations
Operations that deal with PMCs,
including creation and destruction,
manipulation,
and introspection.
These operations are used to create PMCs and examine type information.
- new(out PMC,
in INT)
- new(out PMC,
in INT,
invar PMC)
- new(out PMC,
in STR)
- new(out PMC,
in STR,
invar PMC)
- new(out PMC,
inconst PMC)
- new(out PMC,
inconst PMC,
invar PMC)
- new(out PMC,
in PMC)
- Create a new PMC of class $2; look in core_pmcs.h for the base vtable types.
The assembler allows you to specify PMCs by type name,
by key for names in nested namespace,
as well as by integer - you should do this for compatibility,
to avoid problems if the base types get reassigned.
For example:
new P0, 'ResizableBooleanArray'
- Optionally a PMC may be passed to the constructor. It's up to the class what to do with the intializer. See PDD02 for more.
- typeof(out STR, invar PMC)
- typeof(out INT, invar PMC)
- Return the type of PMC in $2.
- typeof(out INT, invar PMC, in KEY)
- typeof(out INT, invar PMC, in INTKEY)
- Return the type of the entry in aggregate PMC in $2 at key $3.
- typeof(out STR, in INT)
- Return the (native) Parrot type of datatype $2.
- find_type(out INT, in STR)
- find_type(out INT, in PMC)
- Find the PMC type or Parrot datatype by name.
- valid_type(out INT, in INT)
- Check if the PMC type or Parrot datatype $2 is valid.
- get_repr(out STR, invar PMC)
- Set $1 to a string representation of $2
A few simple and common PMC operations.
- find_method(out PMC, invar PMC, in STR)
- Looks up method $3 in $2's vtable, placing the corresponding method PMC in $1.
- defined(out INT, invar PMC)
- defined(out INT, invar PMC, in INTKEY)
- defined(out INT, invar PMC, in KEY)
- Test PMC for definedness.
- exists(out INT, invar PMC, in INTKEY)
- exists(out INT, invar PMC, in KEY)
- Tests whether KEY or INTKEY exists in the aggregate PMC. Places the answer in INT.
- delete(invar PMC, in KEY)
- delete(invar PMC, in INTKEY)
- Delete the specified entry $2 from aggregate $1.
- elements(out INT, invar PMC)
- Returns the number of items in aggregate $2
The fast access ops are shortcuts to common operations implemented invar PMCs.
- push(invar PMC, in INT)
- push(invar PMC, in NUM)
- push(invar PMC, in STR)
- push(invar PMC, invar PMC)
- Push $2 onto the end of the aggregate PMC $1, if that operation is defined.
- pop(out INT, invar PMC)
- pop(out NUM, invar PMC)
- pop(out STR, invar PMC)
- pop(out PMC, invar PMC)
- Pop off last entry in the aggregate $2, placing the result in $1.
- unshift(invar PMC, in INT)
- unshift(invar PMC, in NUM)
- unshift(invar PMC, in STR)
- unshift(invar PMC, invar PMC)
- Unshift $2 onto the front of the aggregate PMC $1.
- shift(out INT, invar PMC)
- shift(out NUM, invar PMC)
- shift(out STR, invar PMC)
- shift(out PMC, invar PMC)
- Shift off the first entry in the aggregate $2 and places it in $1.
Ops to deal with PMC properties.
- setprop(invar PMC, in STR, invar PMC)
- Set property $2 to value $3 for PMC $1.
- getprop(out PMC, in STR, invar PMC)
- Get property $2 of PMC $3 and put it in $1.
- delprop(invar PMC, in STR)
- Delete property $2 from PMC $1.
- prophash(out PMC, invar PMC)
- Get a hash for the properties invar PMC $2 and put it in $1. If the property hash doesn't exist, the
Null
PMC is returned.
Ops to PMC freeze, thaw.
- freeze(out STR, invar PMC)
- Set $1 to the frozen image of $2.
- thaw(out PMC, in STR)
- Set $1 to a newly created PMC from the image $2.
These functions manipulate the vtable MMD function table.
These functions allow bytecode to register subs or methods and query which sub or method would get called for a particular vtable operation. This way you're not required to drop to C to register a new method variant for addition or subtraction, or one of the other binary MMD operations.
- mmdvtregister(in INT, in INT, in INT, invar PMC)
- Register method $4 as the MMD method for vtable entry $1 for classes $2 and $3.
- mmdvtfind(out PMC, in INT, in INT, in INT)
- Find the sub that would be called for vtable entry $2 for types $3 and $4.
- register(invar PMC)
- Add a reference of PMC $1 to the interpreter's root set of PMCs. This is needed for extensions to make sure that the PMC is properly marked during DOD, if that PMC is not known to Parrot's core elsewhere.
- A PMC can be registered multiple times. If it's unregistered and the registration count reaches zero, it will be destroyed during the next DOD run.
- unregister(invar PMC)
- Remove one reference of $1.
- hash(out INT, invar PMC)
- Set $1 to the hash value of $2.
- get_mro(out PMC, invar PMC)
- Set $1 to the mro array of the PMC $2. Please note that this is a direct reference so messing with it can do harm to the method lookup.
Copyright (C) 2001-2007, The Perl Foundation.
This program is free software. It is subject to the same license as the Parrot interpreter itself.