Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index e5a93a7bd5b1f4ec513e0427d54f033b0fdf5dce..fa05518365e690870bb16e532e28208482b0bbd3 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -2626,16 +2626,15 @@ void HGraphBuilder::BuildInitializeElementsHeader(HValue* elements, |
} |
-HValue* HGraphBuilder::BuildAllocateElementsAndInitializeElementsHeader( |
- ElementsKind kind, |
- HValue* capacity) { |
+HValue* HGraphBuilder::BuildAllocateAndInitializeArray(ElementsKind kind, |
+ HValue* capacity) { |
// The HForceRepresentation is to prevent possible deopt on int-smi |
// conversion after allocation but before the new object fields are set. |
capacity = AddUncasted<HForceRepresentation>(capacity, Representation::Smi()); |
HValue* size_in_bytes = BuildCalculateElementsSize(kind, capacity); |
- HValue* new_elements = BuildAllocateElements(kind, size_in_bytes); |
- BuildInitializeElementsHeader(new_elements, kind, capacity); |
- return new_elements; |
+ HValue* new_array = BuildAllocateElements(kind, size_in_bytes); |
+ BuildInitializeElementsHeader(new_array, kind, capacity); |
+ return new_array; |
} |
@@ -2754,8 +2753,8 @@ HValue* HGraphBuilder::BuildGrowElementsCapacity(HValue* object, |
(Page::kMaxRegularHeapObjectSize - FixedArray::kHeaderSize) >> |
ElementsKindToShiftSize(new_kind))); |
- HValue* new_elements = BuildAllocateElementsAndInitializeElementsHeader( |
- new_kind, new_capacity); |
+ HValue* new_elements = |
+ BuildAllocateAndInitializeArray(new_kind, new_capacity); |
BuildCopyElements(elements, kind, new_elements, |
new_kind, length, new_capacity); |
@@ -2789,12 +2788,6 @@ void HGraphBuilder::BuildFillElementsWithValue(HValue* elements, |
} |
} |
- // Since we're about to store a hole value, the store instruction below must |
- // assume an elements kind that supports heap object values. |
- if (IsFastSmiOrObjectElementsKind(elements_kind)) { |
- elements_kind = FAST_HOLEY_ELEMENTS; |
- } |
- |
if (initial_capacity >= 0) { |
for (int i = 0; i < initial_capacity; i++) { |
HInstruction* key = Add<HConstant>(i); |
@@ -2832,10 +2825,40 @@ void HGraphBuilder::BuildFillElementsWithHole(HValue* elements, |
? Add<HConstant>(factory->the_hole_value()) |
: Add<HConstant>(nan_double); |
+ // Since we're about to store a hole value, the store instruction below must |
+ // assume an elements kind that supports heap object values. |
+ if (IsFastSmiOrObjectElementsKind(elements_kind)) { |
+ elements_kind = FAST_HOLEY_ELEMENTS; |
+ } |
+ |
BuildFillElementsWithValue(elements, elements_kind, from, to, hole); |
} |
+void HGraphBuilder::BuildCopyProperties(HValue* from_properties, |
+ HValue* to_properties, HValue* length, |
+ HValue* capacity) { |
+ ElementsKind kind = FAST_ELEMENTS; |
+ |
+ BuildFillElementsWithValue(to_properties, kind, length, capacity, |
+ graph()->GetConstantUndefined()); |
+ |
+ LoopBuilder builder(this, context(), LoopBuilder::kPostDecrement); |
+ |
+ HValue* key = builder.BeginBody(length, graph()->GetConstant0(), Token::GT); |
+ |
+ key = AddUncasted<HSub>(key, graph()->GetConstant1()); |
+ key->ClearFlag(HValue::kCanOverflow); |
+ |
+ HValue* element = |
+ Add<HLoadKeyed>(from_properties, key, static_cast<HValue*>(NULL), kind); |
+ |
+ Add<HStoreKeyed>(to_properties, key, element, kind); |
+ |
+ builder.EndBody(); |
+} |
+ |
+ |
void HGraphBuilder::BuildCopyElements(HValue* from_elements, |
ElementsKind from_elements_kind, |
HValue* to_elements, |