Author: pmichaud
Date: Sat Jan  3 20:45:45 2009
New Revision: 34911

Modified:
   branches/rvar/languages/perl6/src/builtins/guts.pir
   branches/rvar/languages/perl6/src/parser/actions.pm

Log:
[rakudo]: Add 'handles' trait verb.


Modified: branches/rvar/languages/perl6/src/builtins/guts.pir
==============================================================================
--- branches/rvar/languages/perl6/src/builtins/guts.pir (original)
+++ branches/rvar/languages/perl6/src/builtins/guts.pir Sat Jan  3 20:45:45 2009
@@ -470,6 +470,49 @@
     attrhash[$S0] = $P0
     goto attr_loop
   attr_done:
+
+    .const 'Sub' handles = '!handles'
+    $P0 = attr['traitlist']
+    if null $P0 goto traitlist_done
+    it = iter $P0
+  traitlist_loop:
+    unless it goto traitlist_done
+    .local pmc trait
+    trait = shift it
+    $S0 = trait[0]
+    if $S0 != 'trait_verb:handles' goto traitlist_loop
+    .local pmc handles_it
+    $P0 = trait[1]
+    $P0 = 'list'($P0)
+    handles_it = iter $P0
+  handles_loop:
+    unless handles_it goto handles_done
+    $P0 = clone handles
+    $P1 = box name
+    setprop $P0, 'attrname', $P1
+    $P1 = shift handles_it
+    setprop $P0, 'methodname', $P1
+    $S1 = $P1
+    metaclass.'add_method'($S1, $P0)
+    goto handles_loop
+  handles_done:
+    goto traitlist_loop
+  traitlist_done:
+.end
+
+
+.sub '!handles' :method
+    .param pmc args            :slurpy
+    .param pmc options         :slurpy :named
+    .local pmc method, attribute
+    $P0 = getinterp
+    method = $P0['sub']
+    $P1 = getprop 'attrname', method
+    $S1 = $P1
+    attribute = getattribute self, $S1
+    $P1 = getprop 'methodname', method
+    $S1 = $P1
+    .tailcall attribute.$S1(args :flat, options :flat :named)
 .end
 
 

Modified: branches/rvar/languages/perl6/src/parser/actions.pm
==============================================================================
--- branches/rvar/languages/perl6/src/parser/actions.pm (original)
+++ branches/rvar/languages/perl6/src/parser/actions.pm Sat Jan  3 20:45:45 2009
@@ -886,13 +886,16 @@
     if $sym eq 'is' {
         $trait := ~$<name>;
     }
-    make PAST::Op.new( :name('list'), 'trait_auxiliary:' ~ $sym, $trait );
+    make PAST::Op.new( :name('infix:,'), 'trait_auxiliary:' ~ $sym, $trait );
 }
 
 
 method trait_verb($/) {
     my $sym := ~$<sym>;
-    make PAST::Op.new( :name('list'), 'trait_verb:' ~ $sym, 'XXX' );
+    my $value;
+    if $sym eq 'handles' { $value := $( $<EXPR> ); }
+    else { $value := $( $<typename> ); }
+    make PAST::Op.new( :name('infix:,'), 'trait_verb:' ~ $sym, $value );
 }
     
 
@@ -1468,6 +1471,10 @@
                     $init_value.named('init_value');
                     $has.push($init_value);
                 }
+                if $var<traitlist> {
+                    $var<traitlist>.named('traitlist');
+                    $has.push($var<traitlist>);
+                }
                 $block[0].push( $has );
             }
             else { 

Reply via email to