From 234ffb76f7789dd56f962586f5acb6f710ad67f8 Mon Sep 17 00:00:00 2001 From: "adamk@chromium.org" Date: Wed, 29 Oct 2014 17:27:09 +0000 Subject: [PATCH] Various cleanup/simplification in object-observe.js The biggest change is the removal of the map wrapper objects: we now operate directly on the observation weak map, since there are already Get/GetOrCreate/Set functions for each info map. Various other small cleanups as well, including the deletion of unnecessary forwarding functions and making use of standard macros. This is a reland of r24972, retaining GetObservationStateJS() to keep snapshotting working properly. R=rossberg@chromium.org Review URL: https://codereview.chromium.org/663253006 Cr-Commit-Position: refs/heads/master@{#24990} git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24990 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/object-observe.js | 107 ++++++++++++++++---------------------------------- 1 file changed, 34 insertions(+), 73 deletions(-) diff --git a/src/object-observe.js b/src/object-observe.js index b598e68..3af2d51 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]); -- 2.7.4