Skip to content

Commit

Permalink
Add tests for PAST::Transformer transforming PAST::Var.viviself and .…
Browse files Browse the repository at this point in the history
…vivibase, and implement it.

git-svn-id: https://svn.parrot.org/parrot/branches/gsoc_past_optimization@48050 d31e2699-5ff4-0310-a27c-f18f2fbe73fe
  • Loading branch information
tcurtis committed Jul 8, 2010
1 parent 3c92fa6 commit 6b475b5
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 6 deletions.
36 changes: 31 additions & 5 deletions runtime/parrot/library/PAST/Transformer.nqp
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,37 @@ INIT {
pir::load_bytecode('Tree/Transformer.pbc');
}

# This class doesn't differ in behavior from Tree::Transformer, but having
# it provides both a specification of what you expect to be transforming
# and a way to easily change its behavior if that becomes necessary in the
# future.
class PAST::Transformer is Tree::Transformer { }
class PAST::Transformer is Tree::Transformer {
our multi method walkable ($node) { 0; }
our multi method walkable (PAST::Node $node) { 1; }
}

module Tree::Walker {
our multi sub walkChildren (PAST::Transformer $walker, PAST::Var $var) {
my $results := pir::new__PP(Capture);
my $index := 0;
my $max := pir::elements__IP($var);
while ($index < $max) {
$results[$index] := walk($walker, $var[$index]);
$index++;
}
$results['viviself'] := $walker.walk($var.viviself)
if $walker.walkable($var.viviself);
$results['vivibase'] := $walker.walk($var.vivibase)
if $walker.walkable($var.vivibase);
$results;
}

our multi sub replaceChildren (PAST::Var $node, $newChildren) {
$node := null;
for $newChildren.list -> $child {
pir::push($node, $child);
}
for $newChildren.hash {
$node.attr($_.key, $_.value, 1);
}
}
}

# Local Variables:
# mode: cperl
Expand Down
16 changes: 15 additions & 1 deletion t/library/pasttransformer.t
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@ INIT {
pir::load_bytecode('PAST/Pattern.pbc');
}

plan(3);
plan(4);
test_change_node_attributes();
test_change_node_types();
test_delete_nodes();
test_traverse_var_attributes();

class Increment is PAST::Transformer { }
class Negate is PAST::Transformer { }
Expand Down Expand Up @@ -107,6 +108,19 @@ sub test_delete_nodes () {
"Nodes can be deleted by PAST::Transformers.");
}

sub test_traverse_var_attributes () {
my $past :=
PAST::Var.new(:viviself(PAST::Val.new(:value(5))),
:vivibase(PAST::Val.new(:value(6))));
my $transformer := Increment.new;
my $result := $transformer.walk($past);
my $target :=
PAST::Pattern::Var.new(:viviself(PAST::Pattern::Val.new(:value(6))),
:vivibase(PAST::Pattern::Val.new(:value(7))));
ok($result.match($target, :pos($result)),
"PAST::Transformer walks PAST::Var.viviself and .vivibase.");
}

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

0 comments on commit 6b475b5

Please sign in to comment.