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

Unified Diff: lib/src/compiler/code_generator.dart

Issue 1964263002: fuse some null checks with type checks, introduce a special bool variant (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 4 years, 7 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
« no previous file with comments | « lib/runtime/dart_sdk.js ('k') | test/codegen/expect/notnull.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/src/compiler/code_generator.dart
diff --git a/lib/src/compiler/code_generator.dart b/lib/src/compiler/code_generator.dart
index 95dba1cdabaa92703a3e0c6a11ea8fa81638d0fa..c399c8d315a84efc1b43c279d6cf235799ee7c52 100644
--- a/lib/src/compiler/code_generator.dart
+++ b/lib/src/compiler/code_generator.dart
@@ -446,27 +446,44 @@ class CodeGenerator extends GeneralizingAstVisitor
}
@override
- visitAsExpression(AsExpression node) {
- var from = getStaticType(node.expression);
- var to = node.type.type;
-
- var fromExpr = _visit(node.expression);
+ visitAsExpression(AsExpression node) =>
+ _emitCast(node.expression, to: node.type.type);
+
+ /// Emits a cast and/or a null check (i.e. a cast to a non-null type).
+ JS.Expression _emitCast(Expression fromExpr,
+ {DartType to, bool checkNull: false}) {
+ var jsFrom = _visit(fromExpr);
+ var from = getStaticType(fromExpr);
+
+ JS.Expression maybeCheckNull(JS.Expression jsExpr) {
+ if (checkNull && isNullable(fromExpr)) {
+ return js.call('dart.notNull(#)', jsExpr);
+ }
+ return jsExpr;
+ }
// Skip the cast if it's not needed.
- if (rules.isSubtypeOf(from, to)) return fromExpr;
+ if (to == null || rules.isSubtypeOf(from, to)) {
+ return maybeCheckNull(jsFrom);
+ }
// All Dart number types map to a JS double.
if (_isNumberInJS(from) && _isNumberInJS(to)) {
// Make sure to check when converting to int.
if (from != types.intType && to == types.intType) {
- return js.call('dart.asInt(#)', [fromExpr]);
+ // TODO(jmesserly): fuse this with notNull check.
+ return maybeCheckNull(js.call('dart.asInt(#)', [jsFrom]));
}
// A no-op in JavaScript.
- return fromExpr;
+ return maybeCheckNull(jsFrom);
}
- return js.call('dart.as(#, #)', [fromExpr, _emitType(to)]);
+ if (to == types.boolType && checkNull) {
+ return js.call('dart.test(#)', _visit(fromExpr));
+ }
+
+ return maybeCheckNull(js.call('dart.as(#, #)', [jsFrom, _emitType(to)]));
}
@override
@@ -3059,9 +3076,10 @@ class CodeGenerator extends GeneralizingAstVisitor
JS.Expression notNull(Expression expr) {
if (expr == null) return null;
- var jsExpr = _visit(expr);
- if (!isNullable(expr)) return jsExpr;
- return js.call('dart.notNull(#)', jsExpr);
+ if (expr is AsExpression) {
+ return _emitCast(expr.expression, to: expr.type.type, checkNull: true);
+ }
+ return _emitCast(expr, checkNull: true);
}
@override
« no previous file with comments | « lib/runtime/dart_sdk.js ('k') | test/codegen/expect/notnull.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698