Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add post constraint for checking closure parameter signatures
A lot of this was lifted out of make_where_block
  • Loading branch information
hoelzro committed Dec 7, 2014
1 parent de811e5 commit fe8d0d9
Showing 1 changed file with 31 additions and 0 deletions.
31 changes: 31 additions & 0 deletions src/Perl6/Actions.nqp
Expand Up @@ -3751,6 +3751,37 @@ class Perl6::Actions is HLL::Actions does STDActions {
if nqp::istype($*PRECEDING_DECL, $par_type) {
%*PARAM_INFO<dummy> := $*PRECEDING_DECL;
}

if $<name><sigterm> {
unless %*PARAM_INFO<post_constraints> {
%*PARAM_INFO<post_constraints> := [];
}
my $closure_signature := $<name><sigterm><fakesignature>.ast;
my $past := QAST::Block.new(
QAST::Stmts.new(
QAST::Var.new( :name('$_'), :scope('lexical'), :decl('var') )
),
QAST::Stmts.new(
QAST::Op.new(
:op('callmethod'), :name('ACCEPTS'),
$closure_signature,
QAST::Op.new(
:op('callmethod'),
:name('signature'),
QAST::Var.new( :name('$_'), :scope('lexical') )
)
)
),
);
($*W.cur_lexpad())[0].push($past);
my $param := hash(
variable_name => '$_',
nominal_type => $*W.find_symbol(['Mu']));
my $sig := $*W.create_signature(nqp::hash('parameters', [$*W.create_parameter($/, $param)]));
add_signature_binding_code($past, $sig, [$param]);
my $wrapper := $*W.create_code_object($past, 'Block', $sig);
%*PARAM_INFO<post_constraints>.push($wrapper);
}
}

method declare_param($/, $name) {
Expand Down

0 comments on commit fe8d0d9

Please sign in to comment.