OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 library dart2js.ir_nodes; | 4 library dart2js.ir_nodes; |
5 | 5 |
6 import 'dart:collection'; | 6 import 'dart:collection'; |
7 import '../constants/values.dart' as values; | 7 import '../constants/values.dart' as values; |
8 import '../dart_types.dart' show DartType, InterfaceType, TypeVariableType; | 8 import '../dart_types.dart' show DartType, InterfaceType, TypeVariableType; |
9 import '../elements/elements.dart'; | 9 import '../elements/elements.dart'; |
10 import '../io/source_information.dart' show SourceInformation; | 10 import '../io/source_information.dart' show SourceInformation; |
(...skipping 1287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1298 | 1298 |
1299 void setParentPointers() { | 1299 void setParentPointers() { |
1300 object.parent = this; | 1300 object.parent = this; |
1301 index.parent = this; | 1301 index.parent = this; |
1302 value.parent = this; | 1302 value.parent = this; |
1303 } | 1303 } |
1304 } | 1304 } |
1305 | 1305 |
1306 /// Reads the value of a static field or tears off a static method. | 1306 /// Reads the value of a static field or tears off a static method. |
1307 /// | 1307 /// |
1308 /// Note that lazily initialized fields should be read using GetLazyStatic. | 1308 /// If [GetStatic] is used to load a lazily initialized static field, it must |
| 1309 /// have been initialized beforehand, and a [witness] must be set to restrict |
| 1310 /// code motion. |
1309 class GetStatic extends Primitive { | 1311 class GetStatic extends Primitive { |
1310 /// Can be [FieldElement] or [FunctionElement]. | 1312 /// Can be [FieldElement] or [FunctionElement]. |
1311 final Element element; | 1313 final Element element; |
1312 final SourceInformation sourceInformation; | 1314 final SourceInformation sourceInformation; |
1313 | 1315 |
| 1316 /// If reading a lazily initialized field, [witness] must refer to a node |
| 1317 /// that initializes the field or always occurs after the field initializer. |
| 1318 /// |
| 1319 /// The value of the witness is not used. |
| 1320 Reference<Primitive> witness; |
| 1321 |
1314 GetStatic(this.element, [this.sourceInformation]); | 1322 GetStatic(this.element, [this.sourceInformation]); |
1315 | 1323 |
| 1324 /// Read a lazily initialized static field that is known to have been |
| 1325 /// initialized by [witness] or earlier. |
| 1326 GetStatic.witnessed(this.element, Primitive witness, [this.sourceInformation]) |
| 1327 : witness = witness == null ? null : new Reference<Primitive>(witness); |
| 1328 |
1316 accept(Visitor visitor) => visitor.visitGetStatic(this); | 1329 accept(Visitor visitor) => visitor.visitGetStatic(this); |
1317 | 1330 |
1318 bool get hasValue => true; | 1331 bool get hasValue => true; |
1319 bool get isSafeForElimination => true; | 1332 bool get isSafeForElimination => true; |
1320 bool get isSafeForReordering { | 1333 bool get isSafeForReordering { |
1321 return element is FunctionElement || element.isFinal; | 1334 return element is FunctionElement || element.isFinal; |
1322 } | 1335 } |
1323 | 1336 |
1324 void setParentPointers() {} | 1337 void setParentPointers() { |
| 1338 if (witness != null) { |
| 1339 witness.parent = this; |
| 1340 } |
| 1341 } |
1325 } | 1342 } |
1326 | 1343 |
1327 /// Sets the value of a static field. | 1344 /// Sets the value of a static field. |
1328 class SetStatic extends Primitive { | 1345 class SetStatic extends Primitive { |
1329 final FieldElement element; | 1346 final FieldElement element; |
1330 final Reference<Primitive> value; | 1347 final Reference<Primitive> value; |
1331 final SourceInformation sourceInformation; | 1348 final SourceInformation sourceInformation; |
1332 | 1349 |
1333 SetStatic(this.element, Primitive value, [this.sourceInformation]) | 1350 SetStatic(this.element, Primitive value, [this.sourceInformation]) |
1334 : this.value = new Reference<Primitive>(value); | 1351 : this.value = new Reference<Primitive>(value); |
(...skipping 766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2101 | 2118 |
2102 processGetField(GetField node) {} | 2119 processGetField(GetField node) {} |
2103 visitGetField(GetField node) { | 2120 visitGetField(GetField node) { |
2104 processGetField(node); | 2121 processGetField(node); |
2105 processReference(node.object); | 2122 processReference(node.object); |
2106 } | 2123 } |
2107 | 2124 |
2108 processGetStatic(GetStatic node) {} | 2125 processGetStatic(GetStatic node) {} |
2109 visitGetStatic(GetStatic node) { | 2126 visitGetStatic(GetStatic node) { |
2110 processGetStatic(node); | 2127 processGetStatic(node); |
| 2128 if (node.witness != null) { |
| 2129 processReference(node.witness); |
| 2130 } |
2111 } | 2131 } |
2112 | 2132 |
2113 processSetStatic(SetStatic node) {} | 2133 processSetStatic(SetStatic node) {} |
2114 visitSetStatic(SetStatic node) { | 2134 visitSetStatic(SetStatic node) { |
2115 processSetStatic(node); | 2135 processSetStatic(node); |
2116 processReference(node.value); | 2136 processReference(node.value); |
2117 } | 2137 } |
2118 | 2138 |
2119 processCreateBox(CreateBox node) {} | 2139 processCreateBox(CreateBox node) {} |
2120 visitCreateBox(CreateBox node) { | 2140 visitCreateBox(CreateBox node) { |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2354 /// Visit a just-deleted subterm and unlink all [Reference]s in it. | 2374 /// Visit a just-deleted subterm and unlink all [Reference]s in it. |
2355 class RemovalVisitor extends TrampolineRecursiveVisitor { | 2375 class RemovalVisitor extends TrampolineRecursiveVisitor { |
2356 processReference(Reference reference) { | 2376 processReference(Reference reference) { |
2357 reference.unlink(); | 2377 reference.unlink(); |
2358 } | 2378 } |
2359 | 2379 |
2360 static void remove(Node node) { | 2380 static void remove(Node node) { |
2361 (new RemovalVisitor()).visit(node); | 2381 (new RemovalVisitor()).visit(node); |
2362 } | 2382 } |
2363 } | 2383 } |
OLD | NEW |