| 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 '../constants/values.dart' as values show ConstantValue; | 6 import '../constants/values.dart' as values show ConstantValue; |
| 7 import '../dart_types.dart' show DartType, InterfaceType, TypeVariableType; | 7 import '../dart_types.dart' show DartType, InterfaceType, TypeVariableType; |
| 8 import '../elements/elements.dart'; | 8 import '../elements/elements.dart'; |
| 9 import '../io/source_information.dart' show SourceInformation; | 9 import '../io/source_information.dart' show SourceInformation; |
| 10 import '../types/types.dart' show TypeMask; | 10 import '../types/types.dart' show TypeMask; |
| (...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 572 bool get isSafeForElimination => true; | 572 bool get isSafeForElimination => true; |
| 573 bool get isSafeForReordering => false; | 573 bool get isSafeForReordering => false; |
| 574 } | 574 } |
| 575 | 575 |
| 576 /// Assign a [MutableVariable]. | 576 /// Assign a [MutableVariable]. |
| 577 /// | 577 /// |
| 578 /// [MutableVariable]s can be seen as ref cells that are not first-class | 578 /// [MutableVariable]s can be seen as ref cells that are not first-class |
| 579 /// values. This can be seen as a dereferencing assignment: | 579 /// values. This can be seen as a dereferencing assignment: |
| 580 /// | 580 /// |
| 581 /// { [variable] := [value]; [body] } | 581 /// { [variable] := [value]; [body] } |
| 582 class SetMutableVariable extends InteriorExpression { | 582 class SetMutableVariable extends Primitive { |
| 583 final Reference<MutableVariable> variable; | 583 final Reference<MutableVariable> variable; |
| 584 final Reference<Primitive> value; | 584 final Reference<Primitive> value; |
| 585 Expression body; | |
| 586 | 585 |
| 587 SetMutableVariable(MutableVariable variable, Primitive value) | 586 SetMutableVariable(MutableVariable variable, Primitive value) |
| 588 : this.variable = new Reference<MutableVariable>(variable), | 587 : this.variable = new Reference<MutableVariable>(variable), |
| 589 this.value = new Reference<Primitive>(value); | 588 this.value = new Reference<Primitive>(value); |
| 590 | 589 |
| 591 accept(Visitor visitor) => visitor.visitSetMutableVariable(this); | 590 accept(Visitor visitor) => visitor.visitSetMutableVariable(this); |
| 592 | 591 |
| 593 Expression plug(Expression expr) { | 592 bool get isSafeForElimination => false; |
| 594 assert(body == null); | 593 bool get isSafeForReordering => false; |
| 595 return body = expr; | |
| 596 } | |
| 597 } | 594 } |
| 598 | 595 |
| 599 /// Invoke a continuation in tail position. | 596 /// Invoke a continuation in tail position. |
| 600 class InvokeContinuation extends TailExpression { | 597 class InvokeContinuation extends TailExpression { |
| 601 Reference<Continuation> continuation; | 598 Reference<Continuation> continuation; |
| 602 List<Reference<Primitive>> arguments; | 599 List<Reference<Primitive>> arguments; |
| 603 SourceInformation sourceInformation; | 600 SourceInformation sourceInformation; |
| 604 | 601 |
| 605 // An invocation of a continuation is recursive if it occurs in the body of | 602 // An invocation of a continuation is recursive if it occurs in the body of |
| 606 // the continuation itself. | 603 // the continuation itself. |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 655 final Reference<Continuation> falseContinuation; | 652 final Reference<Continuation> falseContinuation; |
| 656 | 653 |
| 657 Branch(this.condition, Continuation trueCont, Continuation falseCont) | 654 Branch(this.condition, Continuation trueCont, Continuation falseCont) |
| 658 : trueContinuation = new Reference<Continuation>(trueCont), | 655 : trueContinuation = new Reference<Continuation>(trueCont), |
| 659 falseContinuation = new Reference<Continuation>(falseCont); | 656 falseContinuation = new Reference<Continuation>(falseCont); |
| 660 | 657 |
| 661 accept(Visitor visitor) => visitor.visitBranch(this); | 658 accept(Visitor visitor) => visitor.visitBranch(this); |
| 662 } | 659 } |
| 663 | 660 |
| 664 /// Directly assigns to a field on a given object. | 661 /// Directly assigns to a field on a given object. |
| 665 class SetField extends InteriorExpression { | 662 class SetField extends Primitive { |
| 666 final Reference<Primitive> object; | 663 final Reference<Primitive> object; |
| 667 FieldElement field; | 664 FieldElement field; |
| 668 final Reference<Primitive> value; | 665 final Reference<Primitive> value; |
| 669 Expression body; | |
| 670 | 666 |
| 671 SetField(Primitive object, this.field, Primitive value) | 667 SetField(Primitive object, this.field, Primitive value) |
| 672 : this.object = new Reference<Primitive>(object), | 668 : this.object = new Reference<Primitive>(object), |
| 673 this.value = new Reference<Primitive>(value); | 669 this.value = new Reference<Primitive>(value); |
| 674 | 670 |
| 675 Expression plug(Expression expr) { | |
| 676 assert(body == null); | |
| 677 return body = expr; | |
| 678 } | |
| 679 | |
| 680 accept(Visitor visitor) => visitor.visitSetField(this); | 671 accept(Visitor visitor) => visitor.visitSetField(this); |
| 672 |
| 673 bool get isSafeForElimination => false; |
| 674 bool get isSafeForReordering => false; |
| 681 } | 675 } |
| 682 | 676 |
| 683 /// Directly reads from a field on a given object. | 677 /// Directly reads from a field on a given object. |
| 684 /// | 678 /// |
| 685 /// The [object] must either be `null` or an object that has [field]. | 679 /// The [object] must either be `null` or an object that has [field]. |
| 686 class GetField extends Primitive { | 680 class GetField extends Primitive { |
| 687 final Reference<Primitive> object; | 681 final Reference<Primitive> object; |
| 688 FieldElement field; | 682 FieldElement field; |
| 689 | 683 |
| 690 /// True if the object is known not to be null. | 684 /// True if the object is known not to be null. |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 771 | 765 |
| 772 bool get isSafeForElimination { | 766 bool get isSafeForElimination { |
| 773 return true; | 767 return true; |
| 774 } | 768 } |
| 775 bool get isSafeForReordering { | 769 bool get isSafeForReordering { |
| 776 return element is FunctionElement || element.isFinal; | 770 return element is FunctionElement || element.isFinal; |
| 777 } | 771 } |
| 778 } | 772 } |
| 779 | 773 |
| 780 /// Sets the value of a static field. | 774 /// Sets the value of a static field. |
| 781 class SetStatic extends InteriorExpression { | 775 class SetStatic extends Primitive { |
| 782 final FieldElement element; | 776 final FieldElement element; |
| 783 final Reference<Primitive> value; | 777 final Reference<Primitive> value; |
| 784 Expression body; | |
| 785 final SourceInformation sourceInformation; | 778 final SourceInformation sourceInformation; |
| 786 | 779 |
| 787 SetStatic(this.element, Primitive value, [this.sourceInformation]) | 780 SetStatic(this.element, Primitive value, [this.sourceInformation]) |
| 788 : this.value = new Reference<Primitive>(value); | 781 : this.value = new Reference<Primitive>(value); |
| 789 | 782 |
| 790 Expression plug(Expression expr) { | 783 accept(Visitor visitor) => visitor.visitSetStatic(this); |
| 791 assert(body == null); | |
| 792 return body = expr; | |
| 793 } | |
| 794 | 784 |
| 795 accept(Visitor visitor) => visitor.visitSetStatic(this); | 785 bool get isSafeForElimination => false; |
| 786 bool get isSafeForReordering => false; |
| 796 } | 787 } |
| 797 | 788 |
| 798 /// Reads the value of a lazily initialized static field. | 789 /// Reads the value of a lazily initialized static field. |
| 799 /// | 790 /// |
| 800 /// If the field has not yet been initialized, its initializer is evaluated | 791 /// If the field has not yet been initialized, its initializer is evaluated |
| 801 /// and assigned to the field. | 792 /// and assigned to the field. |
| 802 /// | 793 /// |
| 803 /// [continuation] is then invoked with the value of the field as argument. | 794 /// [continuation] is then invoked with the value of the field as argument. |
| 804 class GetLazyStatic extends CallExpression { | 795 class GetLazyStatic extends CallExpression { |
| 805 final FieldElement element; | 796 final FieldElement element; |
| (...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1281 processTypeTest(node); | 1272 processTypeTest(node); |
| 1282 processReference(node.value); | 1273 processReference(node.value); |
| 1283 node.typeArguments.forEach(processReference); | 1274 node.typeArguments.forEach(processReference); |
| 1284 } | 1275 } |
| 1285 | 1276 |
| 1286 processSetMutableVariable(SetMutableVariable node) {} | 1277 processSetMutableVariable(SetMutableVariable node) {} |
| 1287 visitSetMutableVariable(SetMutableVariable node) { | 1278 visitSetMutableVariable(SetMutableVariable node) { |
| 1288 processSetMutableVariable(node); | 1279 processSetMutableVariable(node); |
| 1289 processReference(node.variable); | 1280 processReference(node.variable); |
| 1290 processReference(node.value); | 1281 processReference(node.value); |
| 1291 visit(node.body); | |
| 1292 } | 1282 } |
| 1293 | 1283 |
| 1294 processGetLazyStatic(GetLazyStatic node) {} | 1284 processGetLazyStatic(GetLazyStatic node) {} |
| 1295 visitGetLazyStatic(GetLazyStatic node) { | 1285 visitGetLazyStatic(GetLazyStatic node) { |
| 1296 processGetLazyStatic(node); | 1286 processGetLazyStatic(node); |
| 1297 processReference(node.continuation); | 1287 processReference(node.continuation); |
| 1298 } | 1288 } |
| 1299 | 1289 |
| 1300 processLiteralList(LiteralList node) {} | 1290 processLiteralList(LiteralList node) {} |
| 1301 visitLiteralList(LiteralList node) { | 1291 visitLiteralList(LiteralList node) { |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1363 processCreateInstance(node); | 1353 processCreateInstance(node); |
| 1364 node.arguments.forEach(processReference); | 1354 node.arguments.forEach(processReference); |
| 1365 node.typeInformation.forEach(processReference); | 1355 node.typeInformation.forEach(processReference); |
| 1366 } | 1356 } |
| 1367 | 1357 |
| 1368 processSetField(SetField node) {} | 1358 processSetField(SetField node) {} |
| 1369 visitSetField(SetField node) { | 1359 visitSetField(SetField node) { |
| 1370 processSetField(node); | 1360 processSetField(node); |
| 1371 processReference(node.object); | 1361 processReference(node.object); |
| 1372 processReference(node.value); | 1362 processReference(node.value); |
| 1373 visit(node.body); | |
| 1374 } | 1363 } |
| 1375 | 1364 |
| 1376 processGetField(GetField node) {} | 1365 processGetField(GetField node) {} |
| 1377 visitGetField(GetField node) { | 1366 visitGetField(GetField node) { |
| 1378 processGetField(node); | 1367 processGetField(node); |
| 1379 processReference(node.object); | 1368 processReference(node.object); |
| 1380 } | 1369 } |
| 1381 | 1370 |
| 1382 processGetStatic(GetStatic node) {} | 1371 processGetStatic(GetStatic node) {} |
| 1383 visitGetStatic(GetStatic node) { | 1372 visitGetStatic(GetStatic node) { |
| 1384 processGetStatic(node); | 1373 processGetStatic(node); |
| 1385 } | 1374 } |
| 1386 | 1375 |
| 1387 processSetStatic(SetStatic node) {} | 1376 processSetStatic(SetStatic node) {} |
| 1388 visitSetStatic(SetStatic node) { | 1377 visitSetStatic(SetStatic node) { |
| 1389 processSetStatic(node); | 1378 processSetStatic(node); |
| 1390 processReference(node.value); | 1379 processReference(node.value); |
| 1391 visit(node.body); | |
| 1392 } | 1380 } |
| 1393 | 1381 |
| 1394 processCreateBox(CreateBox node) {} | 1382 processCreateBox(CreateBox node) {} |
| 1395 visitCreateBox(CreateBox node) { | 1383 visitCreateBox(CreateBox node) { |
| 1396 processCreateBox(node); | 1384 processCreateBox(node); |
| 1397 } | 1385 } |
| 1398 | 1386 |
| 1399 processReifyRuntimeType(ReifyRuntimeType node) {} | 1387 processReifyRuntimeType(ReifyRuntimeType node) {} |
| 1400 visitReifyRuntimeType(ReifyRuntimeType node) { | 1388 visitReifyRuntimeType(ReifyRuntimeType node) { |
| 1401 processReifyRuntimeType(node); | 1389 processReifyRuntimeType(node); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1473 const RemovalVisitor(); | 1461 const RemovalVisitor(); |
| 1474 | 1462 |
| 1475 processReference(Reference reference) { | 1463 processReference(Reference reference) { |
| 1476 reference.unlink(); | 1464 reference.unlink(); |
| 1477 } | 1465 } |
| 1478 | 1466 |
| 1479 static void remove(Node node) { | 1467 static void remove(Node node) { |
| 1480 (const RemovalVisitor()).visit(node); | 1468 (const RemovalVisitor()).visit(node); |
| 1481 } | 1469 } |
| 1482 } | 1470 } |
| OLD | NEW |