Index: src/code-stubs-hydrogen.cc |
diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc |
index ae198bc24942bef2dd2dcddcd1b40262fe99863f..6e61c789919852ab855467cd780ca8b8ec2959d1 100644 |
--- a/src/code-stubs-hydrogen.cc |
+++ b/src/code-stubs-hydrogen.cc |
@@ -111,6 +111,8 @@ bool CodeStubGraphBuilderBase::BuildGraph() { |
next_block->SetJoinId(BailoutId::StubEntry()); |
set_current_block(next_block); |
+ start_environment->set_ast_id(BailoutId::StubEntry()); |
+ |
HConstant* undefined_constant = new(zone) HConstant( |
isolate()->factory()->undefined_value(), Representation::Tagged()); |
AddInstruction(undefined_constant); |
@@ -227,8 +229,7 @@ HValue* CodeStubGraphBuilder<KeyedLoadFastElementStub>::BuildCodeStub() { |
HInstruction* load = BuildUncheckedMonomorphicElementAccess( |
GetParameter(0), GetParameter(1), NULL, NULL, |
casted_stub()->is_js_array(), casted_stub()->elements_kind(), |
- false, Representation::Tagged()); |
- AddInstruction(load); |
+ false, STANDARD_STORE, Representation::Tagged()); |
return load; |
} |
@@ -241,6 +242,25 @@ Handle<Code> KeyedLoadFastElementStub::GenerateCode() { |
template <> |
+HValue* CodeStubGraphBuilder<KeyedStoreFastElementStub>::BuildCodeStub() { |
+ BuildUncheckedMonomorphicElementAccess( |
+ GetParameter(0), GetParameter(1), GetParameter(2), NULL, |
+ casted_stub()->is_js_array(), casted_stub()->elements_kind(), |
+ true, casted_stub()->store_mode(), Representation::Tagged()); |
+ AddSimulate(BailoutId::StubEntry(), REMOVABLE_SIMULATE); |
+ |
+ return GetParameter(2); |
+} |
+ |
+ |
+Handle<Code> KeyedStoreFastElementStub::GenerateCode() { |
+ CodeStubGraphBuilder<KeyedStoreFastElementStub> builder(this); |
+ LChunk* chunk = OptimizeGraph(builder.CreateGraph()); |
+ return chunk->Codegen(Code::COMPILED_STUB); |
+} |
+ |
+ |
+template <> |
HValue* CodeStubGraphBuilder<TransitionElementsKindStub>::BuildCodeStub() { |
Zone* zone = this->zone(); |
@@ -256,27 +276,16 @@ HValue* CodeStubGraphBuilder<TransitionElementsKindStub>::BuildCodeStub() { |
js_array, |
HType::Smi())); |
- Heap* heap = isolate()->heap(); |
- const int kMinFreeNewSpaceAfterGC = |
- ((heap->InitialSemiSpaceSize() - sizeof(FixedArrayBase)) / 2) / |
- kDoubleSize; |
- |
- HConstant* max_alloc_size = |
- new(zone) HConstant(kMinFreeNewSpaceAfterGC, Representation::Integer32()); |
- AddInstruction(max_alloc_size); |
- // Since we're forcing Integer32 representation for this HBoundsCheck, |
- // there's no need to Smi-check the index. |
- AddInstruction( |
- new(zone) HBoundsCheck(array_length, max_alloc_size, |
- DONT_ALLOW_SMI_KEY, Representation::Integer32())); |
+ ElementsKind to_kind = casted_stub()->to_kind(); |
+ BuildNewSpaceArrayCheck(array_length, to_kind); |
IfBuilder if_builder(this, BailoutId::StubEntry()); |
- if_builder.BeginTrue(array_length, graph()->GetConstant0(), Token::EQ); |
+ if_builder.BeginIf(array_length, graph()->GetConstant0(), Token::EQ); |
// Nothing to do, just change the map. |
- if_builder.BeginFalse(); |
+ if_builder.BeginElse(); |
HInstruction* elements = |
AddInstruction(new(zone) HLoadElements(js_array, js_array)); |
@@ -284,37 +293,16 @@ HValue* CodeStubGraphBuilder<TransitionElementsKindStub>::BuildCodeStub() { |
HInstruction* elements_length = |
AddInstruction(new(zone) HFixedArrayBaseLength(elements)); |
- ElementsKind to_kind = casted_stub()->to_kind(); |
HValue* new_elements = |
- BuildAllocateElements(context(), to_kind, elements_length); |
- |
- // Fast elements kinds need to be initialized in case statements below cause a |
- // garbage collection. |
- Factory* factory = isolate()->factory(); |
- |
- ASSERT(!IsFastSmiElementsKind(to_kind)); |
- double nan_double = FixedDoubleArray::hole_nan_as_double(); |
- HValue* hole = IsFastObjectElementsKind(to_kind) |
- ? AddInstruction(new(zone) HConstant(factory->the_hole_value(), |
- Representation::Tagged())) |
- : AddInstruction(new(zone) HConstant(nan_double, |
- Representation::Double())); |
- |
- LoopBuilder builder(this, context(), LoopBuilder::kPostIncrement, |
- BailoutId::StubEntry()); |
- |
- HValue* zero = graph()->GetConstant0(); |
- HValue* start = IsFastElementsKind(to_kind) ? zero : array_length; |
- HValue* key = builder.BeginBody(start, elements_length, Token::LT); |
- |
- AddInstruction(new(zone) HStoreKeyed(new_elements, key, hole, to_kind)); |
- AddSimulate(BailoutId::StubEntry(), REMOVABLE_SIMULATE); |
- |
- builder.EndBody(); |
+ BuildAllocateElements(context(), to_kind, elements_length, |
+ BailoutId::StubEntry()); |
BuildCopyElements(context(), elements, |
casted_stub()->from_kind(), new_elements, |
- to_kind, array_length); |
+ to_kind, array_length, elements_length, |
+ BailoutId::StubEntry()); |
+ |
+ Factory* factory = isolate()->factory(); |
AddInstruction(new(zone) HStoreNamedField(js_array, |
factory->elements_field_string(), |