| Index: pkg/compiler/lib/src/js_backend/backend.dart
|
| diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
|
| index f8afee062c78c0fb3d16f7e13fcb31a4779647de..7f751dbab719bafcc8576c6b6b6b38ec11dae63b 100644
|
| --- a/pkg/compiler/lib/src/js_backend/backend.dart
|
| +++ b/pkg/compiler/lib/src/js_backend/backend.dart
|
| @@ -107,7 +107,8 @@ class FunctionInlineCache {
|
| if (insideLoop) {
|
| switch (oldDecision) {
|
| case _mustNotInline:
|
| - throw new SpannableAssertionFailure(element,
|
| + throw new SpannableAssertionFailure(
|
| + element,
|
| "Can't mark a function as non-inlinable and inlinable at the "
|
| "same time.");
|
|
|
| @@ -133,7 +134,8 @@ class FunctionInlineCache {
|
| case _mustNotInline:
|
| case _mayInlineInLoopMustNotOutside:
|
| case _canInlineInLoopMustNotOutside:
|
| - throw new SpannableAssertionFailure(element,
|
| + throw new SpannableAssertionFailure(
|
| + element,
|
| "Can't mark a function as non-inlinable and inlinable at the "
|
| "same time.");
|
|
|
| @@ -146,7 +148,6 @@ class FunctionInlineCache {
|
| case _mustInline:
|
| // Do nothing.
|
| break;
|
| -
|
| }
|
| }
|
| }
|
| @@ -164,7 +165,8 @@ class FunctionInlineCache {
|
| case _canInlineInLoopMayInlineOutside:
|
| case _canInline:
|
| case _mustInline:
|
| - throw new SpannableAssertionFailure(element,
|
| + throw new SpannableAssertionFailure(
|
| + element,
|
| "Can't mark a function as non-inlinable and inlinable at the "
|
| "same time.");
|
|
|
| @@ -181,7 +183,8 @@ class FunctionInlineCache {
|
| switch (oldDecision) {
|
| case _canInline:
|
| case _mustInline:
|
| - throw new SpannableAssertionFailure(element,
|
| + throw new SpannableAssertionFailure(
|
| + element,
|
| "Can't mark a function as non-inlinable and inlinable at the "
|
| "same time.");
|
|
|
| @@ -215,7 +218,7 @@ class FunctionInlineCache {
|
| enum SyntheticConstantKind {
|
| DUMMY_INTERCEPTOR,
|
| EMPTY_VALUE,
|
| - TYPEVARIABLE_REFERENCE, // Reference to a type in reflection data.
|
| + TYPEVARIABLE_REFERENCE, // Reference to a type in reflection data.
|
| NAME
|
| }
|
|
|
| @@ -226,7 +229,6 @@ class JavaScriptBackend extends Backend {
|
|
|
| final Annotations annotations;
|
|
|
| -
|
| /// Set of classes that need to be considered for reflection although not
|
| /// otherwise visible during resolution.
|
| Iterable<ClassElement> get classesRequiredForReflection {
|
| @@ -253,7 +255,7 @@ class JavaScriptBackend extends Backend {
|
| /// information will be sent to a server via a POST request.
|
| static const String TRACE_METHOD = const String.fromEnvironment('traceCalls');
|
| static const bool TRACE_CALLS =
|
| - TRACE_METHOD == 'post' || TRACE_METHOD == 'console';
|
| + TRACE_METHOD == 'post' || TRACE_METHOD == 'console';
|
| Element traceHelper;
|
|
|
| TypeMask get stringType => compiler.typesTask.stringType;
|
| @@ -271,8 +273,8 @@ class JavaScriptBackend extends Backend {
|
| TypeMask _indexablePrimitiveTypeCache;
|
| TypeMask get indexablePrimitiveType {
|
| if (_indexablePrimitiveTypeCache == null) {
|
| - _indexablePrimitiveTypeCache = new TypeMask.nonNullSubtype(
|
| - helpers.jsIndexableClass, compiler.world);
|
| + _indexablePrimitiveTypeCache =
|
| + new TypeMask.nonNullSubtype(helpers.jsIndexableClass, compiler.world);
|
| }
|
| return _indexablePrimitiveTypeCache;
|
| }
|
| @@ -280,8 +282,8 @@ class JavaScriptBackend extends Backend {
|
| TypeMask _readableArrayTypeCache;
|
| TypeMask get readableArrayType {
|
| if (_readableArrayTypeCache == null) {
|
| - _readableArrayTypeCache = new TypeMask.nonNullSubclass(
|
| - helpers.jsArrayClass, compiler.world);
|
| + _readableArrayTypeCache =
|
| + new TypeMask.nonNullSubclass(helpers.jsArrayClass, compiler.world);
|
| }
|
| return _readableArrayTypeCache;
|
| }
|
| @@ -298,8 +300,8 @@ class JavaScriptBackend extends Backend {
|
| TypeMask _fixedArrayTypeCache;
|
| TypeMask get fixedArrayType {
|
| if (_fixedArrayTypeCache == null) {
|
| - _fixedArrayTypeCache = new TypeMask.nonNullExact(
|
| - helpers.jsFixedArrayClass, compiler.world);
|
| + _fixedArrayTypeCache =
|
| + new TypeMask.nonNullExact(helpers.jsFixedArrayClass, compiler.world);
|
| }
|
| return _fixedArrayTypeCache;
|
| }
|
| @@ -325,8 +327,7 @@ class JavaScriptBackend extends Backend {
|
| TypeMask _nonNullTypeCache;
|
| TypeMask get nonNullType {
|
| if (_nonNullTypeCache == null) {
|
| - _nonNullTypeCache =
|
| - compiler.typesTask.dynamicType.nonNullable();
|
| + _nonNullTypeCache = compiler.typesTask.dynamicType.nonNullable();
|
| }
|
| return _nonNullTypeCache;
|
| }
|
| @@ -472,8 +473,7 @@ class JavaScriptBackend extends Backend {
|
|
|
| // Checked mode helpers indexed by name.
|
| Map<String, CheckedModeHelper> checkedModeHelperByName =
|
| - new Map<String, CheckedModeHelper>.fromIterable(
|
| - checkedModeHelpers,
|
| + new Map<String, CheckedModeHelper>.fromIterable(checkedModeHelpers,
|
| key: (helper) => helper.name);
|
|
|
| TypeVariableHandler typeVariableHandler;
|
| @@ -512,9 +512,9 @@ class JavaScriptBackend extends Backend {
|
| final BackendImpacts impacts;
|
|
|
| JavaScriptBackend(Compiler compiler,
|
| - {bool generateSourceMap: true,
|
| - bool useStartupEmitter: false,
|
| - bool useNewSourceInfo: false})
|
| + {bool generateSourceMap: true,
|
| + bool useStartupEmitter: false,
|
| + bool useNewSourceInfo: false})
|
| : namer = determineNamer(compiler),
|
| oneShotInterceptors = new Map<jsAst.Name, Selector>(),
|
| interceptedElements = new Map<String, Set<Element>>(),
|
| @@ -522,12 +522,11 @@ class JavaScriptBackend extends Backend {
|
| rtiEncoder = new _RuntimeTypesEncoder(compiler),
|
| specializedGetInterceptors = new Map<jsAst.Name, Set<ClassElement>>(),
|
| annotations = new Annotations(compiler),
|
| - this.sourceInformationStrategy =
|
| - generateSourceMap
|
| - ? (useNewSourceInfo
|
| - ? new PositionSourceInformationStrategy()
|
| - : const StartEndSourceInformationStrategy())
|
| - : const JavaScriptSourceInformationStrategy(),
|
| + this.sourceInformationStrategy = generateSourceMap
|
| + ? (useNewSourceInfo
|
| + ? new PositionSourceInformationStrategy()
|
| + : const StartEndSourceInformationStrategy())
|
| + : const JavaScriptSourceInformationStrategy(),
|
| helpers = new BackendHelpers(compiler),
|
| impacts = new BackendImpacts(compiler),
|
| super(compiler) {
|
| @@ -543,9 +542,8 @@ class JavaScriptBackend extends Backend {
|
| impactTransformer = new JavaScriptImpactTransformer(this);
|
| patchResolverTask = new PatchResolverTask(compiler);
|
| functionCompiler = compiler.options.useCpsIr
|
| - ? new CpsFunctionCompiler(
|
| - compiler, this, sourceInformationStrategy)
|
| - : new SsaFunctionCompiler(this, sourceInformationStrategy);
|
| + ? new CpsFunctionCompiler(compiler, this, sourceInformationStrategy)
|
| + : new SsaFunctionCompiler(this, sourceInformationStrategy);
|
| serialization = new JavaScriptBackendSerialization(this);
|
| }
|
|
|
| @@ -569,11 +567,11 @@ class JavaScriptBackend extends Backend {
|
| if (isForeign(element)) {
|
| return element;
|
| }
|
| - if (isJsInterop(element)) {
|
| + if (isJsInterop(element)) {
|
| if (element.memberName == const PublicName('[]') ||
|
| element.memberName == const PublicName('[]=')) {
|
| - reporter.reportErrorMessage(element,
|
| - MessageKind.JS_INTEROP_INDEX_NOT_SUPPORTED);
|
| + reporter.reportErrorMessage(
|
| + element, MessageKind.JS_INTEROP_INDEX_NOT_SUPPORTED);
|
| }
|
| return element;
|
| }
|
| @@ -586,15 +584,15 @@ class JavaScriptBackend extends Backend {
|
|
|
| bool isBackendLibrary(LibraryElement library) {
|
| return library == helpers.interceptorsLibrary ||
|
| - library == helpers.jsHelperLibrary;
|
| + library == helpers.jsHelperLibrary;
|
| }
|
|
|
| static Namer determineNamer(Compiler compiler) {
|
| - return compiler.options.enableMinification ?
|
| - compiler.options.useFrequencyNamer ?
|
| - new FrequencyBasedNamer(compiler) :
|
| - new MinifyNamer(compiler) :
|
| - new Namer(compiler);
|
| + return compiler.options.enableMinification
|
| + ? compiler.options.useFrequencyNamer
|
| + ? new FrequencyBasedNamer(compiler)
|
| + : new MinifyNamer(compiler)
|
| + : new Namer(compiler);
|
| }
|
|
|
| /// The backend must *always* call this method when enqueuing an
|
| @@ -618,8 +616,7 @@ class JavaScriptBackend extends Backend {
|
| }
|
|
|
| bool _isValidBackendUse(Element element) {
|
| - assert(invariant(element, element.isDeclaration,
|
| - message: ""));
|
| + assert(invariant(element, element.isDeclaration, message: ""));
|
| if (element == helpers.streamIteratorConstructor ||
|
| element == helpers.compiler.symbolConstructor ||
|
| element == helpers.compiler.symbolValidatedConstructor ||
|
| @@ -629,20 +626,20 @@ class JavaScriptBackend extends Backend {
|
| // TODO(johnniwinther): These are valid but we could be more precise.
|
| return true;
|
| } else if (element.implementationLibrary.isPatch ||
|
| - // Needed to detect deserialized injected elements, that is
|
| - // element declared in patch files.
|
| - (element.library.isPlatformLibrary &&
|
| - element.sourcePosition.uri.path.contains(
|
| - '_internal/js_runtime/lib/')) ||
|
| - element.library == helpers.jsHelperLibrary ||
|
| - element.library == helpers.interceptorsLibrary ||
|
| - element.library == helpers.isolateHelperLibrary) {
|
| + // Needed to detect deserialized injected elements, that is
|
| + // element declared in patch files.
|
| + (element.library.isPlatformLibrary &&
|
| + element.sourcePosition.uri.path
|
| + .contains('_internal/js_runtime/lib/')) ||
|
| + element.library == helpers.jsHelperLibrary ||
|
| + element.library == helpers.interceptorsLibrary ||
|
| + element.library == helpers.isolateHelperLibrary) {
|
| // TODO(johnniwinther): We should be more precise about these.
|
| return true;
|
| } else if (element == coreClasses.listClass ||
|
| - element == helpers.mapLiteralClass ||
|
| - element == coreClasses.functionClass ||
|
| - element == coreClasses.stringClass) {
|
| + element == helpers.mapLiteralClass ||
|
| + element == coreClasses.functionClass ||
|
| + element == coreClasses.stringClass) {
|
| // TODO(johnniwinther): Avoid these.
|
| return true;
|
| }
|
| @@ -650,9 +647,9 @@ class JavaScriptBackend extends Backend {
|
| }
|
|
|
| bool usedByBackend(Element element) {
|
| - if (element.isParameter
|
| - || element.isInitializingFormal
|
| - || element.isField) {
|
| + if (element.isParameter ||
|
| + element.isInitializingFormal ||
|
| + element.isField) {
|
| if (usedByBackend(element.enclosingElement)) return true;
|
| }
|
| return helpersUsed.contains(element.declaration);
|
| @@ -665,8 +662,8 @@ class JavaScriptBackend extends Backend {
|
| }
|
|
|
| if (element.isField) {
|
| - if (Elements.isStaticOrTopLevel(element)
|
| - && (element.isFinal || element.isConst)) {
|
| + if (Elements.isStaticOrTopLevel(element) &&
|
| + (element.isFinal || element.isConst)) {
|
| return false;
|
| }
|
| }
|
| @@ -775,23 +772,21 @@ class JavaScriptBackend extends Backend {
|
| * explicit receiver' optimization.
|
| */
|
| bool isInterceptedMixinSelector(Selector selector, TypeMask mask) {
|
| - Set<Element> elements = interceptedMixinElements.putIfAbsent(
|
| - selector.name,
|
| - () {
|
| - Set<Element> elements = interceptedElements[selector.name];
|
| - if (elements == null) return null;
|
| - return elements
|
| - .where((element) =>
|
| - classesMixedIntoInterceptedClasses.contains(
|
| - element.enclosingClass))
|
| - .toSet();
|
| - });
|
| + Set<Element> elements =
|
| + interceptedMixinElements.putIfAbsent(selector.name, () {
|
| + Set<Element> elements = interceptedElements[selector.name];
|
| + if (elements == null) return null;
|
| + return elements
|
| + .where((element) => classesMixedIntoInterceptedClasses
|
| + .contains(element.enclosingClass))
|
| + .toSet();
|
| + });
|
|
|
| if (elements == null) return false;
|
| if (elements.isEmpty) return false;
|
| return elements.any((element) {
|
| return selector.applies(element, compiler.world) &&
|
| - (mask == null || mask.canHit(element, selector, compiler.world));
|
| + (mask == null || mask.canHit(element, selector, compiler.world));
|
| });
|
| }
|
|
|
| @@ -799,12 +794,12 @@ class JavaScriptBackend extends Backend {
|
| /// and never exists at runtime.
|
| bool isCompileTimeOnlyClass(ClassElement class_) {
|
| return class_ == helpers.jsPositiveIntClass ||
|
| - class_ == helpers.jsUInt32Class ||
|
| - class_ == helpers.jsUInt31Class ||
|
| - class_ == helpers.jsFixedArrayClass ||
|
| - class_ == helpers.jsUnmodifiableArrayClass ||
|
| - class_ == helpers.jsMutableArrayClass ||
|
| - class_ == helpers.jsExtendableArrayClass;
|
| + class_ == helpers.jsUInt32Class ||
|
| + class_ == helpers.jsUInt31Class ||
|
| + class_ == helpers.jsFixedArrayClass ||
|
| + class_ == helpers.jsUnmodifiableArrayClass ||
|
| + class_ == helpers.jsMutableArrayClass ||
|
| + class_ == helpers.jsExtendableArrayClass;
|
| }
|
|
|
| /// Maps compile-time classes to their runtime class. The runtime class is
|
| @@ -832,8 +827,8 @@ class JavaScriptBackend extends Backend {
|
| for (Element element in intercepted) {
|
| ClassElement classElement = element.enclosingClass;
|
| if (isCompileTimeOnlyClass(classElement)) continue;
|
| - if (isNativeOrExtendsNative(classElement)
|
| - || interceptedClasses.contains(classElement)) {
|
| + if (isNativeOrExtendsNative(classElement) ||
|
| + interceptedClasses.contains(classElement)) {
|
| result.add(classElement);
|
| }
|
| if (classesMixedIntoInterceptedClasses.contains(classElement)) {
|
| @@ -862,8 +857,7 @@ class JavaScriptBackend extends Backend {
|
| }
|
|
|
| bool operatorEqHandlesNullArgument(FunctionElement operatorEqfunction) {
|
| - return specialOperatorEqClasses.contains(
|
| - operatorEqfunction.enclosingClass);
|
| + return specialOperatorEqClasses.contains(operatorEqfunction.enclosingClass);
|
| }
|
|
|
| void validateInterceptorImplementsAllObjectMethods(
|
| @@ -875,13 +869,12 @@ class JavaScriptBackend extends Backend {
|
| Element interceptorMember = interceptorClass.lookupMember(member.name);
|
| // Interceptors must override all Object methods due to calling convention
|
| // differences.
|
| - assert(invariant(
|
| - interceptorMember,
|
| + assert(invariant(interceptorMember,
|
| interceptorMember.enclosingClass == interceptorClass,
|
| message:
|
| - "Member ${member.name} not overridden in ${interceptorClass}. "
|
| - "Found $interceptorMember from "
|
| - "${interceptorMember.enclosingClass}."));
|
| + "Member ${member.name} not overridden in ${interceptorClass}. "
|
| + "Found $interceptorMember from "
|
| + "${interceptorMember.enclosingClass}."));
|
| });
|
| }
|
|
|
| @@ -892,8 +885,7 @@ class JavaScriptBackend extends Backend {
|
| cls.forEachMember((ClassElement classElement, Element member) {
|
| if (member.name == Identifiers.call) {
|
| reporter.reportErrorMessage(
|
| - member,
|
| - MessageKind.CALL_NOT_SUPPORTED_ON_NATIVE_CLASS);
|
| + member, MessageKind.CALL_NOT_SUPPORTED_ON_NATIVE_CLASS);
|
| return;
|
| }
|
| if (member.isSynthesized) return;
|
| @@ -902,8 +894,7 @@ class JavaScriptBackend extends Backend {
|
| Set<Element> set = interceptedElements.putIfAbsent(
|
| member.name, () => new Set<Element>());
|
| set.add(member);
|
| - },
|
| - includeSuperAndInjectedMembers: true);
|
| + }, includeSuperAndInjectedMembers: true);
|
|
|
| // Walk superclass chain to find mixins.
|
| for (; cls != null; cls = cls.superclass) {
|
| @@ -915,21 +906,18 @@ class JavaScriptBackend extends Backend {
|
| }
|
| }
|
|
|
| - void addInterceptors(ClassElement cls,
|
| - Enqueuer enqueuer,
|
| - Registry registry) {
|
| + void addInterceptors(ClassElement cls, Enqueuer enqueuer, Registry registry) {
|
| if (enqueuer.isResolutionQueue) {
|
| _interceptedClasses.add(helpers.jsInterceptorClass);
|
| _interceptedClasses.add(cls);
|
| cls.ensureResolved(resolution);
|
| cls.forEachMember((ClassElement classElement, Element member) {
|
| - // All methods on [Object] are shadowed by [Interceptor].
|
| - if (classElement == coreClasses.objectClass) return;
|
| - Set<Element> set = interceptedElements.putIfAbsent(
|
| - member.name, () => new Set<Element>());
|
| - set.add(member);
|
| - },
|
| - includeSuperAndInjectedMembers: true);
|
| + // All methods on [Object] are shadowed by [Interceptor].
|
| + if (classElement == coreClasses.objectClass) return;
|
| + Set<Element> set = interceptedElements.putIfAbsent(
|
| + member.name, () => new Set<Element>());
|
| + set.add(member);
|
| + }, includeSuperAndInjectedMembers: true);
|
| }
|
| enqueueClass(enqueuer, cls, registry);
|
| }
|
| @@ -953,8 +941,7 @@ class JavaScriptBackend extends Backend {
|
| void registerCompileTimeConstant(ConstantValue constant, Registry registry) {
|
| registerCompileTimeConstantInternal(constant, registry);
|
|
|
| - if (!registry.isForResolution &&
|
| - lookupMapAnalysis.isLookupMap(constant)) {
|
| + if (!registry.isForResolution && lookupMapAnalysis.isLookupMap(constant)) {
|
| // Note: internally, this registration will temporarily remove the
|
| // constant dependencies and add them later on-demand.
|
| lookupMapAnalysis.registerLookupMapReference(constant);
|
| @@ -969,8 +956,8 @@ class JavaScriptBackend extends Backend {
|
| constants.addCompileTimeConstantForEmission(constant);
|
| }
|
|
|
| - void registerCompileTimeConstantInternal(ConstantValue constant,
|
| - Registry registry) {
|
| + void registerCompileTimeConstantInternal(
|
| + ConstantValue constant, Registry registry) {
|
| DartType type = constant.getType(compiler.coreTypes);
|
| registerInstantiatedConstantType(type, registry);
|
|
|
| @@ -994,51 +981,46 @@ class JavaScriptBackend extends Backend {
|
| if (type is InterfaceType) {
|
| registry.registerInstantiation(instantiatedType);
|
| if (!type.treatAsRaw && classNeedsRti(type.element)) {
|
| - registry.registerStaticUse(
|
| - new StaticUse.staticInvoke(
|
| - // TODO(johnniwinther): Find the right [CallStructure].
|
| - helpers.setRuntimeTypeInfo, null));
|
| + registry.registerStaticUse(new StaticUse.staticInvoke(
|
| + // TODO(johnniwinther): Find the right [CallStructure].
|
| + helpers.setRuntimeTypeInfo,
|
| + null));
|
| }
|
| if (type.element == typeImplementation) {
|
| // If we use a type literal in a constant, the compile time
|
| // constant emitter will generate a call to the createRuntimeType
|
| // helper so we register a use of that.
|
| - registry.registerStaticUse(
|
| - new StaticUse.staticInvoke(
|
| - // TODO(johnniwinther): Find the right [CallStructure].
|
| + registry.registerStaticUse(new StaticUse.staticInvoke(
|
| + // TODO(johnniwinther): Find the right [CallStructure].
|
|
|
| - helpers.createRuntimeType, null));
|
| + helpers.createRuntimeType,
|
| + null));
|
| }
|
| }
|
| }
|
|
|
| void registerMetadataConstant(MetadataAnnotation metadata,
|
| - Element annotatedElement,
|
| - Registry registry) {
|
| + Element annotatedElement, Registry registry) {
|
| assert(registry.isForResolution);
|
| ConstantValue constant = constants.getConstantValueForMetadata(metadata);
|
| registerCompileTimeConstant(constant, registry);
|
| metadataConstants.add(new Dependency(constant, annotatedElement));
|
| }
|
|
|
| - void registerInstantiatedClass(ClassElement cls,
|
| - Enqueuer enqueuer,
|
| - Registry registry) {
|
| + void registerInstantiatedClass(
|
| + ClassElement cls, Enqueuer enqueuer, Registry registry) {
|
| _processClass(cls, enqueuer, registry);
|
| }
|
|
|
| - void registerImplementedClass(ClassElement cls,
|
| - Enqueuer enqueuer,
|
| - Registry registry) {
|
| + void registerImplementedClass(
|
| + ClassElement cls, Enqueuer enqueuer, Registry registry) {
|
| _processClass(cls, enqueuer, registry);
|
| }
|
|
|
| - void _processClass(ClassElement cls,
|
| - Enqueuer enqueuer,
|
| - Registry registry) {
|
| + void _processClass(ClassElement cls, Enqueuer enqueuer, Registry registry) {
|
| if (!cls.typeVariables.isEmpty) {
|
| - typeVariableHandler.registerClassWithTypeVariables(cls, enqueuer,
|
| - registry);
|
| + typeVariableHandler.registerClassWithTypeVariables(
|
| + cls, enqueuer, registry);
|
| }
|
|
|
| // Register any helper that will be needed by the backend.
|
| @@ -1050,7 +1032,7 @@ class JavaScriptBackend extends Backend {
|
| // `iae` helper directly.
|
| enqueue(enqueuer, helpers.throwIllegalArgumentException, registry);
|
| } else if (cls == coreClasses.listClass ||
|
| - cls == coreClasses.stringClass) {
|
| + cls == coreClasses.stringClass) {
|
| // The backend will try to optimize array and string access and use the
|
| // `ioore` and `iae` helpers directly.
|
| enqueue(enqueuer, helpers.throwIndexOutOfRangeException, registry);
|
| @@ -1070,8 +1052,8 @@ class JavaScriptBackend extends Backend {
|
| enqueueClass(enqueuer, helpers.boundClosureClass, registry);
|
| } else if (isNativeOrExtendsNative(cls)) {
|
| enqueue(enqueuer, helpers.getNativeInterceptorMethod, registry);
|
| - enqueueClass(enqueuer, helpers.jsInterceptorClass,
|
| - compiler.globalDependencies);
|
| + enqueueClass(
|
| + enqueuer, helpers.jsInterceptorClass, compiler.globalDependencies);
|
| enqueueClass(enqueuer, helpers.jsJavaScriptObjectClass, registry);
|
| enqueueClass(enqueuer, helpers.jsPlainJavaScriptObjectClass, registry);
|
| enqueueClass(enqueuer, helpers.jsJavaScriptFunctionClass, registry);
|
| @@ -1085,7 +1067,7 @@ class JavaScriptBackend extends Backend {
|
| ConstructorElement ctor = implementation.lookupConstructor(name);
|
| if (ctor == null ||
|
| (Name.isPrivateName(name) &&
|
| - ctor.library != helpers.mapLiteralClass.library)) {
|
| + ctor.library != helpers.mapLiteralClass.library)) {
|
| reporter.internalError(
|
| helpers.mapLiteralClass,
|
| "Map literal class ${helpers.mapLiteralClass} missing "
|
| @@ -1100,7 +1082,8 @@ class JavaScriptBackend extends Backend {
|
| ClassElement implementation = cls.implementation;
|
| Element element = implementation.lookupLocalMember(name);
|
| if (element == null || !element.isFunction || !element.isStatic) {
|
| - reporter.internalError(helpers.mapLiteralClass,
|
| + reporter.internalError(
|
| + helpers.mapLiteralClass,
|
| "Map literal class ${helpers.mapLiteralClass} missing "
|
| "'$name' static member function");
|
| }
|
| @@ -1120,14 +1103,13 @@ class JavaScriptBackend extends Backend {
|
| if (cls == helpers.closureClass) {
|
| enqueue(enqueuer, helpers.closureFromTearOff, registry);
|
| }
|
| - if (cls == coreClasses.stringClass ||
|
| - cls == helpers.jsStringClass) {
|
| + if (cls == coreClasses.stringClass || cls == helpers.jsStringClass) {
|
| addInterceptors(helpers.jsStringClass, enqueuer, registry);
|
| } else if (cls == coreClasses.listClass ||
|
| - cls == helpers.jsArrayClass ||
|
| - cls == helpers.jsFixedArrayClass ||
|
| - cls == helpers.jsExtendableArrayClass ||
|
| - cls == helpers.jsUnmodifiableArrayClass) {
|
| + cls == helpers.jsArrayClass ||
|
| + cls == helpers.jsFixedArrayClass ||
|
| + cls == helpers.jsExtendableArrayClass ||
|
| + cls == helpers.jsUnmodifiableArrayClass) {
|
| addInterceptors(helpers.jsArrayClass, enqueuer, registry);
|
| addInterceptors(helpers.jsMutableArrayClass, enqueuer, registry);
|
| addInterceptors(helpers.jsFixedArrayClass, enqueuer, registry);
|
| @@ -1137,25 +1119,20 @@ class JavaScriptBackend extends Backend {
|
| enqueueInResolution(helpers.jsArrayTypedConstructor, registry);
|
| enqueueInResolution(helpers.setRuntimeTypeInfo, registry);
|
| enqueueInResolution(helpers.getTypeArgumentByIndex, registry);
|
| - } else if (cls == coreClasses.intClass ||
|
| - cls == helpers.jsIntClass) {
|
| + } else if (cls == coreClasses.intClass || cls == helpers.jsIntClass) {
|
| addInterceptors(helpers.jsIntClass, enqueuer, registry);
|
| addInterceptors(helpers.jsPositiveIntClass, enqueuer, registry);
|
| addInterceptors(helpers.jsUInt32Class, enqueuer, registry);
|
| addInterceptors(helpers.jsUInt31Class, enqueuer, registry);
|
| addInterceptors(helpers.jsNumberClass, enqueuer, registry);
|
| - } else if (cls == coreClasses.doubleClass ||
|
| - cls == helpers.jsDoubleClass) {
|
| + } else if (cls == coreClasses.doubleClass || cls == helpers.jsDoubleClass) {
|
| addInterceptors(helpers.jsDoubleClass, enqueuer, registry);
|
| addInterceptors(helpers.jsNumberClass, enqueuer, registry);
|
| - } else if (cls == coreClasses.boolClass ||
|
| - cls == helpers.jsBoolClass) {
|
| + } else if (cls == coreClasses.boolClass || cls == helpers.jsBoolClass) {
|
| addInterceptors(helpers.jsBoolClass, enqueuer, registry);
|
| - } else if (cls == coreClasses.nullClass ||
|
| - cls == helpers.jsNullClass) {
|
| + } else if (cls == coreClasses.nullClass || cls == helpers.jsNullClass) {
|
| addInterceptors(helpers.jsNullClass, enqueuer, registry);
|
| - } else if (cls == coreClasses.numClass ||
|
| - cls == helpers.jsNumberClass) {
|
| + } else if (cls == coreClasses.numClass || cls == helpers.jsNumberClass) {
|
| addInterceptors(helpers.jsIntClass, enqueuer, registry);
|
| addInterceptors(helpers.jsPositiveIntClass, enqueuer, registry);
|
| addInterceptors(helpers.jsUInt32Class, enqueuer, registry);
|
| @@ -1167,7 +1144,8 @@ class JavaScriptBackend extends Backend {
|
| } else if (cls == helpers.jsPlainJavaScriptObjectClass) {
|
| addInterceptors(helpers.jsPlainJavaScriptObjectClass, enqueuer, registry);
|
| } else if (cls == helpers.jsUnknownJavaScriptObjectClass) {
|
| - addInterceptors(helpers.jsUnknownJavaScriptObjectClass, enqueuer, registry);
|
| + addInterceptors(
|
| + helpers.jsUnknownJavaScriptObjectClass, enqueuer, registry);
|
| } else if (cls == helpers.jsJavaScriptFunctionClass) {
|
| addInterceptors(helpers.jsJavaScriptFunctionClass, enqueuer, registry);
|
| } else if (isNativeOrExtendsNative(cls)) {
|
| @@ -1185,13 +1163,12 @@ class JavaScriptBackend extends Backend {
|
| }
|
| }
|
|
|
| - void registerInstantiatedType(InterfaceType type,
|
| - Enqueuer enqueuer,
|
| - Registry registry,
|
| - {bool mirrorUsage: false}) {
|
| + void registerInstantiatedType(
|
| + InterfaceType type, Enqueuer enqueuer, Registry registry,
|
| + {bool mirrorUsage: false}) {
|
| lookupMapAnalysis.registerInstantiatedType(type, registry);
|
| - super.registerInstantiatedType(
|
| - type, enqueuer, registry, mirrorUsage: mirrorUsage);
|
| + super.registerInstantiatedType(type, enqueuer, registry,
|
| + mirrorUsage: mirrorUsage);
|
| }
|
|
|
| void registerUseInterceptor(Enqueuer enqueuer) {
|
| @@ -1227,7 +1204,8 @@ class JavaScriptBackend extends Backend {
|
|
|
| if (TRACE_CALLS) {
|
| traceHelper = TRACE_METHOD == 'console'
|
| - ? helpers.consoleTraceHelper : helpers.postTraceHelper;
|
| + ? helpers.consoleTraceHelper
|
| + : helpers.postTraceHelper;
|
| assert(traceHelper != null);
|
| enqueueInResolution(traceHelper, registry);
|
| }
|
| @@ -1248,24 +1226,18 @@ class JavaScriptBackend extends Backend {
|
|
|
| void registerGetRuntimeTypeArgument(Registry registry) {
|
| enqueueImpact(
|
| - compiler.enqueuer.resolution,
|
| - impacts.getRuntimeTypeArgument,
|
| - registry);
|
| + compiler.enqueuer.resolution, impacts.getRuntimeTypeArgument, registry);
|
| }
|
|
|
| void registerCallMethodWithFreeTypeVariables(
|
| - Element callMethod,
|
| - Enqueuer enqueuer,
|
| - Registry registry) {
|
| + Element callMethod, Enqueuer enqueuer, Registry registry) {
|
| if (enqueuer.isResolutionQueue || methodNeedsRti(callMethod)) {
|
| registerComputeSignature(enqueuer, registry);
|
| }
|
| }
|
|
|
| void registerClosureWithFreeTypeVariables(
|
| - Element closure,
|
| - Enqueuer enqueuer,
|
| - Registry registry) {
|
| + Element closure, Enqueuer enqueuer, Registry registry) {
|
| if (enqueuer.isResolutionQueue || methodNeedsRti(closure)) {
|
| registerComputeSignature(enqueuer, registry);
|
| }
|
| @@ -1284,9 +1256,7 @@ class JavaScriptBackend extends Backend {
|
| void registerGetOfStaticFunction(Enqueuer enqueuer) {
|
| helpers.closureClass.ensureResolved(resolution);
|
| registerInstantiatedType(
|
| - helpers.closureClass.rawType,
|
| - enqueuer,
|
| - compiler.globalDependencies);
|
| + helpers.closureClass.rawType, enqueuer, compiler.globalDependencies);
|
| }
|
|
|
| void registerComputeSignature(Enqueuer enqueuer, Registry registry) {
|
| @@ -1304,8 +1274,8 @@ class JavaScriptBackend extends Backend {
|
| enqueueClass(enqueuer, coreClasses.listClass, registry);
|
| }
|
|
|
| - void registerTypeVariableBoundsSubtypeCheck(DartType typeArgument,
|
| - DartType bound) {
|
| + void registerTypeVariableBoundsSubtypeCheck(
|
| + DartType typeArgument, DartType bound) {
|
| rti.registerTypeVariableBoundsSubtypeCheck(typeArgument, bound);
|
| }
|
|
|
| @@ -1321,10 +1291,8 @@ class JavaScriptBackend extends Backend {
|
| }
|
|
|
| /// Called when resolving a call to a foreign function.
|
| - void registerForeignCall(Send node,
|
| - Element element,
|
| - CallStructure callStructure,
|
| - ForeignResolver resolver) {
|
| + void registerForeignCall(Send node, Element element,
|
| + CallStructure callStructure, ForeignResolver resolver) {
|
| native.NativeResolutionEnqueuer nativeEnqueuer =
|
| compiler.enqueuer.resolution.nativeEnqueuer;
|
| if (element.name == 'JS') {
|
| @@ -1349,15 +1317,13 @@ class JavaScriptBackend extends Backend {
|
| }
|
| }
|
| reporter.reportErrorMessage(
|
| - node,
|
| - MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT);
|
| + node, MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT);
|
| }
|
| }
|
|
|
| void enableNoSuchMethod(Enqueuer world) {
|
| enqueue(world, helpers.createInvocationMirror, compiler.globalDependencies);
|
| - world.registerDynamicUse(
|
| - new DynamicUse(Selectors.noSuchMethod_, null));
|
| + world.registerDynamicUse(new DynamicUse(Selectors.noSuchMethod_, null));
|
| }
|
|
|
| void enableIsolateSupport(Enqueuer enqueuer) {
|
| @@ -1375,7 +1341,6 @@ class JavaScriptBackend extends Backend {
|
| new StaticUse.staticTearOff(compiler.mainFunction));
|
| }
|
| if (enqueuer.isResolutionQueue) {
|
| -
|
| void enqueue(Element element) {
|
| enqueuer.addToWorkList(element);
|
| compiler.globalDependencies.registerDependency(element);
|
| @@ -1396,19 +1361,19 @@ class JavaScriptBackend extends Backend {
|
| }
|
|
|
| bool isComplexNoSuchMethod(FunctionElement element) =>
|
| - noSuchMethodRegistry.isComplex(element);
|
| + noSuchMethodRegistry.isComplex(element);
|
|
|
| bool isDefaultEqualityImplementation(Element element) {
|
| assert(element.name == '==');
|
| ClassElement classElement = element.enclosingClass;
|
| - return classElement == coreClasses.objectClass
|
| - || classElement == helpers.jsInterceptorClass
|
| - || classElement == helpers.jsNullClass;
|
| + return classElement == coreClasses.objectClass ||
|
| + classElement == helpers.jsInterceptorClass ||
|
| + classElement == helpers.jsNullClass;
|
| }
|
|
|
| bool methodNeedsRti(FunctionElement function) {
|
| return rti.methodsNeedingRti.contains(function) ||
|
| - compiler.enabledRuntimeType;
|
| + compiler.enabledRuntimeType;
|
| }
|
|
|
| /// Enqueue [e] in [enqueuer].
|
| @@ -1459,9 +1424,8 @@ class JavaScriptBackend extends Backend {
|
| registerInstantiatedType(type, enqueuer, registry);
|
| }
|
|
|
| - void enqueueImpact(Enqueuer enqueuer,
|
| - BackendImpact impact,
|
| - Registry registry) {
|
| + void enqueueImpact(
|
| + Enqueuer enqueuer, BackendImpact impact, Registry registry) {
|
| for (Element staticUse in impact.staticUses) {
|
| enqueue(enqueuer, staticUse, registry);
|
| }
|
| @@ -1502,17 +1466,16 @@ class JavaScriptBackend extends Backend {
|
| // variables. For instance variables, we may need to generate
|
| // the checked setter.
|
| if (Elements.isStaticOrTopLevel(element)) {
|
| - return impactTransformer.transformCodegenImpact(
|
| - work.registry.worldImpact);
|
| + return impactTransformer
|
| + .transformCodegenImpact(work.registry.worldImpact);
|
| }
|
| } else {
|
| // If the constant-handler was not able to produce a result we have to
|
| // go through the builder (below) to generate the lazy initializer for
|
| // the static variable.
|
| // We also need to register the use of the cyclic-error helper.
|
| - compiler.enqueuer.codegen.registerStaticUse(
|
| - new StaticUse.staticInvoke(
|
| - helpers.cyclicThrowHelper, CallStructure.ONE_ARG));
|
| + compiler.enqueuer.codegen.registerStaticUse(new StaticUse.staticInvoke(
|
| + helpers.cyclicThrowHelper, CallStructure.ONE_ARG));
|
| }
|
| }
|
|
|
| @@ -1542,7 +1505,8 @@ class JavaScriptBackend extends Backend {
|
| }
|
| // Native classes inherit from Interceptor.
|
| return isNative(element)
|
| - ? helpers.jsInterceptorClass : coreClasses.objectClass;
|
| + ? helpers.jsInterceptorClass
|
| + : coreClasses.objectClass;
|
| }
|
|
|
| /**
|
| @@ -1562,11 +1526,12 @@ class JavaScriptBackend extends Backend {
|
| if (totalMethodCount != preMirrorsMethodCount) {
|
| int mirrorCount = totalMethodCount - preMirrorsMethodCount;
|
| double percentage = (mirrorCount / totalMethodCount) * 100;
|
| - DiagnosticMessage hint = reporter.createMessage(
|
| - compiler.mainApp, MessageKind.MIRROR_BLOAT,
|
| - {'count': mirrorCount,
|
| - 'total': totalMethodCount,
|
| - 'percentage': percentage.round()});
|
| + DiagnosticMessage hint =
|
| + reporter.createMessage(compiler.mainApp, MessageKind.MIRROR_BLOAT, {
|
| + 'count': mirrorCount,
|
| + 'total': totalMethodCount,
|
| + 'percentage': percentage.round()
|
| + });
|
|
|
| List<DiagnosticMessage> infos = <DiagnosticMessage>[];
|
| for (LibraryElement library in compiler.libraryLoader.libraries) {
|
| @@ -1576,8 +1541,8 @@ class JavaScriptBackend extends Backend {
|
| if (importedLibrary != compiler.mirrorsLibrary) continue;
|
| MessageKind kind =
|
| compiler.mirrorUsageAnalyzerTask.hasMirrorUsage(library)
|
| - ? MessageKind.MIRROR_IMPORT
|
| - : MessageKind.MIRROR_IMPORT_NO_USAGE;
|
| + ? MessageKind.MIRROR_IMPORT
|
| + : MessageKind.MIRROR_IMPORT_NO_USAGE;
|
| reporter.withCurrentElement(library, () {
|
| infos.add(reporter.createMessage(import, kind));
|
| });
|
| @@ -1604,8 +1569,8 @@ class JavaScriptBackend extends Backend {
|
| * backend with implementation types (JSInt, JSString, ...).
|
| */
|
| CheckedModeHelper getCheckedModeHelper(DartType type, {bool typeCast}) {
|
| - return getCheckedModeHelperInternal(
|
| - type, typeCast: typeCast, nativeCheckOnly: false);
|
| + return getCheckedModeHelperInternal(type,
|
| + typeCast: typeCast, nativeCheckOnly: false);
|
| }
|
|
|
| /**
|
| @@ -1614,8 +1579,8 @@ class JavaScriptBackend extends Backend {
|
| * [type], [:null:] is returned.
|
| */
|
| CheckedModeHelper getNativeCheckedModeHelper(DartType type, {bool typeCast}) {
|
| - return getCheckedModeHelperInternal(
|
| - type, typeCast: typeCast, nativeCheckOnly: true);
|
| + return getCheckedModeHelperInternal(type,
|
| + typeCast: typeCast, nativeCheckOnly: true);
|
| }
|
|
|
| /**
|
| @@ -1623,8 +1588,7 @@ class JavaScriptBackend extends Backend {
|
| * [nativeCheckOnly] is [:true:], only names for native helpers are returned.
|
| */
|
| CheckedModeHelper getCheckedModeHelperInternal(DartType type,
|
| - {bool typeCast,
|
| - bool nativeCheckOnly}) {
|
| + {bool typeCast, bool nativeCheckOnly}) {
|
| String name = getCheckedModeHelperNameInternal(type,
|
| typeCast: typeCast, nativeCheckOnly: nativeCheckOnly);
|
| if (name == null) return null;
|
| @@ -1634,8 +1598,7 @@ class JavaScriptBackend extends Backend {
|
| }
|
|
|
| String getCheckedModeHelperNameInternal(DartType type,
|
| - {bool typeCast,
|
| - bool nativeCheckOnly}) {
|
| + {bool typeCast, bool nativeCheckOnly}) {
|
| assert(type.kind != TypeKind.TYPEDEF);
|
| if (type.isMalformed) {
|
| // The same error is thrown for type test and type cast of a malformed
|
| @@ -1643,8 +1606,8 @@ class JavaScriptBackend extends Backend {
|
| return 'checkMalformedType';
|
| }
|
| Element element = type.element;
|
| - bool nativeCheck = nativeCheckOnly ||
|
| - emitter.nativeEmitter.requiresNativeIsCheck(element);
|
| + bool nativeCheck =
|
| + nativeCheckOnly || emitter.nativeEmitter.requiresNativeIsCheck(element);
|
|
|
| // TODO(13955), TODO(9731). The test for non-primitive types should use an
|
| // interceptor. The interceptor should be an argument to HTypeConversion so
|
| @@ -1656,38 +1619,28 @@ class JavaScriptBackend extends Backend {
|
| if (nativeCheckOnly) return null;
|
| return 'voidTypeCheck';
|
| } else if (element == helpers.jsStringClass ||
|
| - element == coreClasses.stringClass) {
|
| + element == coreClasses.stringClass) {
|
| if (nativeCheckOnly) return null;
|
| - return typeCast
|
| - ? 'stringTypeCast'
|
| - : 'stringTypeCheck';
|
| + return typeCast ? 'stringTypeCast' : 'stringTypeCheck';
|
| } else if (element == helpers.jsDoubleClass ||
|
| - element == coreClasses.doubleClass) {
|
| + element == coreClasses.doubleClass) {
|
| if (nativeCheckOnly) return null;
|
| - return typeCast
|
| - ? 'doubleTypeCast'
|
| - : 'doubleTypeCheck';
|
| + return typeCast ? 'doubleTypeCast' : 'doubleTypeCheck';
|
| } else if (element == helpers.jsNumberClass ||
|
| - element == coreClasses.numClass) {
|
| + element == coreClasses.numClass) {
|
| if (nativeCheckOnly) return null;
|
| - return typeCast
|
| - ? 'numTypeCast'
|
| - : 'numTypeCheck';
|
| + return typeCast ? 'numTypeCast' : 'numTypeCheck';
|
| } else if (element == helpers.jsBoolClass ||
|
| - element == coreClasses.boolClass) {
|
| + element == coreClasses.boolClass) {
|
| if (nativeCheckOnly) return null;
|
| - return typeCast
|
| - ? 'boolTypeCast'
|
| - : 'boolTypeCheck';
|
| + return typeCast ? 'boolTypeCast' : 'boolTypeCheck';
|
| } else if (element == helpers.jsIntClass ||
|
| - element == coreClasses.intClass ||
|
| - element == helpers.jsUInt32Class ||
|
| - element == helpers.jsUInt31Class ||
|
| - element == helpers.jsPositiveIntClass) {
|
| + element == coreClasses.intClass ||
|
| + element == helpers.jsUInt32Class ||
|
| + element == helpers.jsUInt31Class ||
|
| + element == helpers.jsPositiveIntClass) {
|
| if (nativeCheckOnly) return null;
|
| - return typeCast
|
| - ? 'intTypeCast'
|
| - : 'intTypeCheck';
|
| + return typeCast ? 'intTypeCast' : 'intTypeCheck';
|
| } else if (Elements.isNumberOrStringSupertype(element, compiler)) {
|
| if (nativeCheck) {
|
| return typeCast
|
| @@ -1695,8 +1648,8 @@ class JavaScriptBackend extends Backend {
|
| : 'numberOrStringSuperNativeTypeCheck';
|
| } else {
|
| return typeCast
|
| - ? 'numberOrStringSuperTypeCast'
|
| - : 'numberOrStringSuperTypeCheck';
|
| + ? 'numberOrStringSuperTypeCast'
|
| + : 'numberOrStringSuperTypeCheck';
|
| }
|
| } else if (Elements.isStringOnlySupertype(element, compiler)) {
|
| if (nativeCheck) {
|
| @@ -1704,17 +1657,13 @@ class JavaScriptBackend extends Backend {
|
| ? 'stringSuperNativeTypeCast'
|
| : 'stringSuperNativeTypeCheck';
|
| } else {
|
| - return typeCast
|
| - ? 'stringSuperTypeCast'
|
| - : 'stringSuperTypeCheck';
|
| + return typeCast ? 'stringSuperTypeCast' : 'stringSuperTypeCheck';
|
| }
|
| } else if ((element == coreClasses.listClass ||
|
| - element == helpers.jsArrayClass) &&
|
| - type.treatAsRaw) {
|
| + element == helpers.jsArrayClass) &&
|
| + type.treatAsRaw) {
|
| if (nativeCheckOnly) return null;
|
| - return typeCast
|
| - ? 'listTypeCast'
|
| - : 'listTypeCheck';
|
| + return typeCast ? 'listTypeCast' : 'listTypeCheck';
|
| } else {
|
| if (Elements.isListSupertype(element, compiler)) {
|
| if (nativeCheck) {
|
| @@ -1722,15 +1671,11 @@ class JavaScriptBackend extends Backend {
|
| ? 'listSuperNativeTypeCast'
|
| : 'listSuperNativeTypeCheck';
|
| } else {
|
| - return typeCast
|
| - ? 'listSuperTypeCast'
|
| - : 'listSuperTypeCheck';
|
| + return typeCast ? 'listSuperTypeCast' : 'listSuperTypeCheck';
|
| }
|
| } else {
|
| if (type.isInterfaceType && !type.treatAsRaw) {
|
| - return typeCast
|
| - ? 'subtypeCast'
|
| - : 'assertSubtype';
|
| + return typeCast ? 'subtypeCast' : 'assertSubtype';
|
| } else if (type.isTypeVariable) {
|
| return typeCast
|
| ? 'subtypeOfRuntimeTypeCast'
|
| @@ -1741,13 +1686,9 @@ class JavaScriptBackend extends Backend {
|
| if (nativeCheck) {
|
| // TODO(karlklose): can we get rid of this branch when we use
|
| // interceptors?
|
| - return typeCast
|
| - ? 'interceptedTypeCast'
|
| - : 'interceptedTypeCheck';
|
| + return typeCast ? 'interceptedTypeCast' : 'interceptedTypeCheck';
|
| } else {
|
| - return typeCast
|
| - ? 'propertyTypeCast'
|
| - : 'propertyTypeCheck';
|
| + return typeCast ? 'propertyTypeCast' : 'propertyTypeCheck';
|
| }
|
| }
|
| }
|
| @@ -1831,8 +1772,8 @@ class JavaScriptBackend extends Backend {
|
| // TODO(sigurdm): Create a function registerLoadLibraryAccess.
|
| if (compiler.loadLibraryFunction == null) {
|
| compiler.loadLibraryFunction = helpers.loadLibraryWrapper;
|
| - enqueueInResolution(compiler.loadLibraryFunction,
|
| - compiler.globalDependencies);
|
| + enqueueInResolution(
|
| + compiler.loadLibraryFunction, compiler.globalDependencies);
|
| }
|
| } else if (element == helpers.requiresPreambleMarker) {
|
| requiresPreamble = true;
|
| @@ -1849,8 +1790,7 @@ class JavaScriptBackend extends Backend {
|
| }
|
|
|
| /// Called when [:new Symbol(...):] is seen.
|
| - void registerNewSymbol(Registry registry) {
|
| - }
|
| + void registerNewSymbol(Registry registry) {}
|
|
|
| /// Should [element] (a getter) that would normally not be generated due to
|
| /// treeshaking be retained for reflection?
|
| @@ -1930,13 +1870,13 @@ class JavaScriptBackend extends Backend {
|
| implementationClasses[coreClasses.nullClass] = helpers.jsNullClass;
|
|
|
| // These methods are overwritten with generated versions.
|
| - inlineCache.markAsNonInlinable(
|
| - helpers.getInterceptorMethod, insideLoop: true);
|
| + inlineCache.markAsNonInlinable(helpers.getInterceptorMethod,
|
| + insideLoop: true);
|
|
|
| specialOperatorEqClasses
|
| - ..add(coreClasses.objectClass)
|
| - ..add(helpers.jsInterceptorClass)
|
| - ..add(helpers.jsNullClass);
|
| + ..add(coreClasses.objectClass)
|
| + ..add(helpers.jsInterceptorClass)
|
| + ..add(helpers.jsNullClass);
|
|
|
| validateInterceptorImplementsAllObjectMethods(helpers.jsInterceptorClass);
|
| // The null-interceptor must also implement *all* methods.
|
| @@ -1945,9 +1885,8 @@ class JavaScriptBackend extends Backend {
|
| return new Future.value();
|
| }
|
|
|
| - void registerMirrorUsage(Set<String> symbols,
|
| - Set<Element> targets,
|
| - Set<Element> metaTargets) {
|
| + void registerMirrorUsage(
|
| + Set<String> symbols, Set<Element> targets, Set<Element> metaTargets) {
|
| if (symbols == null && targets == null && metaTargets == null) {
|
| // The user didn't specify anything, or there are imports of
|
| // 'dart:mirrors' without @MirrorsUsed.
|
| @@ -1992,8 +1931,8 @@ class JavaScriptBackend extends Backend {
|
| */
|
| bool requiredByMirrorSystem(Element element) {
|
| return hasInsufficientMirrorsUsed && isTreeShakingDisabled ||
|
| - matchesMirrorsMetaTarget(element) ||
|
| - targetsUsed.contains(element);
|
| + matchesMirrorsMetaTarget(element) ||
|
| + targetsUsed.contains(element);
|
| }
|
|
|
| /**
|
| @@ -2005,9 +1944,9 @@ class JavaScriptBackend extends Backend {
|
| Element enclosing = recursive ? element.enclosingElement : null;
|
|
|
| return hasInsufficientMirrorsUsed ||
|
| - matchesMirrorsMetaTarget(element) ||
|
| - targetsUsed.contains(element) ||
|
| - (enclosing != null && referencedFromMirrorSystem(enclosing));
|
| + matchesMirrorsMetaTarget(element) ||
|
| + targetsUsed.contains(element) ||
|
| + (enclosing != null && referencedFromMirrorSystem(enclosing));
|
| }
|
|
|
| /**
|
| @@ -2180,8 +2119,8 @@ class JavaScriptBackend extends Backend {
|
| _membersNeededForReflection.add(globalizedElement);
|
| }
|
|
|
| - jsAst.Call generateIsJsIndexableCall(jsAst.Expression use1,
|
| - jsAst.Expression use2) {
|
| + jsAst.Call generateIsJsIndexableCall(
|
| + jsAst.Expression use1, jsAst.Expression use2) {
|
| String dispatchPropertyName = embeddedNames.DISPATCH_PROPERTY_NAME;
|
| jsAst.Expression dispatchProperty =
|
| emitter.generateEmbeddedGlobalAccess(dispatchPropertyName);
|
| @@ -2202,8 +2141,7 @@ class JavaScriptBackend extends Backend {
|
| // Just checking for [:TypedData:] is not sufficient, as it is an
|
| // abstract class any user-defined class can implement. So we also
|
| // check for the interface [JavaScriptIndexingBehavior].
|
| - return
|
| - compiler.typedDataClass != null &&
|
| + return compiler.typedDataClass != null &&
|
| compiler.world.isInstantiated(compiler.typedDataClass) &&
|
| mask.satisfies(compiler.typedDataClass, compiler.world) &&
|
| mask.satisfies(helpers.jsIndexingBehaviorInterface, compiler.world);
|
| @@ -2214,13 +2152,14 @@ class JavaScriptBackend extends Backend {
|
| !type1.intersection(type2, compiler.world).isEmpty;
|
| // TODO(herhut): Maybe cache the TypeMask for typedDataClass and
|
| // jsIndexingBehaviourInterface.
|
| - return
|
| - compiler.typedDataClass != null &&
|
| + return compiler.typedDataClass != null &&
|
| compiler.world.isInstantiated(compiler.typedDataClass) &&
|
| intersects(mask,
|
| new TypeMask.subtype(compiler.typedDataClass, compiler.world)) &&
|
| - intersects(mask,
|
| - new TypeMask.subtype(helpers.jsIndexingBehaviorInterface, compiler.world));
|
| + intersects(
|
| + mask,
|
| + new TypeMask.subtype(
|
| + helpers.jsIndexingBehaviorInterface, compiler.world));
|
| }
|
|
|
| /// Returns all static fields that are referenced through [targetsUsed].
|
| @@ -2260,7 +2199,7 @@ class JavaScriptBackend extends Backend {
|
| noSuchMethodRegistry.onQueueEmpty();
|
| if (!enabledNoSuchMethod &&
|
| (noSuchMethodRegistry.hasThrowingNoSuchMethod ||
|
| - noSuchMethodRegistry.hasComplexNoSuchMethod)) {
|
| + noSuchMethodRegistry.hasComplexNoSuchMethod)) {
|
| enableNoSuchMethod(enqueuer);
|
| enabledNoSuchMethod = true;
|
| }
|
| @@ -2294,8 +2233,7 @@ class JavaScriptBackend extends Backend {
|
|
|
| compiler.libraryLoader.libraries.forEach(retainMetadataOf);
|
| for (Dependency dependency in metadataConstants) {
|
| - registerCompileTimeConstant(
|
| - dependency.constant,
|
| + registerCompileTimeConstant(dependency.constant,
|
| new EagerRegistry('EagerRegistry for ${dependency}', enqueuer));
|
| }
|
| if (!enqueuer.isResolutionQueue) {
|
| @@ -2343,53 +2281,46 @@ class JavaScriptBackend extends Backend {
|
| hasForceInline = true;
|
| if (VERBOSE_OPTIMIZER_HINTS) {
|
| reporter.reportHintMessage(
|
| - element,
|
| - MessageKind.GENERIC,
|
| - {'text': "Must inline"});
|
| + element, MessageKind.GENERIC, {'text': "Must inline"});
|
| }
|
| inlineCache.markAsMustInline(element);
|
| } else if (cls == helpers.noInlineClass) {
|
| hasNoInline = true;
|
| if (VERBOSE_OPTIMIZER_HINTS) {
|
| reporter.reportHintMessage(
|
| - element,
|
| - MessageKind.GENERIC,
|
| - {'text': "Cannot inline"});
|
| + element, MessageKind.GENERIC, {'text': "Cannot inline"});
|
| }
|
| inlineCache.markAsNonInlinable(element);
|
| } else if (cls == helpers.noThrowsClass) {
|
| hasNoThrows = true;
|
| if (!Elements.isStaticOrTopLevelFunction(element) &&
|
| !element.isFactoryConstructor) {
|
| - reporter.internalError(element,
|
| + reporter.internalError(
|
| + element,
|
| "@NoThrows() is currently limited to top-level"
|
| " or static functions and factory constructors.");
|
| }
|
| if (VERBOSE_OPTIMIZER_HINTS) {
|
| reporter.reportHintMessage(
|
| - element,
|
| - MessageKind.GENERIC,
|
| - {'text': "Cannot throw"});
|
| + element, MessageKind.GENERIC, {'text': "Cannot throw"});
|
| }
|
| compiler.world.registerCannotThrow(element);
|
| } else if (cls == helpers.noSideEffectsClass) {
|
| hasNoSideEffects = true;
|
| if (VERBOSE_OPTIMIZER_HINTS) {
|
| reporter.reportHintMessage(
|
| - element,
|
| - MessageKind.GENERIC,
|
| - {'text': "Has no side effects"});
|
| + element, MessageKind.GENERIC, {'text': "Has no side effects"});
|
| }
|
| compiler.world.registerSideEffectsFree(element);
|
| }
|
| }
|
| if (hasForceInline && hasNoInline) {
|
| - reporter.internalError(element,
|
| - "@ForceInline() must not be used with @NoInline.");
|
| + reporter.internalError(
|
| + element, "@ForceInline() must not be used with @NoInline.");
|
| }
|
| if (hasNoThrows && !hasNoInline) {
|
| - reporter.internalError(element,
|
| - "@NoThrows() should always be combined with @NoInline.");
|
| + reporter.internalError(
|
| + element, "@NoThrows() should always be combined with @NoInline.");
|
| }
|
| if (hasNoSideEffects && !hasNoInline) {
|
| reporter.internalError(element,
|
| @@ -2399,6 +2330,7 @@ class JavaScriptBackend extends Backend {
|
| compiler.enabledInvokeOn = true;
|
| }
|
| }
|
| +
|
| /*
|
| CodeBuffer codeOf(Element element) {
|
| return generatedCode.containsKey(element)
|
| @@ -2450,66 +2382,55 @@ class JavaScriptBackend extends Backend {
|
| bool enableCodegenWithErrorsIfSupported(Spannable node) {
|
| if (compiler.options.useCpsIr) {
|
| // TODO(25747): Support code generation with compile-time errors.
|
| - reporter.reportHintMessage(
|
| - node,
|
| - MessageKind.GENERIC,
|
| - {'text': "Generation of code with compile time errors is currently "
|
| - "not supported with the CPS IR."});
|
| + reporter.reportHintMessage(node, MessageKind.GENERIC, {
|
| + 'text': "Generation of code with compile time errors is currently "
|
| + "not supported with the CPS IR."
|
| + });
|
| return false;
|
| }
|
| return true;
|
| }
|
|
|
| - jsAst.Expression rewriteAsync(FunctionElement element,
|
| - jsAst.Expression code) {
|
| + jsAst.Expression rewriteAsync(
|
| + FunctionElement element, jsAst.Expression code) {
|
| AsyncRewriterBase rewriter = null;
|
| jsAst.Name name = namer.methodPropertyName(element);
|
| switch (element.asyncMarker) {
|
| case AsyncMarker.ASYNC:
|
| - rewriter = new AsyncRewriter(
|
| - reporter,
|
| - element,
|
| - asyncHelper:
|
| - emitter.staticFunctionAccess(helpers.asyncHelper),
|
| - wrapBody:
|
| - emitter.staticFunctionAccess(helpers.wrapBody),
|
| - newCompleter: emitter.staticFunctionAccess(
|
| - helpers.syncCompleterConstructor),
|
| + rewriter = new AsyncRewriter(reporter, element,
|
| + asyncHelper: emitter.staticFunctionAccess(helpers.asyncHelper),
|
| + wrapBody: emitter.staticFunctionAccess(helpers.wrapBody),
|
| + newCompleter:
|
| + emitter.staticFunctionAccess(helpers.syncCompleterConstructor),
|
| safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
|
| bodyName: namer.deriveAsyncBodyName(name));
|
| break;
|
| case AsyncMarker.SYNC_STAR:
|
| - rewriter = new SyncStarRewriter(
|
| - reporter,
|
| - element,
|
| - endOfIteration: emitter.staticFunctionAccess(
|
| - helpers.endOfIteration),
|
| - newIterable: emitter.staticFunctionAccess(
|
| - helpers.syncStarIterableConstructor),
|
| - yieldStarExpression: emitter.staticFunctionAccess(
|
| - helpers.yieldStar),
|
| - uncaughtErrorExpression: emitter.staticFunctionAccess(
|
| - helpers.syncStarUncaughtError),
|
| + rewriter = new SyncStarRewriter(reporter, element,
|
| + endOfIteration:
|
| + emitter.staticFunctionAccess(helpers.endOfIteration),
|
| + newIterable: emitter
|
| + .staticFunctionAccess(helpers.syncStarIterableConstructor),
|
| + yieldStarExpression:
|
| + emitter.staticFunctionAccess(helpers.yieldStar),
|
| + uncaughtErrorExpression:
|
| + emitter.staticFunctionAccess(helpers.syncStarUncaughtError),
|
| safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
|
| bodyName: namer.deriveAsyncBodyName(name));
|
| - break;
|
| + break;
|
| case AsyncMarker.ASYNC_STAR:
|
| - rewriter = new AsyncStarRewriter(
|
| - reporter,
|
| - element,
|
| - asyncStarHelper: emitter.staticFunctionAccess(
|
| - helpers.asyncStarHelper),
|
| - streamOfController: emitter.staticFunctionAccess(
|
| - helpers.streamOfController),
|
| - wrapBody:
|
| - emitter.staticFunctionAccess(helpers.wrapBody),
|
| - newController: emitter.staticFunctionAccess(
|
| - helpers.asyncStarControllerConstructor),
|
| + rewriter = new AsyncStarRewriter(reporter, element,
|
| + asyncStarHelper:
|
| + emitter.staticFunctionAccess(helpers.asyncStarHelper),
|
| + streamOfController:
|
| + emitter.staticFunctionAccess(helpers.streamOfController),
|
| + wrapBody: emitter.staticFunctionAccess(helpers.wrapBody),
|
| + newController: emitter
|
| + .staticFunctionAccess(helpers.asyncStarControllerConstructor),
|
| safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
|
| - yieldExpression: emitter.staticFunctionAccess(
|
| - helpers.yieldSingle),
|
| - yieldStarExpression: emitter.staticFunctionAccess(
|
| - helpers.yieldStar),
|
| + yieldExpression: emitter.staticFunctionAccess(helpers.yieldSingle),
|
| + yieldStarExpression:
|
| + emitter.staticFunctionAccess(helpers.yieldStar),
|
| bodyName: namer.deriveAsyncBodyName(name));
|
| break;
|
| default:
|
| @@ -2522,7 +2443,7 @@ class JavaScriptBackend extends Backend {
|
| /// The locations of js patch-files relative to the sdk-descriptors.
|
| static const _patchLocations = const <String, String>{
|
| "async": "_internal/js_runtime/lib/async_patch.dart",
|
| - "collection": "_internal/js_runtime/lib/collection_patch.dart",
|
| + "collection": "_internal/js_runtime/lib/collection_patch.dart",
|
| "convert": "_internal/js_runtime/lib/convert_patch.dart",
|
| "core": "_internal/js_runtime/lib/core_patch.dart",
|
| "developer": "_internal/js_runtime/lib/developer_patch.dart",
|
| @@ -2544,11 +2465,9 @@ class JavaScriptBackend extends Backend {
|
| @override
|
| ImpactStrategy createImpactStrategy(
|
| {bool supportDeferredLoad: true,
|
| - bool supportDumpInfo: true,
|
| - bool supportSerialization: true}) {
|
| - return new JavaScriptImpactStrategy(
|
| - resolution,
|
| - compiler.dumpInfoTask,
|
| + bool supportDumpInfo: true,
|
| + bool supportSerialization: true}) {
|
| + return new JavaScriptImpactStrategy(resolution, compiler.dumpInfoTask,
|
| supportDeferredLoad: supportDeferredLoad,
|
| supportDumpInfo: supportDumpInfo,
|
| supportSerialization: supportSerialization);
|
| @@ -2758,8 +2677,8 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
|
| }
|
|
|
| if (hasTypeLiteral) {
|
| - transformed.registerTypeUse(new TypeUse.instantiation(
|
| - backend.compiler.coreTypes.typeType));
|
| + transformed.registerTypeUse(
|
| + new TypeUse.instantiation(backend.compiler.coreTypes.typeType));
|
| registerBackendImpact(transformed, impacts.typeLiteral);
|
| }
|
|
|
| @@ -2769,8 +2688,8 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
|
| if (mapLiteralUse.isConstant) {
|
| registerBackendImpact(transformed, impacts.constantMapLiteral);
|
| } else {
|
| - transformed.registerTypeUse(
|
| - new TypeUse.instantiation(mapLiteralUse.type));
|
| + transformed
|
| + .registerTypeUse(new TypeUse.instantiation(mapLiteralUse.type));
|
| }
|
| registerRequiredType(mapLiteralUse.type);
|
| }
|
| @@ -2778,8 +2697,8 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
|
| for (ListLiteralUse listLiteralUse in worldImpact.listLiterals) {
|
| // TODO(johnniwinther): Use the [isConstant] and [isEmpty] property when
|
| // factory constructors are registered directly.
|
| - transformed.registerTypeUse(
|
| - new TypeUse.instantiation(listLiteralUse.type));
|
| + transformed
|
| + .registerTypeUse(new TypeUse.instantiation(listLiteralUse.type));
|
| registerRequiredType(listLiteralUse.type);
|
| }
|
|
|
| @@ -2796,7 +2715,8 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
|
| LocalFunctionElement closure = staticUse.element;
|
| if (closure.type.containsTypeVariables) {
|
| backend.compiler.enqueuer.resolution.universe
|
| - .closuresWithFreeTypeVariables.add(closure);
|
| + .closuresWithFreeTypeVariables
|
| + .add(closure);
|
| registerBackendImpact(transformed, impacts.computeSignature);
|
| }
|
| }
|
| @@ -2828,8 +2748,8 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
|
| return transformed;
|
| }
|
|
|
| - void registerBackendImpact(TransformedWorldImpact worldImpact,
|
| - BackendImpact backendImpact) {
|
| + void registerBackendImpact(
|
| + TransformedWorldImpact worldImpact, BackendImpact backendImpact) {
|
| for (Element staticUse in backendImpact.staticUses) {
|
| assert(staticUse != null);
|
| backend.registerBackendUse(staticUse);
|
| @@ -2839,14 +2759,12 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
|
| }
|
| for (InterfaceType instantiatedType in backendImpact.instantiatedTypes) {
|
| backend.registerBackendUse(instantiatedType.element);
|
| - worldImpact.registerTypeUse(
|
| - new TypeUse.instantiation(instantiatedType));
|
| + worldImpact.registerTypeUse(new TypeUse.instantiation(instantiatedType));
|
| }
|
| for (ClassElement cls in backendImpact.instantiatedClasses) {
|
| cls.ensureResolved(backend.resolution);
|
| backend.registerBackendUse(cls);
|
| - worldImpact.registerTypeUse(
|
| - new TypeUse.instantiation(cls.rawType));
|
| + worldImpact.registerTypeUse(new TypeUse.instantiation(cls.rawType));
|
| }
|
| for (BackendImpact otherImpact in backendImpact.otherImpacts) {
|
| registerBackendImpact(worldImpact, otherImpact);
|
| @@ -2888,8 +2806,8 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
|
| if (type.isTypeVariable) {
|
| registerBackendImpact(transformed, impacts.typeVariableTypeCheck);
|
| if (inCheckedMode) {
|
| - registerBackendImpact(transformed,
|
| - impacts.typeVariableCheckedModeTypeCheck);
|
| + registerBackendImpact(
|
| + transformed, impacts.typeVariableCheckedModeTypeCheck);
|
| }
|
| }
|
| }
|
| @@ -2963,18 +2881,17 @@ class JavaScriptImpactTransformer extends ImpactTransformer {
|
| backend.addCompileTimeConstantForEmission(constant);
|
| }
|
|
|
| - for (Pair<DartType, DartType> check in
|
| - impact.typeVariableBoundsSubtypeChecks) {
|
| + for (Pair<DartType, DartType> check
|
| + in impact.typeVariableBoundsSubtypeChecks) {
|
| backend.registerTypeVariableBoundsSubtypeCheck(check.a, check.b);
|
| }
|
|
|
| -
|
| for (StaticUse staticUse in impact.staticUses) {
|
| if (staticUse.kind == StaticUseKind.CLOSURE) {
|
| LocalFunctionElement closure = staticUse.element;
|
| if (backend.methodNeedsRti(closure)) {
|
| - registerBackendImpact(transformed, impacts.computeSignature);
|
| - }
|
| + registerBackendImpact(transformed, impacts.computeSignature);
|
| + }
|
| }
|
| }
|
|
|
| @@ -3029,17 +2946,14 @@ class JavaScriptImpactStrategy extends ImpactStrategy {
|
| final bool supportDumpInfo;
|
| final bool supportSerialization;
|
|
|
| - JavaScriptImpactStrategy(this.resolution,
|
| - this.dumpInfoTask,
|
| - {this.supportDeferredLoad,
|
| - this.supportDumpInfo,
|
| - this.supportSerialization});
|
| + JavaScriptImpactStrategy(this.resolution, this.dumpInfoTask,
|
| + {this.supportDeferredLoad,
|
| + this.supportDumpInfo,
|
| + this.supportSerialization});
|
|
|
| @override
|
| - void visitImpact(Element element,
|
| - WorldImpact impact,
|
| - WorldImpactVisitor visitor,
|
| - ImpactUseCase impactUse) {
|
| + void visitImpact(Element element, WorldImpact impact,
|
| + WorldImpactVisitor visitor, ImpactUseCase impactUse) {
|
| // TODO(johnniwinther): Compute the application strategy once for each use.
|
| if (impactUse == ResolutionEnqueuer.IMPACT_USE) {
|
| if (supportDeferredLoad || supportSerialization) {
|
| @@ -3061,8 +2975,7 @@ class JavaScriptImpactStrategy extends ImpactStrategy {
|
|
|
| @override
|
| void onImpactUsed(ImpactUseCase impactUse) {
|
| - if (impactUse == DeferredLoadTask.IMPACT_USE &&
|
| - !supportSerialization) {
|
| + if (impactUse == DeferredLoadTask.IMPACT_USE && !supportSerialization) {
|
| // TODO(johnniwinther): Allow emptying when serialization has been
|
| // performed.
|
| resolution.emptyCache();
|
|
|