OLD | NEW |
1 library dart2js.cps_ir_integrity; | 1 library dart2js.cps_ir_integrity; |
2 | 2 |
3 import 'cps_ir_nodes.dart'; | 3 import 'cps_ir_nodes.dart'; |
4 import 'cps_ir_nodes_sexpr.dart'; | 4 import 'cps_ir_nodes_sexpr.dart'; |
5 import '../tracer.dart' as tracer; | 5 import '../tracer.dart' as tracer; |
6 | 6 |
7 /// Dump S-expressions on error if the tracer is enabled. | 7 /// Dump S-expressions on error if the tracer is enabled. |
8 /// | 8 /// |
9 /// Technically this has nothing to do with the tracer, but if you want one | 9 /// Technically this has nothing to do with the tracer, but if you want one |
10 /// enabled, you typically want the other as well, so we use the same flag. | 10 /// enabled, you typically want the other as well, so we use the same flag. |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 enterScope(cont.parameters); | 127 enterScope(cont.parameters); |
128 // Put every continuation in scope at its own body. The isRecursive | 128 // Put every continuation in scope at its own body. The isRecursive |
129 // flag is checked explicitly using [insideContinuations]. | 129 // flag is checked explicitly using [insideContinuations]. |
130 enterScope([cont]); | 130 enterScope([cont]); |
131 enterContinuation(cont); | 131 enterContinuation(cont); |
132 return cont.body; | 132 return cont.body; |
133 } | 133 } |
134 | 134 |
135 @override | 135 @override |
136 visitFunctionDefinition(FunctionDefinition node) { | 136 visitFunctionDefinition(FunctionDefinition node) { |
137 if (node.thisParameter != null) { | 137 if (node.interceptorParameter != null) { |
138 handleDeclaration(node.thisParameter); | 138 handleDeclaration(node.interceptorParameter); |
139 enterScope([node.thisParameter]); | 139 enterScope([node.interceptorParameter]); |
| 140 } |
| 141 if (node.receiverParameter != null) { |
| 142 handleDeclaration(node.receiverParameter); |
| 143 enterScope([node.receiverParameter]); |
140 } | 144 } |
141 node.parameters.forEach(handleDeclaration); | 145 node.parameters.forEach(handleDeclaration); |
142 enterScope(node.parameters); | 146 enterScope(node.parameters); |
143 handleDeclaration(node.returnContinuation); | 147 handleDeclaration(node.returnContinuation); |
144 enterScope([node.returnContinuation]); | 148 enterScope([node.returnContinuation]); |
145 if (!node.returnContinuation.isReturnContinuation) { | 149 if (!node.returnContinuation.isReturnContinuation) { |
146 error('Return continuation with a body', node); | 150 error('Return continuation with a body', node); |
147 } | 151 } |
148 visit(node.body); | 152 visit(node.body); |
149 } | 153 } |
(...skipping 24 matching lines...) Expand all Loading... |
174 error('Recursive InvokeContinuation marked as non-recursive', node); | 178 error('Recursive InvokeContinuation marked as non-recursive', node); |
175 } | 179 } |
176 if (node.isRecursive && !target.isRecursive) { | 180 if (node.isRecursive && !target.isRecursive) { |
177 error('Recursive Continuation was not marked as recursive', node); | 181 error('Recursive Continuation was not marked as recursive', node); |
178 } | 182 } |
179 if (node.argumentRefs.length != target.parameters.length) { | 183 if (node.argumentRefs.length != target.parameters.length) { |
180 error('Arity mismatch in InvokeContinuation', node); | 184 error('Arity mismatch in InvokeContinuation', node); |
181 } | 185 } |
182 } | 186 } |
183 | 187 |
| 188 @override |
| 189 processInvokeMethod(InvokeMethod node) { |
| 190 if (node.callingConvention == CallingConvention.Intercepted) { |
| 191 if (node.interceptorRef == null) { |
| 192 error('No interceptor on intercepted call', node); |
| 193 } |
| 194 } else { |
| 195 if (node.interceptorRef != null) { |
| 196 error('Interceptor on call with ${node.callingConvention}', node); |
| 197 } |
| 198 } |
| 199 } |
| 200 |
184 void checkReferenceChain(Definition def) { | 201 void checkReferenceChain(Definition def) { |
185 Reference previous = null; | 202 Reference previous = null; |
186 for (Reference ref = def.firstRef; ref != null; ref = ref.next) { | 203 for (Reference ref = def.firstRef; ref != null; ref = ref.next) { |
187 if (ref.previous != ref) { | 204 if (ref.previous != ref) { |
188 // Reference was not seen during IR traversal, so it is orphaned. | 205 // Reference was not seen during IR traversal, so it is orphaned. |
189 error('Orphaned reference in reference chain for $def', def); | 206 error('Orphaned reference in reference chain for $def', def); |
190 } | 207 } |
191 // Repair the .previous link that was used for marking. | 208 // Repair the .previous link that was used for marking. |
192 ref.previous = previous; | 209 ref.previous = previous; |
193 previous = ref; | 210 previous = ref; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 } | 265 } |
249 | 266 |
250 @override | 267 @override |
251 processReference(Reference node) { | 268 processReference(Reference node) { |
252 if (node.parent != _parent) { | 269 if (node.parent != _parent) { |
253 error('Parent pointer on $node is ${node.parent} but should be $_parent', | 270 error('Parent pointer on $node is ${node.parent} but should be $_parent', |
254 node); | 271 node); |
255 } | 272 } |
256 } | 273 } |
257 } | 274 } |
OLD | NEW |