Index: src/code-stub-assembler.cc |
diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc |
index 5295189a8e7816bdc7947828b3486554c0596e31..d05e07bd08bd463771e1cdeab64ee115df017808 100644 |
--- a/src/code-stub-assembler.cc |
+++ b/src/code-stub-assembler.cc |
@@ -1318,6 +1318,50 @@ Node* CodeStubAssembler::AllocateSlicedTwoByteString(Node* length, Node* parent, |
return result; |
} |
+Node* CodeStubAssembler::AllocateRegExpResult(Node* context, Node* length, |
+ Node* index, Node* input) { |
+ Node* const max_length = |
+ SmiConstant(Smi::FromInt(JSArray::kInitialMaxFastElementArray)); |
+ Assert(SmiLessThanOrEqual(length, max_length)); |
+ |
+ // Allocate the JSRegExpResult. |
+ // TODO(jgruber): Fold JSArray and FixedArray allocations, then remove |
+ // unneeded store of elements. |
+ Node* const result = Allocate(JSRegExpResult::kSize); |
+ |
+ // TODO(jgruber): Store map as Heap constant? |
+ Node* const native_context = LoadNativeContext(context); |
+ Node* const map = |
+ LoadContextElement(native_context, Context::REGEXP_RESULT_MAP_INDEX); |
+ StoreMapNoWriteBarrier(result, map); |
+ |
+ // Initialize the header before allocating the elements. |
+ Node* const empty_array = EmptyFixedArrayConstant(); |
+ DCHECK(Heap::RootIsImmortalImmovable(Heap::kEmptyFixedArrayRootIndex)); |
+ StoreObjectFieldNoWriteBarrier(result, JSArray::kPropertiesOffset, |
+ empty_array); |
+ StoreObjectFieldNoWriteBarrier(result, JSArray::kElementsOffset, empty_array); |
+ StoreObjectFieldNoWriteBarrier(result, JSArray::kLengthOffset, length); |
+ |
+ StoreObjectFieldNoWriteBarrier(result, JSRegExpResult::kIndexOffset, index); |
+ StoreObjectField(result, JSRegExpResult::kInputOffset, input); |
+ |
+ Node* const zero = IntPtrConstant(0); |
+ Node* const length_intptr = SmiUntag(length); |
+ const ElementsKind elements_kind = FAST_ELEMENTS; |
+ const ParameterMode parameter_mode = INTPTR_PARAMETERS; |
+ |
+ Node* const elements = |
+ AllocateFixedArray(elements_kind, length_intptr, parameter_mode); |
+ StoreObjectField(result, JSArray::kElementsOffset, elements); |
+ |
+ // Fill in the elements with undefined. |
+ FillFixedArrayWithValue(elements_kind, elements, zero, length_intptr, |
+ Heap::kUndefinedValueRootIndex, parameter_mode); |
+ |
+ return result; |
+} |
+ |
Node* CodeStubAssembler::AllocateUninitializedJSArrayWithoutElements( |
ElementsKind kind, Node* array_map, Node* length, Node* allocation_site) { |
Comment("begin allocation of JSArray without elements"); |
@@ -1408,7 +1452,7 @@ Node* CodeStubAssembler::AllocateFixedArray(ElementsKind kind, |
Node* capacity_node, |
ParameterMode mode, |
AllocationFlags flags) { |
- Node* total_size = GetFixedAarrayAllocationSize(capacity_node, kind, mode); |
+ Node* total_size = GetFixedArrayAllocationSize(capacity_node, kind, mode); |
// Allocate both array and elements object, and initialize the JSArray. |
Node* array = Allocate(total_size, flags); |