/
Pass.nqp
70 lines (60 loc) · 1.95 KB
/
Pass.nqp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
class Tree::Optimizer::Pass;
has @!dependencies;
has $!name;
has $!recursive;
has $!transformation;
has $!when;
our multi method dependencies () { @!dependencies; }
our multi method dependencies (@deps) { @!dependencies := @deps; }
our multi method name () { $!name; }
our multi method name ($name) { $!name := $name; }
our multi method recursive () { $!recursive; }
our multi method recursive ($recursive) { $!recursive := $recursive; }
our multi method transformation () { $!transformation; }
our multi method transformation ($tran) { $!transformation := $tran; }
our multi method when () { $!when; }
our multi method when ($when) { $!when := $when; }
method new ($trans, *%adverbs) {
pir::die(" A pass' transformation must not be undefined.")
unless pir::defined__IP($trans);
my $self := pir::new__PP(self.HOW.get_parrotclass(self));
$self.BUILD(:transformation($trans), |%adverbs);
$self;
}
my $current-gen-name := 0;
sub gen-name () {
'__unnamed_' ~ $current-gen-name++;
}
method BUILD (:$transformation, :$name, :$recursive, :$when, *%rest) {
$!name := $name || gen-name();
$!recursive := $recursive || 0;
$!transformation := $transformation;
$!when := $when;
my $depends-on := %rest<depends-on>;
if $depends-on {
@!dependencies := (pir::isa__IPP($depends-on, String)
?? [ $depends-on ]
!! $depends-on);
}
}
method run ($tree) {
if $!recursive {
self.generate-transformer.walk($tree);
} elsif pir::defined__IPP($!when) {
my $/ := $!when.ACCEPTS($tree, :exact(1));
if $/ {
$!transformation($/);
} else {
$tree;
}
} else {
$!transformation($tree);
}
}
method generate-transformer () {
if pir::defined__IP($!when) {
$!when.transformer_class.new($!when, $!transformation);
} else {
Tree::Optimizer::Transformer::Single.new($!transformation);
}
}