Reviewers: Igor Sheludko,

Message:
ptal

Description:
Fix keyed stores to strings convertible to indices

BUG=chromium:509545
LOG=n

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

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+14, -19 lines):
  M src/ic/ic.cc
  M test/mjsunit/harmony/proxies.js
  M test/mjsunit/primitive-keyed-access.js


Index: src/ic/ic.cc
diff --git a/src/ic/ic.cc b/src/ic/ic.cc
index 4006f296a10b5503e708c0151866aba8d8756a7b..7d572ee4819263c6368c0e83c458aa6d072c7e46 100644
--- a/src/ic/ic.cc
+++ b/src/ic/ic.cc
@@ -1545,22 +1545,6 @@ MaybeHandle<Object> StoreIC::Store(Handle<Object> object, Handle<Name> name, return TypeError(MessageTemplate::kNonObjectPropertyStore, object, name);
   }

-  // Check if the given name is an array index.
-  uint32_t index;
-  if (name->AsArrayIndex(&index)) {
-    // Ignore other stores where the receiver is not a JSObject.
-    // TODO(1475): Must check prototype chains of object wrappers.
-    if (!object->IsJSObject()) return value;
-    Handle<JSObject> receiver = Handle<JSObject>::cast(object);
-
-    Handle<Object> result;
-    ASSIGN_RETURN_ON_EXCEPTION(
-        isolate(), result,
- Object::SetElement(isolate(), receiver, index, value, language_mode()),
-        Object);
-    return value;
-  }
-
   // Observed objects are always modified through the runtime.
   if (object->IsHeapObject() &&
       Handle<HeapObject>::cast(object)->map()->is_observed()) {
@@ -2116,7 +2100,10 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object,
   Handle<Object> store_handle;
   Handle<Code> stub = megamorphic_stub();

-  if (key->IsInternalizedString() || key->IsSymbol()) {
+  uint32_t index;
+  if ((key->IsInternalizedString() &&
+       !String::cast(*key)->AsArrayIndex(&index)) ||
+      key->IsSymbol()) {
     ASSIGN_RETURN_ON_EXCEPTION(
         isolate(), store_handle,
         StoreIC::Store(object, Handle<Name>::cast(key), value,
@@ -2156,8 +2143,6 @@ MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object,
   }

   if (use_ic) {
-    DCHECK(!object->IsAccessCheckNeeded());
-
     if (object->IsJSObject()) {
       Handle<JSObject> receiver = Handle<JSObject>::cast(object);
       bool key_is_smi_like = !Object::ToSmi(isolate(), key).is_null();
Index: test/mjsunit/harmony/proxies.js
diff --git a/test/mjsunit/harmony/proxies.js b/test/mjsunit/harmony/proxies.js index 585574eb43a82b784a0f6402faab96e369af87a6..f1d37b445a9fc866375f1f9ccba9426c6f0e3b57 100644
--- a/test/mjsunit/harmony/proxies.js
+++ b/test/mjsunit/harmony/proxies.js
@@ -382,6 +382,10 @@ function TestSet2(create, handler) {
   assertEquals(46, (function(n) { return p[n] = 46 })(99))
   assertEquals("99", key)
   assertEquals(46, val)
+
+  assertEquals(47, p["0"] = 47)
+  assertEquals("0", key)
+  assertEquals(47, val)
 }

 TestSet({
Index: test/mjsunit/primitive-keyed-access.js
diff --git a/test/mjsunit/primitive-keyed-access.js b/test/mjsunit/primitive-keyed-access.js index 16bb6a07cad53fcf8ca835685f5b5f0a93fe1902..c83975a8d30d560655cea66fe2384f32e46977e6 100644
--- a/test/mjsunit/primitive-keyed-access.js
+++ b/test/mjsunit/primitive-keyed-access.js
@@ -41,3 +41,9 @@ assertThrows(function() {
   var sym = Symbol('66');
   sym[62] = 0;
 });
+
+assertThrows(function() {
+  "use strict";
+  var o = "bla";
+  o["0"] = 1;
+});


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to