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

Side by Side Diff: lib/src/compiler/code_generator.dart

Issue 2026133002: Throw TypeError instead of CastError for type coercions. (Closed) Base URL: https://github.com/dart-lang/dev_compiler@master
Patch Set: Created 4 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) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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 import 'dart:collection' show HashMap, HashSet; 5 import 'dart:collection' show HashMap, HashSet;
6 import 'dart:math' show min, max; 6 import 'dart:math' show min, max;
7 7
8 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator; 8 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator;
9 import 'package:analyzer/dart/ast/ast.dart'; 9 import 'package:analyzer/dart/ast/ast.dart';
10 import 'package:analyzer/dart/ast/token.dart' show Token, TokenType; 10 import 'package:analyzer/dart/ast/token.dart' show Token, TokenType;
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after
542 } 542 }
543 543
544 // A no-op in JavaScript. 544 // A no-op in JavaScript.
545 return jsFrom; 545 return jsFrom;
546 } 546 }
547 547
548 var type = _emitType(to, 548 var type = _emitType(to,
549 nameType: options.nameTypeTests || options.hoistTypeTests, 549 nameType: options.nameTypeTests || options.hoistTypeTests,
550 hoistType: options.hoistTypeTests); 550 hoistType: options.hoistTypeTests);
551 if (_inAngularTemplate) return jsFrom; 551 if (_inAngularTemplate) return jsFrom;
552 return js.call('dart.as(#, #)', [jsFrom, type]); 552 if (isReifiedCoercion(node)) {
553 return js.call('dart.check(#, #)', [jsFrom, type]);
554 } else {
555 return js.call('dart.as(#, #)', [jsFrom, type]);
556 }
557 }
558
559 bool isReifiedCoercion(AstNode node) {
560 // TODO(sra): Find a better way to recognize reified coercion, since we
561 // can't set the isSynthetic attribute.
562 return (node is AsExpression) && (node.asOperator.offset == 0);
553 } 563 }
554 564
555 @override 565 @override
556 visitIsExpression(IsExpression node) { 566 visitIsExpression(IsExpression node) {
557 // Generate `is` as `dart.is` or `typeof` depending on the RHS type. 567 // Generate `is` as `dart.is` or `typeof` depending on the RHS type.
558 JS.Expression result; 568 JS.Expression result;
559 var type = node.type.type; 569 var type = node.type.type;
560 var lhs = _visit(node.expression); 570 var lhs = _visit(node.expression);
561 var typeofName = _jsTypeofName(type); 571 var typeofName = _jsTypeofName(type);
562 if (typeofName != null) { 572 if (typeofName != null) {
(...skipping 3832 matching lines...) Expand 10 before | Expand all | Expand 10 after
4395 } 4405 }
4396 if (node is BinaryExpression) { 4406 if (node is BinaryExpression) {
4397 JS.Expression shortCircuit(String code) { 4407 JS.Expression shortCircuit(String code) {
4398 return finish(js.call(code, 4408 return finish(js.call(code,
4399 [_visitTest(node.leftOperand), _visitTest(node.rightOperand)])); 4409 [_visitTest(node.leftOperand), _visitTest(node.rightOperand)]));
4400 } 4410 }
4401 var op = node.operator.type.lexeme; 4411 var op = node.operator.type.lexeme;
4402 if (op == '&&') return shortCircuit('# && #'); 4412 if (op == '&&') return shortCircuit('# && #');
4403 if (op == '||') return shortCircuit('# || #'); 4413 if (op == '||') return shortCircuit('# || #');
4404 } 4414 }
4405 // Offset 0 from start of file is syntactically impossible for normal code. 4415 if (isReifiedCoercion(node)) {
4406 // TODO(sra): Find a better way to recognize reified coercion, since we 4416 AsExpression asNode = node;
4407 // can't set the isSynthetic attribute. 4417 assert(asNode.staticType == types.boolType);
4408 if (node is AsExpression && node.asOperator.offset == 0) { 4418 return js.call('dart.test(#)', _visit(asNode.expression));
4409 assert(node.staticType == types.boolType);
4410 return js.call('dart.test(#)', _visit(node.expression));
4411 } 4419 }
4412 JS.Expression result = _visit(node); 4420 JS.Expression result = _visit(node);
4413 if (isNullable(node)) result = js.call('dart.test(#)', result); 4421 if (isNullable(node)) result = js.call('dart.test(#)', result);
4414 return result; 4422 return result;
4415 } 4423 }
4416 4424
4417 /// Like [_emitMemberName], but for declaration sites. 4425 /// Like [_emitMemberName], but for declaration sites.
4418 /// 4426 ///
4419 /// Unlike call sites, we always have an element available, so we can use it 4427 /// Unlike call sites, we always have an element available, so we can use it
4420 /// directly rather than computing the relevant options for [_emitMemberName]. 4428 /// directly rather than computing the relevant options for [_emitMemberName].
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
4664 } 4672 }
4665 4673
4666 bool isLibraryPrefix(Expression node) => 4674 bool isLibraryPrefix(Expression node) =>
4667 node is SimpleIdentifier && node.staticElement is PrefixElement; 4675 node is SimpleIdentifier && node.staticElement is PrefixElement;
4668 4676
4669 LibraryElement _getLibrary(AnalysisContext c, String uri) => 4677 LibraryElement _getLibrary(AnalysisContext c, String uri) =>
4670 c.computeLibraryElement(c.sourceFactory.forUri(uri)); 4678 c.computeLibraryElement(c.sourceFactory.forUri(uri));
4671 4679
4672 bool _isDartRuntime(LibraryElement l) => 4680 bool _isDartRuntime(LibraryElement l) =>
4673 l.isInSdk && l.source.uri.toString() == 'dart:_runtime'; 4681 l.isInSdk && l.source.uri.toString() == 'dart:_runtime';
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698