| Index: pkg/compiler/lib/src/ssa/builder.dart
|
| diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
|
| index 042ac75d1b569b5cdba7d3af37d1698eca6ad3dd..0269ab2ce67abee3aef9a2799da043cffaf9c87c 100644
|
| --- a/pkg/compiler/lib/src/ssa/builder.dart
|
| +++ b/pkg/compiler/lib/src/ssa/builder.dart
|
| @@ -554,7 +554,7 @@ class SsaBuilder extends ast.Visitor
|
| */
|
| List<HInstruction> completeDynamicSendArgumentsList(Selector selector,
|
| FunctionElement function, List<HInstruction> providedArguments) {
|
| - assert(selector.applies(function, compiler.world));
|
| + assert(selector.applies(function, compiler.closedWorld));
|
| FunctionSignature signature = function.functionSignature;
|
| List<HInstruction> compiledArguments = new List<HInstruction>(
|
| signature.parameterCount + 1); // Plus one for receiver.
|
| @@ -648,8 +648,9 @@ class SsaBuilder extends ast.Visitor
|
| element.isGenerativeConstructorBody,
|
| message: "Missing selector for inlining of $element."));
|
| if (selector != null) {
|
| - if (!selector.applies(function, compiler.world)) return false;
|
| - if (mask != null && !mask.canHit(function, selector, compiler.world)) {
|
| + if (!selector.applies(function, compiler.closedWorld)) return false;
|
| + if (mask != null &&
|
| + !mask.canHit(function, selector, compiler.closedWorld)) {
|
| return false;
|
| }
|
| }
|
| @@ -894,7 +895,7 @@ class SsaBuilder extends ast.Visitor
|
| */
|
| HGraph buildMethod(FunctionElement functionElement) {
|
| assert(invariant(functionElement, functionElement.isImplementation));
|
| - graph.calledInLoop = compiler.world.isCalledInLoop(functionElement);
|
| + graph.calledInLoop = compiler.closedWorld.isCalledInLoop(functionElement);
|
| ast.FunctionExpression function = resolvedAst.node;
|
| assert(function != null);
|
| assert(elements.getFunctionDefinition(function) != null);
|
| @@ -1482,8 +1483,8 @@ class SsaBuilder extends ast.Visitor
|
| }, includeSuperAndInjectedMembers: true);
|
|
|
| InterfaceType type = classElement.thisType;
|
| - TypeMask ssaType =
|
| - new TypeMask.nonNullExact(classElement.declaration, compiler.world);
|
| + TypeMask ssaType = new TypeMask.nonNullExact(
|
| + classElement.declaration, compiler.closedWorld);
|
| List<DartType> instantiatedTypes;
|
| addInlinedInstantiation(type);
|
| if (!currentInlinedInstantiations.isEmpty) {
|
| @@ -1596,7 +1597,7 @@ class SsaBuilder extends ast.Visitor
|
| HInvokeConstructorBody invoke = new HInvokeConstructorBody(
|
| body.declaration, bodyCallInputs, backend.nonNullType);
|
| invoke.sideEffects =
|
| - compiler.world.getSideEffectsOfElement(constructor);
|
| + compiler.closedWorld.getSideEffectsOfElement(constructor);
|
| add(invoke);
|
| }
|
| }
|
| @@ -1738,7 +1739,8 @@ class SsaBuilder extends ast.Visitor
|
| type = type.unaliased;
|
| assert(assertTypeInContext(type, original));
|
| if (type.isInterfaceType && !type.treatAsRaw) {
|
| - TypeMask subtype = new TypeMask.subtype(type.element, compiler.world);
|
| + TypeMask subtype =
|
| + new TypeMask.subtype(type.element, compiler.closedWorld);
|
| HInstruction representations = buildTypeArgumentRepresentations(type);
|
| add(representations);
|
| return new HTypeConversion.withTypeRepresentation(
|
| @@ -1779,7 +1781,7 @@ class SsaBuilder extends ast.Visitor
|
| if (type.isObject) return original;
|
| // The type element is either a class or the void element.
|
| Element element = type.element;
|
| - TypeMask mask = new TypeMask.subtype(element, compiler.world);
|
| + TypeMask mask = new TypeMask.subtype(element, compiler.closedWorld);
|
| return new HTypeKnown.pinned(mask, original);
|
| }
|
|
|
| @@ -2424,7 +2426,7 @@ class SsaBuilder extends ast.Visitor
|
| });
|
|
|
| TypeMask type =
|
| - new TypeMask.nonNullExact(closureClassElement, compiler.world);
|
| + new TypeMask.nonNullExact(closureClassElement, compiler.closedWorld);
|
| push(new HCreate(closureClassElement, capturedVariables, type)
|
| ..sourceInformation = sourceInformationBuilder.buildCreate(node));
|
|
|
| @@ -2696,7 +2698,8 @@ class SsaBuilder extends ast.Visitor
|
| // handler in the case of lists, because the constant handler
|
| // does not look at elements in the list.
|
| TypeMask type = TypeMaskFactory.inferredTypeForElement(field, compiler);
|
| - if (!type.containsAll(compiler.world) && !instruction.isConstantNull()) {
|
| + if (!type.containsAll(compiler.closedWorld) &&
|
| + !instruction.isConstantNull()) {
|
| // TODO(13429): The inferrer should know that an element
|
| // cannot be null.
|
| instruction.instructionType = type.nonNullable();
|
| @@ -3042,7 +3045,8 @@ class SsaBuilder extends ast.Visitor
|
| add(representations);
|
| js.Name operator = backend.namer.operatorIs(element);
|
| HInstruction isFieldName = addConstantStringFromName(operator);
|
| - HInstruction asFieldName = compiler.world.hasAnyStrictSubtype(element)
|
| + HInstruction asFieldName = compiler.closedWorld
|
| + .hasAnyStrictSubtype(element)
|
| ? addConstantStringFromName(backend.namer.substitutionName(element))
|
| : graph.addConstantNull(compiler);
|
| List<HInstruction> inputs = <HInstruction>[
|
| @@ -3066,7 +3070,7 @@ class SsaBuilder extends ast.Visitor
|
| }
|
|
|
| HInstruction buildFunctionType(FunctionType type) {
|
| - type.accept(new TypeBuilder(compiler.world), this);
|
| + type.accept(new TypeBuilder(compiler.closedWorld), this);
|
| return pop();
|
| }
|
|
|
| @@ -3683,7 +3687,7 @@ class SsaBuilder extends ast.Visitor
|
| // calling [makeStaticArgumentList].
|
| Selector selector = elements.getSelector(node);
|
| assert(invariant(
|
| - node, selector.applies(function.implementation, compiler.world),
|
| + node, selector.applies(function.implementation, compiler.closedWorld),
|
| message: "$selector does not apply to ${function.implementation}"));
|
| List<HInstruction> inputs = makeStaticArgumentList(
|
| selector.callStructure, node.arguments, function.implementation);
|
| @@ -3848,10 +3852,11 @@ class SsaBuilder extends ast.Visitor
|
| }
|
|
|
| bool needsSubstitutionForTypeVariableAccess(ClassElement cls) {
|
| - ClassWorld classWorld = compiler.world;
|
| + ClassWorld classWorld = compiler.closedWorld;
|
| if (classWorld.isUsedAsMixin(cls)) return true;
|
|
|
| - return compiler.world.anyStrictSubclassOf(cls, (ClassElement subclass) {
|
| + return compiler.closedWorld.anyStrictSubclassOf(cls,
|
| + (ClassElement subclass) {
|
| return !rti.isTrivialSubstitution(subclass, cls);
|
| });
|
| }
|
| @@ -4033,13 +4038,13 @@ class SsaBuilder extends ast.Visitor
|
| isFixedList = true;
|
| TypeMask inferred =
|
| TypeMaskFactory.inferredForNode(sourceElement, send, compiler);
|
| - return inferred.containsAll(compiler.world)
|
| + return inferred.containsAll(compiler.closedWorld)
|
| ? backend.fixedArrayType
|
| : inferred;
|
| } else if (isGrowableListConstructorCall) {
|
| TypeMask inferred =
|
| TypeMaskFactory.inferredForNode(sourceElement, send, compiler);
|
| - return inferred.containsAll(compiler.world)
|
| + return inferred.containsAll(compiler.closedWorld)
|
| ? backend.extendableArrayType
|
| : inferred;
|
| } else if (Elements.isConstructorOfTypedArraySubclass(
|
| @@ -4049,8 +4054,9 @@ class SsaBuilder extends ast.Visitor
|
| TypeMaskFactory.inferredForNode(sourceElement, send, compiler);
|
| ClassElement cls = element.enclosingClass;
|
| assert(backend.isNative(cls.thisType.element));
|
| - return inferred.containsAll(compiler.world)
|
| - ? new TypeMask.nonNullExact(cls.thisType.element, compiler.world)
|
| + return inferred.containsAll(compiler.closedWorld)
|
| + ? new TypeMask.nonNullExact(
|
| + cls.thisType.element, compiler.closedWorld)
|
| : inferred;
|
| } else if (element.isGenerativeConstructor) {
|
| ClassElement cls = element.enclosingClass;
|
| @@ -4059,7 +4065,7 @@ class SsaBuilder extends ast.Visitor
|
| return new TypeMask.nonNullEmpty();
|
| } else {
|
| return new TypeMask.nonNullExact(
|
| - cls.thisType.element, compiler.world);
|
| + cls.thisType.element, compiler.closedWorld);
|
| }
|
| } else {
|
| return TypeMaskFactory.inferredReturnTypeForElement(
|
| @@ -4683,10 +4689,11 @@ class SsaBuilder extends ast.Visitor
|
| bool isOptimizableOperationOnIndexable(Selector selector, Element element) {
|
| bool isLength = selector.isGetter && selector.name == "length";
|
| if (isLength || selector.isIndex) {
|
| - return compiler.world.isSubtypeOf(
|
| + return compiler.closedWorld.isSubtypeOf(
|
| element.enclosingClass.declaration, helpers.jsIndexableClass);
|
| } else if (selector.isIndexSet) {
|
| - return compiler.world.isSubtypeOf(element.enclosingClass.declaration,
|
| + return compiler.closedWorld.isSubtypeOf(
|
| + element.enclosingClass.declaration,
|
| helpers.jsMutableIndexableClass);
|
| } else {
|
| return false;
|
| @@ -4709,7 +4716,7 @@ class SsaBuilder extends ast.Visitor
|
| return false;
|
| }
|
|
|
| - Element element = compiler.world.locateSingleElement(selector, mask);
|
| + Element element = compiler.closedWorld.locateSingleElement(selector, mask);
|
| if (element != null &&
|
| !element.isField &&
|
| !(element.isGetter && selector.isCall) &&
|
| @@ -4856,7 +4863,7 @@ class SsaBuilder extends ast.Visitor
|
| typeMask =
|
| TypeMaskFactory.inferredReturnTypeForElement(element, compiler);
|
| }
|
| - bool targetCanThrow = !compiler.world.getCannotThrow(element);
|
| + bool targetCanThrow = !compiler.closedWorld.getCannotThrow(element);
|
| // TODO(5346): Try to avoid the need for calling [declaration] before
|
| var instruction;
|
| if (backend.isJsInterop(element)) {
|
| @@ -4871,7 +4878,8 @@ class SsaBuilder extends ast.Visitor
|
| instruction.instantiatedTypes =
|
| new List<DartType>.from(currentInlinedInstantiations);
|
| }
|
| - instruction.sideEffects = compiler.world.getSideEffectsOfElement(element);
|
| + instruction.sideEffects =
|
| + compiler.closedWorld.getSideEffectsOfElement(element);
|
| }
|
| if (location == null) {
|
| push(instruction);
|
| @@ -4905,7 +4913,7 @@ class SsaBuilder extends ast.Visitor
|
| selector, inputs, type, sourceInformation,
|
| isSetter: selector.isSetter || selector.isIndexSet);
|
| instruction.sideEffects =
|
| - compiler.world.getSideEffectsOfSelector(selector, null);
|
| + compiler.closedWorld.getSideEffectsOfSelector(selector, null);
|
| return instruction;
|
| }
|
|
|
| @@ -4935,7 +4943,7 @@ class SsaBuilder extends ast.Visitor
|
| void generateSuperSendSet() {
|
| Selector setterSelector = elements.getSelector(node);
|
| if (Elements.isUnresolved(element) ||
|
| - !setterSelector.applies(element, compiler.world)) {
|
| + !setterSelector.applies(element, compiler.closedWorld)) {
|
| generateSuperNoSuchMethodSend(node, setterSelector, setterInputs);
|
| pop();
|
| } else {
|
| @@ -5908,7 +5916,7 @@ class SsaBuilder extends ast.Visitor
|
| HInstruction awaited = pop();
|
| // TODO(herhut): Improve this type.
|
| push(new HAwait(awaited,
|
| - new TypeMask.subclass(coreClasses.objectClass, compiler.world)));
|
| + new TypeMask.subclass(coreClasses.objectClass, compiler.closedWorld)));
|
| }
|
|
|
| visitTypeAnnotation(ast.TypeAnnotation node) {
|
| @@ -5969,7 +5977,8 @@ class SsaBuilder extends ast.Visitor
|
|
|
| TypeMask type =
|
| TypeMaskFactory.inferredForNode(sourceElement, node, compiler);
|
| - if (!type.containsAll(compiler.world)) instruction.instructionType = type;
|
| + if (!type.containsAll(compiler.closedWorld))
|
| + instruction.instructionType = type;
|
| stack.add(instruction);
|
| }
|
|
|
| @@ -6069,8 +6078,10 @@ class SsaBuilder extends ast.Visitor
|
| TypeMask mask = elements.getMoveNextTypeMask(node);
|
| pushInvokeDynamic(node, selector, mask, [streamIterator]);
|
| HInstruction future = pop();
|
| - push(new HAwait(future,
|
| - new TypeMask.subclass(coreClasses.objectClass, compiler.world)));
|
| + push(new HAwait(
|
| + future,
|
| + new TypeMask.subclass(
|
| + coreClasses.objectClass, compiler.closedWorld)));
|
| return popBoolified();
|
| }
|
|
|
| @@ -6107,8 +6118,10 @@ class SsaBuilder extends ast.Visitor
|
| node, buildInitializer, buildCondition, buildUpdate, buildBody);
|
| }, () {
|
| pushInvokeDynamic(node, Selectors.cancel, null, [streamIterator]);
|
| - push(new HAwait(pop(),
|
| - new TypeMask.subclass(coreClasses.objectClass, compiler.world)));
|
| + push(new HAwait(
|
| + pop(),
|
| + new TypeMask.subclass(
|
| + coreClasses.objectClass, compiler.closedWorld)));
|
| pop();
|
| });
|
| }
|
| @@ -6126,7 +6139,7 @@ class SsaBuilder extends ast.Visitor
|
|
|
| TypeMask mask = elements.getIteratorTypeMask(node);
|
|
|
| - ClassWorld classWorld = compiler.world;
|
| + ClassWorld classWorld = compiler.closedWorld;
|
| if (mask != null &&
|
| mask.satisfies(helpers.jsIndexableClass, classWorld) &&
|
| // String is indexable but not iterable.
|
| @@ -6404,12 +6417,12 @@ class SsaBuilder extends ast.Visitor
|
| // The instruction type will always be a subtype of the mapLiteralClass, but
|
| // type inference might discover a more specific type, or find nothing (in
|
| // dart2js unit tests).
|
| - TypeMask mapType =
|
| - new TypeMask.nonNullSubtype(helpers.mapLiteralClass, compiler.world);
|
| + TypeMask mapType = new TypeMask.nonNullSubtype(
|
| + helpers.mapLiteralClass, compiler.closedWorld);
|
| TypeMask returnTypeMask =
|
| TypeMaskFactory.inferredReturnTypeForElement(constructor, compiler);
|
| TypeMask instructionType =
|
| - mapType.intersection(returnTypeMask, compiler.world);
|
| + mapType.intersection(returnTypeMask, compiler.closedWorld);
|
|
|
| addInlinedInstantiation(expectedType);
|
| pushInvokeStatic(node, constructor, inputs,
|
| @@ -7237,7 +7250,7 @@ class StringBuilderVisitor extends ast.Visitor {
|
| Selector selector = Selectors.toString_;
|
| TypeMask type = TypeMaskFactory.inferredTypeForSelector(
|
| selector, expression.instructionType, compiler);
|
| - if (type.containsOnlyString(compiler.world)) {
|
| + if (type.containsOnlyString(compiler.closedWorld)) {
|
| builder.pushInvokeDynamic(node, selector, expression.instructionType,
|
| <HInstruction>[expression]);
|
| append(builder.pop());
|
|
|