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); |
-} |
+} |