Reviewers: Rico,

Description:
Fix bug in Array.prototype.indexOf/lastIndexOf when called on non-sparse
non-arrays.

Please review this at http://codereview.chromium.org/3358025/show

Affected files:
  M src/runtime.cc
  M test/mjsunit/array-indexing.js


Index: src/runtime.cc
diff --git a/src/runtime.cc b/src/runtime.cc
index f9c2e5bea6995953adc9f7cd1e720d337da3b37d..9ec4c1153e2c2801ba8009aede552a872484cd1b 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -7985,12 +7985,14 @@ static Object* Runtime_MoveArrayContents(Arguments args) {
 // How many elements does this array have?
 static Object* Runtime_EstimateNumberOfElements(Arguments args) {
   ASSERT(args.length() == 1);
-  CONVERT_CHECKED(JSArray, array, args[0]);
-  HeapObject* elements = array->elements();
+  CONVERT_CHECKED(JSObject, object, args[0]);
+  HeapObject* elements = object->elements();
   if (elements->IsDictionary()) {
return Smi::FromInt(NumberDictionary::cast(elements)->NumberOfElements());
+  } else if (object->IsJSArray()){
+    return JSArray::cast(object)->length();
   } else {
-    return array->length();
+    return Smi::FromInt(FixedArray::cast(elements)->length());
   }
 }

Index: test/mjsunit/array-indexing.js
diff --git a/test/mjsunit/array-indexing.js b/test/mjsunit/array-indexing.js
index 180a4d6c344bd1db85e43f5ba9582a02ff8d9ba3..fab692a39cffef434450aa89a269a35b9a40bf3c 100644
--- a/test/mjsunit/array-indexing.js
+++ b/test/mjsunit/array-indexing.js
@@ -27,7 +27,7 @@

 var array = [1,2,3,1,2,3,1,2,3,1,2,3];
 var undef_array = [0,,2,undefined,4,,6,undefined,8,,10];
-// Sparse arrays with lenght 42000.
+// Sparse arrays with length 42000.
 var sparse_array = [];
 sparse_array[100] = 3;
 sparse_array[200] = undefined;
@@ -40,6 +40,9 @@ sparse_array[800] = undefined;
 sparse_array[900] = 3
 sparse_array[41999] = "filler";

+var dense_object = { 0: 42, 1: 37, length: 2 };
+var sparse_object = { 0: 42, 100000: 37, length: 200000 };
+
 // ----------------------------------------------------------------------
 // Array.prototype.indexOf.
 // ----------------------------------------------------------------------
@@ -93,6 +96,11 @@ assertEquals(200, sparse_array.indexOf(undefined, -42000));
 assertEquals(800, sparse_array.indexOf(undefined, 201 - 42000));
 assertEquals(-1, sparse_array.indexOf(undefined, 801 - 42000));

+// Find in non-arrays.
+assertEquals(0, Array.prototype.indexOf.call(dense_object, 42));
+assertEquals(1, Array.prototype.indexOf.call(dense_object, 37));
+assertEquals(0, Array.prototype.indexOf.call(sparse_object, 42));
+assertEquals(100000, Array.prototype.indexOf.call(sparse_object, 37));

 // ----------------------------------------------------------------------
 // Array.prototype.lastIndexOf.
@@ -145,3 +153,14 @@ assertEquals(-1, sparse_array.lastIndexOf(undefined, 199));
 assertEquals(800, sparse_array.lastIndexOf(undefined, -1));
 assertEquals(200, sparse_array.lastIndexOf(undefined, 799 - 42000));
 assertEquals(-1, sparse_array.lastIndexOf(undefined, 199 - 42000));
+
+assertEquals(0, Array.prototype.lastIndexOf.call(dense_object, 42));
+assertEquals(1, Array.prototype.lastIndexOf.call(dense_object, 37));
+assertEquals(0, Array.prototype.lastIndexOf.call(sparse_object, 42));
+assertEquals(100000, Array.prototype.lastIndexOf.call(sparse_object, 37));
+
+//Find in non-arrays.
+assertEquals(0, Array.prototype.lastIndexOf.call(dense_object, 42));
+assertEquals(1, Array.prototype.lastIndexOf.call(dense_object, 37));
+assertEquals(0, Array.prototype.lastIndexOf.call(sparse_object, 42));
+assertEquals(100000, Array.prototype.lastIndexOf.call(sparse_object, 37));


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

Reply via email to