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

Unified Diff: src/builtins.cc

Issue 669101: Fix invalid fast return in splice when returned array is empty. (Closed)
Patch Set: Created 10 years, 10 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
« no previous file with comments | « no previous file | test/mjsunit/array-splice.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/builtins.cc
diff --git a/src/builtins.cc b/src/builtins.cc
index 50f36e56e6b7ee3f27a06e7082d58db1143eede6..fc77c2b920bf53f47c820ff7a775c1ec1b5c3462 100644
--- a/src/builtins.cc
+++ b/src/builtins.cc
@@ -616,30 +616,34 @@ BUILTIN(ArraySplice) {
}
}
int actualDeleteCount = Min(Max(deleteCount, 0), len - actualStart);
Kasper Lund 2010/03/05 07:08:14 Don't use camelCase for local variables.
- if (actualDeleteCount == 0) {
- return AllocateEmptyJSArray();
- }
- // Allocate result array.
- Object* result = AllocateJSArray();
- if (result->IsFailure()) return result;
- JSArray* result_array = JSArray::cast(result);
+ FixedArray* elms = FixedArray::cast(array->elements());
- result = Heap::AllocateUninitializedFixedArray(actualDeleteCount);
- if (result->IsFailure()) return result;
- FixedArray* result_elms = FixedArray::cast(result);
+ JSArray* result_array = NULL;
+ if (actualDeleteCount == 0) {
+ Object* result = AllocateEmptyJSArray();
+ if (result->IsFailure()) return result;
+ result_array = JSArray::cast(result);
+ } else {
+ // Allocate result array.
+ Object* result = AllocateJSArray();
+ if (result->IsFailure()) return result;
+ result_array = JSArray::cast(result);
- FixedArray* elms = FixedArray::cast(array->elements());
+ result = Heap::AllocateUninitializedFixedArray(actualDeleteCount);
+ if (result->IsFailure()) return result;
+ FixedArray* result_elms = FixedArray::cast(result);
- AssertNoAllocation no_gc;
- // Fill newly created array.
- CopyElements(&no_gc, result_elms, 0, elms, actualStart, actualDeleteCount);
+ AssertNoAllocation no_gc;
+ // Fill newly created array.
+ CopyElements(&no_gc, result_elms, 0, elms, actualStart, actualDeleteCount);
- // Set elements.
- result_array->set_elements(result_elms);
+ // Set elements.
+ result_array->set_elements(result_elms);
- // Set the length.
- result_array->set_length(Smi::FromInt(actualDeleteCount));
+ // Set the length.
+ result_array->set_length(Smi::FromInt(actualDeleteCount));
+ }
int itemCount = (n_arguments > 1) ? (n_arguments - 2) : 0;
Kasper Lund 2010/03/05 07:08:14 Don't use camelCase for local variables.
@@ -647,6 +651,7 @@ BUILTIN(ArraySplice) {
if (itemCount < actualDeleteCount) {
// Shrink the array.
+ AssertNoAllocation no_gc;
MoveElements(&no_gc,
elms, actualStart + itemCount,
elms, actualStart + actualDeleteCount,
@@ -667,6 +672,7 @@ BUILTIN(ArraySplice) {
if (obj->IsFailure()) return obj;
FixedArray* new_elms = FixedArray::cast(obj);
+ AssertNoAllocation no_gc;
// Copy the part before actualStart as is.
CopyElements(&no_gc, new_elms, 0, elms, 0, actualStart);
FillWithHoles(new_elms, new_length, capacity);
@@ -676,12 +682,14 @@ BUILTIN(ArraySplice) {
array->set_elements(elms);
}
+ AssertNoAllocation no_gc;
MoveElements(&no_gc,
elms, actualStart + itemCount,
source_elms, actualStart + actualDeleteCount,
(len - actualDeleteCount - actualStart));
}
+ AssertNoAllocation no_gc;
WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc);
for (int k = actualStart; k < actualStart + itemCount; k++) {
elms->set(k, args[3 + k - actualStart], mode);
« no previous file with comments | « no previous file | test/mjsunit/array-splice.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698