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

Unified Diff: pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart

Issue 737353002: cps-ir: Implement boolean conversion in and use it to implement '&&', '||', and '?:'. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 1 month 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/tree_ir/tree_ir_builder.dart
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
index d4ba56ed2a1dd962075aa5193b503d4d0a18cce1..b4680b0657c3c1df25141cc18f4172797f510465 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
@@ -4,11 +4,15 @@
library tree_ir_builder;
-import '../dart2jslib.dart' as dart2js;
import '../dart_types.dart';
import '../elements/elements.dart';
import '../cps_ir/cps_ir_nodes.dart' as cps_ir;
import 'tree_ir_nodes.dart';
+import 'package:compiler/src/js_backend/codegen/unsugar.dart'
+ as js_cps_ir show Boolify;
sigurdm 2014/11/20 12:47:28 package import
+import 'package:compiler/src/constants/expressions.dart';
+import 'package:compiler/src/constants/values.dart';
+import 'package:compiler/src/common.dart' as dart2js;
/**
* Builder translates from CPS-based IR to direct-style Tree.
@@ -473,5 +477,38 @@ class Builder extends cps_ir.Visitor<Node> {
Expression visitIsTrue(cps_ir.IsTrue node) {
return getVariableReference(node.value);
}
+
+ /**
+ * Boolean conversion maps any object o into a boolean. Boolean conversion is
+ * defined by the function application
+ * (bool v){
+ * assert(v != null);
+ * return identical(v, true);
+ * }(o)
+ */
+ Expression visitBoolify(js_cps_ir.Boolify node) {
+ /// TODO(karlklose): implement the assert(v != null) check.
+ return new InvokeStatic(
+ compiler.identicalFunction,
+ identicalSelector,
+ <Expression>[visitIsTrue(node), constantTrue]);
+ }
+
+ // Helpers.
+
+ dart2js.Selector get identicalSelector {
+ return new dart2js.Selector(
+ dart2js.SelectorKind.CALL,
+ 'identical',
+ null,
+ 2);
+ }
+
+ /// TOOD(karlklose): cache this?
+ Constant get constantTrue {
+ ConstantExpression trueValue =
+ new PrimitiveConstantExpression(new TrueConstantValue());
+ return new Constant(trueValue);
+ }
}

Powered by Google App Engine
This is Rietveld 408576698