| Index: src/object-observe.js
|
| diff --git a/src/object-observe.js b/src/object-observe.js
|
| index b598e685b436a40c80c5b540666dff770aed6caf..3af2d512075c15bb4294970ab7eadf8a92a886ab 100644
|
| --- a/src/object-observe.js
|
| +++ b/src/object-observe.js
|
| @@ -35,10 +35,15 @@
|
|
|
| var observationState;
|
|
|
| +// We have to wait until after bootstrapping to grab a reference to the
|
| +// observationState object, since it's not possible to serialize that
|
| +// reference into the snapshot.
|
| function GetObservationStateJS() {
|
| - if (IS_UNDEFINED(observationState))
|
| + if (IS_UNDEFINED(observationState)) {
|
| observationState = %GetObservationState();
|
| + }
|
|
|
| + // TODO(adamk): Consider moving this code into heap.cc
|
| if (IS_UNDEFINED(observationState.callbackInfoMap)) {
|
| observationState.callbackInfoMap = %ObservationWeakMapCreate();
|
| observationState.objectInfoMap = %ObservationWeakMapCreate();
|
| @@ -51,55 +56,6 @@ function GetObservationStateJS() {
|
| return observationState;
|
| }
|
|
|
| -function GetWeakMapWrapper() {
|
| - function MapWrapper(map) {
|
| - this.map_ = map;
|
| - };
|
| -
|
| - MapWrapper.prototype = {
|
| - __proto__: null,
|
| - get: function(key) {
|
| - return %WeakCollectionGet(this.map_, key);
|
| - },
|
| - set: function(key, value) {
|
| - %WeakCollectionSet(this.map_, key, value);
|
| - },
|
| - has: function(key) {
|
| - return !IS_UNDEFINED(this.get(key));
|
| - }
|
| - };
|
| -
|
| - return MapWrapper;
|
| -}
|
| -
|
| -var contextMaps;
|
| -
|
| -function GetContextMaps() {
|
| - if (IS_UNDEFINED(contextMaps)) {
|
| - var map = GetWeakMapWrapper();
|
| - var observationState = GetObservationStateJS();
|
| - contextMaps = {
|
| - callbackInfoMap: new map(observationState.callbackInfoMap),
|
| - objectInfoMap: new map(observationState.objectInfoMap),
|
| - notifierObjectInfoMap: new map(observationState.notifierObjectInfoMap)
|
| - };
|
| - }
|
| -
|
| - return contextMaps;
|
| -}
|
| -
|
| -function GetCallbackInfoMap() {
|
| - return GetContextMaps().callbackInfoMap;
|
| -}
|
| -
|
| -function GetObjectInfoMap() {
|
| - return GetContextMaps().objectInfoMap;
|
| -}
|
| -
|
| -function GetNotifierObjectInfoMap() {
|
| - return GetContextMaps().notifierObjectInfoMap;
|
| -}
|
| -
|
| function GetPendingObservers() {
|
| return GetObservationStateJS().pendingObservers;
|
| }
|
| @@ -204,35 +160,34 @@ function ObjectInfoGetOrCreate(object) {
|
| performing: null,
|
| performingCount: 0,
|
| };
|
| - GetObjectInfoMap().set(object, objectInfo);
|
| + %WeakCollectionSet(GetObservationStateJS().objectInfoMap,
|
| + object, objectInfo);
|
| }
|
| return objectInfo;
|
| }
|
|
|
| function ObjectInfoGet(object) {
|
| - return GetObjectInfoMap().get(object);
|
| + return %WeakCollectionGet(GetObservationStateJS().objectInfoMap, object);
|
| }
|
|
|
| function ObjectInfoGetFromNotifier(notifier) {
|
| - return GetNotifierObjectInfoMap().get(notifier);
|
| + return %WeakCollectionGet(GetObservationStateJS().notifierObjectInfoMap,
|
| + notifier);
|
| }
|
|
|
| function ObjectInfoGetNotifier(objectInfo) {
|
| if (IS_NULL(objectInfo.notifier)) {
|
| objectInfo.notifier = { __proto__: notifierPrototype };
|
| - GetNotifierObjectInfoMap().set(objectInfo.notifier, objectInfo);
|
| + %WeakCollectionSet(GetObservationStateJS().notifierObjectInfoMap,
|
| + objectInfo.notifier, objectInfo);
|
| }
|
|
|
| return objectInfo.notifier;
|
| }
|
|
|
| -function ObjectInfoGetObject(objectInfo) {
|
| - return objectInfo.object;
|
| -}
|
| -
|
| function ChangeObserversIsOptimized(changeObservers) {
|
| - return typeof changeObservers === 'function' ||
|
| - typeof changeObservers.callback === 'function';
|
| + return IS_SPEC_FUNCTION(changeObservers) ||
|
| + IS_SPEC_FUNCTION(changeObservers.callback);
|
| }
|
|
|
| // The set of observers on an object is called 'changeObservers'. The first
|
| @@ -328,16 +283,21 @@ function ConvertAcceptListToTypeMap(arg) {
|
| // priority. When a change record must be enqueued for the callback, it
|
| // normalizes. When delivery clears any pending change records, it re-optimizes.
|
| function CallbackInfoGet(callback) {
|
| - return GetCallbackInfoMap().get(callback);
|
| + return %WeakCollectionGet(GetObservationStateJS().callbackInfoMap, callback);
|
| +}
|
| +
|
| +function CallbackInfoSet(callback, callbackInfo) {
|
| + %WeakCollectionSet(GetObservationStateJS().callbackInfoMap,
|
| + callback, callbackInfo);
|
| }
|
|
|
| function CallbackInfoGetOrCreate(callback) {
|
| - var callbackInfo = GetCallbackInfoMap().get(callback);
|
| + var callbackInfo = CallbackInfoGet(callback);
|
| if (!IS_UNDEFINED(callbackInfo))
|
| return callbackInfo;
|
|
|
| - var priority = GetNextCallbackPriority();
|
| - GetCallbackInfoMap().set(callback, priority);
|
| + var priority = GetNextCallbackPriority();
|
| + CallbackInfoSet(callback, priority);
|
| return priority;
|
| }
|
|
|
| @@ -349,12 +309,12 @@ function CallbackInfoGetPriority(callbackInfo) {
|
| }
|
|
|
| function CallbackInfoNormalize(callback) {
|
| - var callbackInfo = GetCallbackInfoMap().get(callback);
|
| + var callbackInfo = CallbackInfoGet(callback);
|
| if (IS_NUMBER(callbackInfo)) {
|
| var priority = callbackInfo;
|
| callbackInfo = new InternalArray;
|
| callbackInfo.priority = priority;
|
| - GetCallbackInfoMap().set(callback, callbackInfo);
|
| + CallbackInfoSet(callback, callbackInfo);
|
| }
|
| return callbackInfo;
|
| }
|
| @@ -445,8 +405,8 @@ function ObjectInfoEnqueueExternalChangeRecord(objectInfo, changeRecord, type) {
|
|
|
| var hasType = !IS_UNDEFINED(type);
|
| var newRecord = hasType ?
|
| - { object: ObjectInfoGetObject(objectInfo), type: type } :
|
| - { object: ObjectInfoGetObject(objectInfo) };
|
| + { object: objectInfo.object, type: type } :
|
| + { object: objectInfo.object };
|
|
|
| for (var prop in changeRecord) {
|
| if (prop === 'object' || (hasType && prop === 'type')) continue;
|
| @@ -594,17 +554,18 @@ function NativeObjectGetNotifier(object) {
|
| }
|
|
|
| function CallbackDeliverPending(callback) {
|
| - var callbackInfo = GetCallbackInfoMap().get(callback);
|
| + var callbackInfo = CallbackInfoGet(callback);
|
| if (IS_UNDEFINED(callbackInfo) || IS_NUMBER(callbackInfo))
|
| return false;
|
|
|
| // Clear the pending change records from callback and return it to its
|
| // "optimized" state.
|
| var priority = callbackInfo.priority;
|
| - GetCallbackInfoMap().set(callback, priority);
|
| + CallbackInfoSet(callback, priority);
|
|
|
| - if (GetPendingObservers())
|
| - delete GetPendingObservers()[priority];
|
| + var pendingObservers = GetPendingObservers();
|
| + if (!IS_NULL(pendingObservers))
|
| + delete pendingObservers[priority];
|
|
|
| var delivered = [];
|
| %MoveArrayContents(callbackInfo, delivered);
|
| @@ -624,7 +585,7 @@ function ObjectDeliverChangeRecords(callback) {
|
|
|
| function ObserveMicrotaskRunner() {
|
| var pendingObservers = GetPendingObservers();
|
| - if (pendingObservers) {
|
| + if (!IS_NULL(pendingObservers)) {
|
| SetPendingObservers(null);
|
| for (var i in pendingObservers) {
|
| CallbackDeliverPending(pendingObservers[i]);
|
|
|