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

Unified Diff: src/object-observe.js

Issue 11274014: Store Object.observe state per-isolate rather than per-context (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 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 | « src/heap.cc ('k') | src/runtime.h » ('j') | 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 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);
-}
+}
« no previous file with comments | « src/heap.cc ('k') | src/runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698