Author: jonathan
Date: Thu Jan 8 11:02:27 2009
New Revision: 35220
Modified:
branches/rvar2/languages/perl6/src/parser/actions.pm
Log:
[rakudo] Restore handling of : param separator for the invocant somewhat. This
fixes some tests, and is a step towards getting multimethods working again.
Modified: branches/rvar2/languages/perl6/src/parser/actions.pm
==============================================================================
--- branches/rvar2/languages/perl6/src/parser/actions.pm (original)
+++ branches/rvar2/languages/perl6/src/parser/actions.pm Thu Jan 8
11:02:27 2009
@@ -949,9 +949,6 @@
my $var := $( $<parameter>[$i] );
my $name := $var.name();
- ## add var node to block
- $sigpast.push( $var );
-
if $var<type_binding> {
$sigpast.push( $var<type_binding> );
}
@@ -983,11 +980,33 @@
}
$sigparam.push(PAST::Val.new(:value($readtype),:named('readtype')));
+ ## if it's an invocant, flag it as such and make the var be a
+ ## lexical that has self register bound to it
+ if $<param_sep>[$i][0] eq ':' {
+ if $i == 0 {
+ $sigparam.push(PAST::Val.new( :value(1),
:named('invocant')));
+ $var.scope('lexical');
+ $var.isdecl(1);
+ $var := PAST::Op.new(
+ :pasttype('bind'),
+ $var,
+ PAST::Var.new( :name('self'), :scope('register') )
+ );
+ }
+ else {
+ $/.panic("Can only use : separator to denote invocant
after first parameter.");
+ }
+ }
+
+ ## handle end of multi-invocant sequence
if ($multi_inv_suppress) {
$sigparam.push(PAST::Val.new(:value(0),:named('multi_invocant')));
}
if $<param_sep>[$i][0] eq ';;' { $multi_inv_suppress := 1; }
+ ## add var node to block
+ $sigpast.push( $var );
+
$loadinit.push($sigparam);
$i++;
}