Common vtable format for all variables
Maintainer: Dan Sugalski <dan@sidhe.org> Class: Internals PDD Number: 2 Version: 1.1 Status: Developing Last Modified: 13 May 2002 PDD Format: 1 Language: English
13 May 2002
None. First version
Cleaned up the definition. It was a mess.
This RFC presents the vtable entries, and their order, that all variables MUST provide.
All perl variables hide their guts behind a magic perl structure generally referred to as a PMC, or Perl Magic Cookie. Nothing outside the core of perl (in fact, nothing outside the data type's vtable routines) should infer anything about a PMC. (hence the Magic part)
The first parameter to all of these should be the destination PMC.
vtables are neat because they decouple the interface and implementation of various object functions. This does mean, though, that you need to either know what functions are available and what they do, or have some method of finding out. It's faster if you know which vtable entry does what, so that's the method perl's using.
The following functions are singleton functions. (There are no keyed versions of these)
The init vtable method takes an unused PMC as a parameter, and turns it into a PMC appropriate for the class owning the vtable. Called as a class method.
turns the PMC into a PMC of type type. If the morphing can't be reasonably done, for example if an integer is asked to turn into a PerlArray, then the PMC is first destroyed, then recreated as an empty PMC of the new type.
type
This method is primarily used when the interpreter has need of coercing a PMC to a particular type, and isn't meant as a general purpose casting tool. Compilers should only emit valid transformations.
Called by the DOD when its sweeping through the PMCs and has detected that this PMC is both alive and has a custom mark routine. The second parameter is the PMC at the tail of the free PMC list, as passed to mark_used. This should return the new tail of the free PMC list.
mark_used
If a PMC has this set, its responsible for marking all buffers and PMCs under its control as alive. If it does not, those PMCs or buffers may be collected later. This method does not have to call the mark method on any PMCs it marks--the DOD system takes care of that. (So no need to recurse into aggregate PMCs or anything of the sort)
mark
This method may allocate no memory from Parrot, nor may it alter Parrot's internal structures. It should have no side-effects from the C level either.
This routine may not throw an exception.
This method is called by the DOD when it determines that a PMC is dead, and that PMC has marked itself as having a destroy method.
When this method finishes, the PMC will be marked as dead. As such you should make sure that you do not leave any references to it in any parrot structure by the end of the method.
This method may not throw an exception. It will be ignored if it does.
The following functions have two forms, a plain form and a _keyed form. The keyed form takes a KEY for each PMC parameter.
Return the type of the PMC. Type is a unique tag associated with the PMC when the PMC's class is loaded. Negative numbers are considered interpreter-specific, non-public types.
Returns the subtype of a PMC. (Note that this may be unimplemented, and may go away) This is intended to return information about the PMC--what type of number or string it is, whether it's a scalar, hash, array, or list, and suchlike things.
Return the name of the class for the PMC.
Return a clone of the specified PMC. If the PMC is fake, for example we're asking for a clone of an element of an integer array, this must return an appropriate real PMC that holds the fake information.
Returns a subroutine PMC for the passed method name. This subroutine PMC may be cached, so the method must return an equivalent sub PMC each time, or be capable of dealing with the returned sub PMCs being reused.
Returns the native integer value of the PMC.
Returns the native float value of the PMC.
Returns the value of the PMC as a bignum.
Returns the native string value of the PMC. This may be in the encoding of the PMC's choice.
Returns the constant TRUE if the PMC is true, or FALSE if the PMC is false.
Returns the number of elements in the PMC.
Returns the PMC for this PMC. While this may seem nonsensical, it's useful in several circumstances. If the PMC is being accessed with a key, it returns the PMC for the thing being accessed. If the thing being accessed may return something odd, for example a reference, it may return a value different than the PMC that get_pmc is being called on.
Returns TRUE if the PMCs are the same, and FALSE if they're not. In this case, "the same" means identical at a low level. For plain equality, use the is_equal method.
Sets the PMC to the integer value passed. What the PMC does with the passed in integer depends on the class.
Sets the PMC to the numeric value passed in.
Sets the PMC to the passed in bignum value.
Sets the PMC to the passed in string value.
Assigns the source PMC to the destination PMC.
A shortcut version of set_pmc in those cases where the interpreter knows the source and destination PMCs are of the same type.
set_pmc
The following vtable functions come in multiple flavors, one for each numeric type (INTVAL, NUMVAL, BIGNUM) and a PMC. Each flavor has a keyed and non-keyed version.
Each function does what its name implies and returns a PMC with the result.
The following vtable functions all have a keyed and non-keyed version.
There are two forms of this, where value is a STRING and where it's a PMC. In either case, a PMC representing the two source values concatenated together is returned.
Returns TRUE if the two PMCs are generically equivalent, or FALSE if they aren't.
Compares the two PMCs. Returns -1 if the left PMC is smaller, 0 if they are equal, and 1 if the right PMC is smaller. cmp compares the two as PMCs (whatever that means for the class), cmp_num compares them numerically, and cmp_string compares them as strings.
cmp
cmp_num
cmp_string
Does a short-circuiting logical or, and returns the PMC that wins.
Does a short-circuiting logical and and returns the PMC that wins.
Does a logical xor on the two parameters and returns a PMC representing the result.
Where value can be either an INTVAL or a PMC. Returns a PMC that represents the leftmost PMC repeated value times.
Autoincrement the PMC.
Autodecrement the PMC.
This is only valid for keyed access. Returns TRUE or FALSE if the key exists or doesn't in the aggregate being queried.
Checks to see if the PMC is defined. Returns TRUE or FALSE.
Delete the specified entry from the aggregate.
Given the passed in key for the PMC, return the next key.
Return a substring of the passed in PMC. Returns a substring, either as a PMC or a STRING.
To install Scheme, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Scheme
CPAN shell
perl -MCPAN -e shell install Scheme
For more information on module installation, please visit the detailed CPAN module installation guide.