diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2010-09-16 21:33:32 -0700 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2010-09-16 21:33:32 -0700 |
commit | 431e43009c1a90781bea57aa993797d0161bbf95 (patch) | |
tree | 05f2a330d690365aee943d0bc1b5813070662c4b /deps/v8/src/array.js | |
parent | d2de8ba400abf5fffe4ed9c688df86508ea72ff1 (diff) | |
download | node-431e43009c1a90781bea57aa993797d0161bbf95.tar.gz |
Upgrade V8 to 2.4.4
Diffstat (limited to 'deps/v8/src/array.js')
-rw-r--r-- | deps/v8/src/array.js | 63 |
1 files changed, 57 insertions, 6 deletions
diff --git a/deps/v8/src/array.js b/deps/v8/src/array.js index e12df6414..b2ebece9c 100644 --- a/deps/v8/src/array.js +++ b/deps/v8/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; } |