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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
diff --git a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
index a865f1c6bd6394767f5ed38b483119306bc2bc27..7b495496463d1db2c6ef2080783eff48e7c93c76 100644
--- a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
@@ -424,13 +424,16 @@ class KernelAstAdapter {
ir.Procedure get checkSubtypeOfRuntimeType =>
kernel.functions[_backend.helpers.checkSubtypeOfRuntimeType];
- ir.Procedure get assertHelper =>
- kernel.functions[_backend.helpers.assertHelper];
+ ir.Procedure get throwTypeError =>
+ kernel.functions[_backend.helpers.throwTypeError];
TypeMask get throwTypeErrorType =>
TypeMaskFactory.inferredReturnTypeForElement(
_backend.helpers.throwTypeError, _globalInferenceResults);
+ ir.Procedure get assertHelper =>
+ kernel.functions[_backend.helpers.assertHelper];
+
TypeMask get assertHelperReturnType =>
TypeMaskFactory.inferredReturnTypeForElement(
_backend.helpers.assertHelper, _globalInferenceResults);
@@ -507,7 +510,12 @@ class KernelAstAdapter {
}
ResolutionDartType getDartType(ir.DartType type) {
- return type.accept(_typeConverter);
+ return _typeConverter.convert(type);
+ }
+
+ 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.
+ if (type is ir.InvalidType) return null;
+ return _typeConverter.convert(type);
}
List<ResolutionDartType> getDartTypes(List<ir.DartType> types) {
@@ -530,6 +538,7 @@ class KernelAstAdapter {
}
ResolutionDartType getFunctionReturnType(ir.FunctionNode node) {
+ if (node.returnType is ir.InvalidType) return const ResolutionDynamicType();
return getDartType(node.returnType);
}
@@ -780,12 +789,23 @@ enum ForeignKind {
/// Visitor that converts kernel dart types into [ResolutionDartType].
class DartTypeConverter extends ir.DartTypeVisitor<ResolutionDartType> {
final KernelAstAdapter astAdapter;
+ bool topLevel = true;
DartTypeConverter(this.astAdapter);
- ResolutionDartType visitType(ir.DartType type) => type.accept(this);
+ ResolutionDartType convert(ir.DartType type) {
+ topLevel = true;
+ return type.accept(this);
+ }
+
+ /// Visit a inner type.
+ ResolutionDartType visitType(ir.DartType type) {
+ topLevel = false;
+ return type.accept(this);
+ }
List<ResolutionDartType> visitTypes(List<ir.DartType> types) {
+ topLevel = false;
return new List.generate(
types.length, (int index) => types[index].accept(this));
}
@@ -844,7 +864,12 @@ class DartTypeConverter extends ir.DartTypeVisitor<ResolutionDartType> {
@override
ResolutionDartType visitInvalidType(ir.InvalidType node) {
- throw new UnimplementedError("Invalid types not currently supported");
+ if (topLevel) {
+ throw new UnimplementedError(
+ "Outermost invalid types not currently supported");
+ }
+ // Nested invalid types are treated as `dynamic`.
+ return const ResolutionDynamicType();
}
}
« 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