NAME
src/pmc/class.pmc - defines a class
DESCRIPTION
This class implements the Class PMC, as outlined in docs/pdds/pdd15_objects.pod.
Class is not derived from any other PMC.
Structure
The Class PMC structure (Parrot_Class
) consists of twelve items:
id
The type number of the PMC.
name
The name of the class -- a STRING.
An empty STRING is allocated during initialization.
namespace
The namespace the class is associated with,
if any.
A Null PMC is allocated during initialization.
instantiated
A flag denoting whether this class has been instantiated since last modification.
A native integer with value zero is allocated during initialization.
parents
An array of immediate parent classes.
An empty ResizablePMCArray PMC is allocated during initialization.
all_parents
A cached array of ourself and all parent classes,
in method resolution order (MRO).
A ResizablePMCArray PMC is allocated during initialization,
and is populated with the current class.
roles
An array of the roles this class has been composed from.
An empty ResizablePMCArray PMC is allocated during initialization.
methods
A directory of method names and method bodies this class provides.
An empty Hash PMC is allocated during initialization.
vtable_overrides
A directory of vtable function names and method bodies this class overrides.
An empty Hash PMC is allocated during initialization.
attrib_metadata
A directory of attribute names and attribute metadata this class contains.
An empty Hash PMC is allocated during initialization.
attrib_index
A lookup table for attributes in this class and parents.
A Null PMC is allocated during initialization.
attrib_cache
A cache of visible attribute names to attribute indexes.
A Null PMC is allocated during initialization.
resolve_method
A list of method names the class provides used for name conflict resolution.
An empty ResizablePMCArray PMC is allocated during initialization.
Functions
void init()
Initializes a Class PMC.
void init_pmc(PMC *init_data)
The actual class creation code,
called from STRING *get_string()
Returns the name of the class (without the HLL namespace).
void mark()
Marks any referenced strings and PMCs in the structure as live.
void add_attribute(STRING *name, PMC *type)
Adds the given attribute (void remove_attribute(STRING *name)
Removes the given attribute (void add_method(STRING *name, PMC *sub)
Adds the given sub PMC as a method with the given name.
void remove_method(STRING *name)
Removes the method with the given name.
void add_vtable_override(STRING *name, PMC *sub)
Adds the given sub PMC as a vtable override with the given name.
void add_parent(PMC *parent)
Adds the supplied PMC to the list of parents for the class.
void remove_parent(PMC *parent)
Remove the supplied class object from the list of parents for the class.
Throws an exception if parent is null,
is not a class,
or is not a parent,
or if the class has been instantiated.
void add_role(PMC *role)
Adds the supplied PMC to the list of roles for the class,
provided there are no conflicts.
PMC *inspect_str(STRING *what)
Provides introspection of a specific piece of information about the class.
The available information is:
- name String PMC containing the name of the class
- namespace NameSpace PMC of the the namespace attached to the class.
- attributes Hash keyed on attribute name, where the value is a hash describing it.
- methods Hash keyed on method name, value is an invokable PMC. Includes methods composed in from roles.
- roles Array of Role PMCs. Includes roles done by the roles that were composed into this class.
- parents Array of Class PMCs representing the direct parents of this class.
PMC *inspect()
Returns a Hash describing the class,
with key/value pairs as described in inspect_str.
PMC *clone()
Returns an anonymous copy of the class (with no name and no link to a namespace).
Unsets the instantiated flag,
allowing modifications.
PMC *clone_pmc(PMC *args)
Makes a copy of the class,
then modifies or adds to it based upon the contents of the supplied initialization data.
If a new name or namespace is not supplied in PMC *instantiate(PMC *init)
Creates a new PMC object of the type of the class and calls init().
INTVAL isa_pmc(PMC *class)
Returns whether the class is or inherits from INTVAL isa(STRING *classname)
Returns whether the class is or inherits from INTVAL does(STRING *role_name)
Returns whether the class does the role with the given INTVAL does_pmc(PMC *role)
Returns whether the class does the given INTVAL type()
Returns the integer type of the class.
void visit(PMC *info)
This is used by freeze/thaw to visit the contents of the class.void freeze(PMC *info)
Used to archive the class.
void thaw(PMC *info)
Used to unarchive the class.
INTVAL get_integer()
This is just a temporary hack.
Type ID numbers shouldn't be externally visible to the average PIR user.
However,
we need this for now to interface with functions like Parrot_pmc_new and pmc_reuse,
which take type ID numbers still.
void thawfinish(PMC *info)
Called after the class has been thawed.
void name(STRING *name :optional, int has_name :opt_flag)
Sets the name of the class,
and updates the namespace accordingly.
void get_namespace()
Gets the namespace that this class is attached to.
void resolve_method()
Sets the list of method names that the class provides to resolve conflicts in methods from roles.
When called with no parameter,
returns the list.
void new(PMC *args :slurpy :named)
Creates an instance of the object.
Initializes any attributes specified in the parameter list.
void attributes()
Return a hash where the keys are attribute names and the values are hashes providing a set of key/value pairs describing the attribute.
void add_attribute()
Add an attribute to the class.
Requires a name and,
optionally,
a type.
void methods()
Return a hash where the keys are method names and the values are methods.
void add_method(STRING *name, PMC *sub)
Adds the given sub PMC as a method with the given name.
Delegates to the void add_vtable_override(STRING *name, PMC *sub)
Adds the given sub PMC as a vtable override with the given name.
Delegates to the void remove_method(STRING *name)
Removes the method with the given name.
PMC *find_method(STRING *name)
Walks the MRO of the class and finds the method with the given name.
void parents()
Returns the parents array PMC.
void add_parent(PMC *parent)
Adds the supplied PMC to the list of parents for the class.
void roles()
Returns the roles array PMC.
void add_role(PMC *role, PMC *exclude :optional :named("exclude"), PMC *alias :optional :named("alias"))
Composes a role into a class with the given exclusions and aliases.
void inspect(STRING *what :optional)
Gets all introspection data for the class or,
if the optional string parameter is supplied,
a particular item of introspection data.
void isa(STRING *class_name)
Returns true if this object is or derives from the class named in void does(STRING *role_name)
Returns true if this object or one of its parents performs the named role,
false otherwise.
newclass
opcode.
The init_data
argument may be either the name of the class or a hash of initialization arguments.
The class is attached to the current HLL namespace.
name
) with an optional type
.
Throws an exception if the current class has been instantiated.
Enters the attribute in the attrib_metadata
table.
Returns an error if an attribute of name
already exists.
name
) from the class.
Throws an exception if the current class has been instantiated,
or if the class has no attribute name
.
args
then the cloned class will be anonymous.
The instantiated flag is unset to allow further modifications.
*class
.
*classname
.
*role_name
.
*role
.
*info
is the visit info,
(see include/parrot/pmc_freeze.h).
add_method
vtable.
add_vtable_override
vtable.
class_name
,
false otherwise.