summaryrefslogtreecommitdiffstats
path: root/src/array.js
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2010-09-22 15:07:15 +0100
committerSteve Block <steveblock@google.com>2010-09-29 18:15:43 +0100
commit59151504615d929945dc59db37bf1166937748c6 (patch)
tree2199adfe73b4618f685bae891d2d54f2cd997f77 /src/array.js
parent9ac36c9faca11611ada13b4054edbaa0738661d0 (diff)
downloadandroid_external_v8-59151504615d929945dc59db37bf1166937748c6.tar.gz
android_external_v8-59151504615d929945dc59db37bf1166937748c6.tar.bz2
android_external_v8-59151504615d929945dc59db37bf1166937748c6.zip
Update V8 to r5447 as required by WebKit r67908
Change-Id: I5af6ccf18523cb7e28460e6bbc044444256cdb97
Diffstat (limited to 'src/array.js')
-rw-r--r--src/array.js63
1 files changed, 57 insertions, 6 deletions
diff --git a/src/array.js b/src/array.js
index e12df641..b2ebece9 100644
--- a/src/array.js
+++ b/src/array.js
@@ -957,14 +957,41 @@ function ArrayIndexOf(element, index) {
// If index is still negative, search the entire array.
if (index < 0) index = 0;
}
+ var min = index;
+ var max = length;
+ if (UseSparseVariant(this, length, true)) {
+ var intervals = %GetArrayKeys(this, length);
+ if (intervals.length == 2 && intervals[0] < 0) {
+ // A single interval.
+ var intervalMin = -(intervals[0] + 1);
+ var intervalMax = intervalMin + intervals[1];
+ min = MAX(min, intervalMin);
+ max = intervalMax; // Capped by length already.
+ // Fall through to loop below.
+ } else {
+ if (intervals.length == 0) return -1;
+ // Get all the keys in sorted order.
+ var sortedKeys = GetSortedArrayKeys(this, intervals);
+ var n = sortedKeys.length;
+ var i = 0;
+ while (i < n && sortedKeys[i] < index) i++;
+ while (i < n) {
+ var key = sortedKeys[i];
+ if (!IS_UNDEFINED(key) && this[key] === element) return key;
+ i++;
+ }
+ return -1;
+ }
+ }
// Lookup through the array.
if (!IS_UNDEFINED(element)) {
- for (var i = index; i < length; i++) {
+ for (var i = min; i < max; i++) {
if (this[i] === element) return i;
}
return -1;
}
- for (var i = index; i < length; i++) {
+ // Lookup through the array.
+ for (var i = min; i < max; i++) {
if (IS_UNDEFINED(this[i]) && i in this) {
return i;
}
@@ -981,19 +1008,43 @@ function ArrayLastIndexOf(element, index) {
} else {
index = TO_INTEGER(index);
// If index is negative, index from end of the array.
- if (index < 0) index = length + index;
+ if (index < 0) index += length;
// If index is still negative, do not search the array.
- if (index < 0) index = -1;
+ if (index < 0) return -1;
else if (index >= length) index = length - 1;
}
+ var min = 0;
+ var max = index;
+ if (UseSparseVariant(this, length, true)) {
+ var intervals = %GetArrayKeys(this, index + 1);
+ if (intervals.length == 2 && intervals[0] < 0) {
+ // A single interval.
+ var intervalMin = -(intervals[0] + 1);
+ var intervalMax = intervalMin + intervals[1];
+ min = MAX(min, intervalMin);
+ max = intervalMax; // Capped by index already.
+ // Fall through to loop below.
+ } else {
+ if (intervals.length == 0) return -1;
+ // Get all the keys in sorted order.
+ var sortedKeys = GetSortedArrayKeys(this, intervals);
+ var i = sortedKeys.length - 1;
+ while (i >= 0) {
+ var key = sortedKeys[i];
+ if (!IS_UNDEFINED(key) && this[key] === element) return key;
+ i--;
+ }
+ return -1;
+ }
+ }
// Lookup through the array.
if (!IS_UNDEFINED(element)) {
- for (var i = index; i >= 0; i--) {
+ for (var i = max; i >= min; i--) {
if (this[i] === element) return i;
}
return -1;
}
- for (var i = index; i >= 0; i--) {
+ for (var i = max; i >= min; i--) {
if (IS_UNDEFINED(this[i]) && i in this) {
return i;
}