Chromium Code Reviews| Index: src/object-observe.js |
| diff --git a/src/object-observe.js b/src/object-observe.js |
| index 26e23be30dcb6ac267fb54b8b429adff0493fbfc..c2234f08a01ea3a6f6085273b5a00a294206cf99 100644 |
| --- a/src/object-observe.js |
| +++ b/src/object-observe.js |
| @@ -43,8 +43,14 @@ function createInternalWeakMap() { |
| return map; |
| } |
| -var observerInfoMap = createInternalWeakMap(); |
| -var objectInfoMap = createInternalWeakMap(); |
| +function GetOrCreateObjectObservationState() { |
| + var state = %GetObjectObservationState(); |
| + if (IS_UNDEFINED(state.observerInfoMap)) { |
| + state.observerInfoMap = createInternalWeakMap(); |
| + state.objectInfoMap = createInternalWeakMap(); |
| + } |
| + return state; |
| +} |
|
rafaelw
2012/10/24 15:21:35
suggestion:
var state = %GetObjectObservationStat
adamk
2012/10/24 15:50:38
Done.
|
| $Object.observe = function(object, callback) { |
| @@ -55,20 +61,21 @@ $Object.observe = function(object, callback) { |
| if (InternalObjectIsFrozen(callback)) |
| throw MakeTypeError("observe_callback_frozen"); |
| - if (!observerInfoMap.has(callback)) { |
| + var state = GetOrCreateObjectObservationState(); |
| + if (!state.observerInfoMap.has(callback)) { |
| // TODO: setup observerInfo.priority. |
| - observerInfoMap.set(callback, { |
| + state.observerInfoMap.set(callback, { |
| pendingChangeRecords: null |
| }); |
| } |
| - var objectInfo = objectInfoMap.get(object); |
| + var objectInfo = state.objectInfoMap.get(object); |
| if (IS_UNDEFINED(objectInfo)) { |
| // TODO: setup objectInfo.notifier |
| objectInfo = { |
| changeObservers: new InternalArray(callback) |
| }; |
| - objectInfoMap.set(object, objectInfo); |
| + state.objectInfoMap.set(object, objectInfo); |
| return; |
| } |
| @@ -83,11 +90,12 @@ $Object.unobserve = function(object, callback) { |
| if (!IS_SPEC_OBJECT(object)) |
| throw MakeTypeError("observe_non_object", ["unobserve"]); |
| - var objectInfo = objectInfoMap.get(object); |
| + var state = GetOrCreateObjectObservationState(); |
| + var objectInfo = state.objectInfoMap.get(object); |
| if (IS_UNDEFINED(objectInfo)) |
| return; |
| - var observerInfo = observerInfoMap.get(callback); |
| + var observerInfo = state.observerInfoMap.get(callback); |
| var changeObservers = objectInfo.changeObservers; |
| var index = changeObservers.indexOf(callback); |
| @@ -97,10 +105,10 @@ $Object.unobserve = function(object, callback) { |
| changeObservers.splice(index, 1); |
| } |
| -function EnqueueChangeRecord(changeRecord, observers) { |
| +function EnqueueChangeRecord(changeRecord, observers, state) { |
| for (var i = 0; i < observers.length; i++) { |
| var observer = observers[i]; |
| - var observerInfo = observerInfoMap.get(observer); |
| + var observerInfo = state.observerInfoMap.get(observer); |
| // TODO: "activate" the observer |
| @@ -118,7 +126,8 @@ $Object.notify = function(object, changeRecord) { |
| if (!IS_STRING(changeRecord.type)) |
| throw MakeTypeError("observe_type_non_string"); |
| - var objectInfo = objectInfoMap.get(object); |
| + var state = GetOrCreateObjectObservationState(); |
| + var objectInfo = state.objectInfoMap.get(object); |
| if (IS_UNDEFINED(objectInfo)) |
| return; |
| @@ -132,14 +141,15 @@ $Object.notify = function(object, changeRecord) { |
| } |
| InternalObjectFreeze(newRecord); |
| - EnqueueChangeRecord(newRecord, objectInfo.changeObservers); |
| + EnqueueChangeRecord(newRecord, objectInfo.changeObservers, state); |
| } |
| $Object.deliverChangeRecords = function(callback) { |
| if (!IS_SPEC_FUNCTION(callback)) |
| throw MakeTypeError("observe_non_function", ["deliverChangeRecords"]); |
| - var observerInfo = observerInfoMap.get(callback); |
| + var state = GetOrCreateObjectObservationState(); |
| + var observerInfo = state.observerInfoMap.get(callback); |
| if (IS_UNDEFINED(observerInfo)) |
| return; |
| @@ -151,4 +161,4 @@ $Object.deliverChangeRecords = function(callback) { |
| var delivered = []; |
| %MoveArrayContents(pendingChangeRecords, delivered); |
| callback(delivered); |
| -} |
| +} |