develooper Front page | perl.cvs.parrot | Postings from January 2009

[svn:parrot] r35220 - branches/rvar2/languages/perl6/src/parser

From:
jonathan
Date:
January 8, 2009 11:02
Subject:
[svn:parrot] r35220 - branches/rvar2/languages/perl6/src/parser
Message ID:
20090108190227.F1067CB9F9@x12.develooper.com
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++;
         }



nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About