@@ -22,50 +22,37 @@ class QRegex::Optimizer {
22
22
method all_subtypes ($ node , $ type ) {
23
23
my int $ res := 0 ;
24
24
for $ node {
25
- if $ node . rxtype eq $ type {
26
- $ res ++
27
- } else {
28
- return -1 ;
29
- }
25
+ return -1 if $ node . rxtype ne $ type ;
26
+ $ res ++ ;
30
27
}
31
28
return $ res ;
32
29
}
33
30
34
31
method first_non_concat_child ($ node ) {
35
32
while nqp :: elems (@ ($ node )) >= 1 {
36
- if nqp ::istype($ node , QAST ::Regex) {
37
- if $ node . rxtype eq ' concat' {
38
- if $ node [0 ]. rxtype eq ' qastnode' && $ node [0 ]. subtype eq ' declarative' {
39
- # the debugger puts these all over our code; we should pretend we never saw them.
40
- $ node := $ node [1 ];
41
- } else {
42
- $ node := $ node [0 ];
43
- }
44
- } else {
45
- last ;
46
- }
47
- } else {
48
- last ;
49
- }
33
+ last unless nqp ::istype($ node , QAST ::Regex);
34
+ last unless $ node . rxtype eq ' concat' ;
35
+ $ node := ($ node [0 ]. rxtype eq ' qastnode' && $ node [0 ]. subtype eq ' declarative' )
36
+ ?? $ node [1 ] !! $ node [0 ];
50
37
}
51
38
$ node ;
52
39
}
53
40
54
41
method dont_scan ($ node ) {
55
42
while nqp :: elems (@ ($ node )) >= 1 {
56
- if nqp ::istype($ node , QAST ::Regex) {
57
- if nqp ::istype($ node [0 ], QAST ::Regex) && $ node [0 ]. rxtype eq ' scan' {
58
- $ node . shift ;
59
- last ;
60
- }
61
- if $ node . rxtype eq ' concat' {
62
- $ node := $ node [0 ];
63
- } else {
64
- last ;
65
- }
43
+ last unless nqp ::istype($ node , QAST ::Regex);
44
+
45
+ if nqp ::istype($ node [0 ], QAST ::Regex) && $ node [0 ]. rxtype eq ' scan' {
46
+ $ node . shift ;
47
+ last ;
48
+ }
49
+
50
+ if $ node . rxtype eq ' concat' {
51
+ $ node := $ node [0 ];
66
52
} else {
67
53
last ;
68
54
}
55
+
69
56
}
70
57
}
71
58
@@ -152,45 +139,47 @@ class QRegex::Optimizer {
152
139
}
153
140
154
141
method visit_children ($ node ) {
142
+ if nqp ::isstr($ node ) {
143
+ return ;
144
+ }
145
+
155
146
my int $ i := 0 ;
156
- unless nqp ::isstr($ node ) {
157
- my int $ n := nqp :: elems (@ ($ node ));
158
- while $ i < $ n {
159
- my $ visit := $ node [$ i ];
160
- if nqp ::istype($ visit , QAST ::Regex) {
161
- my $ type := $ visit . rxtype;
162
- if $ type eq ' concat' {
163
- $ node [$ i ] := self . visit_concat($ visit );
164
- } elsif $ type eq ' literal' {
165
- } elsif $ type eq ' quant' {
166
- self . visit_children($ visit );
167
- } elsif $ type eq ' subrule' {
168
- $ node [$ i ] := $ ! main_opt ($ node [$ i ]) if $ ! main_opt ;
169
- $ node [$ i ] := self . simplify_assertion($ visit );
170
- } elsif $ type eq ' qastnode' {
171
- $ node [$ i ] := $ ! main_opt ($ node [$ i ]) if $ ! main_opt ;
172
- } elsif $ type eq ' anchor' {
173
- } elsif $ type eq ' enumcharlist' {
174
- } elsif $ type eq ' cclass' {
175
- } elsif $ type eq ' scan' {
176
- } elsif $ type eq ' charrange' {
177
- } elsif $ type eq ' dynquant' {
178
- $ node [$ i ] := $ ! main_opt ($ node [$ i ]) if $ ! main_opt ;
179
- } elsif $ type eq ' pass' || $ type eq ' fail' {
180
- } else {
181
- # alt, altseq, conjseq, conj, quant
182
- self . visit_children($ visit );
183
- }
184
- } elsif nqp ::istype($ visit , QAST ::Block) {
185
- @ ! outer . push ($ visit );
147
+ my int $ n := nqp :: elems (@ ($ node ));
148
+ while $ i < $ n {
149
+ my $ visit := $ node [$ i ];
150
+ if nqp ::istype($ visit , QAST ::Regex) {
151
+ my $ type := $ visit . rxtype;
152
+ if $ type eq ' concat' {
153
+ $ node [$ i ] := self . visit_concat($ visit );
154
+ } elsif $ type eq ' literal' {
155
+ } elsif $ type eq ' quant' {
186
156
self . visit_children($ visit );
187
- @ ! outer . pop ();
188
- }
189
- else {
157
+ } elsif $ type eq ' subrule' {
158
+ $ node [$ i ] := $ ! main_opt ($ node [$ i ]) if $ ! main_opt ;
159
+ $ node [$ i ] := self . simplify_assertion($ visit );
160
+ } elsif $ type eq ' qastnode' {
161
+ $ node [$ i ] := $ ! main_opt ($ node [$ i ]) if $ ! main_opt ;
162
+ } elsif $ type eq ' anchor' {
163
+ } elsif $ type eq ' enumcharlist' {
164
+ } elsif $ type eq ' cclass' {
165
+ } elsif $ type eq ' scan' {
166
+ } elsif $ type eq ' charrange' {
167
+ } elsif $ type eq ' dynquant' {
168
+ $ node [$ i ] := $ ! main_opt ($ node [$ i ]) if $ ! main_opt ;
169
+ } elsif $ type eq ' pass' || $ type eq ' fail' {
170
+ } else {
171
+ # alt, altseq, conjseq, conj, quant
190
172
self . visit_children($ visit );
191
173
}
192
- $ i := $ i + 1 ;
174
+ } elsif nqp ::istype($ visit , QAST ::Block) {
175
+ @ ! outer . push ($ visit );
176
+ self . visit_children($ visit );
177
+ @ ! outer . pop ();
178
+ }
179
+ else {
180
+ self . visit_children($ visit );
193
181
}
182
+ $ i := $ i + 1 ;
194
183
}
195
184
}
196
185
}
0 commit comments