Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Unified Diff: src/object-observe.js

Issue 663253006: Various cleanup/simplification in object-observe.js (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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]);
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698