Skip to content

Commit

Permalink
Add support for :recursive, though :when and :recursive still don't w…
Browse files Browse the repository at this point in the history
…ork together.
  • Loading branch information
tcurtis committed Jul 31, 2010
1 parent 91fd0a8 commit da979a4
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 2 deletions.
3 changes: 3 additions & 0 deletions setup.nqp
Expand Up @@ -32,6 +32,7 @@ sub MAIN() {
'build/POST/Pattern.pir', 'src/POST/Pattern.nqp',
'build/Tree/Optimizer.pir', 'src/Tree/Optimizer.nqp',
'build/Tree/Optimizer/Pass.pir', 'src/Tree/Optimizer/Pass.nqp',
'build/Tree/Optimizer/Transformers.pir', 'src/Tree/Optimizer/Transformers.nqp',
'build/Tree/Pattern.pir', 'src/Tree/Pattern.nqp',
'build/Tree/Pattern/Any.pir', 'src/Tree/Pattern/Any.nqp',
'build/Tree/Pattern/Closure.pir', 'src/Tree/Pattern/Closure.nqp',
Expand All @@ -52,6 +53,7 @@ sub MAIN() {
'build/POST/Pattern.pbc', 'build/POST/Pattern.pir',
'build/Tree/Optimizer.pbc', 'build/Tree/Optimizer.pir',
'build/Tree/Optimizer/Pass.pbc', 'build/Tree/Optimizer/Pass.pir',
'build/Tree/Optimizer/Transformers.pbc', 'build/Tree/Optimizer/Transformers.pir',
'build/Tree/Pattern.pbc', 'build/Tree/Pattern.pir',
'build/Tree/Pattern/Any.pbc', 'build/Tree/Pattern/Any.pir',
'build/Tree/Pattern/Closure.pbc', 'build/Tree/Pattern/Closure.pir',
Expand Down Expand Up @@ -79,6 +81,7 @@ sub MAIN() {
build/POST/Pattern.pbc
build/Tree/Optimizer.pbc
build/Tree/Optimizer/Pass.pbc
build/Tree/Optimizer/Transformers.pbc
build/Tree/Pattern.pbc
build/Tree/Pattern/Any.pbc
build/Tree/Pattern/Closure.pbc
Expand Down
20 changes: 18 additions & 2 deletions src/Tree/Optimizer/Pass.nqp
@@ -1,6 +1,11 @@
class Tree::Optimizer::Pass;

INIT {
pir::load_bytecode('Tree/Optimizer/Transformers.pbc');
}

has $!name;
has $!recursive;
has $!transformation;
has $!when;

Expand All @@ -22,14 +27,17 @@ my $current-gen-name := 0;
sub gen-name () {
'__unnamed_' ~ $current-gen-name++;
}
method BUILD (:$transformation, :$name, :$when, *%ignored) {
method BUILD (:$transformation, :$name, :$recursive, :$when, *%ignored) {
$!name := $name || gen-name();
$!recursive := $recursive || 0;
$!transformation := $transformation;
$!when := $when;
}

method run ($tree) {
if pir::defined__IPP($!when) {
if $!recursive {
self.generate-transformer.walk($tree);
} elsif pir::defined__IPP($!when) {
my $/ := $tree ~~ $!when;
if $/ {
$!transformation($/);
Expand All @@ -40,3 +48,11 @@ method run ($tree) {
$!transformation($tree);
}
}

method generate-transformer () {
if pir::defined__IP($!when) {
$!when.transformer_class.new($!when, $!transformation);
} else {
Tree::Optimizer::Transformer::Single.new($!transformation);
}
}
25 changes: 25 additions & 0 deletions src/Tree/Optimizer/Transformers.nqp
@@ -0,0 +1,25 @@
INIT {
pir::load_bytecode('Tree/Transformer.pbc');
}

class Tree::Optimizer::Transformer::Single is Tree::Transformer {
has $!transform;

method new ($transform) {
my $self := pir::new__PP(self.HOW.get_parrotclass(self));
$self.BUILD($transform);
$self;
}

method BUILD ($transform) { $!transform := $transform; }

method transform () { $!transform; }
}

module Tree::Walker {
our multi walk (Tree::Optimizer::Transformer::Single $walker, $node) {
my $result := $walker.transform()($node);
replaceChildren($result, walkChildren($walker, $result));
$result;
}
}

0 comments on commit da979a4

Please sign in to comment.