Skip to content

Commit

Permalink
Make it so Stash ~~ Hash, so we can introspect and install stuff into…
Browse files Browse the repository at this point in the history
… it from Perl 6 land.
  • Loading branch information
jnthn committed Jun 25, 2011
1 parent 1e1fab5 commit 2301d8c
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 15 deletions.
25 changes: 12 additions & 13 deletions src/Perl6/Metamodel/BOOTSTRAP.pm
Expand Up @@ -497,22 +497,21 @@ Bool.HOW.publish_parrot_vtable_mapping(Bool);

# Set up Stash type, using a Parrot hash under the hood for storage.
my stub Stash metaclass Perl6::Metamodel::ClassHOW { ... };
Stash.HOW.add_parent(Stash, Cool);
Stash.HOW.add_attribute(Stash, BOOTSTRAPATTR.new(:name<$!symbols>, :type(Mu)));
Stash.HOW.add_parrot_vtable_handler_mapping(Stash, 'get_pmc_keyed', '$!symbols');
Stash.HOW.add_parrot_vtable_handler_mapping(Stash, 'get_pmc_keyed_str', '$!symbols');
Stash.HOW.add_parrot_vtable_handler_mapping(Stash, 'set_pmc_keyed', '$!symbols');
Stash.HOW.add_parrot_vtable_handler_mapping(Stash, 'set_pmc_keyed_str', '$!symbols');
Stash.HOW.add_parrot_vtable_handler_mapping(Stash, 'exists_keyed', '$!symbols');
Stash.HOW.add_parrot_vtable_handler_mapping(Stash, 'exists_keyed_str', '$!symbols');
Stash.HOW.add_parrot_vtable_handler_mapping(Stash, 'get_iter', '$!symbols');
Stash.HOW.add_parent(Stash, Hash);
Stash.HOW.add_parrot_vtable_handler_mapping(EnumMap, 'get_pmc_keyed', '$!storage');
Stash.HOW.add_parrot_vtable_handler_mapping(EnumMap, 'get_pmc_keyed_str', '$!storage');
Stash.HOW.add_parrot_vtable_handler_mapping(EnumMap, 'set_pmc_keyed', '$!storage');
Stash.HOW.add_parrot_vtable_handler_mapping(EnumMap, 'set_pmc_keyed_str', '$!storage');
Stash.HOW.add_parrot_vtable_handler_mapping(EnumMap, 'exists_keyed', '$!storage');
Stash.HOW.add_parrot_vtable_handler_mapping(EnumMap, 'exists_keyed_str', '$!storage');
Stash.HOW.add_parrot_vtable_handler_mapping(EnumMap, 'get_iter', '$!storage');
Stash.HOW.publish_parrot_vtable_handler_mapping(Stash);

# Set this Stash type for the various types of package.
Perl6::Metamodel::PackageHOW.set_stash_type(Stash);
Perl6::Metamodel::ModuleHOW.set_stash_type(Stash);
Perl6::Metamodel::NativeHOW.set_stash_type(Stash);
Perl6::Metamodel::ClassHOW.set_stash_type(Stash);
Perl6::Metamodel::PackageHOW.set_stash_type(Stash, EnumMap);
Perl6::Metamodel::ModuleHOW.set_stash_type(Stash, EnumMap);
Perl6::Metamodel::NativeHOW.set_stash_type(Stash, EnumMap);
Perl6::Metamodel::ClassHOW.set_stash_type(Stash, EnumMap);

# Give everything we've set up so far a Stash.
Perl6::Metamodel::ClassHOW.add_stash(Mu);
Expand Down
6 changes: 4 additions & 2 deletions src/Perl6/Metamodel/Stashing.pm
Expand Up @@ -2,15 +2,17 @@
# code that does its runtime during compile time yet. Really should just
# have a my $stash_type and set/get from that.
role Perl6::Metamodel::Stashing {
method set_stash_type($type) {
method set_stash_type($type, $attr_type) {
pir::set_hll_global__vSP('StashType', $type);
pir::set_hll_global__vSP('StashAttrType', $attr_type);
}

method add_stash($type_obj) {
unless pir::isnull__IP(pir::get_hll_global__Ps('StashType')) {
my $stash_type := pir::get_hll_global__Ps('StashType');
my $attr_type := pir::get_hll_global__Ps('StashAttrType');
my $stash := pir::repr_instance_of__PP($stash_type);
pir::setattribute__vPPsP($stash, $stash_type, '$!symbols', my %symbols);
pir::setattribute__vPPsP($stash, $attr_type, '$!storage', my %symbols);
pir::set_who__vPP($type_obj, $stash);
}
$type_obj
Expand Down

0 comments on commit 2301d8c

Please sign in to comment.