Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Allow overriding of postcircumfix:<( )>.
  • Loading branch information
jnthn committed Aug 3, 2011
1 parent f72544a commit f5ab8d0
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 2 deletions.
13 changes: 12 additions & 1 deletion src/Perl6/Metamodel/BOOTSTRAP.pm
Expand Up @@ -60,7 +60,6 @@ Mu.HOW.add_parrot_vtable_mapping(Mu, 'get_string',
});
Mu.HOW.add_parrot_vtable_mapping(Mu, 'defined',
sub ($self) { pir::istrue__IP($self.defined()) });
Mu.HOW.publish_parrot_vtable_mapping(Mu);

# class Any is Mu { ... }
my stub Any metaclass Perl6::Metamodel::ClassHOW { ... };
Expand Down Expand Up @@ -394,6 +393,7 @@ Code.HOW.add_method(Code, 'dispatcher', sub ($self) {

# Need to actually run the code block. Also need this available before we finish
# up the stub.
Code.HOW.add_parrot_vtable_mapping(Code, 'invoke', nqp::null());
Code.HOW.add_parrot_vtable_handler_mapping(Code, 'invoke', '$!do');
Code.HOW.publish_parrot_vtable_handler_mapping(Code);
Code.HOW.publish_parrot_vtable_mapping(Code);
Expand Down Expand Up @@ -629,6 +629,17 @@ Perl6::Metamodel::ClassHOW.add_stash(Scalar);
Perl6::Metamodel::ClassHOW.add_stash(Bool);
Perl6::Metamodel::ClassHOW.add_stash(Stash);

# Make Parrot invoke v-table construct a capture and delegate off
# to postcircumfix:<( )>.
Mu.HOW.add_parrot_vtable_mapping(Mu, 'invoke',
sub ($self, *@pos, *%named) {
my $c := nqp::create(Capture);
nqp::bindattr($c, Capture, '$!list', @pos);
nqp::bindattr($c, Capture, '$!hash', %named);
$self.postcircumfix:<( )>($c);
});
Mu.HOW.publish_parrot_vtable_mapping(Mu);

# If we don't already have a PROCESS, set it up.
my $PROCESS;
my $hll_ns := pir::get_root_global__PS('perl6');
Expand Down
2 changes: 1 addition & 1 deletion src/Perl6/Metamodel/ParrotInterop.pm
@@ -1 +1 @@
# Various bits of Parrot interoperability, including vtable overrides and specifying# that an attribute delegates to a given Parrot vtable.role Perl6::Metamodel::ParrotInterop { # Maps vtable names to vtable method overrides. has %!parrot_vtable_mapping; # Maps vtable names to attributes lookup info, so that an override can work by # delegation. has %!parrot_vtable_handler_mapping; method add_parrot_vtable_mapping($obj, $name, $meth) { if pir::defined(%!parrot_vtable_mapping{$name}) { pir::die("Class '" ~ self.name($obj) ~ "' already has a Parrot v-table override for '" ~ $name ~ "'"); } %!parrot_vtable_mapping{$name} := $meth; } method add_parrot_vtable_handler_mapping($obj, $name, $attr_name) { if pir::defined(%!parrot_vtable_handler_mapping{$name}) { pir::die("Class '" ~ self.name($obj) ~ "' already has a Parrot v-table handler for '" ~ $name ~ "'"); } %!parrot_vtable_handler_mapping{$name} := [ $obj, $attr_name ]; } method publish_parrot_vtable_mapping($obj) { my %mapping; for self.mro($obj) { my %map := $_.HOW.parrot_vtable_mappings($_, :local(1)); for %map { unless %mapping{$_.key} { %mapping{$_.key} := $_.value; } } } if +%mapping { pir::stable_publish_vtable_mapping__vPP($obj, %mapping); } } method publish_parrot_vtable_handler_mapping($obj) { my %mapping; for self.mro($obj) { my %map := $_.HOW.parrot_vtable_handler_mappings($_, :local(1)); for %map { unless %mapping{$_.key} { %mapping{$_.key} := $_.value; } } } if +%mapping { pir::stable_publish_vtable_handler_mapping__vPP($obj, %mapping); } } method parrot_vtable_mappings($obj, :$local!) { %!parrot_vtable_mapping } method parrot_vtable_handler_mappings($obj, :$local!) { %!parrot_vtable_handler_mapping }}
# Various bits of Parrot interoperability, including vtable overrides and specifying# that an attribute delegates to a given Parrot vtable.role Perl6::Metamodel::ParrotInterop { # Maps vtable names to vtable method overrides. has %!parrot_vtable_mapping; # Maps vtable names to attributes lookup info, so that an override can work by # delegation. has %!parrot_vtable_handler_mapping; method add_parrot_vtable_mapping($obj, $name, $meth) { if pir::defined(%!parrot_vtable_mapping{$name}) { pir::die("Class '" ~ self.name($obj) ~ "' already has a Parrot v-table override for '" ~ $name ~ "'"); } %!parrot_vtable_mapping{$name} := $meth; } method add_parrot_vtable_handler_mapping($obj, $name, $attr_name) { if pir::defined(%!parrot_vtable_handler_mapping{$name}) { pir::die("Class '" ~ self.name($obj) ~ "' already has a Parrot v-table handler for '" ~ $name ~ "'"); } %!parrot_vtable_handler_mapping{$name} := [ $obj, $attr_name ]; } method publish_parrot_vtable_mapping($obj) { my %mapping; for self.mro($obj) { my %map := $_.HOW.parrot_vtable_mappings($_, :local(1)); for %map { unless pir::exists(%mapping, $_.key) { if $_.value { %mapping{$_.key} := $_.value; } else { %mapping{$_.key} := nqp::null(); } } } } if +%mapping { pir::stable_publish_vtable_mapping__vPP($obj, %mapping); } } method publish_parrot_vtable_handler_mapping($obj) { my %mapping; for self.mro($obj) { my %map := $_.HOW.parrot_vtable_handler_mappings($_, :local(1)); for %map { unless pir::exists(%mapping, $_.key) { if $_.value { %mapping{$_.key} := $_.value; } else { %mapping{$_.key} := nqp::null(); } } } } if +%mapping { pir::stable_publish_vtable_handler_mapping__vPP($obj, %mapping); } } method parrot_vtable_mappings($obj, :$local!) { %!parrot_vtable_mapping } method parrot_vtable_handler_mappings($obj, :$local!) { %!parrot_vtable_handler_mapping }}
Expand Down

0 comments on commit f5ab8d0

Please sign in to comment.