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

Side by Side Diff: pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart

Issue 2630633002: dart2js-kernel: special-case InvalidType in 'is' and 'as' (Closed)
Patch Set: format Created 3 years, 11 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) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 'package:js_runtime/shared/embedded_names.dart'; 5 import 'package:js_runtime/shared/embedded_names.dart';
6 import 'package:kernel/ast.dart' as ir; 6 import 'package:kernel/ast.dart' as ir;
7 7
8 import '../common.dart'; 8 import '../common.dart';
9 import '../common/names.dart'; 9 import '../common/names.dart';
10 import '../compiler.dart'; 10 import '../compiler.dart';
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 TypeMaskFactory.inferredReturnTypeForElement( 417 TypeMaskFactory.inferredReturnTypeForElement(
418 _backend.helpers.checkConcurrentModificationError, 418 _backend.helpers.checkConcurrentModificationError,
419 _globalInferenceResults); 419 _globalInferenceResults);
420 420
421 ir.Procedure get checkSubtype => 421 ir.Procedure get checkSubtype =>
422 kernel.functions[_backend.helpers.checkSubtype]; 422 kernel.functions[_backend.helpers.checkSubtype];
423 423
424 ir.Procedure get checkSubtypeOfRuntimeType => 424 ir.Procedure get checkSubtypeOfRuntimeType =>
425 kernel.functions[_backend.helpers.checkSubtypeOfRuntimeType]; 425 kernel.functions[_backend.helpers.checkSubtypeOfRuntimeType];
426 426
427 ir.Procedure get assertHelper => 427 ir.Procedure get throwTypeError =>
428 kernel.functions[_backend.helpers.assertHelper]; 428 kernel.functions[_backend.helpers.throwTypeError];
429 429
430 TypeMask get throwTypeErrorType => 430 TypeMask get throwTypeErrorType =>
431 TypeMaskFactory.inferredReturnTypeForElement( 431 TypeMaskFactory.inferredReturnTypeForElement(
432 _backend.helpers.throwTypeError, _globalInferenceResults); 432 _backend.helpers.throwTypeError, _globalInferenceResults);
433 433
434 ir.Procedure get assertHelper =>
435 kernel.functions[_backend.helpers.assertHelper];
436
434 TypeMask get assertHelperReturnType => 437 TypeMask get assertHelperReturnType =>
435 TypeMaskFactory.inferredReturnTypeForElement( 438 TypeMaskFactory.inferredReturnTypeForElement(
436 _backend.helpers.assertHelper, _globalInferenceResults); 439 _backend.helpers.assertHelper, _globalInferenceResults);
437 440
438 ir.Procedure get assertTest => kernel.functions[_backend.helpers.assertTest]; 441 ir.Procedure get assertTest => kernel.functions[_backend.helpers.assertTest];
439 442
440 TypeMask get assertTestReturnType => 443 TypeMask get assertTestReturnType =>
441 TypeMaskFactory.inferredReturnTypeForElement( 444 TypeMaskFactory.inferredReturnTypeForElement(
442 _backend.helpers.assertTest, _globalInferenceResults); 445 _backend.helpers.assertTest, _globalInferenceResults);
443 446
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 ConstantValue indexConstant = constant.fields.values.single; 503 ConstantValue indexConstant = constant.fields.values.single;
501 if (indexConstant is IntConstantValue) { 504 if (indexConstant is IntConstantValue) {
502 return indexConstant.primitiveValue; 505 return indexConstant.primitiveValue;
503 } 506 }
504 } 507 }
505 } 508 }
506 return null; 509 return null;
507 } 510 }
508 511
509 ResolutionDartType getDartType(ir.DartType type) { 512 ResolutionDartType getDartType(ir.DartType type) {
510 return type.accept(_typeConverter); 513 return _typeConverter.convert(type);
514 }
515
516 ResolutionDartType getDartTypeInvalidNull(ir.DartType type) {
Siggi Cherem (dart-lang) 2017/01/13 16:36:14 nit: rename, some ideas: - getDartTypeIfValid (I
sra1 2017/01/13 18:53:11 Done.
517 if (type is ir.InvalidType) return null;
518 return _typeConverter.convert(type);
511 } 519 }
512 520
513 List<ResolutionDartType> getDartTypes(List<ir.DartType> types) { 521 List<ResolutionDartType> getDartTypes(List<ir.DartType> types) {
514 return types.map(getDartType).toList(); 522 return types.map(getDartType).toList();
515 } 523 }
516 524
517 ResolutionDartType getDartTypeOfListLiteral(ir.ListLiteral list) { 525 ResolutionDartType getDartTypeOfListLiteral(ir.ListLiteral list) {
518 ast.Node node = getNodeOrNull(list); 526 ast.Node node = getNodeOrNull(list);
519 if (node != null) return elements.getType(node); 527 if (node != null) return elements.getType(node);
520 assertNodeIsSynthetic(list); 528 assertNodeIsSynthetic(list);
521 return _compiler.commonElements.listType(getDartType(list.typeArgument)); 529 return _compiler.commonElements.listType(getDartType(list.typeArgument));
522 } 530 }
523 531
524 ResolutionDartType getDartTypeOfMapLiteral(ir.MapLiteral literal) { 532 ResolutionDartType getDartTypeOfMapLiteral(ir.MapLiteral literal) {
525 ast.Node node = getNodeOrNull(literal); 533 ast.Node node = getNodeOrNull(literal);
526 if (node != null) return elements.getType(node); 534 if (node != null) return elements.getType(node);
527 assertNodeIsSynthetic(literal); 535 assertNodeIsSynthetic(literal);
528 return _compiler.commonElements 536 return _compiler.commonElements
529 .mapType(getDartType(literal.keyType), getDartType(literal.valueType)); 537 .mapType(getDartType(literal.keyType), getDartType(literal.valueType));
530 } 538 }
531 539
532 ResolutionDartType getFunctionReturnType(ir.FunctionNode node) { 540 ResolutionDartType getFunctionReturnType(ir.FunctionNode node) {
541 if (node.returnType is ir.InvalidType) return const ResolutionDynamicType();
533 return getDartType(node.returnType); 542 return getDartType(node.returnType);
534 } 543 }
535 544
536 /// Computes the function type corresponding the signature of [node]. 545 /// Computes the function type corresponding the signature of [node].
537 ResolutionFunctionType getFunctionType(ir.FunctionNode node) { 546 ResolutionFunctionType getFunctionType(ir.FunctionNode node) {
538 ResolutionDartType returnType = getFunctionReturnType(node); 547 ResolutionDartType returnType = getFunctionReturnType(node);
539 List<ResolutionDartType> parameterTypes = <ResolutionDartType>[]; 548 List<ResolutionDartType> parameterTypes = <ResolutionDartType>[];
540 List<ResolutionDartType> optionalParameterTypes = <ResolutionDartType>[]; 549 List<ResolutionDartType> optionalParameterTypes = <ResolutionDartType>[];
541 for (ir.VariableDeclaration variable in node.positionalParameters) { 550 for (ir.VariableDeclaration variable in node.positionalParameters) {
542 if (parameterTypes.length == node.requiredParameterCount) { 551 if (parameterTypes.length == node.requiredParameterCount) {
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
773 JS, 782 JS,
774 JS_BUILTIN, 783 JS_BUILTIN,
775 JS_EMBEDDED_GLOBAL, 784 JS_EMBEDDED_GLOBAL,
776 JS_INTERCEPTOR_CONSTANT, 785 JS_INTERCEPTOR_CONSTANT,
777 NONE, 786 NONE,
778 } 787 }
779 788
780 /// Visitor that converts kernel dart types into [ResolutionDartType]. 789 /// Visitor that converts kernel dart types into [ResolutionDartType].
781 class DartTypeConverter extends ir.DartTypeVisitor<ResolutionDartType> { 790 class DartTypeConverter extends ir.DartTypeVisitor<ResolutionDartType> {
782 final KernelAstAdapter astAdapter; 791 final KernelAstAdapter astAdapter;
792 bool topLevel = true;
783 793
784 DartTypeConverter(this.astAdapter); 794 DartTypeConverter(this.astAdapter);
785 795
786 ResolutionDartType visitType(ir.DartType type) => type.accept(this); 796 ResolutionDartType convert(ir.DartType type) {
797 topLevel = true;
798 return type.accept(this);
799 }
800
801 /// Visit a inner type.
802 ResolutionDartType visitType(ir.DartType type) {
803 topLevel = false;
804 return type.accept(this);
805 }
787 806
788 List<ResolutionDartType> visitTypes(List<ir.DartType> types) { 807 List<ResolutionDartType> visitTypes(List<ir.DartType> types) {
808 topLevel = false;
789 return new List.generate( 809 return new List.generate(
790 types.length, (int index) => types[index].accept(this)); 810 types.length, (int index) => types[index].accept(this));
791 } 811 }
792 812
793 @override 813 @override
794 ResolutionDartType visitTypeParameterType(ir.TypeParameterType node) { 814 ResolutionDartType visitTypeParameterType(ir.TypeParameterType node) {
795 if (node.parameter.parent is ir.Class) { 815 if (node.parameter.parent is ir.Class) {
796 ir.Class cls = node.parameter.parent; 816 ir.Class cls = node.parameter.parent;
797 int index = cls.typeParameters.indexOf(node.parameter); 817 int index = cls.typeParameters.indexOf(node.parameter);
798 ClassElement classElement = astAdapter.getElement(cls); 818 ClassElement classElement = astAdapter.getElement(cls);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
837 return const ResolutionVoidType(); 857 return const ResolutionVoidType();
838 } 858 }
839 859
840 @override 860 @override
841 ResolutionDartType visitDynamicType(ir.DynamicType node) { 861 ResolutionDartType visitDynamicType(ir.DynamicType node) {
842 return const ResolutionDynamicType(); 862 return const ResolutionDynamicType();
843 } 863 }
844 864
845 @override 865 @override
846 ResolutionDartType visitInvalidType(ir.InvalidType node) { 866 ResolutionDartType visitInvalidType(ir.InvalidType node) {
847 throw new UnimplementedError("Invalid types not currently supported"); 867 if (topLevel) {
868 throw new UnimplementedError(
869 "Outermost invalid types not currently supported");
870 }
871 // Nested invalid types are treated as `dynamic`.
872 return const ResolutionDynamicType();
848 } 873 }
849 } 874 }
850 875
851 /// Visitor that converts string literals and concatenations of string literals 876 /// Visitor that converts string literals and concatenations of string literals
852 /// into the string value. 877 /// into the string value.
853 class Stringifier extends ir.ExpressionVisitor<String> { 878 class Stringifier extends ir.ExpressionVisitor<String> {
854 @override 879 @override
855 String visitStringLiteral(ir.StringLiteral node) => node.value; 880 String visitStringLiteral(ir.StringLiteral node) => node.value;
856 881
857 @override 882 @override
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
964 989
965 @override 990 @override
966 String get name => null; 991 String get name => null;
967 992
968 @override 993 @override
969 int get nestingLevel => 1; 994 int get nestingLevel => 1;
970 995
971 @override 996 @override
972 ast.Node get statement => null; 997 ast.Node get statement => null;
973 } 998 }
OLDNEW
« pkg/compiler/lib/src/ssa/builder_kernel.dart ('K') | « pkg/compiler/lib/src/ssa/builder_kernel.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698