Commit a38a8ffa authored by antonm@chromium.org's avatar antonm@chromium.org

ArraySplice builtin should return empty array and not alter receiver if invoked with no arguments.

Review URL: http://codereview.chromium.org/6357025

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6540 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 1023f569
...@@ -603,16 +603,17 @@ function ArraySplice(start, delete_count) { ...@@ -603,16 +603,17 @@ function ArraySplice(start, delete_count) {
} }
// SpiderMonkey, TraceMonkey and JSC treat the case where no delete count is // SpiderMonkey, TraceMonkey and JSC treat the case where no delete count is
// given differently from when an undefined delete count is given. // given as a request to delete all the elements from the start.
// And it differs from the case of undefined delete count.
// This does not follow ECMA-262, but we do the same for // This does not follow ECMA-262, but we do the same for
// compatibility. // compatibility.
var del_count = 0; var del_count = 0;
if (num_arguments > 1) { if (num_arguments == 1) {
del_count = len - start_i;
} else {
del_count = TO_INTEGER(delete_count); del_count = TO_INTEGER(delete_count);
if (del_count < 0) del_count = 0; if (del_count < 0) del_count = 0;
if (del_count > len - start_i) del_count = len - start_i; if (del_count > len - start_i) del_count = len - start_i;
} else {
del_count = len - start_i;
} }
var deleted_elements = []; var deleted_elements = [];
......
...@@ -750,19 +750,26 @@ BUILTIN(ArraySplice) { ...@@ -750,19 +750,26 @@ BUILTIN(ArraySplice) {
: Min(relative_start, len); : Min(relative_start, len);
// SpiderMonkey, TraceMonkey and JSC treat the case where no delete count is // SpiderMonkey, TraceMonkey and JSC treat the case where no delete count is
// given differently from when an undefined delete count is given. // given as a request to delete all the elements from the start.
// And it differs from the case of undefined delete count.
// This does not follow ECMA-262, but we do the same for // This does not follow ECMA-262, but we do the same for
// compatibility. // compatibility.
int delete_count = len; int actual_delete_count;
if (n_arguments == 1) {
ASSERT(len - actual_start >= 0);
actual_delete_count = len - actual_start;
} else {
int value = 0; // ToInteger(undefined) == 0
if (n_arguments > 1) { if (n_arguments > 1) {
Object* arg2 = args[2]; Object* arg2 = args[2];
if (arg2->IsSmi()) { if (arg2->IsSmi()) {
delete_count = Smi::cast(arg2)->value(); value = Smi::cast(arg2)->value();
} else { } else {
return CallJsBuiltin("ArraySplice", args); return CallJsBuiltin("ArraySplice", args);
} }
} }
int actual_delete_count = Min(Max(delete_count, 0), len - actual_start); actual_delete_count = Min(Max(value, 0), len - actual_start);
}
JSArray* result_array = NULL; JSArray* result_array = NULL;
if (actual_delete_count == 0) { if (actual_delete_count == 0) {
......
...@@ -339,6 +339,20 @@ ...@@ -339,6 +339,20 @@
})(); })();
// Check the case of JS builtin .splice()
(function() {
for (var i = 0; i < 7; i++) {
var array = [1, 2, 3, 4];
Array.prototype[3] = 'foo'; // To force JS builtin.
var spliced = array.splice();
assertEquals([], spliced);
assertEquals([1, 2, 3, 4], array);
}
})();
// Check the behaviour when approaching maximal values for length. // Check the behaviour when approaching maximal values for length.
(function() { (function() {
for (var i = 0; i < 7; i++) { for (var i = 0; i < 7; i++) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment