| Index: pkg/compiler/lib/src/js_emitter/old_emitter/reflection_data_parser.dart
|
| diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/reflection_data_parser.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/reflection_data_parser.dart
|
| index befd7a9eecab363baf9fb7d562ace1830f108a0e..b1f1ba34291c97c8bcfc3ec0369cc85d3105e901 100644
|
| --- a/pkg/compiler/lib/src/js_emitter/old_emitter/reflection_data_parser.dart
|
| +++ b/pkg/compiler/lib/src/js_emitter/old_emitter/reflection_data_parser.dart
|
| @@ -53,17 +53,46 @@ jsAst.Expression getReflectionDataParser(OldEmitter oldEmitter,
|
| jsAst.Expression metadataAccess =
|
| emitter.generateEmbeddedGlobalAccess(embeddedNames.METADATA);
|
|
|
| +
|
| jsAst.Statement processClassData = js.statement('''{
|
| + function finishAddStubsHelper() {
|
| + var prototype = this;
|
| + var object;
|
| + while (prototype.#deferredAction) {
|
| + if (prototype.hasOwnProperty(#deferredActionString)) {
|
| + delete prototype.#deferredAction; // Intended to make it slow, too.
|
| + var properties = Object.keys(prototype);
|
| + for (var index = 0; index < properties.length; index++) {
|
| + var property = properties[index];
|
| + var firstChar = property.charCodeAt(0);
|
| + var elem;
|
| + if (property !== "${namer.classDescriptorProperty}" &&
|
| + property !== "$reflectableField" &&
|
| + firstChar !== 43 && // 43 is aka "+".
|
| + firstChar !== 42 && // 42 is aka "*"
|
| + (elem = prototype[property]) != null &&
|
| + elem.constructor === Array &&
|
| + property !== "<>") {
|
| + addStubs(prototype, elem, property, false, null);
|
| + }
|
| + }
|
| + }
|
| + prototype = prototype.__proto__;
|
| + }
|
| + }
|
| +
|
| function processClassData(cls, descriptor, processedClasses) {
|
| descriptor = convertToSlowObject(descriptor); // Use a slow object.
|
| var previousProperty;
|
| var properties = Object.keys(descriptor);
|
| + var hasDeferredWork = false;
|
| for (var i = 0; i < properties.length; i++) {
|
| var property = properties[i];
|
| var firstChar = property.charCodeAt(0);
|
| if (property === "static") {
|
| processStatics(#embeddedStatics[cls] = descriptor.static,
|
| processedClasses);
|
| + delete descriptor.static;
|
| } else if (firstChar === 43) { // 43 is aka "+".
|
| mangledNames[previousProperty] = property.substring(1);
|
| var flag = descriptor[property];
|
| @@ -82,12 +111,19 @@ jsAst.Expression getReflectionDataParser(OldEmitter oldEmitter,
|
| elem != null &&
|
| elem.constructor === Array &&
|
| property !== "<>") {
|
| - addStubs(descriptor, elem, property, false, []);
|
| + if (supportsDirectProtoAccess) {
|
| + hasDeferredWork = true;
|
| + } else {
|
| + addStubs(descriptor, elem, property, false, null);
|
| + }
|
| } else {
|
| previousProperty = property;
|
| }
|
| }
|
| }
|
| +
|
| + if (hasDeferredWork)
|
| + descriptor.#deferredAction = finishAddStubsHelper;
|
|
|
| /* The 'fields' are either a constructor function or a
|
| * string encoding fields, constructor and superclass. Gets the
|
| @@ -128,7 +164,9 @@ jsAst.Expression getReflectionDataParser(OldEmitter oldEmitter,
|
| processedClasses.collected[cls] = [globalObject, descriptor];
|
| classes.push(cls);
|
| }
|
| -}''', {'embeddedStatics': staticsAccess,
|
| +}''', {'deferredAction': namer.deferredAction,
|
| + 'deferredActionString': js.string(namer.deferredAction),
|
| + 'embeddedStatics': staticsAccess,
|
| 'hasRetainedMetadata': backend.hasRetainedMetadata,
|
| 'metadata': metadataAccess,
|
| 'notInCspMode': !compiler.useContentSecurityPolicy});
|
| @@ -195,7 +233,7 @@ jsAst.Expression getReflectionDataParser(OldEmitter oldEmitter,
|
| }
|
| var funcs = [descriptor[name] = descriptor[alias] = f];
|
| f.\$stubName = name;
|
| - functions.push(name);
|
| + if (isStatic) functions.push(name);
|
| for (; index < array.length; index += 2) {
|
| f = array[index + 1];
|
| if (typeof f != "function") break;
|
| @@ -203,7 +241,7 @@ jsAst.Expression getReflectionDataParser(OldEmitter oldEmitter,
|
| funcs.push(f);
|
| if (f.\$stubName) {
|
| descriptor[f.\$stubName] = f;
|
| - functions.push(f.\$stubName);
|
| + if (isStatic) functions.push(f.\$stubName);
|
| }
|
| }
|
| index++;
|
| @@ -230,10 +268,12 @@ jsAst.Expression getReflectionDataParser(OldEmitter oldEmitter,
|
| descriptor[name].\$getter = f;
|
| f.\$getterStub = true;
|
| // Used to create an isolate using spawnFunction.
|
| - if (isStatic) #globalFunctions[name] = f;
|
| + if (isStatic) {
|
| + #globalFunctions[name] = f;
|
| + functions.push(getterStubName);
|
| + }
|
| descriptor[getterStubName] = f;
|
| funcs.push(f);
|
| - if (getterStubName) functions.push(getterStubName);
|
| f.\$stubName = getterStubName;
|
| f.\$callName = null;
|
| // Update the interceptedNames map (which only exists if `invokeOn` was
|
|
|