Revision: 5555
Author: [email protected]
Date: Wed Sep 29 09:05:05 2010
Log: Backport r5553 "Do not invoke indexed interceptor getters for negative indices." to 2.3.
Review URL: http://codereview.chromium.org/3569002
http://code.google.com/p/v8/source/detail?r=5555

Modified:
 /branches/2.3/src/arm/ic-arm.cc
 /branches/2.3/src/ia32/ic-ia32.cc
 /branches/2.3/src/stub-cache.cc
 /branches/2.3/src/version.cc
 /branches/2.3/src/x64/ic-x64.cc
 /branches/2.3/test/cctest/test-api.cc

=======================================
--- /branches/2.3/src/arm/ic-arm.cc     Thu Sep 16 03:37:18 2010
+++ /branches/2.3/src/arm/ic-arm.cc     Wed Sep 29 09:05:05 2010
@@ -1602,8 +1602,9 @@
   // Check that the receiver isn't a smi.
   __ BranchOnSmi(r1, &slow);

-  // Check that the key is a smi.
-  __ BranchOnNotSmi(r0, &slow);
+  // Check that the key is an array index, that is Uint32.
+  __ tst(r0, Operand(kSmiTagMask | kSmiSignMask));
+  __ b(ne, &slow);

   // Get the map of the receiver.
   __ ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset));
=======================================
--- /branches/2.3/src/ia32/ic-ia32.cc   Thu Sep 16 03:37:18 2010
+++ /branches/2.3/src/ia32/ic-ia32.cc   Wed Sep 29 09:05:05 2010
@@ -910,8 +910,8 @@
   __ test(edx, Immediate(kSmiTagMask));
   __ j(zero, &slow, not_taken);

-  // Check that the key is a smi.
-  __ test(eax, Immediate(kSmiTagMask));
+  // Check that the key is an array index, that is Uint32.
+  __ test(eax, Immediate(kSmiTagMask | kSmiSignMask));
   __ j(not_zero, &slow, not_taken);

   // Get the map of the receiver.
=======================================
--- /branches/2.3/src/stub-cache.cc     Wed Aug 25 08:26:24 2010
+++ /branches/2.3/src/stub-cache.cc     Wed Sep 29 09:05:05 2010
@@ -988,6 +988,7 @@

 Object* KeyedLoadPropertyWithInterceptor(Arguments args) {
   JSObject* receiver = JSObject::cast(args[0]);
+  ASSERT(Smi::cast(args[1])->value() >= 0);
   uint32_t index = Smi::cast(args[1])->value();
   return receiver->GetElementWithInterceptor(receiver, index);
 }
=======================================
--- /branches/2.3/src/version.cc        Tue Sep 28 00:32:12 2010
+++ /branches/2.3/src/version.cc        Wed Sep 29 09:05:05 2010
@@ -35,7 +35,7 @@
 #define MAJOR_VERSION     2
 #define MINOR_VERSION     3
 #define BUILD_NUMBER      11
-#define PATCH_LEVEL       15
+#define PATCH_LEVEL       16
 #define CANDIDATE_VERSION false

 // Define SONAME to have the SCons build the put a specific SONAME into the
=======================================
--- /branches/2.3/src/x64/ic-x64.cc     Thu Sep 16 03:37:18 2010
+++ /branches/2.3/src/x64/ic-x64.cc     Wed Sep 29 09:05:05 2010
@@ -918,8 +918,8 @@
   // Check that the receiver isn't a smi.
   __ JumpIfSmi(rdx, &slow);

-  // Check that the key is a smi.
-  __ JumpIfNotSmi(rax, &slow);
+  // Check that the key is an array index, that is Uint32.
+  __ JumpIfNotPositiveSmi(rax, &slow);

   // Get the map of the receiver.
   __ movq(rcx, FieldOperand(rdx, HeapObject::kMapOffset));
=======================================
--- /branches/2.3/test/cctest/test-api.cc       Mon Sep 27 08:03:50 2010
+++ /branches/2.3/test/cctest/test-api.cc       Wed Sep 29 09:05:05 2010
@@ -3060,7 +3060,7 @@
 static v8::Handle<Value> IdentityIndexedPropertyGetter(
     uint32_t index,
     const AccessorInfo& info) {
-  return v8::Integer::New(index);
+  return v8::Integer::NewFromUnsigned(index);
 }


@@ -3183,6 +3183,45 @@
       "}";
   ExpectString(code, "PASSED");
 }
+
+
+THREADED_TEST(IndexedInterceptorWithNegativeIndices) {
+  v8::HandleScope scope;
+  Local<ObjectTemplate> templ = ObjectTemplate::New();
+  templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter);
+
+  LocalContext context;
+  Local<v8::Object> obj = templ->NewInstance();
+  context->Global()->Set(v8_str("obj"), obj);
+
+  const char* code =
+      "try {"
+      "  for (var i = 0; i < 100; i++) {"
+      "    var expected = i;"
+      "    var key = i;"
+      "    if (i == 25) {"
+      "       key = -1;"
+      "       expected = undefined;"
+      "    }"
+      "    if (i == 50) {"
+      "       /* probe minimal Smi number on 32-bit platforms */"
+      "       key = -(1 << 30);"
+      "       expected = undefined;"
+      "    }"
+      "    if (i == 75) {"
+      "       /* probe minimal Smi number on 64-bit platforms */"
+      "       key = 1 << 31;"
+      "       expected = undefined;"
+      "    }"
+      "    var v = obj[key];"
+ " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;"
+      "  }"
+      "  'PASSED'"
+      "} catch(e) {"
+      "  e"
+      "}";
+  ExpectString(code, "PASSED");
+}


 THREADED_TEST(IndexedInterceptorWithNotSmiLookup) {
@@ -3198,11 +3237,12 @@
       "try {"
       "  for (var i = 0; i < 100; i++) {"
       "    var expected = i;"
+      "    var key = i;"
       "    if (i == 50) {"
-      "       i = 'foobar';"
+      "       key = 'foobar';"
       "       expected = undefined;"
       "    }"
-      "    var v = obj[i];"
+      "    var v = obj[key];"
" if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;"
       "  }"
       "  'PASSED'"

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

Reply via email to