| Index: pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
|
| diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
|
| index 9f2ad07848b1c694769e936095049a85586fa190..6d8676e59209d3c0aad37acbca8e06d06c05d295 100644
|
| --- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
|
| +++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
|
| @@ -53,6 +53,8 @@ import '../util/util.dart';
|
| import 'package:js_runtime/shared/embedded_names.dart'
|
| show JsBuiltin, JsGetName;
|
| import '../constants/values.dart';
|
| +import 'type_mask_system.dart' show
|
| + TypeMaskSystem;
|
|
|
| typedef void IrBuilderCallback(Element element, ir.FunctionDefinition irNode);
|
|
|
| @@ -76,7 +78,8 @@ class IrBuilderTask extends CompilerTask {
|
|
|
| String get name => 'CPS builder';
|
|
|
| - ir.FunctionDefinition buildNode(AstElement element) {
|
| + ir.FunctionDefinition buildNode(AstElement element,
|
| + TypeMaskSystem typeMaskSystem) {
|
| return measure(() {
|
| bailoutMessage = null;
|
|
|
| @@ -88,7 +91,8 @@ class IrBuilderTask extends CompilerTask {
|
|
|
| IrBuilderVisitor builder =
|
| new JsIrBuilderVisitor(
|
| - elementsMapping, compiler, sourceInformationBuilder);
|
| + elementsMapping, compiler, sourceInformationBuilder,
|
| + typeMaskSystem);
|
| ir.FunctionDefinition irNode = builder.buildExecutable(element);
|
| if (irNode == null) {
|
| bailoutMessage = builder.bailoutMessage;
|
| @@ -127,6 +131,7 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| final TreeElements elements;
|
| final Compiler compiler;
|
| final SourceInformationBuilder sourceInformationBuilder;
|
| + final TypeMaskSystem typeMaskSystem;
|
|
|
| /// A map from try statements in the source to analysis information about
|
| /// them.
|
| @@ -157,7 +162,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| /// Construct a top-level visitor.
|
| IrBuilderVisitor(this.elements,
|
| this.compiler,
|
| - this.sourceInformationBuilder);
|
| + this.sourceInformationBuilder,
|
| + this.typeMaskSystem);
|
|
|
| DiagnosticReporter get reporter => compiler.reporter;
|
|
|
| @@ -409,6 +415,21 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| closureScope: getClosureScopeForNode(node));
|
| }
|
|
|
| + /// If compiling with trusted type annotations, assumes that [value] is
|
| + /// now known to be `null` or an instance of [type].
|
| + ///
|
| + /// This is also where we should add type checks in checked mode, but this
|
| + /// is not supported yet.
|
| + ir.Primitive checkType(ir.Primitive value, DartType dartType) {
|
| + if (!compiler.trustTypeAnnotations) return value;
|
| + TypeMask type = typeMaskSystem.subtypesOf(dartType).nullable();
|
| + return irBuilder.buildRefinement(value, type);
|
| + }
|
| +
|
| + ir.Primitive checkTypeVsElement(ir.Primitive value, TypedElement element) {
|
| + return checkType(value, element.type);
|
| + }
|
| +
|
| ir.Primitive visitVariableDefinitions(ast.VariableDefinitions node) {
|
| assert(irBuilder.isOpen);
|
| for (ast.Node definition in node.definitions.nodes) {
|
| @@ -420,6 +441,7 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| assert(!definition.arguments.isEmpty);
|
| assert(definition.arguments.tail.isEmpty);
|
| initialValue = visit(definition.arguments.head);
|
| + initialValue = checkTypeVsElement(initialValue, element);
|
| } else {
|
| assert(definition is ast.Identifier);
|
| }
|
| @@ -1402,7 +1424,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
|
| LocalElement element,
|
| ast.Node rhs,
|
| _) {
|
| - return irBuilder.buildLocalVariableSet(element, visit(rhs));
|
| + ir.Primitive value = visit(rhs);
|
| + value = checkTypeVsElement(value, element);
|
| + return irBuilder.buildLocalVariableSet(element, value);
|
| }
|
|
|
| @override
|
| @@ -2530,8 +2554,9 @@ class JsIrBuilderVisitor extends IrBuilderVisitor {
|
|
|
| JsIrBuilderVisitor(TreeElements elements,
|
| Compiler compiler,
|
| - SourceInformationBuilder sourceInformationBuilder)
|
| - : super(elements, compiler, sourceInformationBuilder);
|
| + SourceInformationBuilder sourceInformationBuilder,
|
| + TypeMaskSystem typeMaskSystem)
|
| + : super(elements, compiler, sourceInformationBuilder, typeMaskSystem);
|
|
|
|
|
| /// Builds the IR for creating an instance of the closure class corresponding
|
| @@ -2684,7 +2709,8 @@ class JsIrBuilderVisitor extends IrBuilderVisitor {
|
| return new JsIrBuilderVisitor(
|
| context.resolvedAst.elements,
|
| compiler,
|
| - sourceInformationBuilder.forContext(context));
|
| + sourceInformationBuilder.forContext(context),
|
| + typeMaskSystem);
|
| }
|
|
|
| /// Builds the IR for an [expression] taken from a different [context].
|
|
|