diff --git a/src/Perl6/Actions.pm b/src/Perl6/Actions.pm index b205f693049..60ef1ec3bcd 100644 --- a/src/Perl6/Actions.pm +++ b/src/Perl6/Actions.pm @@ -2555,7 +2555,7 @@ class Perl6::RegexActions is Regex::P6Regex::Actions { } } -# Takes a block and adds a signature ot it, as well as code to bind the call +# Takes a block and adds a signature to it, as well as code to bind the call # capture against the signature. Returns the name of the signature setup block. sub add_signature($block, $sig_obj, $lazy) { # Set arity. @@ -2576,18 +2576,24 @@ sub add_signature($block, $sig_obj, $lazy) { )); # If lazy, make and push signature setup block. + $block := $sig_obj.ast(1); if $lazy { - my $sig_setup_block := - PAST::Block.new( :blocktype, $sig_obj.ast(1) ); - $block[0].push($sig_setup_block); - PAST::Val.new(:value($sig_setup_block)); + make_lazy_sig_block($block) } else { - $block.loadinit.push($sig_obj.ast(1)); + $block.loadinit.push($block); $block.loadinit.push(PAST::Op.new( :inline(' setprop block, "$!signature", signature') )); } } +# Makes a lazy signature building block. +sub make_lazy_sig_block($block) { + my $sig_setup_block := + PAST::Block.new( :blocktype, $block ); + $block[0].push($sig_setup_block); + PAST::Val.new(:value($sig_setup_block)); +} + # Adds a placeholder parameter to this block's signature. sub add_placeholder_parameter($sigil, $ident, :$named, :$slurpy_pos, :$slurpy_named) { our @BLOCK; @@ -2632,6 +2638,7 @@ sub create_code_object($block, $type, $multiness, $lazy_init) { ); if $lazy_init { $past.push($lazy_init) } $past := $block; + $past := $type; $past } @@ -2924,8 +2931,9 @@ sub prevent_null_return($block) { # one. Used by things doing where clause-ish things. sub where_blockify($expr) { my $past; - if $expr.isa(PAST::Block) { - $past := $expr; + if $expr && $expr eq 'Block' { + my $lazy_name := make_lazy_sig_block($expr); + $past := create_code_object($expr, 'Block', 0, $lazy_name); } else { $past := PAST::Block.new( :blocktype('declaration'),