| parrotcode: NameSpace PMC | |
| Contents | PMCs |

src/pmc/namespace.pmc - NameSpace PMC

These are the vtable functions for the namespace PMC.

PMC_struct_val ... the hash, bucket->value is either a
var/sub or a namespace, of a FixedPMCarray
of 2 PMCs (namespace, sub/var) slots
PMC_pmc_val ... parent namespace
PMC_data ... name STRING of this namespace part

void init()NameSpace PMC by calling Hash.init and clearing other fields.void mark()void set_pmc_keyed_str(STRING *key, PMC *value)*value as the namespace item for *key. This is part of the raw interface. If the PMC value is exactly a NameSpace, SELF will be set as the parent of that namespace and the name key of value is stored too.void set_pmc_keyed(PMC *key, PMC *value)key is a simple key, it works like above. If key is an array of strings or a chained key, add all components to the namespace.PMC *get_pmc_keyed(PMC *key)key is either an array of strings, or a possibly nested key.PMC *get_pmc_keyed_str(PMC *key)void *get_pointer_keyed_str(STRING *key)void *get_pointer_keyed(PMC *key)STRING *get_string()
METHOD void PMC *add_namespace(STRING *name, PMC *namespace)namespace is not a NameSpace PMC or subclass. METHOD void add_namespace(STRING *name, PMC *namespace) {
STRING *s_ns = CONST_STRING(INTERP, "NameSpace");
if (!VTABLE_isa(INTERP, namespace, s_ns))
real_exception(INTERP, NULL, E_TypeError,
"Invalid type %d in add_namespace()",
namespace->vtable->base_type);
VTABLE_set_pmc_keyed_str(INTERP, SELF, name, namespace);
return;
}
METHOD void PMC *add_sub(STRING *name, PMC *sub)sub is not a Sub PMC or subclass. METHOD void add_sub(STRING *name, PMC *sub) {
STRING *s_sub = CONST_STRING(INTERP, "Sub");
if (!VTABLE_isa(INTERP, sub, s_sub))
real_exception(INTERP, NULL, E_TypeError,
"Invalid type %d in add_sub()", sub->vtable->base_type);
VTABLE_set_pmc_keyed_str(INTERP, SELF, name, sub);
return;
}
METHOD void PMC *add_var(STRING *name, PMC *var) METHOD void add_var(STRING *name, PMC *var) {
VTABLE_set_pmc_keyed_str(INTERP, SELF, name, var);
return;
}
METHOD PMC *get_name() $P2 = $P3.'get_name'()
$S0 = join '::', $P2 # '::Foo::Bar'
METHOD PMC *find_namespace(STRING *name)METHOD PMC *find_sub(STRING *name)METHOD PMC *find_var(STRING *name)METHOD PMC *del_namespace(STRING *name)METHOD PMC *del_sub(STRING *name)METHOD PMC *del_var(STRING *name)METHOD PMC *get_sym(STRING *name)METHOD void export_to(PMC *dest, PMC *what)dest NameSpace. what is an array of (string) names to be exported.METHOD PMC *get_parent()
|
|
|