| Index: pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
|
| diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
|
| index 7c9b6d88861b63f0fced1e5815b4ac4cea37899a..cb4dc4fbfd0b42f285ef55b1ecaa0ce6de9c7208 100644
|
| --- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
|
| +++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
|
| @@ -8,9 +8,8 @@ import 'dart:convert';
|
| import 'dart:collection' show HashMap;
|
|
|
| import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames;
|
| -import 'package:js_runtime/shared/embedded_names.dart' show
|
| - JsBuiltin,
|
| - JsGetName;
|
| +import 'package:js_runtime/shared/embedded_names.dart'
|
| + show JsBuiltin, JsGetName;
|
|
|
| import '../headers.dart';
|
| import '../js_emitter.dart' hide Emitter;
|
| @@ -20,76 +19,60 @@ import '../program_builder/program_builder.dart';
|
| import '../constant_ordering.dart' show deepCompareConstants;
|
|
|
| import '../../common.dart';
|
| -import '../../common/names.dart' show
|
| - Names;
|
| -import '../../compiler.dart' show
|
| - Compiler;
|
| +import '../../common/names.dart' show Names;
|
| +import '../../compiler.dart' show Compiler;
|
| import '../../constants/values.dart';
|
| -import '../../core_types.dart' show
|
| - CoreClasses;
|
| -import '../../dart_types.dart' show
|
| - DartType;
|
| +import '../../core_types.dart' show CoreClasses;
|
| +import '../../dart_types.dart' show DartType;
|
| import '../../deferred_load.dart' show OutputUnit;
|
| -import '../../elements/elements.dart' show
|
| - ClassElement,
|
| - ConstructorBodyElement,
|
| - Element,
|
| - Elements,
|
| - ElementKind,
|
| - FieldElement,
|
| - FunctionElement,
|
| - FunctionSignature,
|
| - LibraryElement,
|
| - MetadataAnnotation,
|
| - MethodElement,
|
| - MemberElement,
|
| - Name,
|
| - ParameterElement,
|
| - TypedefElement,
|
| - TypeVariableElement,
|
| - VariableElement;
|
| +import '../../elements/elements.dart'
|
| + show
|
| + ClassElement,
|
| + ConstructorBodyElement,
|
| + Element,
|
| + Elements,
|
| + ElementKind,
|
| + FieldElement,
|
| + FunctionElement,
|
| + FunctionSignature,
|
| + LibraryElement,
|
| + MetadataAnnotation,
|
| + MethodElement,
|
| + MemberElement,
|
| + Name,
|
| + ParameterElement,
|
| + TypedefElement,
|
| + TypeVariableElement,
|
| + VariableElement;
|
| import '../../hash/sha1.dart' show Hasher;
|
| import '../../io/code_output.dart';
|
| -import '../../io/line_column_provider.dart' show
|
| - LineColumnCollector,
|
| - LineColumnProvider;
|
| -import '../../io/source_map_builder.dart' show
|
| - SourceMapBuilder;
|
| +import '../../io/line_column_provider.dart'
|
| + show LineColumnCollector, LineColumnProvider;
|
| +import '../../io/source_map_builder.dart' show SourceMapBuilder;
|
| import '../../js/js.dart' as jsAst;
|
| import '../../js/js.dart' show js;
|
| -import '../../js_backend/backend_helpers.dart' show
|
| - BackendHelpers;
|
| -import '../../js_backend/js_backend.dart' show
|
| - CheckedModeHelper,
|
| - CompoundName,
|
| - ConstantEmitter,
|
| - CustomElementsAnalysis,
|
| - GetterName,
|
| - JavaScriptBackend,
|
| - JavaScriptConstantCompiler,
|
| - Namer,
|
| - RuntimeTypes,
|
| - SetterName,
|
| - Substitution,
|
| - TypeCheck,
|
| - TypeChecks,
|
| - TypeVariableHandler;
|
| -import '../../universe/call_structure.dart' show
|
| - CallStructure;
|
| -import '../../universe/selector.dart' show
|
| - Selector;
|
| -import '../../util/characters.dart' show
|
| - $$,
|
| - $A,
|
| - $HASH,
|
| - $PERIOD,
|
| - $Z,
|
| - $a,
|
| - $z;
|
| -import '../../util/uri_extras.dart' show
|
| - relativize;
|
| -import '../../util/util.dart' show
|
| - equalElements;
|
| +import '../../js_backend/backend_helpers.dart' show BackendHelpers;
|
| +import '../../js_backend/js_backend.dart'
|
| + show
|
| + CheckedModeHelper,
|
| + CompoundName,
|
| + ConstantEmitter,
|
| + CustomElementsAnalysis,
|
| + GetterName,
|
| + JavaScriptBackend,
|
| + JavaScriptConstantCompiler,
|
| + Namer,
|
| + RuntimeTypes,
|
| + SetterName,
|
| + Substitution,
|
| + TypeCheck,
|
| + TypeChecks,
|
| + TypeVariableHandler;
|
| +import '../../universe/call_structure.dart' show CallStructure;
|
| +import '../../universe/selector.dart' show Selector;
|
| +import '../../util/characters.dart' show $$, $A, $HASH, $PERIOD, $Z, $a, $z;
|
| +import '../../util/uri_extras.dart' show relativize;
|
| +import '../../util/util.dart' show equalElements;
|
|
|
| part 'class_builder.dart';
|
| part 'class_emitter.dart';
|
| @@ -101,7 +84,6 @@ part 'interceptor_emitter.dart';
|
| part 'nsm_emitter.dart';
|
| part 'setup_program_builder.dart';
|
|
|
| -
|
| class Emitter implements js_emitter.Emitter {
|
| final Compiler compiler;
|
| final CodeEmitterTask task;
|
| @@ -202,15 +184,13 @@ class Emitter implements js_emitter.Emitter {
|
|
|
| List<jsAst.Node> cspPrecompiledFunctionFor(OutputUnit outputUnit) {
|
| return _cspPrecompiledFunctions.putIfAbsent(
|
| - outputUnit,
|
| - () => new List<jsAst.Node>());
|
| + outputUnit, () => new List<jsAst.Node>());
|
| }
|
|
|
| List<jsAst.Expression> cspPrecompiledConstructorNamesFor(
|
| OutputUnit outputUnit) {
|
| return _cspPrecompiledConstructorNames.putIfAbsent(
|
| - outputUnit,
|
| - () => new List<jsAst.Expression>());
|
| + outputUnit, () => new List<jsAst.Expression>());
|
| }
|
|
|
| /// Erases the precompiled information for csp mode for all output units.
|
| @@ -225,9 +205,9 @@ class Emitter implements js_emitter.Emitter {
|
|
|
| @override
|
| bool isConstantInlinedOrAlreadyEmitted(ConstantValue constant) {
|
| - if (constant.isFunction) return true; // Already emitted.
|
| - if (constant.isPrimitive) return true; // Inlined.
|
| - if (constant.isDummy) return true; // Inlined.
|
| + if (constant.isFunction) return true; // Already emitted.
|
| + if (constant.isPrimitive) return true; // Inlined.
|
| + if (constant.isDummy) return true; // Inlined.
|
| // The name is null when the constant is already a JS constant.
|
| // TODO(floitsch): every constant should be registered, so that we can
|
| // share the ones that take up too much space (like some strings).
|
| @@ -270,8 +250,8 @@ class Emitter implements js_emitter.Emitter {
|
| if (isConstantInlinedOrAlreadyEmitted(value)) {
|
| return constantEmitter.generate(value);
|
| }
|
| - return js('#.#', [namer.globalObjectForConstant(value),
|
| - namer.constantName(value)]);
|
| + return js('#.#',
|
| + [namer.globalObjectForConstant(value), namer.constantName(value)]);
|
| }
|
|
|
| jsAst.Expression constantInitializerExpression(ConstantValue value) {
|
| @@ -280,18 +260,17 @@ class Emitter implements js_emitter.Emitter {
|
|
|
| String get name => 'CodeEmitter';
|
|
|
| - String get finishIsolateConstructorName
|
| - => '${namer.isolateName}.\$finishIsolateConstructor';
|
| - String get isolatePropertiesName
|
| - => '${namer.isolateName}.${namer.isolatePropertiesName}';
|
| - String get lazyInitializerProperty
|
| - => r'$lazy';
|
| - String get lazyInitializerName
|
| - => '${namer.isolateName}.${lazyInitializerProperty}';
|
| + String get finishIsolateConstructorName =>
|
| + '${namer.isolateName}.\$finishIsolateConstructor';
|
| + String get isolatePropertiesName =>
|
| + '${namer.isolateName}.${namer.isolatePropertiesName}';
|
| + String get lazyInitializerProperty => r'$lazy';
|
| + String get lazyInitializerName =>
|
| + '${namer.isolateName}.${lazyInitializerProperty}';
|
| String get initName => 'init';
|
|
|
| - jsAst.Name get makeConstListProperty
|
| - => namer.internalGlobal('makeConstantList');
|
| + jsAst.Name get makeConstListProperty =>
|
| + namer.internalGlobal('makeConstantList');
|
|
|
| /// The name of the property that contains all field names.
|
| ///
|
| @@ -321,22 +300,21 @@ class Emitter implements js_emitter.Emitter {
|
| jsAst.PropertyAccess globalPropertyAccess(Element element) {
|
| jsAst.Name name = namer.globalPropertyName(element);
|
| jsAst.PropertyAccess pa = new jsAst.PropertyAccess(
|
| - new jsAst.VariableUse(namer.globalObjectFor(element)),
|
| - name);
|
| + new jsAst.VariableUse(namer.globalObjectFor(element)), name);
|
| return pa;
|
| }
|
|
|
| @override
|
| jsAst.Expression isolateLazyInitializerAccess(FieldElement element) {
|
| - return jsAst.js('#.#', [namer.globalObjectFor(element),
|
| - namer.lazyInitializerName(element)]);
|
| - }
|
| + return jsAst.js('#.#',
|
| + [namer.globalObjectFor(element), namer.lazyInitializerName(element)]);
|
| + }
|
|
|
| @override
|
| jsAst.Expression isolateStaticClosureAccess(FunctionElement element) {
|
| - return jsAst.js('#.#()',
|
| - [namer.globalObjectFor(element), namer.staticClosureName(element)]);
|
| - }
|
| + return jsAst.js('#.#()',
|
| + [namer.globalObjectFor(element), namer.staticClosureName(element)]);
|
| + }
|
|
|
| @override
|
| jsAst.PropertyAccess staticFieldAccess(FieldElement element) {
|
| @@ -354,8 +332,8 @@ class Emitter implements js_emitter.Emitter {
|
| }
|
|
|
| @override
|
| - jsAst.PropertyAccess prototypeAccess(ClassElement element,
|
| - bool hasBeenInstantiated) {
|
| + jsAst.PropertyAccess prototypeAccess(
|
| + ClassElement element, bool hasBeenInstantiated) {
|
| return jsAst.js('#.prototype', constructorAccess(element));
|
| }
|
|
|
| @@ -373,8 +351,8 @@ class Emitter implements js_emitter.Emitter {
|
| jsAst.Template templateForBuiltin(JsBuiltin builtin) {
|
| switch (builtin) {
|
| case JsBuiltin.dartObjectConstructor:
|
| - return jsAst.js.expressionTemplateYielding(
|
| - typeAccess(coreClasses.objectClass));
|
| + return jsAst.js
|
| + .expressionTemplateYielding(typeAccess(coreClasses.objectClass));
|
|
|
| case JsBuiltin.isCheckPropertyToJsConstructorName:
|
| int isPrefixLength = namer.operatorIsPrefix.length;
|
| @@ -396,8 +374,8 @@ class Emitter implements js_emitter.Emitter {
|
| // TODO(floitsch): move this closer to where is-check properties are
|
| // built.
|
| String isPrefix = namer.operatorIsPrefix;
|
| - return jsAst.js.expressionTemplateFor(
|
| - "('$isPrefix' + #) in #.prototype");
|
| + return jsAst.js
|
| + .expressionTemplateFor("('$isPrefix' + #) in #.prototype");
|
|
|
| case JsBuiltin.isGivenTypeRti:
|
| return jsAst.js.expressionTemplateFor('#.$typeNameProperty === #');
|
| @@ -420,13 +398,13 @@ class Emitter implements js_emitter.Emitter {
|
| return jsAst.js.expressionTemplateFor("$functionGettersMap[#]()");
|
|
|
| default:
|
| - reporter.internalError(NO_LOCATION_SPANNABLE,
|
| - "Unhandled Builtin: $builtin");
|
| + reporter.internalError(
|
| + NO_LOCATION_SPANNABLE, "Unhandled Builtin: $builtin");
|
| return null;
|
| }
|
| }
|
|
|
| - List<jsAst.Statement> buildTrivialNsmHandlers(){
|
| + List<jsAst.Statement> buildTrivialNsmHandlers() {
|
| return nsmEmitter.buildTrivialNsmHandlers();
|
| }
|
|
|
| @@ -437,9 +415,7 @@ class Emitter implements js_emitter.Emitter {
|
| jsAst.Expression interceptorsByTagAccess,
|
| jsAst.Expression leafTagsAccess) {
|
| return NativeGenerator.buildNativeInfoHandler(infoAccess, constructorAccess,
|
| - subclassReadGenerator,
|
| - interceptorsByTagAccess,
|
| - leafTagsAccess);
|
| + subclassReadGenerator, interceptorsByTagAccess, leafTagsAccess);
|
| }
|
|
|
| jsAst.ObjectInitializer generateInterceptedNamesSet() {
|
| @@ -450,12 +426,12 @@ class Emitter implements js_emitter.Emitter {
|
| bool _isNativeTypeNeedingReflectionName(Element element) {
|
| if (!element.isClass) return false;
|
| return (element == coreClasses.intClass ||
|
| - element == coreClasses.doubleClass ||
|
| - element == coreClasses.numClass ||
|
| - element == coreClasses.stringClass ||
|
| - element == coreClasses.boolClass ||
|
| - element == coreClasses.nullClass ||
|
| - element == coreClasses.listClass);
|
| + element == coreClasses.doubleClass ||
|
| + element == coreClasses.numClass ||
|
| + element == coreClasses.stringClass ||
|
| + element == coreClasses.boolClass ||
|
| + element == coreClasses.nullClass ||
|
| + element == coreClasses.listClass);
|
| }
|
|
|
| /// Returns the "reflection name" of an [Element] or [Selector].
|
| @@ -473,12 +449,11 @@ class Emitter implements js_emitter.Emitter {
|
| String name = elementOrSelector.name;
|
| if (backend.shouldRetainName(name) ||
|
| elementOrSelector is Element &&
|
| - // Make sure to retain names of unnamed constructors, and
|
| - // for common native types.
|
| - ((name == '' &&
|
| - backend.isAccessibleByReflection(elementOrSelector)) ||
|
| - _isNativeTypeNeedingReflectionName(elementOrSelector))) {
|
| -
|
| + // Make sure to retain names of unnamed constructors, and
|
| + // for common native types.
|
| + ((name == '' &&
|
| + backend.isAccessibleByReflection(elementOrSelector)) ||
|
| + _isNativeTypeNeedingReflectionName(elementOrSelector))) {
|
| // TODO(ahe): Enable the next line when I can tell the difference between
|
| // an instance method and a global. They may have the same mangled name.
|
| // if (recordedMangledNames.contains(mangledName)) return null;
|
| @@ -488,8 +463,7 @@ class Emitter implements js_emitter.Emitter {
|
| return null;
|
| }
|
|
|
| - String getReflectionNameInternal(elementOrSelector,
|
| - jsAst.Name mangledName) {
|
| + String getReflectionNameInternal(elementOrSelector, jsAst.Name mangledName) {
|
| String name = namer.privateName(elementOrSelector.memberName);
|
| if (elementOrSelector.isGetter) return name;
|
| if (elementOrSelector.isSetter) {
|
| @@ -511,9 +485,9 @@ class Emitter implements js_emitter.Emitter {
|
| // with each other.
|
| return " $name";
|
| }
|
| - if (elementOrSelector is Selector
|
| - || elementOrSelector.isFunction
|
| - || elementOrSelector.isConstructor) {
|
| + if (elementOrSelector is Selector ||
|
| + elementOrSelector.isFunction ||
|
| + elementOrSelector.isConstructor) {
|
| int positionalParameterCount;
|
| String namedArguments = '';
|
| bool isConstructor = false;
|
| @@ -559,8 +533,8 @@ class Emitter implements js_emitter.Emitter {
|
| } else if (element.isTypedef) {
|
| return element.name;
|
| }
|
| - throw reporter.internalError(element,
|
| - 'Do not know how to reflect on this $element.');
|
| + throw reporter.internalError(
|
| + element, 'Do not know how to reflect on this $element.');
|
| }
|
|
|
| String namedParametersAsReflectionNames(CallStructure structure) {
|
| @@ -569,43 +543,45 @@ class Emitter implements js_emitter.Emitter {
|
| return ':$names';
|
| }
|
|
|
| - jsAst.Statement buildCspPrecompiledFunctionFor(
|
| - OutputUnit outputUnit) {
|
| + jsAst.Statement buildCspPrecompiledFunctionFor(OutputUnit outputUnit) {
|
| if (compiler.options.useContentSecurityPolicy) {
|
| // TODO(ahe): Compute a hash code.
|
| // TODO(sigurdm): Avoid this precompiled function. Generated
|
| // constructor-functions and getter/setter functions can be stored in the
|
| // library-description table. Setting properties on these can be moved to
|
| // finishClasses.
|
| - return js.statement(r"""
|
| + return js.statement(
|
| + r"""
|
| #precompiled = function ($collectedClasses$) {
|
| #norename;
|
| var $desc;
|
| #functions;
|
| return #result;
|
| };""",
|
| - {'norename': new jsAst.Comment("// ::norenaming:: "),
|
| - 'precompiled': generateEmbeddedGlobalAccess(embeddedNames.PRECOMPILED),
|
| - 'functions': cspPrecompiledFunctionFor(outputUnit),
|
| - 'result': new jsAst.ArrayInitializer(
|
| - cspPrecompiledConstructorNamesFor(outputUnit))});
|
| + {
|
| + 'norename': new jsAst.Comment("// ::norenaming:: "),
|
| + 'precompiled':
|
| + generateEmbeddedGlobalAccess(embeddedNames.PRECOMPILED),
|
| + 'functions': cspPrecompiledFunctionFor(outputUnit),
|
| + 'result': new jsAst.ArrayInitializer(
|
| + cspPrecompiledConstructorNamesFor(outputUnit))
|
| + });
|
| } else {
|
| return js.comment("Constructors are generated at runtime.");
|
| }
|
| }
|
|
|
| - void assembleClass(Class cls, ClassBuilder enclosingBuilder,
|
| - Fragment fragment) {
|
| + void assembleClass(
|
| + Class cls, ClassBuilder enclosingBuilder, Fragment fragment) {
|
| ClassElement classElement = cls.element;
|
| reporter.withCurrentElement(classElement, () {
|
| if (compiler.options.hasIncrementalSupport) {
|
| ClassBuilder cachedBuilder =
|
| cachedClassBuilders.putIfAbsent(classElement, () {
|
| - ClassBuilder builder =
|
| - new ClassBuilder.forClass(classElement, namer);
|
| - classEmitter.emitClass(cls, builder, fragment);
|
| - return builder;
|
| - });
|
| + ClassBuilder builder = new ClassBuilder.forClass(classElement, namer);
|
| + classEmitter.emitClass(cls, builder, fragment);
|
| + return builder;
|
| + });
|
| invariant(classElement, cachedBuilder.fields.isEmpty);
|
| invariant(classElement, cachedBuilder.superName == null);
|
| invariant(classElement, cachedBuilder.functionType == null);
|
| @@ -617,8 +593,8 @@ class Emitter implements js_emitter.Emitter {
|
| });
|
| }
|
|
|
| - void assembleStaticFunctions(Iterable<Method> staticFunctions,
|
| - Fragment fragment) {
|
| + void assembleStaticFunctions(
|
| + Iterable<Method> staticFunctions, Fragment fragment) {
|
| if (staticFunctions == null) return;
|
|
|
| for (Method method in staticFunctions) {
|
| @@ -628,17 +604,18 @@ class Emitter implements js_emitter.Emitter {
|
| if (element == null) continue;
|
| ClassBuilder builder = new ClassBuilder.forStatics(element, namer);
|
| containerBuilder.addMemberMethod(method, builder);
|
| - getElementDescriptor(element, fragment).properties
|
| + getElementDescriptor(element, fragment)
|
| + .properties
|
| .addAll(builder.properties);
|
| }
|
| }
|
|
|
| jsAst.Statement buildStaticNonFinalFieldInitializations(
|
| OutputUnit outputUnit) {
|
| - jsAst.Statement buildInitialization(Element element,
|
| - jsAst.Expression initialValue) {
|
| + jsAst.Statement buildInitialization(
|
| + Element element, jsAst.Expression initialValue) {
|
| return js.statement('${namer.staticStateHolder}.# = #',
|
| - [namer.globalPropertyName(element), initialValue]);
|
| + [namer.globalPropertyName(element), initialValue]);
|
| }
|
|
|
| bool inMainUnit = (outputUnit == compiler.deferredLoadTask.mainOutputUnit);
|
| @@ -662,7 +639,7 @@ class Emitter implements js_emitter.Emitter {
|
| // variables, so that `isolateProperties` stays a fast object.
|
| outputStaticNonFinalFieldLists.forEach(
|
| (OutputUnit fieldsOutputUnit, Iterable<VariableElement> fields) {
|
| - if (fieldsOutputUnit == outputUnit) return; // Skip the main unit.
|
| + if (fieldsOutputUnit == outputUnit) return; // Skip the main unit.
|
| for (Element element in fields) {
|
| reporter.withCurrentElement(element, () {
|
| parts.add(buildInitialization(element, jsAst.number(0)));
|
| @@ -675,12 +652,14 @@ class Emitter implements js_emitter.Emitter {
|
| }
|
|
|
| jsAst.Statement buildLazilyInitializedStaticFields(
|
| - Iterable<StaticField> lazyFields, {bool isMainFragment: true}) {
|
| + Iterable<StaticField> lazyFields,
|
| + {bool isMainFragment: true}) {
|
| if (lazyFields.isNotEmpty) {
|
| needsLazyInitializer = true;
|
| List<jsAst.Expression> laziesInfo =
|
| buildLaziesInfo(lazyFields, isMainFragment);
|
| - return js.statement('''
|
| + return js.statement(
|
| + '''
|
| (function(lazies) {
|
| for (var i = 0; i < lazies.length; ) {
|
| var fieldName = lazies[i++];
|
| @@ -711,11 +690,14 @@ class Emitter implements js_emitter.Emitter {
|
| }
|
| }
|
| })(#laziesInfo)
|
| - ''', {'notMinified': !compiler.options.enableMinification,
|
| + ''',
|
| + {
|
| + 'notMinified': !compiler.options.enableMinification,
|
| 'laziesInfo': new jsAst.ArrayInitializer(laziesInfo),
|
| 'lazy': js(lazyInitializerName),
|
| 'isMainFragment': isMainFragment,
|
| - 'isDeferredFragment': !isMainFragment});
|
| + 'isDeferredFragment': !isMainFragment
|
| + });
|
| } else {
|
| return js.comment("No lazy statics.");
|
| }
|
| @@ -739,8 +721,8 @@ class Emitter implements js_emitter.Emitter {
|
| }
|
|
|
| // TODO(sra): Remove this unused function.
|
| - jsAst.Expression buildLazilyInitializedStaticField(
|
| - VariableElement element, {String isolateProperties}) {
|
| + jsAst.Expression buildLazilyInitializedStaticField(VariableElement element,
|
| + {String isolateProperties}) {
|
| jsAst.Expression code = backend.generatedCode[element];
|
| // The code is null if we ended up not needing the lazily
|
| // initialized field after all because of constant folding
|
| @@ -754,28 +736,31 @@ class Emitter implements js_emitter.Emitter {
|
| if (isolateProperties != null) {
|
| // This is currently only used in incremental compilation to patch
|
| // in new lazy values.
|
| - return js('#(#,#,#,#,#)',
|
| - [js(lazyInitializerName),
|
| - js.quoteName(namer.globalPropertyName(element)),
|
| - js.quoteName(namer.lazyInitializerName(element)),
|
| - code,
|
| - js.string(element.name),
|
| - isolateProperties]);
|
| + return js('#(#,#,#,#,#)', [
|
| + js(lazyInitializerName),
|
| + js.quoteName(namer.globalPropertyName(element)),
|
| + js.quoteName(namer.lazyInitializerName(element)),
|
| + code,
|
| + js.string(element.name),
|
| + isolateProperties
|
| + ]);
|
| }
|
|
|
| if (compiler.options.enableMinification) {
|
| - return js('#(#,#,#)',
|
| - [js(lazyInitializerName),
|
| - js.quoteName(namer.globalPropertyName(element)),
|
| - js.quoteName(namer.lazyInitializerName(element)),
|
| - code]);
|
| + return js('#(#,#,#)', [
|
| + js(lazyInitializerName),
|
| + js.quoteName(namer.globalPropertyName(element)),
|
| + js.quoteName(namer.lazyInitializerName(element)),
|
| + code
|
| + ]);
|
| } else {
|
| - return js('#(#,#,#,#)',
|
| - [js(lazyInitializerName),
|
| - js.quoteName(namer.globalPropertyName(element)),
|
| - js.quoteName(namer.lazyInitializerName(element)),
|
| - code,
|
| - js.string(element.name)]);
|
| + return js('#(#,#,#,#)', [
|
| + js(lazyInitializerName),
|
| + js.quoteName(namer.globalPropertyName(element)),
|
| + js.quoteName(namer.lazyInitializerName(element)),
|
| + code,
|
| + js.string(element.name)
|
| + ]);
|
| }
|
| }
|
|
|
| @@ -790,17 +775,17 @@ class Emitter implements js_emitter.Emitter {
|
| jsAst.Expression typesAccess =
|
| generateEmbeddedGlobalAccess(embeddedNames.TYPES);
|
|
|
| - parts..add(js.statement('# = #;', [metadataAccess, program.metadata]))
|
| - ..add(js.statement('# = #;', [typesAccess, types]));
|
| + parts
|
| + ..add(js.statement('# = #;', [metadataAccess, program.metadata]))
|
| + ..add(js.statement('# = #;', [typesAccess, types]));
|
| } else if (types != null) {
|
| - parts.add(js.statement('var ${namer.deferredTypesName} = #;',
|
| - types));
|
| + parts.add(js.statement('var ${namer.deferredTypesName} = #;', types));
|
| }
|
| return new jsAst.Block(parts);
|
| }
|
|
|
| jsAst.Statement buildCompileTimeConstants(List<Constant> constants,
|
| - {bool isMainFragment}) {
|
| + {bool isMainFragment}) {
|
| assert(isMainFragment != null);
|
|
|
| if (constants.isEmpty) return js.comment("No constants in program.");
|
| @@ -822,9 +807,11 @@ class Emitter implements js_emitter.Emitter {
|
|
|
| jsAst.Statement buildConstantInitializer(ConstantValue constant) {
|
| jsAst.Name name = namer.constantName(constant);
|
| - jsAst.Statement initializer = js.statement('#.# = #',
|
| - [namer.globalObjectForConstant(constant), name,
|
| - constantInitializerExpression(constant)]);
|
| + jsAst.Statement initializer = js.statement('#.# = #', [
|
| + namer.globalObjectForConstant(constant),
|
| + name,
|
| + constantInitializerExpression(constant)
|
| + ]);
|
| compiler.dumpInfoTask.registerConstantAst(constant, initializer);
|
| return initializer;
|
| }
|
| @@ -836,7 +823,8 @@ class Emitter implements js_emitter.Emitter {
|
|
|
| jsAst.Statement buildMakeConstantList(bool outputContainsConstantList) {
|
| if (outputContainsConstantList) {
|
| - return js.statement(r'''
|
| + return js.statement(
|
| + r'''
|
| // Functions are stored in the hidden class and not as properties in
|
| // the object. We never actually look at the value, but only want
|
| // to know if the property exists.
|
| @@ -853,13 +841,12 @@ class Emitter implements js_emitter.Emitter {
|
|
|
| jsAst.Statement buildFunctionThatReturnsNull() {
|
| return js.statement('#.# = function() {}',
|
| - [namer.isolateName,
|
| - backend.rtiEncoder.getFunctionThatReturnsNullName]);
|
| + [namer.isolateName, backend.rtiEncoder.getFunctionThatReturnsNullName]);
|
| }
|
|
|
| jsAst.Expression generateFunctionThatReturnsNull() {
|
| - return js("#.#", [namer.isolateName,
|
| - backend.rtiEncoder.getFunctionThatReturnsNullName]);
|
| + return js("#.#",
|
| + [namer.isolateName, backend.rtiEncoder.getFunctionThatReturnsNullName]);
|
| }
|
|
|
| buildMain(jsAst.Statement invokeMain) {
|
| @@ -868,23 +855,25 @@ class Emitter implements js_emitter.Emitter {
|
| List<jsAst.Statement> parts = <jsAst.Statement>[];
|
|
|
| if (NativeGenerator.needsIsolateAffinityTagInitialization(backend)) {
|
| - parts.add(
|
| - NativeGenerator.generateIsolateAffinityTagInitialization(
|
| - backend,
|
| - generateEmbeddedGlobalAccess,
|
| - js("""
|
| + parts.add(NativeGenerator.generateIsolateAffinityTagInitialization(
|
| + backend,
|
| + generateEmbeddedGlobalAccess,
|
| + js(
|
| + """
|
| // On V8, the 'intern' function converts a string to a symbol, which
|
| // makes property access much faster.
|
| function (s) {
|
| var o = {};
|
| o[s] = 1;
|
| return Object.keys(convertToFastObject(o))[0];
|
| - }""", [])));
|
| + }""",
|
| + [])));
|
| }
|
|
|
| - parts..add(js.comment('BEGIN invoke [main].'))
|
| - ..add(invokeMain)
|
| - ..add(js.comment('END invoke [main].'));
|
| + parts
|
| + ..add(js.comment('BEGIN invoke [main].'))
|
| + ..add(invokeMain)
|
| + ..add(js.comment('END invoke [main].'));
|
|
|
| return new jsAst.Block(parts);
|
| }
|
| @@ -905,7 +894,8 @@ class Emitter implements js_emitter.Emitter {
|
| jsAst.Expression laziesAccess =
|
| generateEmbeddedGlobalAccess(embeddedNames.LAZIES);
|
|
|
| - return js.statement('''
|
| + return js.statement(
|
| + '''
|
| function init() {
|
| $isolatePropertiesName = Object.create(null);
|
| #allClasses = map();
|
| @@ -1015,20 +1005,24 @@ class Emitter implements js_emitter.Emitter {
|
| return Isolate;
|
| }
|
|
|
| - }''', {'allClasses': allClassesAccess,
|
| - 'getTypeFromName': getTypeFromNameAccess,
|
| - 'interceptorsByTag': interceptorsByTagAccess,
|
| - 'leafTags': leafTagsAccess,
|
| - 'finishedClasses': finishedClassesAccess,
|
| - 'needsLazyInitializer': needsLazyInitializer,
|
| - 'lazies': laziesAccess, 'cyclicThrow': cyclicThrow,
|
| - 'isolatePropertiesName': namer.isolatePropertiesName,
|
| - 'outputContainsConstantList': outputContainsConstantList,
|
| - 'makeConstListProperty': makeConstListProperty,
|
| - 'functionThatReturnsNullProperty':
|
| - backend.rtiEncoder.getFunctionThatReturnsNullName,
|
| - 'hasIncrementalSupport': compiler.options.hasIncrementalSupport,
|
| - 'lazyInitializerProperty': lazyInitializerProperty,});
|
| + }''',
|
| + {
|
| + 'allClasses': allClassesAccess,
|
| + 'getTypeFromName': getTypeFromNameAccess,
|
| + 'interceptorsByTag': interceptorsByTagAccess,
|
| + 'leafTags': leafTagsAccess,
|
| + 'finishedClasses': finishedClassesAccess,
|
| + 'needsLazyInitializer': needsLazyInitializer,
|
| + 'lazies': laziesAccess,
|
| + 'cyclicThrow': cyclicThrow,
|
| + 'isolatePropertiesName': namer.isolatePropertiesName,
|
| + 'outputContainsConstantList': outputContainsConstantList,
|
| + 'makeConstListProperty': makeConstListProperty,
|
| + 'functionThatReturnsNullProperty':
|
| + backend.rtiEncoder.getFunctionThatReturnsNullName,
|
| + 'hasIncrementalSupport': compiler.options.hasIncrementalSupport,
|
| + 'lazyInitializerProperty': lazyInitializerProperty,
|
| + });
|
| }
|
|
|
| jsAst.Statement buildConvertToFastObjectFunction() {
|
| @@ -1047,7 +1041,8 @@ class Emitter implements js_emitter.Emitter {
|
| }'''));
|
| }
|
|
|
| - return js.statement(r'''
|
| + return js.statement(
|
| + r'''
|
| function convertToFastObject(properties) {
|
| // Create an instance that uses 'properties' as prototype. This should
|
| // make 'properties' a fast object.
|
| @@ -1056,7 +1051,8 @@ class Emitter implements js_emitter.Emitter {
|
| new MyClass();
|
| #;
|
| return properties;
|
| - }''', [debugCode]);
|
| + }''',
|
| + [debugCode]);
|
| }
|
|
|
| jsAst.Statement buildConvertToSlowObjectFunction() {
|
| @@ -1092,14 +1088,14 @@ class Emitter implements js_emitter.Emitter {
|
| return supportsDirectProtoAccess;
|
| }
|
|
|
| - jsAst.Expression generateLibraryDescriptor(LibraryElement library,
|
| - Fragment fragment) {
|
| + jsAst.Expression generateLibraryDescriptor(
|
| + LibraryElement library, Fragment fragment) {
|
| var uri = "";
|
| if (!compiler.options.enableMinification || backend.mustPreserveUris) {
|
| uri = library.canonicalUri;
|
| if (uri.scheme == 'file' && compiler.options.outputUri != null) {
|
| - uri = relativize(
|
| - compiler.options.outputUri, library.canonicalUri, false);
|
| + uri =
|
| + relativize(compiler.options.outputUri, library.canonicalUri, false);
|
| }
|
| }
|
|
|
| @@ -1125,11 +1121,12 @@ class Emitter implements js_emitter.Emitter {
|
| compiler.dumpInfoTask.registerElementAst(library, initializer);
|
|
|
| List<jsAst.Expression> parts = <jsAst.Expression>[];
|
| - parts..add(js.string(libraryName))
|
| - ..add(js.string(uri.toString()))
|
| - ..add(metadata == null ? new jsAst.ArrayHole() : metadata)
|
| - ..add(js('#', namer.globalObjectFor(library)))
|
| - ..add(initializer);
|
| + parts
|
| + ..add(js.string(libraryName))
|
| + ..add(js.string(uri.toString()))
|
| + ..add(metadata == null ? new jsAst.ArrayHole() : metadata)
|
| + ..add(js('#', namer.globalObjectFor(library)))
|
| + ..add(initializer);
|
| if (library == compiler.mainApp) {
|
| parts.add(js.number(1));
|
| }
|
| @@ -1137,12 +1134,13 @@ class Emitter implements js_emitter.Emitter {
|
| return new jsAst.ArrayInitializer(parts);
|
| }
|
|
|
| - void assemblePrecompiledConstructor(OutputUnit outputUnit,
|
| - jsAst.Name constructorName,
|
| - jsAst.Expression constructorAst,
|
| - List<jsAst.Name> fields) {
|
| - cspPrecompiledFunctionFor(outputUnit).add(
|
| - new jsAst.FunctionDeclaration(constructorName, constructorAst));
|
| + void assemblePrecompiledConstructor(
|
| + OutputUnit outputUnit,
|
| + jsAst.Name constructorName,
|
| + jsAst.Expression constructorAst,
|
| + List<jsAst.Name> fields) {
|
| + cspPrecompiledFunctionFor(outputUnit)
|
| + .add(new jsAst.FunctionDeclaration(constructorName, constructorAst));
|
|
|
| String fieldNamesProperty = FIELD_NAMES_PROPERTY_NAME;
|
| bool hasIsolateSupport = compiler.hasIsolateSupport;
|
| @@ -1154,7 +1152,8 @@ class Emitter implements js_emitter.Emitter {
|
| fieldNamesArray = new jsAst.LiteralNull();
|
| }
|
|
|
| - cspPrecompiledFunctionFor(outputUnit).add(js.statement(r'''
|
| + cspPrecompiledFunctionFor(outputUnit).add(js.statement(
|
| + r'''
|
| {
|
| #constructorName.#typeNameProperty = #constructorNameString;
|
| // IE does not have a name property.
|
| @@ -1167,11 +1166,13 @@ class Emitter implements js_emitter.Emitter {
|
| #constructorName.$fieldNamesProperty = #fieldNamesArray;
|
| }
|
| }''',
|
| - {"constructorName": constructorName,
|
| - "typeNameProperty": typeNameProperty,
|
| - "constructorNameString": js.quoteName(constructorName),
|
| - "hasIsolateSupport": hasIsolateSupport,
|
| - "fieldNamesArray": fieldNamesArray}));
|
| + {
|
| + "constructorName": constructorName,
|
| + "typeNameProperty": typeNameProperty,
|
| + "constructorNameString": js.quoteName(constructorName),
|
| + "hasIsolateSupport": hasIsolateSupport,
|
| + "fieldNamesArray": fieldNamesArray
|
| + }));
|
|
|
| cspPrecompiledConstructorNamesFor(outputUnit).add(js('#', constructorName));
|
| }
|
| @@ -1192,10 +1193,10 @@ class Emitter implements js_emitter.Emitter {
|
| jsAst.Expression typeIndex =
|
| task.metadataCollector.reifyType(type, ignoreTypeVariables: true);
|
| ClassBuilder builder = new ClassBuilder.forStatics(typedef, namer);
|
| - builder.addPropertyByName(embeddedNames.TYPEDEF_TYPE_PROPERTY_NAME,
|
| - typeIndex);
|
| - builder.addPropertyByName(embeddedNames.TYPEDEF_PREDICATE_PROPERTY_NAME,
|
| - js.boolean(true));
|
| + builder.addPropertyByName(
|
| + embeddedNames.TYPEDEF_TYPE_PROPERTY_NAME, typeIndex);
|
| + builder.addPropertyByName(
|
| + embeddedNames.TYPEDEF_PREDICATE_PROPERTY_NAME, js.boolean(true));
|
|
|
| // We can be pretty sure that the objectClass is initialized, since
|
| // typedefs are only emitted with reflection, which requires lots of
|
| @@ -1206,16 +1207,14 @@ class Emitter implements js_emitter.Emitter {
|
| jsAst.Name mangledName = namer.globalPropertyName(typedef);
|
| String reflectionName = getReflectionName(typedef, mangledName);
|
| getElementDescriptor(library, mainFragment)
|
| - ..addProperty(mangledName, declaration)
|
| - ..addPropertyByName("+$reflectionName", js.string(''));
|
| + ..addProperty(mangledName, declaration)
|
| + ..addPropertyByName("+$reflectionName", js.string(''));
|
| // Also emit a trivial constructor for CSP mode.
|
| jsAst.Name constructorName = mangledName;
|
| jsAst.Expression constructorAst = js('function() {}');
|
| List<jsAst.Name> fieldNames = [];
|
| - assemblePrecompiledConstructor(mainOutputUnit,
|
| - constructorName,
|
| - constructorAst,
|
| - fieldNames);
|
| + assemblePrecompiledConstructor(
|
| + mainOutputUnit, constructorName, constructorAst, fieldNames);
|
| }
|
| }
|
|
|
| @@ -1234,13 +1233,12 @@ class Emitter implements js_emitter.Emitter {
|
| if (isProgramSplit) {
|
| String template =
|
| "var #globalObject = #globalsHolder.#globalObject = map();";
|
| - parts.add(js.statement(template, {"globalObject": globalObject,
|
| - "globalsHolder": globalsHolder}));
|
| + parts.add(js.statement(template,
|
| + {"globalObject": globalObject, "globalsHolder": globalsHolder}));
|
| } else {
|
| - parts.add(js.statement("var #globalObject = map();",
|
| - {"globalObject": globalObject}));
|
| + parts.add(js.statement(
|
| + "var #globalObject = map();", {"globalObject": globalObject}));
|
| }
|
| -
|
| }
|
|
|
| return new jsAst.Block(parts);
|
| @@ -1292,13 +1290,15 @@ class Emitter implements js_emitter.Emitter {
|
| '''));
|
|
|
| for (String object in Namer.userGlobalObjects) {
|
| - parts.add(js.statement('''
|
| + parts.add(js.statement(
|
| + '''
|
| if (typeof print === "function") {
|
| print("Size of " + #objectString + ": "
|
| + String(Object.getOwnPropertyNames(#object).length)
|
| + ", fast properties " + HasFastProperties(#object));
|
| }
|
| - ''', {"object": object, "objectString": js.string(object)}));
|
| + ''',
|
| + {"object": object, "objectString": js.string(object)}));
|
| }
|
| }
|
|
|
| @@ -1323,8 +1323,7 @@ class Emitter implements js_emitter.Emitter {
|
| }
|
|
|
| if (!mangledGlobalFieldNames.isEmpty) {
|
| - List<jsAst.Name> keys = mangledGlobalFieldNames.keys.toList()
|
| - ..sort();
|
| + List<jsAst.Name> keys = mangledGlobalFieldNames.keys.toList()..sort();
|
| List<jsAst.Property> properties = <jsAst.Property>[];
|
| for (jsAst.Name key in keys) {
|
| jsAst.Literal value = js.string(mangledGlobalFieldNames[key]);
|
| @@ -1345,14 +1344,13 @@ class Emitter implements js_emitter.Emitter {
|
| pendingStatics =
|
| Elements.sortedByPosition(elements.where((e) => !e.isLibrary));
|
|
|
| - pendingStatics.forEach((element) =>
|
| - reporter.reportInfo(
|
| - element, MessageKind.GENERIC, {'text': 'Pending statics.'}));
|
| + pendingStatics.forEach((element) => reporter.reportInfo(
|
| + element, MessageKind.GENERIC, {'text': 'Pending statics.'}));
|
| }
|
|
|
| if (pendingStatics != null && !pendingStatics.isEmpty) {
|
| - reporter.internalError(pendingStatics.first,
|
| - 'Pending statics (see above).');
|
| + reporter.internalError(
|
| + pendingStatics.first, 'Pending statics (see above).');
|
| }
|
| }
|
|
|
| @@ -1384,9 +1382,10 @@ class Emitter implements js_emitter.Emitter {
|
| /// variable. The deferred hunks will add their initialization to this.
|
| /// The semicolon is important in minified mode, without it the
|
| /// following parenthesis looks like a call to the object literal.
|
| - return js.statement('self.#deferredInitializers = '
|
| - 'self.#deferredInitializers || Object.create(null);',
|
| - {'deferredInitializers': deferredInitializers});
|
| + return js.statement(
|
| + 'self.#deferredInitializers = '
|
| + 'self.#deferredInitializers || Object.create(null);',
|
| + {'deferredInitializers': deferredInitializers});
|
| }
|
|
|
| jsAst.Program buildOutputAstForMain(Program program,
|
| @@ -1397,8 +1396,7 @@ class Emitter implements js_emitter.Emitter {
|
|
|
| List<jsAst.Statement> statements = <jsAst.Statement>[];
|
|
|
| - statements..add(buildGeneratedBy())
|
| - ..add(js.comment(HOOKS_API_USAGE));
|
| + statements..add(buildGeneratedBy())..add(js.comment(HOOKS_API_USAGE));
|
|
|
| if (isProgramSplit) {
|
| statements.add(buildDeferredHeader());
|
| @@ -1420,9 +1418,8 @@ class Emitter implements js_emitter.Emitter {
|
| }
|
|
|
| if (descriptors.isNotEmpty) {
|
| - List<Element> remainingLibraries = descriptors.keys
|
| - .where((Element e) => e is LibraryElement)
|
| - .toList();
|
| + List<Element> remainingLibraries =
|
| + descriptors.keys.where((Element e) => e is LibraryElement).toList();
|
|
|
| // The remaining descriptors are only accessible through reflection.
|
| // The program builder does not collect libraries that only
|
| @@ -1440,7 +1437,8 @@ class Emitter implements js_emitter.Emitter {
|
|
|
| // Using a named function here produces easier to read stack traces in
|
| // Chrome/V8.
|
| - statements.add(js.statement("""
|
| + statements.add(js.statement(
|
| + """
|
| (function() {
|
| // No renaming in the top-level function to save the locals for the
|
| // nested context where they will be used more. We have to put the
|
| @@ -1550,47 +1548,52 @@ class Emitter implements js_emitter.Emitter {
|
|
|
| #main;
|
| })();
|
| - """, {
|
| - "disableVariableRenaming": js.comment("/* ::norenaming:: */"),
|
| - "hasIncrementalSupport": compiler.options.hasIncrementalSupport,
|
| - "helper": js('this.#', [namer.incrementalHelperName]),
|
| - "schemaChange": buildSchemaChangeFunction(),
|
| - "addMethod": buildIncrementalAddMethod(),
|
| - "isProgramSplit": isProgramSplit,
|
| - "supportsDirectProtoAccess": buildSupportsDirectProtoAccess(),
|
| - "globalsHolder": globalsHolder,
|
| - "globalObjectSetup": buildGlobalObjectSetup(isProgramSplit),
|
| - "isolateName": namer.isolateName,
|
| - "isolatePropertiesName": js(isolatePropertiesName),
|
| - "initName": initName,
|
| - "functionThatReturnsNull": buildFunctionThatReturnsNull(),
|
| - "mangledNames": buildMangledNames(),
|
| - "setupProgram": buildSetupProgram(program, compiler, backend, namer, this),
|
| - "setupProgramName": setupProgramName,
|
| - "descriptors": descriptorsAst,
|
| - "cspPrecompiledFunctions": buildCspPrecompiledFunctionFor(mainOutputUnit),
|
| - "getInterceptorMethods": interceptorEmitter.buildGetInterceptorMethods(),
|
| - "oneShotInterceptors": interceptorEmitter.buildOneShotInterceptors(),
|
| - "makeConstantList":
|
| - buildMakeConstantList(program.outputContainsConstantList),
|
| - "compileTimeConstants": buildCompileTimeConstants(mainFragment.constants,
|
| - isMainFragment: true),
|
| - "deferredBoilerPlate": buildDeferredBoilerPlate(deferredLoadHashes),
|
| - "staticNonFinalInitializers": buildStaticNonFinalFieldInitializations(
|
| - mainOutputUnit),
|
| - "typeToInterceptorMap":
|
| - interceptorEmitter.buildTypeToInterceptorMap(program),
|
| - "lazyStaticFields": buildLazilyInitializedStaticFields(
|
| - mainFragment.staticLazilyInitializedFields),
|
| - "metadata": buildMetadata(program, mainOutputUnit),
|
| - "convertToFastObject": buildConvertToFastObjectFunction(),
|
| - "convertToSlowObject": buildConvertToSlowObjectFunction(),
|
| - "convertGlobalObjectsToFastObjects":
|
| - buildConvertGlobalObjectToFastObjects(),
|
| - "debugFastObjects": buildDebugFastObjectCode(),
|
| - "init": buildInitFunction(program.outputContainsConstantList),
|
| - "main": buildMain(mainFragment.invokeMain)
|
| - }));
|
| + """,
|
| + {
|
| + "disableVariableRenaming": js.comment("/* ::norenaming:: */"),
|
| + "hasIncrementalSupport": compiler.options.hasIncrementalSupport,
|
| + "helper": js('this.#', [namer.incrementalHelperName]),
|
| + "schemaChange": buildSchemaChangeFunction(),
|
| + "addMethod": buildIncrementalAddMethod(),
|
| + "isProgramSplit": isProgramSplit,
|
| + "supportsDirectProtoAccess": buildSupportsDirectProtoAccess(),
|
| + "globalsHolder": globalsHolder,
|
| + "globalObjectSetup": buildGlobalObjectSetup(isProgramSplit),
|
| + "isolateName": namer.isolateName,
|
| + "isolatePropertiesName": js(isolatePropertiesName),
|
| + "initName": initName,
|
| + "functionThatReturnsNull": buildFunctionThatReturnsNull(),
|
| + "mangledNames": buildMangledNames(),
|
| + "setupProgram":
|
| + buildSetupProgram(program, compiler, backend, namer, this),
|
| + "setupProgramName": setupProgramName,
|
| + "descriptors": descriptorsAst,
|
| + "cspPrecompiledFunctions":
|
| + buildCspPrecompiledFunctionFor(mainOutputUnit),
|
| + "getInterceptorMethods":
|
| + interceptorEmitter.buildGetInterceptorMethods(),
|
| + "oneShotInterceptors": interceptorEmitter.buildOneShotInterceptors(),
|
| + "makeConstantList":
|
| + buildMakeConstantList(program.outputContainsConstantList),
|
| + "compileTimeConstants": buildCompileTimeConstants(
|
| + mainFragment.constants,
|
| + isMainFragment: true),
|
| + "deferredBoilerPlate": buildDeferredBoilerPlate(deferredLoadHashes),
|
| + "staticNonFinalInitializers":
|
| + buildStaticNonFinalFieldInitializations(mainOutputUnit),
|
| + "typeToInterceptorMap":
|
| + interceptorEmitter.buildTypeToInterceptorMap(program),
|
| + "lazyStaticFields": buildLazilyInitializedStaticFields(
|
| + mainFragment.staticLazilyInitializedFields),
|
| + "metadata": buildMetadata(program, mainOutputUnit),
|
| + "convertToFastObject": buildConvertToFastObjectFunction(),
|
| + "convertToSlowObject": buildConvertToSlowObjectFunction(),
|
| + "convertGlobalObjectsToFastObjects":
|
| + buildConvertGlobalObjectToFastObjects(),
|
| + "debugFastObjects": buildDebugFastObjectCode(),
|
| + "init": buildInitFunction(program.outputContainsConstantList),
|
| + "main": buildMain(mainFragment.invokeMain)
|
| + }));
|
|
|
| return new jsAst.Program(statements);
|
| }
|
| @@ -1603,14 +1606,12 @@ class Emitter implements js_emitter.Emitter {
|
| codeOutputListeners = <CodeOutputListener>[lineColumnCollector];
|
| }
|
|
|
| - CodeOutput mainOutput =
|
| - new StreamCodeOutput(compiler.outputProvider('', 'js'),
|
| - codeOutputListeners);
|
| + CodeOutput mainOutput = new StreamCodeOutput(
|
| + compiler.outputProvider('', 'js'), codeOutputListeners);
|
| outputBuffers[mainOutputUnit] = mainOutput;
|
|
|
| -
|
| - mainOutput.addBuffer(jsAst.createCodeBuffer(
|
| - program, compiler, monitor: compiler.dumpInfoTask));
|
| + mainOutput.addBuffer(jsAst.createCodeBuffer(program, compiler,
|
| + monitor: compiler.dumpInfoTask));
|
|
|
| if (compiler.options.deferredMapUri != null) {
|
| outputDeferredMap();
|
| @@ -1774,8 +1775,8 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| return outputs;
|
| }
|
|
|
| - void finalizeTokensInAst(jsAst.Program main,
|
| - Iterable<jsAst.Program> deferredParts) {
|
| + void finalizeTokensInAst(
|
| + jsAst.Program main, Iterable<jsAst.Program> deferredParts) {
|
| jsAst.TokenCounter counter = new jsAst.TokenCounter();
|
| counter.countTokens(main);
|
| deferredParts.forEach(counter.countTokens);
|
| @@ -1794,7 +1795,7 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| programBuilder.collector.outputStaticNonFinalFieldLists;
|
| outputLibraryLists = programBuilder.collector.outputLibraryLists;
|
| typedefsNeededForReflection =
|
| - programBuilder.collector.typedefsNeededForReflection;
|
| + programBuilder.collector.typedefsNeededForReflection;
|
|
|
| assembleProgram(program);
|
|
|
| @@ -1804,11 +1805,9 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
|
|
| Map<OutputUnit, _DeferredOutputUnitHash> deferredHashTokens =
|
| new Map<OutputUnit, _DeferredOutputUnitHash>.fromIterables(
|
| - deferredParts.keys,
|
| - deferredParts.keys.map((OutputUnit unit) {
|
| - return new _DeferredOutputUnitHash(unit);
|
| - })
|
| - );
|
| + deferredParts.keys, deferredParts.keys.map((OutputUnit unit) {
|
| + return new _DeferredOutputUnitHash(unit);
|
| + }));
|
|
|
| jsAst.Program mainOutput =
|
| buildOutputAstForMain(program, deferredHashTokens);
|
| @@ -1828,10 +1827,8 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| });
|
| emitMainOutputUnit(program.mainFragment.outputUnit, mainOutput);
|
|
|
| - if (backend.requiresPreamble &&
|
| - !backend.htmlLibraryIsLoaded) {
|
| - reporter.reportHintMessage(
|
| - NO_LOCATION_SPANNABLE, MessageKind.PREAMBLE);
|
| + if (backend.requiresPreamble && !backend.htmlLibraryIsLoaded) {
|
| + reporter.reportHintMessage(NO_LOCATION_SPANNABLE, MessageKind.PREAMBLE);
|
| }
|
| // Return the total program size.
|
| return outputBuffers.values.fold(0, (a, b) => a + b.length);
|
| @@ -1856,8 +1853,7 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| // For static (not top level) elements, record their code in a buffer
|
| // specific to the class. For now, not supported for native classes and
|
| // native elements.
|
| - ClassElement cls =
|
| - element.enclosingClassOrCompilationUnit.declaration;
|
| + ClassElement cls = element.enclosingClassOrCompilationUnit.declaration;
|
| if (compiler.codegenWorld.directlyInstantiatedClasses.contains(cls) &&
|
| !backend.isNative(cls) &&
|
| compiler.deferredLoadTask.outputUnitForElement(element) ==
|
| @@ -1871,8 +1867,8 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| return elementDescriptors
|
| .putIfAbsent(fragment, () => new Map<Element, ClassBuilder>())
|
| .putIfAbsent(owner, () {
|
| - return new ClassBuilder(owner, namer, owner.isClass);
|
| - });
|
| + return new ClassBuilder(owner, namer, owner.isClass);
|
| + });
|
| }
|
|
|
| /// Emits support-code for deferred loading into [output].
|
| @@ -1880,7 +1876,8 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| Map<OutputUnit, _DeferredOutputUnitHash> deferredLoadHashes) {
|
| List<jsAst.Statement> parts = <jsAst.Statement>[];
|
|
|
| - parts.add(js.statement('''
|
| + parts.add(js.statement(
|
| + '''
|
| {
|
| // Function for checking if a hunk is loaded given its hash.
|
| #isHunkLoaded = function(hunkHash) {
|
| @@ -1898,15 +1895,18 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| #deferredInitialized[hunkHash] = true;
|
| };
|
| }
|
| - ''', {"globalsHolder": globalsHolder,
|
| - "isHunkLoaded": generateEmbeddedGlobalAccess(
|
| - embeddedNames.IS_HUNK_LOADED),
|
| - "isHunkInitialized": generateEmbeddedGlobalAccess(
|
| - embeddedNames.IS_HUNK_INITIALIZED),
|
| - "initializeLoadedHunk": generateEmbeddedGlobalAccess(
|
| - embeddedNames.INITIALIZE_LOADED_HUNK),
|
| - "deferredInitialized": generateEmbeddedGlobalAccess(
|
| - embeddedNames.DEFERRED_INITIALIZED)}));
|
| + ''',
|
| + {
|
| + "globalsHolder": globalsHolder,
|
| + "isHunkLoaded":
|
| + generateEmbeddedGlobalAccess(embeddedNames.IS_HUNK_LOADED),
|
| + "isHunkInitialized":
|
| + generateEmbeddedGlobalAccess(embeddedNames.IS_HUNK_INITIALIZED),
|
| + "initializeLoadedHunk": generateEmbeddedGlobalAccess(
|
| + embeddedNames.INITIALIZE_LOADED_HUNK),
|
| + "deferredInitialized":
|
| + generateEmbeddedGlobalAccess(embeddedNames.DEFERRED_INITIALIZED)
|
| + }));
|
|
|
| // Write a javascript mapping from Deferred import load ids (derrived
|
| // from the import prefix.) to a list of lists of uris of hunks to load,
|
| @@ -1916,15 +1916,15 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| new Map<String, List<jsAst.LiteralString>>();
|
| Map<String, List<_DeferredOutputUnitHash>> deferredLibraryHashes =
|
| new Map<String, List<_DeferredOutputUnitHash>>();
|
| - compiler.deferredLoadTask.hunksToLoad.forEach(
|
| - (String loadId, List<OutputUnit>outputUnits) {
|
| + compiler.deferredLoadTask.hunksToLoad
|
| + .forEach((String loadId, List<OutputUnit> outputUnits) {
|
| List<jsAst.LiteralString> uris = new List<jsAst.LiteralString>();
|
| List<_DeferredOutputUnitHash> hashes =
|
| new List<_DeferredOutputUnitHash>();
|
| deferredLibraryHashes[loadId] = new List<_DeferredOutputUnitHash>();
|
| for (OutputUnit outputUnit in outputUnits) {
|
| - uris.add(js.escapedString(
|
| - backend.deferredPartFileName(outputUnit.name)));
|
| + uris.add(
|
| + js.escapedString(backend.deferredPartFileName(outputUnit.name)));
|
| hashes.add(deferredLoadHashes[outputUnit]);
|
| }
|
|
|
| @@ -1935,8 +1935,8 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| void emitMapping(String name, Map<String, List<jsAst.Expression>> mapping) {
|
| List<jsAst.Property> properties = new List<jsAst.Property>();
|
| mapping.forEach((String key, List<jsAst.Expression> values) {
|
| - properties.add(new jsAst.Property(js.escapedString(key),
|
| - new jsAst.ArrayInitializer(values)));
|
| + properties.add(new jsAst.Property(
|
| + js.escapedString(key), new jsAst.ArrayInitializer(values)));
|
| });
|
| jsAst.Node initializer =
|
| new jsAst.ObjectInitializer(properties, isOneLiner: true);
|
| @@ -1946,13 +1946,12 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| }
|
|
|
| emitMapping(embeddedNames.DEFERRED_LIBRARY_URIS, deferredLibraryUris);
|
| - emitMapping(embeddedNames.DEFERRED_LIBRARY_HASHES,
|
| - deferredLibraryHashes);
|
| + emitMapping(embeddedNames.DEFERRED_LIBRARY_HASHES, deferredLibraryHashes);
|
|
|
| return new jsAst.Block(parts);
|
| }
|
|
|
| - Map <OutputUnit, jsAst.Program> buildOutputAstForDeferredCode(
|
| + Map<OutputUnit, jsAst.Program> buildOutputAstForDeferredCode(
|
| Program program) {
|
| if (!program.isSplit) return const <OutputUnit, jsAst.Program>{};
|
|
|
| @@ -1973,17 +1972,19 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
|
|
| for (String globalObject in Namer.reservedGlobalObjectNames) {
|
| body.add(js.statement('var #object = #globalsHolder.#object;',
|
| - {'globalsHolder': globalsHolder,
|
| - 'object': globalObject}));
|
| + {'globalsHolder': globalsHolder, 'object': globalObject}));
|
| }
|
| - body..add(js.statement('var init = #globalsHolder.init;',
|
| - {'globalsHolder': globalsHolder}))
|
| - ..add(js.statement('var $setupProgramName = '
|
| - '#globalsHolder.$setupProgramName;',
|
| - {'globalsHolder': globalsHolder}))
|
| - ..add(js.statement('var ${namer.isolateName} = '
|
| - '#globalsHolder.${namer.isolateName};',
|
| - {'globalsHolder': globalsHolder}));
|
| + body
|
| + ..add(js.statement('var init = #globalsHolder.init;',
|
| + {'globalsHolder': globalsHolder}))
|
| + ..add(js.statement(
|
| + 'var $setupProgramName = '
|
| + '#globalsHolder.$setupProgramName;',
|
| + {'globalsHolder': globalsHolder}))
|
| + ..add(js.statement(
|
| + 'var ${namer.isolateName} = '
|
| + '#globalsHolder.${namer.isolateName};',
|
| + {'globalsHolder': globalsHolder}));
|
| String typesAccess =
|
| generateEmbeddedGlobalAccessString(embeddedNames.TYPES);
|
| if (libraryDescriptor != null) {
|
| @@ -1999,26 +2000,30 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| js.statement('$setupProgramName(dart, ${typesAccess}.length);'));
|
| }
|
|
|
| - body..add(buildMetadata(program, outputUnit))
|
| - ..add(js.statement('${typesAccess}.push.apply(${typesAccess}, '
|
| - '${namer.deferredTypesName});'));
|
| + body
|
| + ..add(buildMetadata(program, outputUnit))
|
| + ..add(js.statement('${typesAccess}.push.apply(${typesAccess}, '
|
| + '${namer.deferredTypesName});'));
|
|
|
| - body.add(buildCompileTimeConstants(fragment.constants,
|
| - isMainFragment: false));
|
| + body.add(
|
| + buildCompileTimeConstants(fragment.constants, isMainFragment: false));
|
| body.add(buildStaticNonFinalFieldInitializations(outputUnit));
|
| body.add(buildLazilyInitializedStaticFields(
|
| - fragment.staticLazilyInitializedFields, isMainFragment: false));
|
| + fragment.staticLazilyInitializedFields,
|
| + isMainFragment: false));
|
|
|
| List<jsAst.Statement> statements = <jsAst.Statement>[];
|
|
|
| statements
|
| - ..add(buildGeneratedBy())
|
| - ..add(buildDeferredHeader())
|
| - ..add(js.statement('${deferredInitializers}.current = '
|
| - """function (#, ${namer.staticStateHolder}) {
|
| + ..add(buildGeneratedBy())
|
| + ..add(buildDeferredHeader())
|
| + ..add(js.statement(
|
| + '${deferredInitializers}.current = '
|
| + """function (#, ${namer.staticStateHolder}) {
|
| #
|
| }
|
| - """, [globalsHolder, body]));
|
| + """,
|
| + [globalsHolder, body]));
|
|
|
| result[outputUnit] = new jsAst.Program(statements);
|
| }
|
| @@ -2032,7 +2037,6 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| /// itself.
|
| Map<OutputUnit, String> emitDeferredOutputUnits(
|
| Map<OutputUnit, jsAst.Program> outputAsts) {
|
| -
|
| Map<OutputUnit, String> hunkHashes = new Map<OutputUnit, String>();
|
|
|
| for (OutputUnit outputUnit in outputAsts.keys) {
|
| @@ -2049,13 +2053,12 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| String partPrefix =
|
| backend.deferredPartFileName(outputUnit.name, addExtension: false);
|
| CodeOutput output = new StreamCodeOutput(
|
| - compiler.outputProvider(partPrefix, 'part.js'),
|
| - outputListeners);
|
| + compiler.outputProvider(partPrefix, 'part.js'), outputListeners);
|
|
|
| outputBuffers[outputUnit] = output;
|
|
|
| - output.addBuffer(jsAst.createCodeBuffer(
|
| - outputAsts[outputUnit], compiler, monitor: compiler.dumpInfoTask));
|
| + output.addBuffer(jsAst.createCodeBuffer(outputAsts[outputUnit], compiler,
|
| + monitor: compiler.dumpInfoTask));
|
|
|
| // Make a unique hash of the code (before the sourcemaps are added)
|
| // This will be used to retrieve the initializing function from the global
|
| @@ -2063,7 +2066,7 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| String hash = hasher.getHash();
|
|
|
| output.add('$N${deferredInitializers}["$hash"]$_=$_'
|
| - '${deferredInitializers}.current$N');
|
| + '${deferredInitializers}.current$N');
|
|
|
| if (generateSourceMap) {
|
| Uri mapUri, partUri;
|
| @@ -2076,22 +2079,21 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| String mapFileName = partName + ".js.map";
|
| List<String> mapSegments = sourceMapUri.pathSegments.toList();
|
| mapSegments[mapSegments.length - 1] = mapFileName;
|
| - mapUri = compiler.options.sourceMapUri
|
| - .replace(pathSegments: mapSegments);
|
| + mapUri =
|
| + compiler.options.sourceMapUri.replace(pathSegments: mapSegments);
|
| }
|
|
|
| if (outputUri != null) {
|
| String partFileName = partName + ".js";
|
| List<String> partSegments = outputUri.pathSegments.toList();
|
| partSegments[partSegments.length - 1] = partFileName;
|
| - partUri = compiler.options.outputUri.replace(
|
| - pathSegments: partSegments);
|
| + partUri =
|
| + compiler.options.outputUri.replace(pathSegments: partSegments);
|
| }
|
|
|
| output.add(generateSourceMapTag(mapUri, partUri));
|
| output.close();
|
| - outputSourceMap(output, lineColumnCollector, partName,
|
| - mapUri, partUri);
|
| + outputSourceMap(output, lineColumnCollector, partName, mapUri, partUri);
|
| } else {
|
| output.close();
|
| }
|
| @@ -2108,21 +2110,19 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| return new jsAst.Comment(generatedBy(compiler, flavor: options.join(", ")));
|
| }
|
|
|
| - void outputSourceMap(CodeOutput output,
|
| - LineColumnProvider lineColumnProvider,
|
| - String name,
|
| - [Uri sourceMapUri,
|
| - Uri fileUri]) {
|
| + void outputSourceMap(
|
| + CodeOutput output, LineColumnProvider lineColumnProvider, String name,
|
| + [Uri sourceMapUri, Uri fileUri]) {
|
| if (!generateSourceMap) return;
|
| // Create a source file for the compilation output. This allows using
|
| // [:getLine:] to transform offsets to line numbers in [SourceMapBuilder].
|
| SourceMapBuilder sourceMapBuilder =
|
| - new SourceMapBuilder(sourceMapUri, fileUri, lineColumnProvider);
|
| + new SourceMapBuilder(sourceMapUri, fileUri, lineColumnProvider);
|
| output.forEachSourceLocation(sourceMapBuilder.addMapping);
|
| String sourceMap = sourceMapBuilder.build();
|
| compiler.outputProvider(name, 'js.map')
|
| - ..add(sourceMap)
|
| - ..close();
|
| + ..add(sourceMap)
|
| + ..close();
|
| }
|
|
|
| void outputDeferredMap() {
|
| @@ -2133,9 +2133,9 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| "needed for a given deferred library import.";
|
| mapping.addAll(compiler.deferredLoadTask.computeDeferredMap());
|
| compiler.outputProvider(
|
| - compiler.options.deferredMapUri.path, 'deferred_map')
|
| - ..add(const JsonEncoder.withIndent(" ").convert(mapping))
|
| - ..close();
|
| + compiler.options.deferredMapUri.path, 'deferred_map')
|
| + ..add(const JsonEncoder.withIndent(" ").convert(mapping))
|
| + ..close();
|
| }
|
|
|
| void invalidateCaches() {
|
| @@ -2146,7 +2146,6 @@ function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
|
| cachedClassBuilders.remove(element.enclosingClass);
|
|
|
| nativeEmitter.cachedBuilders.remove(element.enclosingClass);
|
| -
|
| }
|
| }
|
| }
|
|
|