| Index: src/builtins/builtins-regexp.cc
|
| diff --git a/src/builtins/builtins-regexp.cc b/src/builtins/builtins-regexp.cc
|
| index 86871d24c1e6dbeb0d7dbb27f2ca39c7d14e7c91..6196f6d93a3139a8dab5164a0750aa8ed0fddc74 100644
|
| --- a/src/builtins/builtins-regexp.cc
|
| +++ b/src/builtins/builtins-regexp.cc
|
| @@ -1386,7 +1386,7 @@ class GrowableFixedArray {
|
| a->Bind(&grow);
|
| {
|
| Node* const new_capacity = NewCapacity(a, capacity);
|
| - Node* const new_array = GrowFixedArray(capacity, new_capacity, mode);
|
| + Node* const new_array = ResizeFixedArray(length, new_capacity, mode);
|
|
|
| var_capacity_.Bind(new_capacity);
|
| var_array_.Bind(new_array);
|
| @@ -1407,10 +1407,28 @@ class GrowableFixedArray {
|
| CodeStubAssembler* a = assembler_;
|
|
|
| const ElementsKind kind = FAST_ELEMENTS;
|
| + const ParameterMode mode = CodeStubAssembler::INTPTR_PARAMETERS;
|
|
|
| Node* const native_context = a->LoadNativeContext(context);
|
| Node* const array_map = a->LoadJSArrayElementsMap(kind, native_context);
|
|
|
| + // Shrink to fit if necessary.
|
| + {
|
| + Label next(a);
|
| +
|
| + Node* const length = var_length_.value();
|
| + Node* const capacity = var_capacity_.value();
|
| +
|
| + a->GotoIf(a->WordEqual(length, capacity), &next);
|
| +
|
| + Node* const array = ResizeFixedArray(length, length, mode);
|
| + var_array_.Bind(array);
|
| + var_capacity_.Bind(length);
|
| + a->Goto(&next);
|
| +
|
| + a->Bind(&next);
|
| + }
|
| +
|
| Node* const result_length = a->SmiTag(length());
|
| Node* const result = a->AllocateUninitializedJSArrayWithoutElements(
|
| kind, array_map, result_length, nullptr);
|
| @@ -1454,14 +1472,17 @@ class GrowableFixedArray {
|
| return new_capacity;
|
| }
|
|
|
| - Node* GrowFixedArray(Node* const current_capacity, Node* const new_capacity,
|
| - ParameterMode mode) {
|
| + // Creates a new array with {new_capacity} and copies the first
|
| + // {element_count} elements from the current array.
|
| + Node* ResizeFixedArray(Node* const element_count, Node* const new_capacity,
|
| + ParameterMode mode) {
|
| DCHECK(mode == CodeStubAssembler::INTPTR_PARAMETERS);
|
|
|
| CodeStubAssembler* a = assembler_;
|
|
|
| - CSA_ASSERT(a, a->IntPtrGreaterThan(current_capacity, a->IntPtrConstant(0)));
|
| - CSA_ASSERT(a, a->IntPtrGreaterThan(new_capacity, current_capacity));
|
| + CSA_ASSERT(a, a->IntPtrGreaterThan(element_count, a->IntPtrConstant(0)));
|
| + CSA_ASSERT(a, a->IntPtrGreaterThan(new_capacity, a->IntPtrConstant(0)));
|
| + CSA_ASSERT(a, a->IntPtrGreaterThanOrEqual(new_capacity, element_count));
|
|
|
| const ElementsKind kind = FAST_ELEMENTS;
|
| const WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER;
|
| @@ -1471,9 +1492,8 @@ class GrowableFixedArray {
|
| Node* const from_array = var_array_.value();
|
| Node* const to_array =
|
| a->AllocateFixedArray(kind, new_capacity, mode, flags);
|
| - a->CopyFixedArrayElements(kind, from_array, kind, to_array,
|
| - current_capacity, new_capacity, barrier_mode,
|
| - mode);
|
| + a->CopyFixedArrayElements(kind, from_array, kind, to_array, element_count,
|
| + new_capacity, barrier_mode, mode);
|
|
|
| return to_array;
|
| }
|
|
|