Index: src/arm/code-stubs-arm.cc |
diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc |
index 3ab09a2df964ad26bce760eeff3fc6d2a5e48ee7..4b745b1016bb1e7256af6c420f2ac8752351713c 100644 |
--- a/src/arm/code-stubs-arm.cc |
+++ b/src/arm/code-stubs-arm.cc |
@@ -344,6 +344,7 @@ static void GenerateFastCloneShallowArrayCommon( |
MacroAssembler* masm, |
int length, |
FastCloneShallowArrayStub::Mode mode, |
+ AllocationSiteInfoMode allocation_site_info_mode, |
Label* fail) { |
// Registers on entry: |
// |
@@ -357,7 +358,12 @@ static void GenerateFastCloneShallowArrayCommon( |
? FixedDoubleArray::SizeFor(length) |
: FixedArray::SizeFor(length); |
} |
- int size = JSArray::kSize + elements_size; |
+ int size = JSArray::kSize; |
+ int allocation_info_start = size; |
+ if (allocation_site_info_mode == TRACK_ALLOCATION_SITE_INFO) { |
+ size += AllocationSiteInfo::kSize; |
+ } |
+ size += elements_size; |
// Allocate both the JS array and the elements array in one big |
// allocation. This avoids multiple limit checks. |
@@ -367,6 +373,13 @@ static void GenerateFastCloneShallowArrayCommon( |
} |
__ AllocateInNewSpace(size, r0, r1, r2, fail, flags); |
+ if (allocation_site_info_mode == TRACK_ALLOCATION_SITE_INFO) { |
+ __ mov(r2, Operand(Handle<Map>(masm->isolate()->heap()-> |
+ allocation_site_info_map()))); |
+ __ str(r2, FieldMemOperand(r0, allocation_info_start)); |
+ __ str(r3, FieldMemOperand(r0, allocation_info_start + kPointerSize)); |
+ } |
+ |
// Copy the JS array part. |
for (int i = 0; i < JSArray::kSize; i += kPointerSize) { |
if ((i != JSArray::kElementsOffset) || (length == 0)) { |
@@ -379,7 +392,11 @@ static void GenerateFastCloneShallowArrayCommon( |
// Get hold of the elements array of the boilerplate and setup the |
// elements pointer in the resulting object. |
__ ldr(r3, FieldMemOperand(r3, JSArray::kElementsOffset)); |
- __ add(r2, r0, Operand(JSArray::kSize)); |
+ if (allocation_site_info_mode == TRACK_ALLOCATION_SITE_INFO) { |
+ __ add(r2, r0, Operand(JSArray::kSize + AllocationSiteInfo::kSize)); |
+ } else { |
+ __ add(r2, r0, Operand(JSArray::kSize)); |
+ } |
__ str(r2, FieldMemOperand(r0, JSArray::kElementsOffset)); |
// Copy the elements array. |
@@ -406,6 +423,13 @@ void FastCloneShallowArrayStub::Generate(MacroAssembler* masm) { |
__ b(eq, &slow_case); |
FastCloneShallowArrayStub::Mode mode = mode_; |
+ AllocationSiteInfoMode allocation_site_info_mode = |
+ DONT_TRACK_ALLOCATION_SITE_INFO; |
+ if (mode == CLONE_ANY_ELEMENTS_WITH_ALLOCATION_SITE_INFO) { |
+ mode = CLONE_ANY_ELEMENTS; |
+ allocation_site_info_mode = TRACK_ALLOCATION_SITE_INFO; |
+ } |
+ |
if (mode == CLONE_ANY_ELEMENTS) { |
Label double_elements, check_fast_elements; |
__ ldr(r0, FieldMemOperand(r3, JSArray::kElementsOffset)); |
@@ -413,7 +437,9 @@ void FastCloneShallowArrayStub::Generate(MacroAssembler* masm) { |
__ CompareRoot(r0, Heap::kFixedCOWArrayMapRootIndex); |
__ b(ne, &check_fast_elements); |
GenerateFastCloneShallowArrayCommon(masm, 0, |
- COPY_ON_WRITE_ELEMENTS, &slow_case); |
+ COPY_ON_WRITE_ELEMENTS, |
+ allocation_site_info_mode, |
+ &slow_case); |
// Return and remove the on-stack parameters. |
__ add(sp, sp, Operand(3 * kPointerSize)); |
__ Ret(); |
@@ -422,7 +448,9 @@ void FastCloneShallowArrayStub::Generate(MacroAssembler* masm) { |
__ CompareRoot(r0, Heap::kFixedArrayMapRootIndex); |
__ b(ne, &double_elements); |
GenerateFastCloneShallowArrayCommon(masm, length_, |
- CLONE_ELEMENTS, &slow_case); |
+ CLONE_ELEMENTS, |
+ allocation_site_info_mode, |
+ &slow_case); |
// Return and remove the on-stack parameters. |
__ add(sp, sp, Operand(3 * kPointerSize)); |
__ Ret(); |
@@ -454,7 +482,8 @@ void FastCloneShallowArrayStub::Generate(MacroAssembler* masm) { |
__ pop(r3); |
} |
- GenerateFastCloneShallowArrayCommon(masm, length_, mode, &slow_case); |
+ GenerateFastCloneShallowArrayCommon(masm, length_, mode, |
+ allocation_site_info_mode, &slow_case); |
// Return and remove the on-stack parameters. |
__ add(sp, sp, Operand(3 * kPointerSize)); |