| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 SsaCodeGeneratorTask extends CompilerTask { | 7 class SsaCodeGeneratorTask extends CompilerTask { |
| 8 | 8 |
| 9 final JavaScriptBackend backend; | 9 final JavaScriptBackend backend; |
| 10 | 10 |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 } | 120 } |
| 121 | 121 |
| 122 bool contains(T x) => map.containsKey(x); | 122 bool contains(T x) => map.containsKey(x); |
| 123 | 123 |
| 124 bool remove(T x) => map.remove(x) != null; | 124 bool remove(T x) => map.remove(x) != null; |
| 125 | 125 |
| 126 bool get isEmpty => map.isEmpty; | 126 bool get isEmpty => map.isEmpty; |
| 127 | 127 |
| 128 void forEach(f) => map.keys.forEach(f); | 128 void forEach(f) => map.keys.forEach(f); |
| 129 | 129 |
| 130 T get first => map.keys.iterator().next(); | 130 T get first { |
| 131 var iterator = map.keys.iterator; |
| 132 if (!iterator.moveNext()) throw new StateError("No elements"); |
| 133 return iterator.current; |
| 134 } |
| 131 | 135 |
| 132 get length => map.length; | 136 get length => map.length; |
| 133 } | 137 } |
| 134 | 138 |
| 135 typedef void ElementAction(Element element); | 139 typedef void ElementAction(Element element); |
| 136 | 140 |
| 137 abstract class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { | 141 abstract class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
| 138 /** | 142 /** |
| 139 * Returned by [expressionType] to tell how code can be generated for | 143 * Returned by [expressionType] to tell how code can be generated for |
| 140 * a subgraph. | 144 * a subgraph. |
| (...skipping 995 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1136 } | 1140 } |
| 1137 | 1141 |
| 1138 void emitAssignment(String destination, String source) { | 1142 void emitAssignment(String destination, String source) { |
| 1139 assignVariable(destination, new js.VariableUse(source)); | 1143 assignVariable(destination, new js.VariableUse(source)); |
| 1140 } | 1144 } |
| 1141 | 1145 |
| 1142 /** | 1146 /** |
| 1143 * Sequentialize a list of conceptually parallel copies. Parallel | 1147 * Sequentialize a list of conceptually parallel copies. Parallel |
| 1144 * copies may contain cycles, that this method breaks. | 1148 * copies may contain cycles, that this method breaks. |
| 1145 */ | 1149 */ |
| 1146 void sequentializeCopies(List<Copy> copies, | 1150 void sequentializeCopies(Iterable<Copy> copies, |
| 1147 String tempName, | 1151 String tempName, |
| 1148 void doAssignment(String target, String source)) { | 1152 void doAssignment(String target, String source)) { |
| 1149 // Map to keep track of the current location (ie the variable that | 1153 // Map to keep track of the current location (ie the variable that |
| 1150 // holds the initial value) of a variable. | 1154 // holds the initial value) of a variable. |
| 1151 Map<String, String> currentLocation = new Map<String, String>(); | 1155 Map<String, String> currentLocation = new Map<String, String>(); |
| 1152 | 1156 |
| 1153 // Map to keep track of the initial value of a variable. | 1157 // Map to keep track of the initial value of a variable. |
| 1154 Map<String, String> initialValue = new Map<String, String>(); | 1158 Map<String, String> initialValue = new Map<String, String>(); |
| 1155 | 1159 |
| 1156 // List of variables to assign a value. | 1160 // List of variables to assign a value. |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1219 ready.add(current); | 1223 ready.add(current); |
| 1220 } | 1224 } |
| 1221 } | 1225 } |
| 1222 } | 1226 } |
| 1223 | 1227 |
| 1224 void assignPhisOfSuccessors(HBasicBlock node) { | 1228 void assignPhisOfSuccessors(HBasicBlock node) { |
| 1225 CopyHandler handler = variableNames.getCopyHandler(node); | 1229 CopyHandler handler = variableNames.getCopyHandler(node); |
| 1226 if (handler == null) return; | 1230 if (handler == null) return; |
| 1227 | 1231 |
| 1228 // Map the instructions to strings. | 1232 // Map the instructions to strings. |
| 1229 List<Copy> copies = handler.copies.map((Copy copy) { | 1233 Iterable<Copy> copies = handler.copies.mappedBy((Copy copy) { |
| 1230 return new Copy(variableNames.getName(copy.source), | 1234 return new Copy(variableNames.getName(copy.source), |
| 1231 variableNames.getName(copy.destination)); | 1235 variableNames.getName(copy.destination)); |
| 1232 }); | 1236 }); |
| 1233 | 1237 |
| 1234 sequentializeCopies(copies, variableNames.getSwapTemp(), emitAssignment); | 1238 sequentializeCopies(copies, variableNames.getSwapTemp(), emitAssignment); |
| 1235 | 1239 |
| 1236 for (Copy copy in handler.assignments) { | 1240 for (Copy copy in handler.assignments) { |
| 1237 String name = variableNames.getName(copy.destination); | 1241 String name = variableNames.getName(copy.destination); |
| 1238 use(copy.source); | 1242 use(copy.source); |
| 1239 assignVariable(name, pop()); | 1243 assignVariable(name, pop()); |
| (...skipping 1800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3040 if (leftType.canBeNull() && rightType.canBeNull()) { | 3044 if (leftType.canBeNull() && rightType.canBeNull()) { |
| 3041 if (left.isConstantNull() || right.isConstantNull() || | 3045 if (left.isConstantNull() || right.isConstantNull() || |
| 3042 (leftType.isPrimitive() && leftType == rightType)) { | 3046 (leftType.isPrimitive() && leftType == rightType)) { |
| 3043 return '=='; | 3047 return '=='; |
| 3044 } | 3048 } |
| 3045 return null; | 3049 return null; |
| 3046 } else { | 3050 } else { |
| 3047 return '==='; | 3051 return '==='; |
| 3048 } | 3052 } |
| 3049 } | 3053 } |
| OLD | NEW |