Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(23)

Side by Side Diff: pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart

Issue 1153603006: dart2js cps: Type casts and related changes to type propagation. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Another typo in SExpression unstrngifier Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 library tree_ir_nodes; 5 library tree_ir_nodes;
6 6
7 import '../constants/expressions.dart'; 7 import '../constants/expressions.dart';
8 import '../constants/values.dart' as values; 8 import '../constants/values.dart' as values;
9 import '../dart_types.dart' show DartType, InterfaceType, TypeVariableType; 9 import '../dart_types.dart' show DartType, InterfaceType, TypeVariableType;
10 import '../elements/elements.dart'; 10 import '../elements/elements.dart';
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 /// counter must be decremented by hand when a [Break] becomes orphaned. 71 /// counter must be decremented by hand when a [Break] becomes orphaned.
72 int useCount = 0; 72 int useCount = 0;
73 73
74 /// The [LabeledStatement] or [WhileTrue] binding this label. 74 /// The [LabeledStatement] or [WhileTrue] binding this label.
75 JumpTarget binding; 75 JumpTarget binding;
76 } 76 }
77 77
78 /** 78 /**
79 * A local variable in the tree IR. 79 * A local variable in the tree IR.
80 * 80 *
81 * All tree IR variables are mutable, and may in Dart-mode be referenced inside 81 * All tree IR variables are mutable.
82 * nested functions.
83 * 82 *
84 * To use a variable as an expression, reference it from a [VariableUse], with 83 * To use a variable as an expression, reference it from a [VariableUse], with
85 * one [VariableUse] per expression. 84 * one [VariableUse] per expression.
86 * 85 *
87 * [Variable]s are reference counted. The node constructors [VariableUse], 86 * [Variable]s are reference counted. The node constructors [VariableUse],
88 * [Assign], [FunctionDefinition], and [Try] automatically update the reference 87 * [Assign], [FunctionDefinition], and [Try] automatically update the reference
89 * count for their variables, but when transforming the tree, the transformer 88 * count for their variables, but when transforming the tree, the transformer
90 * is responsible for updating reference counts. 89 * is responsible for updating reference counts.
91 */ 90 */
92 class Variable extends Node { 91 class Variable extends Node {
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 final List<LiteralMapEntry> entries; 316 final List<LiteralMapEntry> entries;
318 317
319 LiteralMap(this.type, this.entries); 318 LiteralMap(this.type, this.entries);
320 319
321 accept(ExpressionVisitor visitor) => visitor.visitLiteralMap(this); 320 accept(ExpressionVisitor visitor) => visitor.visitLiteralMap(this);
322 accept1(ExpressionVisitor1 visitor, arg) { 321 accept1(ExpressionVisitor1 visitor, arg) {
323 return visitor.visitLiteralMap(this, arg); 322 return visitor.visitLiteralMap(this, arg);
324 } 323 }
325 } 324 }
326 325
326 /// Type test or type cast.
327 ///
328 /// Note that if this is a type test, then [type] cannot be `Object`, `dynamic`,
329 /// or the `Null` type. These cases are compiled to other node types.
327 class TypeOperator extends Expression { 330 class TypeOperator extends Expression {
328 Expression value; 331 Expression value;
329 final DartType type; 332 final DartType type;
330 final List<Expression> typeArguments; 333 final List<Expression> typeArguments;
331 final bool isTypeTest; 334 final bool isTypeTest;
332 335
333 TypeOperator(this.value, this.type, this.typeArguments, 336 TypeOperator(this.value, this.type, this.typeArguments,
334 {bool this.isTypeTest}); 337 {bool this.isTypeTest});
335 338
336 accept(ExpressionVisitor visitor) => visitor.visitTypeOperator(this); 339 accept(ExpressionVisitor visitor) => visitor.visitTypeOperator(this);
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
611 variable.writeCount++; // Being a catch parameter counts as a write. 614 variable.writeCount++; // Being a catch parameter counts as a write.
612 } 615 }
613 } 616 }
614 617
615 accept(StatementVisitor visitor) => visitor.visitTry(this); 618 accept(StatementVisitor visitor) => visitor.visitTry(this);
616 accept1(StatementVisitor1 visitor, arg) { 619 accept1(StatementVisitor1 visitor, arg) {
617 return visitor.visitTry(this, arg); 620 return visitor.visitTry(this, arg);
618 } 621 }
619 } 622 }
620 623
624 /// A statement that is known to be unreachable.
625 class Unreachable extends Statement {
626 Statement get next => null;
627 void set next(Statement value) => throw 'UNREACHABLE';
628
629 accept(StatementVisitor visitor) => visitor.visitUnreachable(this);
630 accept1(StatementVisitor1 visitor, arg) {
631 return visitor.visitUnreachable(this, arg);
632 }
633 }
634
621 class FunctionDefinition extends Node { 635 class FunctionDefinition extends Node {
622 final ExecutableElement element; 636 final ExecutableElement element;
623 final List<Variable> parameters; 637 final List<Variable> parameters;
624 Statement body; 638 Statement body;
625 639
626 /// Creates a function definition and updates `writeCount` for [parameters]. 640 /// Creates a function definition and updates `writeCount` for [parameters].
627 FunctionDefinition(this.element, this.parameters, this.body) { 641 FunctionDefinition(this.element, this.parameters, this.body) {
628 for (Variable param in parameters) { 642 for (Variable param in parameters) {
629 param.writeCount++; // Being a parameter counts as a write. 643 param.writeCount++; // Being a parameter counts as a write.
630 } 644 }
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 S visitReturn(Return node); 835 S visitReturn(Return node);
822 S visitThrow(Throw node); 836 S visitThrow(Throw node);
823 S visitRethrow(Rethrow node); 837 S visitRethrow(Rethrow node);
824 S visitBreak(Break node); 838 S visitBreak(Break node);
825 S visitContinue(Continue node); 839 S visitContinue(Continue node);
826 S visitIf(If node); 840 S visitIf(If node);
827 S visitWhileTrue(WhileTrue node); 841 S visitWhileTrue(WhileTrue node);
828 S visitWhileCondition(WhileCondition node); 842 S visitWhileCondition(WhileCondition node);
829 S visitExpressionStatement(ExpressionStatement node); 843 S visitExpressionStatement(ExpressionStatement node);
830 S visitTry(Try node); 844 S visitTry(Try node);
845 S visitUnreachable(Unreachable node);
831 } 846 }
832 847
833 abstract class StatementVisitor1<S, A> { 848 abstract class StatementVisitor1<S, A> {
834 S visitStatement(Statement node, A arg) => node.accept1(this, arg); 849 S visitStatement(Statement node, A arg) => node.accept1(this, arg);
835 S visitLabeledStatement(LabeledStatement node, A arg); 850 S visitLabeledStatement(LabeledStatement node, A arg);
836 S visitReturn(Return node, A arg); 851 S visitReturn(Return node, A arg);
837 S visitThrow(Throw node, A arg); 852 S visitThrow(Throw node, A arg);
838 S visitRethrow(Rethrow node, A arg); 853 S visitRethrow(Rethrow node, A arg);
839 S visitBreak(Break node, A arg); 854 S visitBreak(Break node, A arg);
840 S visitContinue(Continue node, A arg); 855 S visitContinue(Continue node, A arg);
841 S visitIf(If node, A arg); 856 S visitIf(If node, A arg);
842 S visitWhileTrue(WhileTrue node, A arg); 857 S visitWhileTrue(WhileTrue node, A arg);
843 S visitWhileCondition(WhileCondition node, A arg); 858 S visitWhileCondition(WhileCondition node, A arg);
844 S visitExpressionStatement(ExpressionStatement node, A arg); 859 S visitExpressionStatement(ExpressionStatement node, A arg);
845 S visitTry(Try node, A arg); 860 S visitTry(Try node, A arg);
861 S visitUnreachable(Unreachable node, A arg);
846 } 862 }
847 863
848 abstract class RecursiveVisitor implements StatementVisitor, ExpressionVisitor { 864 abstract class RecursiveVisitor implements StatementVisitor, ExpressionVisitor {
849 visitExpression(Expression e) => e.accept(this); 865 visitExpression(Expression e) => e.accept(this);
850 visitStatement(Statement s) => s.accept(this); 866 visitStatement(Statement s) => s.accept(this);
851 867
852 visitInnerFunction(FunctionDefinition node); 868 visitInnerFunction(FunctionDefinition node);
853 869
854 visitVariable(Variable variable) {} 870 visitVariable(Variable variable) {}
855 871
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1000 visitExpression(node.target); 1016 visitExpression(node.target);
1001 } 1017 }
1002 1018
1003 visitTypeExpression(TypeExpression node) { 1019 visitTypeExpression(TypeExpression node) {
1004 node.arguments.forEach(visitExpression); 1020 node.arguments.forEach(visitExpression);
1005 } 1021 }
1006 1022
1007 visitCreateInvocationMirror(CreateInvocationMirror node) { 1023 visitCreateInvocationMirror(CreateInvocationMirror node) {
1008 node.arguments.forEach(visitExpression); 1024 node.arguments.forEach(visitExpression);
1009 } 1025 }
1026
1027 visitUnreachable(Unreachable node) {}
1010 } 1028 }
1011 1029
1012 abstract class Transformer implements ExpressionVisitor<Expression>, 1030 abstract class Transformer implements ExpressionVisitor<Expression>,
1013 StatementVisitor<Statement> { 1031 StatementVisitor<Statement> {
1014 Expression visitExpression(Expression e) => e.accept(this); 1032 Expression visitExpression(Expression e) => e.accept(this);
1015 Statement visitStatement(Statement s) => s.accept(this); 1033 Statement visitStatement(Statement s) => s.accept(this);
1016 } 1034 }
1017 1035
1018 class RecursiveTransformer extends Transformer { 1036 class RecursiveTransformer extends Transformer {
1019 void visitInnerFunction(FunctionDefinition node) { 1037 void visitInnerFunction(FunctionDefinition node) {
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
1196 1214
1197 visitTypeExpression(TypeExpression node) { 1215 visitTypeExpression(TypeExpression node) {
1198 _replaceExpressions(node.arguments); 1216 _replaceExpressions(node.arguments);
1199 return node; 1217 return node;
1200 } 1218 }
1201 1219
1202 visitCreateInvocationMirror(CreateInvocationMirror node) { 1220 visitCreateInvocationMirror(CreateInvocationMirror node) {
1203 _replaceExpressions(node.arguments); 1221 _replaceExpressions(node.arguments);
1204 return node; 1222 return node;
1205 } 1223 }
1224
1225 visitUnreachable(Unreachable node) {
1226 return node;
1227 }
1206 } 1228 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart ('k') | pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698