src/pmc/class.pmc - defines a class
This class implements the Class PMC,
as outlined in docs/pdds/pdd15_objects.pod.
Class is not derived from any other PMC.
The Class PMC structure (Parrot_Class
) consists of twelve items:
id
- The type number of the PMC.
[deprecated: See RT #48024]
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 MRO order.
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 method 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.
vtable_cache
- Cache of the vtable used for objects (only STM).
resolve_method
- A list of method names the class provides used for name conflict resolution.
An empty ResizablePMCArray PMC is allocated during initialization.
void init()
- Initializes a Class PMC.
void init_pmc(PMC *init_data)
- The actual class creation code,
called from
newclass
opcode.
The init
argument may either be the name of the class,
or a hash of initialization arguments.
The class is attatched to the current HLL namespace.
PMC *subclass(PMC *name)
- Creates a subclass,
optionally with a given
name
.
void destroy()
- Free the memory associated with the class's underlying struct.
STRING *get_string()
- Return the name of the class (without the HLL namespace).
void mark()
- Mark any referenced strings and PMCs in the structure as live.
void add_attribute(STRING *name, PMC *type)
- Adds the given attribute (
name
) with an optional type
.
Creates a new class if the current class has been instantiated.
Enters the attribute in the attributes
array.
Returns an error if an attribute of name
already exists.
void add_method(STRING *name, PMC *sub)
- Adds the given sub PMC as a 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 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,
value is 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
args
then the cloned class will be anonymous.
The instantiated flag is unset to allow further modifications.
PMC *instantiate(PMC *init)
- Creates a new PMC object of the type of the class and calls init().
INTVAL isa_pmc(PMC *classname)
- Returns whether the class is or inherits from
*classname
.
INTVAL isa(STRING *classname)
- Returns whether the class is or inherits from
*classname
.
INTVAL does(STRING *role_name)
- Returns whether the class does the role with the given
*rolename
.
INTVAL does_pmc(PMC *role)
- Returns whether the class does the given
*role
.
INTVAL type()
- Returns the integer type of the class.
void visit(visit_info *info)
- This is used by freeze/thaw to visit the contents of the class.
*info
is the visit info,
(see include/parrot/pmc_freeze.h).
void freeze(visit_info *info)
- Used to archive the class.
void thaw(visit_info *info)
- Used to unarchive the class.
void thawfinish(visit_info *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 accoringly.
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
add_method
vtable method.
PMC *find_method(STRING *name)
- Walks the MRO of the class and finds the method with the given name.
void parents()
- Return the parents array PMC.
void add_parent(PMC *parent)
- Adds the supplied PMC to the list of parents for the class.
void roles()
- Return the roles array PMC.
void add_role(PMC *role, PMC *exclude :optional :named("exclude"), PMC *alias :optional :named("alias"))
- Compose 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
class_name
,
false otherwise.
void does(STRING *role_name)
- Returns true if this object or one of its parents performs the named role,
false otherwise.
docs/pdds/pdd15_objects.pod.