Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 809640fb437aa303c39e0d51e087e59b3e210b29..ee051aa24a87c2d9aae5d9b0bb3636fc592fdc77 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -9875,8 +9875,8 @@ HValue* HOptimizedGraphBuilder::BuildAllocateExternalElements( |
HValue* HOptimizedGraphBuilder::BuildAllocateFixedTypedArray( |
ExternalArrayType array_type, size_t element_size, |
- ElementsKind fixed_elements_kind, |
- HValue* byte_length, HValue* length) { |
+ ElementsKind fixed_elements_kind, HValue* byte_length, HValue* length, |
+ bool initialize) { |
STATIC_ASSERT( |
(FixedTypedArrayBase::kHeaderSize & kObjectAlignmentMask) == 0); |
HValue* total_size; |
@@ -9915,7 +9915,7 @@ HValue* HOptimizedGraphBuilder::BuildAllocateFixedTypedArray( |
HValue* filler = Add<HConstant>(static_cast<int32_t>(0)); |
- { |
+ if (initialize) { |
LoopBuilder builder(this, context(), LoopBuilder::kPostIncrement); |
HValue* key = builder.BeginBody( |
@@ -9938,7 +9938,8 @@ void HOptimizedGraphBuilder::GenerateTypedArrayInitialize( |
static const int kBufferArg = 2; |
static const int kByteOffsetArg = 3; |
static const int kByteLengthArg = 4; |
- static const int kArgsLength = 5; |
+ static const int kInitializeArg = 5; |
+ static const int kArgsLength = 6; |
DCHECK(arguments->length() == kArgsLength); |
@@ -9987,6 +9988,11 @@ void HOptimizedGraphBuilder::GenerateTypedArrayInitialize( |
CHECK_ALIVE(VisitForValue(arguments->at(kByteLengthArg))); |
HValue* byte_length = Pop(); |
+ CHECK(arguments->at(kInitializeArg)->IsLiteral()); |
+ bool initialize = static_cast<Literal*>(arguments->at(kInitializeArg)) |
+ ->value() |
+ ->BooleanValue(); |
+ |
NoObservableSideEffectsScope scope(this); |
IfBuilder byte_offset_smi(this); |
@@ -10034,9 +10040,9 @@ void HOptimizedGraphBuilder::GenerateTypedArrayInitialize( |
AddStoreMapConstant(obj, obj_map); |
} else { |
DCHECK(is_zero_byte_offset); |
- elements = BuildAllocateFixedTypedArray( |
- array_type, element_size, fixed_elements_kind, |
- byte_length, length); |
+ elements = BuildAllocateFixedTypedArray(array_type, element_size, |
+ fixed_elements_kind, byte_length, |
+ length, initialize); |
} |
Add<HStoreNamedField>( |
obj, HObjectAccess::ForElementsPointer(), elements); |
@@ -10050,6 +10056,7 @@ void HOptimizedGraphBuilder::GenerateTypedArrayInitialize( |
Push(buffer); |
Push(byte_offset); |
Push(byte_length); |
+ CHECK_ALIVE(VisitForValue(arguments->at(kInitializeArg))); |
PushArgumentsFromEnvironment(kArgsLength); |
Add<HCallRuntime>(expr->name(), expr->function(), kArgsLength); |
} |