Reviewers: Michael Starzinger,

Description:
Object.observe: Fixed missing case for turning off ICs.


[email protected]
BUG=


Please review this at https://codereview.chromium.org/11358122/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/ic.cc
  M test/mjsunit/harmony/object-observe.js


Index: src/ic.cc
diff --git a/src/ic.cc b/src/ic.cc
index 50a3a277a3bfa21746e172a14f9a00b9054a9320..e75e253d8e8270bf4d79be5b90e81855dc18abbf 100644
--- a/src/ic.cc
+++ b/src/ic.cc
@@ -1921,7 +1921,9 @@ MaybeObject* KeyedStoreIC::Store(State state,

   // Do not use ICs for objects that require access checks (including
   // the global object).
-  bool use_ic = FLAG_use_ic && !object->IsAccessCheckNeeded();
+  bool use_ic = FLAG_use_ic && !object->IsAccessCheckNeeded() &&
+      !(FLAG_harmony_observation && object->IsJSObject() &&
+          JSObject::cast(*object)->map()->is_observed());
   ASSERT(!(use_ic && object->IsJSGlobalProxy()));

   if (use_ic) {
Index: test/mjsunit/harmony/object-observe.js
diff --git a/test/mjsunit/harmony/object-observe.js b/test/mjsunit/harmony/object-observe.js index 6a0fc0dfea131f367345a1ac15ec858243377431..e90ddaf601ad9abd08ba78e316b8fe3e101ab706 100644
--- a/test/mjsunit/harmony/object-observe.js
+++ b/test/mjsunit/harmony/object-observe.js
@@ -323,3 +323,35 @@ observer.assertCallbackRecords([
   { object: obj, name: "1", type: "updated", oldValue: undefined },
   { object: obj, name: "1", type: "updated", oldValue: 9 },
 ]);
+
+
+// Assignments in loops (checking different IC states).
+reset();
+var obj = {};
+Object.observe(obj, observer.callback);
+for (var i = 0; i < 5; i++) {
+  obj["a" + i] = i;
+}
+Object.deliverChangeRecords(observer.callback);
+observer.assertCallbackRecords([
+  { object: obj, name: "a0", type: "new" },
+  { object: obj, name: "a1", type: "new" },
+  { object: obj, name: "a2", type: "new" },
+  { object: obj, name: "a3", type: "new" },
+  { object: obj, name: "a4", type: "new" },
+]);
+
+reset();
+var obj = {};
+Object.observe(obj, observer.callback);
+for (var i = 0; i < 5; i++) {
+  obj[i] = i;
+}
+Object.deliverChangeRecords(observer.callback);
+observer.assertCallbackRecords([
+  { object: obj, name: "0", type: "new" },
+  { object: obj, name: "1", type: "new" },
+  { object: obj, name: "2", type: "new" },
+  { object: obj, name: "3", type: "new" },
+  { object: obj, name: "4", type: "new" },
+]);


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to