OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of ssa; | 5 part of ssa; |
6 | 6 |
7 class HValidator extends HInstructionVisitor { | 7 class HValidator extends HInstructionVisitor { |
8 bool isValid = true; | 8 bool isValid = true; |
9 HGraph graph; | 9 HGraph graph; |
10 | 10 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 if (block.last is HJump && block.successors.length != 1) { | 44 if (block.last is HJump && block.successors.length != 1) { |
45 markInvalid("Break or continue node without one successor"); | 45 markInvalid("Break or continue node without one successor"); |
46 } | 46 } |
47 if (block.last is HReturn && | 47 if (block.last is HReturn && |
48 (block.successors.length != 1 || !block.successors[0].isExitBlock())) { | 48 (block.successors.length != 1 || !block.successors[0].isExitBlock())) { |
49 markInvalid("Return node with > 1 succesor or not going to exit-block"); | 49 markInvalid("Return node with > 1 succesor or not going to exit-block"); |
50 } | 50 } |
51 if (block.last is HExit && !block.successors.isEmpty) { | 51 if (block.last is HExit && !block.successors.isEmpty) { |
52 markInvalid("Exit block with successor"); | 52 markInvalid("Exit block with successor"); |
53 } | 53 } |
54 if (block.last is HThrow && !block.successors.isEmpty) { | 54 if (block.last is HThrow && block.successors.length > 1) { |
55 markInvalid("Throw block with successor"); | 55 markInvalid("Throw block with more than one successor"); |
56 } | 56 } |
57 | 57 |
58 if (block.successors.isEmpty && | 58 if (block.successors.isEmpty && |
59 block.last is !HThrow && | 59 block.last is !HThrow && |
60 !block.isExitBlock()) { | 60 !block.isExitBlock()) { |
61 markInvalid("Non-exit or throw block without successor"); | 61 markInvalid("Non-exit or throw block without successor"); |
62 } | 62 } |
63 | 63 |
64 // Check that successors ids are always higher than the current one. | 64 // Check that successors ids are always higher than the current one. |
65 // TODO(floitsch): this is, of course, not true for back-branches. | 65 // TODO(floitsch): this is, of course, not true for back-branches. |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 markInvalid("Instruction in wrong block"); | 172 markInvalid("Instruction in wrong block"); |
173 } | 173 } |
174 if (!hasCorrectInputs()) { | 174 if (!hasCorrectInputs()) { |
175 markInvalid("Incorrect inputs"); | 175 markInvalid("Incorrect inputs"); |
176 } | 176 } |
177 if (!hasCorrectUses()) { | 177 if (!hasCorrectUses()) { |
178 markInvalid("Incorrect uses"); | 178 markInvalid("Incorrect uses"); |
179 } | 179 } |
180 } | 180 } |
181 } | 181 } |
OLD | NEW |