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

Unified Diff: pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart

Issue 1311353008: dart2js cps: Use a strictness flag on Branch instead of rewriting. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 4 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 side-by-side diff with in-line comments
Download patch
Index: pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
index 24938d43fc8d9cdd8342d984e711759189f30a43..6aeb3d9bcbec13ec652b970a5d5356a98f028b35 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
@@ -654,29 +654,36 @@ class InvokeContinuation extends TailExpression {
accept(Visitor visitor) => visitor.visitInvokeContinuation(this);
}
-/// The base class of things which can be tested and branched on.
-abstract class Condition extends Node {
-}
-
-class IsTrue extends Condition {
- final Reference<Primitive> value;
-
- IsTrue(Primitive val) : value = new Reference<Primitive>(val);
-
- accept(Visitor visitor) => visitor.visitIsTrue(this);
-}
-
/// Choose between a pair of continuations based on a condition value.
///
/// The two continuations must not declare any parameters.
class Branch extends TailExpression {
- final Condition condition;
+ final Reference<Primitive> condition;
final Reference<Continuation> trueContinuation;
final Reference<Continuation> falseContinuation;
- Branch(this.condition, Continuation trueCont, Continuation falseCont)
- : trueContinuation = new Reference<Continuation>(trueCont),
- falseContinuation = new Reference<Continuation>(falseCont);
+ /// If true, only the value `true` satisfies the condition. Otherwise, any
+ /// truthy value satisfies the check.
+ ///
+ /// Non-strict checks are preferable when the condition is known to be a
+ /// boolean.
+ bool isStrictCheck;
+
+ Branch.strict(Primitive condition,
+ Continuation trueCont,
+ Continuation falseCont)
+ : this.condition = new Reference<Primitive>(condition),
+ trueContinuation = new Reference<Continuation>(trueCont),
+ falseContinuation = new Reference<Continuation>(falseCont),
+ isStrictCheck = true;
+
+ Branch.loose(Primitive condition,
+ Continuation trueCont,
+ Continuation falseCont)
+ : this.condition = new Reference<Primitive>(condition),
+ trueContinuation = new Reference<Continuation>(trueCont),
+ falseContinuation = new Reference<Continuation>(falseCont),
+ this.isStrictCheck = false;
accept(Visitor visitor) => visitor.visitBranch(this);
}
@@ -1191,9 +1198,6 @@ abstract class Visitor<T> {
T visitGetIndex(GetIndex node);
T visitSetIndex(SetIndex node);
- // Conditions.
- T visitIsTrue(IsTrue node);
-
// Support for literal foreign code.
T visitForeignCode(ForeignCode node);
}
@@ -1201,9 +1205,6 @@ abstract class Visitor<T> {
/// Visits all non-recursive children of a CPS term, i.e. anything
/// not of type [Expression] or [Continuation].
///
-/// Note that the non-recursive nodes can contain other nodes inside of them,
-/// e.g. [Branch] contains an [IsTrue] which contains a [Reference].
-///
/// The `process*` methods are called in pre-order for every node visited.
/// These can be overridden without disrupting the visitor traversal.
class LeafVisitor implements Visitor {
@@ -1300,7 +1301,7 @@ class LeafVisitor implements Visitor {
processBranch(node);
processReference(node.trueContinuation);
processReference(node.falseContinuation);
- visit(node.condition);
+ processReference(node.condition);
}
processTypeCast(TypeCast node) {}
@@ -1379,12 +1380,6 @@ class LeafVisitor implements Visitor {
node.parameters.forEach(visitParameter);
}
- processIsTrue(IsTrue node) {}
- visitIsTrue(IsTrue node) {
- processIsTrue(node);
- processReference(node.value);
- }
-
processInterceptor(Interceptor node) {}
visitInterceptor(Interceptor node) {
processInterceptor(node);
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart ('k') | pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698