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