[svn:parrot] r48024 - in branches/gsoc_past_optimization/runtime/parrot/library/PAST: . Transformer

tcurtis at svn.parrot.org tcurtis at svn.parrot.org
Wed Jul 7 05:09:10 UTC 2010


Author: tcurtis
Date: Wed Jul  7 05:09:09 2010
New Revision: 48024
URL: https://trac.parrot.org/parrot/changeset/48024

Log:
Make PAST::Transformer::Dynamic not be a PAST::Walker::Dynamic. Also add traversal of PAST::Var.viviself to PAST::Walker.

Modified:
   branches/gsoc_past_optimization/runtime/parrot/library/PAST/Transformer/Dynamic.nqp
   branches/gsoc_past_optimization/runtime/parrot/library/PAST/Walker.nqp

Modified: branches/gsoc_past_optimization/runtime/parrot/library/PAST/Transformer/Dynamic.nqp
==============================================================================
--- branches/gsoc_past_optimization/runtime/parrot/library/PAST/Transformer/Dynamic.nqp	Wed Jul  7 04:20:56 2010	(r48023)
+++ branches/gsoc_past_optimization/runtime/parrot/library/PAST/Transformer/Dynamic.nqp	Wed Jul  7 05:09:09 2010	(r48024)
@@ -4,12 +4,34 @@
 
 INIT {
     pir::load_bytecode('PAST/Transformer.pbc');
-    pir::load_bytecode('PAST/Walker/Dynamic.pbc');
+}
+
+my sub gen_accessor ($class, $meth, $attr) {
+    $class.HOW().add_method($class, $meth, 
+                             method ($val?) {
+                                 my $result;
+                                 if (pir::defined__IP($val)) {
+                                     pir::setattribute(self, ~$attr, $val);
+                                 }
+                                 else {
+                                     $result := 
+                                       pir::getattribute__PPS(self, $attr);
+                                 }
+                                 $result;
+                             });
 }
 
 class PAST::Transformer::Dynamic is PAST::Transformer {
-    PAST::Transformer::Dynamic.HOW().add_parent(PAST::Transformer::Dynamic,
-                                                PAST::Walker::Dynamic);
+    has $block;
+    has $op;
+    has $stmts;
+    has $val;
+    has $var;
+    has $varlist;
+
+    for (<block op stmts val var varlist>) {
+        gen_accessor(PAST::Transformer::Dynamic, $_, "\$" ~ $_);
+    }
 }
 
 module Tree::Walker {

Modified: branches/gsoc_past_optimization/runtime/parrot/library/PAST/Walker.nqp
==============================================================================
--- branches/gsoc_past_optimization/runtime/parrot/library/PAST/Walker.nqp	Wed Jul  7 04:20:56 2010	(r48023)
+++ branches/gsoc_past_optimization/runtime/parrot/library/PAST/Walker.nqp	Wed Jul  7 05:09:09 2010	(r48024)
@@ -10,7 +10,25 @@
 # Doesn't actually have any unique behavior, but separating it out is good
 # for readability, documentation, and in case we end up needing to change
 # its behavior later.
-class PAST::Walker is Tree::Walker { }
+class PAST::Walker is Tree::Walker {
+    our multi method walkable ($node) { 0; }
+    our multi method walkable (PAST::Node $node) { 1; }
+}
+
+module Tree::Walker {
+    our multi sub walk (PAST::Walker $walker, Integer $i) { }
+    our multi sub walk (PAST::Walker $walker, String $s) { }
+
+    our multi sub walkChildren (PAST::Walker $walker, PAST::Var $var) {
+        my $index := 0;
+        my $max := pir::elements__IP($var);
+        my $child;
+        until ($index == $max) {
+            walk($walker, $var[$index++]);
+        }
+        walk($walker, $var.viviself) if $walker.walkable(viviself);
+    }
+}
 
 # Local Variables:
 #   mode: cperl


More information about the parrot-commits mailing list