Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Refactor handling of nodes to !add_param, fixing implicit slurpy array.
t/spec/S03-operators/p5arrow.t passes again.
  • Loading branch information
pmichaud committed May 4, 2009
1 parent cddb162 commit 3c95282
Showing 1 changed file with 24 additions and 20 deletions.
44 changes: 24 additions & 20 deletions src/parser/actions.pm
Expand Up @@ -905,7 +905,6 @@ method signature($/, $key) {
my $block := @?BLOCK.shift();
my $sigpast := $block[0];
my $loadinit := $block.loadinit();
my $sigobj := PAST::Var.new( :name('signature'), :scope('register') );

block_signature($block);

Expand All @@ -923,19 +922,7 @@ method signature($/, $key) {
}

## add parameter to the signature object
my $sigparam := PAST::Op.new( :pasttype('callmethod'),
:name('!add_param'), $sigobj, $name );

## if it's named optional or slurpy, note that in the signature object
if $var.named() ne "" {
$sigparam.push(PAST::Val.new( :value($var.named()), :named('named') ));
}
if $var.viviself() {
$sigparam.push(PAST::Val.new( :value(1), :named('optional') ));
}
if $var.slurpy() {
$sigparam.push(PAST::Val.new( :value(1), :named('slurpy') ));
}
my $sigparam := make_sigparam( $var );

## add any typechecks
my $type := $var<type>;
Expand Down Expand Up @@ -1931,12 +1918,7 @@ method variable($/, $key) {

## add to block's signature
block_signature($?BLOCK);
$?BLOCK.loadinit().push(
PAST::Op.new( :pasttype('callmethod'), :name('!add_param'),
PAST::Var.new( :name('signature'), :scope('register') ),
$varname
)
);
$?BLOCK.loadinit().push( make_sigparam( $param ) );
}
## use twigil-less form afterwards
$twigil := '';
Expand Down Expand Up @@ -1964,6 +1946,8 @@ method variable($/, $key) {
:scope('parameter'),
:slurpy(1) );
if $sigil eq '%' { $param.named(1); }
block_signature($?BLOCK);
$?BLOCK.loadinit().push( make_sigparam( $param ) );
$?BLOCK[0].unshift($param);
}
}
Expand Down Expand Up @@ -3151,6 +3135,26 @@ sub return_handler_past() {
)
}


sub make_sigparam($var) {
my $sigparam :=
PAST::Op.new( :pasttype('callmethod'), :name('!add_param'),
PAST::Var.new( :name('signature'), :scope('register') ),
$var.name()
);
if $var.named() ne "" {
$sigparam.push(PAST::Val.new( :value($var.named()), :named('named') ));
}
if $var.viviself() {
$sigparam.push(PAST::Val.new( :value(1), :named('optional') ));
}
if $var.slurpy() {
$sigparam.push(PAST::Val.new( :value(1), :named('slurpy') ));
}
$sigparam;
}


# Local Variables:
# mode: cperl
# cperl-indent-level: 4
Expand Down

0 comments on commit 3c95282

Please sign in to comment.