Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Unified Diff: src/array.js

Issue 349073002: Remove SmartMove from array.js (Closed) Base URL: git://github.com/v8/v8.git@bleeding_edge
Patch Set: ws Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/array.js
diff --git a/src/array.js b/src/array.js
index ef7aae4774f92764c788be57f4de4d3f62171e9f..5ef8f1141f80909f5879c89896fc386ee658a8d9 100644
--- a/src/array.js
+++ b/src/array.js
@@ -221,50 +221,6 @@ function SmartSlice(array, start_i, del_count, len, deleted_elements) {
}
-// This function implements the optimized splice implementation that can use
-// special array operations to handle sparse arrays in a sensible fashion.
-function SmartMove(array, start_i, del_count, len, num_additional_args) {
- // Move data to new array.
- var new_array = new InternalArray(len - del_count + num_additional_args);
- var indices = %GetArrayKeys(array, len);
- if (IS_NUMBER(indices)) {
- var limit = indices;
- for (var i = 0; i < start_i && i < limit; ++i) {
- var current = array[i];
- if (!IS_UNDEFINED(current) || i in array) {
- new_array[i] = current;
- }
- }
- for (var i = start_i + del_count; i < limit; ++i) {
- var current = array[i];
- if (!IS_UNDEFINED(current) || i in array) {
- new_array[i - del_count + num_additional_args] = current;
- }
- }
- } else {
- var length = indices.length;
- for (var k = 0; k < length; ++k) {
- var key = indices[k];
- if (!IS_UNDEFINED(key)) {
- if (key < start_i) {
- var current = array[key];
- if (!IS_UNDEFINED(current) || key in array) {
- new_array[key] = current;
- }
- } else if (key >= start_i + del_count) {
- var current = array[key];
- if (!IS_UNDEFINED(current) || key in array) {
- new_array[key - del_count + num_additional_args] = current;
- }
- }
- }
- }
- }
- // Move contents of new_array into this array
- %MoveArrayContents(new_array, array);
-}
-
-
// This is part of the old simple-minded splice. We are using it either
// because the receiver is not an array (so we have no choice) or because we
// know we are not deleting or moving a lot of elements.
@@ -282,8 +238,9 @@ function SimpleSlice(array, start_i, del_count, len, deleted_elements) {
}
-function SimpleMove(array, start_i, del_count, len, num_additional_args) {
- if (num_additional_args !== del_count) {
+function SimpleMove(array, start_i, del_count, len, num_additional_args,
+ force) {
+ if (num_additional_args !== del_count || force) {
rafaelw 2014/06/22 23:59:18 Note that |force| is required here because the spe
// Move the existing elements after the elements to be deleted
// to the right position in the resulting array.
if (num_additional_args > del_count) {
@@ -586,11 +543,7 @@ function ArrayShift() {
var first = array[0];
- if (IS_ARRAY(array)) {
- SmartMove(array, 0, 1, len, 0);
- } else {
- SimpleMove(array, 0, 1, len, 0);
- }
+ SimpleMove(array, 0, 1, len, 0);
array.length = len - 1;
@@ -626,14 +579,7 @@ function ArrayUnshift(arg1) { // length == 1
var array = TO_OBJECT_INLINE(this);
var len = TO_UINT32(array.length);
var num_arguments = %_ArgumentsLength();
- var is_sealed = ObjectIsSealed(array);
-
- if (IS_ARRAY(array) && !is_sealed && len > 0) {
- SmartMove(array, 0, 0, len, num_arguments);
- } else {
- SimpleMove(array, 0, 0, len, num_arguments);
- }
-
+ SimpleMove(array, 0, 0, len, num_arguments, true);
for (var i = 0; i < num_arguments; i++) {
array[i] = %_Arguments(i);
}
@@ -783,25 +729,8 @@ function ArraySplice(start, delete_count) {
["Array.prototype.splice"]);
}
- var use_simple_splice = true;
- if (IS_ARRAY(array) &&
- num_elements_to_add !== del_count) {
- // If we are only deleting/moving a few things near the end of the
- // array then the simple version is going to be faster, because it
- // doesn't touch most of the array.
- var estimated_non_hole_elements = %EstimateNumberOfElements(array);
- if (len > 20 && (estimated_non_hole_elements >> 2) < (len - start_i)) {
- use_simple_splice = false;
- }
- }
-
- if (use_simple_splice) {
- SimpleSlice(array, start_i, del_count, len, deleted_elements);
- SimpleMove(array, start_i, del_count, len, num_elements_to_add);
- } else {
- SmartSlice(array, start_i, del_count, len, deleted_elements);
- SmartMove(array, start_i, del_count, len, num_elements_to_add);
- }
+ SimpleSlice(array, start_i, del_count, len, deleted_elements);
Toon Verwaest 2014/06/23 08:42:36 I guess now you can remove the "Simple" prefixes
+ SimpleMove(array, start_i, del_count, len, num_elements_to_add);
// Insert the arguments into the resulting array in
// place of the deleted elements.
« no previous file with comments | « no previous file | test/mjsunit/array-functions-prototype-misc.js » ('j') | test/mjsunit/array-functions-prototype-misc.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698