Index: src/code-stubs-hydrogen.cc |
diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc |
index 2024d08f5c08574a2156229a9cd2d5b86b0bcbac..525c28ee85cb8b4b76068349f1928a1e61cd890e 100644 |
--- a/src/code-stubs-hydrogen.cc |
+++ b/src/code-stubs-hydrogen.cc |
@@ -56,7 +56,14 @@ static LChunk* OptimizeGraph(HGraph* graph) { |
class CodeStubGraphBuilderBase : public HGraphBuilder { |
public: |
CodeStubGraphBuilderBase(Isolate* isolate, HydrogenCodeStub* stub) |
- : HGraphBuilder(&info_), info_(stub, isolate), context_(NULL) {} |
+ : HGraphBuilder(&info_), info_(stub, isolate), context_(NULL) { |
+ int major_key = stub->MajorKey(); |
+ descriptor_ = info_.isolate()->code_stub_interface_descriptor(major_key); |
+ if (descriptor_->register_param_count_ < 0) { |
+ stub->InitializeInterfaceDescriptor(info_.isolate(), descriptor_); |
+ } |
+ parameters_.Reset(new HParameter*[descriptor_->register_param_count_]); |
+ } |
virtual bool BuildGraph(); |
protected: |
@@ -70,6 +77,7 @@ class CodeStubGraphBuilderBase : public HGraphBuilder { |
private: |
SmartArrayPointer<HParameter*> parameters_; |
CompilationInfoWithZone info_; |
+ CodeStubInterfaceDescriptor* descriptor_; |
HContext* context_; |
}; |
@@ -81,37 +89,33 @@ bool CodeStubGraphBuilderBase::BuildGraph() { |
PrintF("Compiling stub %s using hydrogen\n", name); |
HTracer::Instance()->TraceCompilation(&info_); |
} |
- HBasicBlock* next_block = graph()->CreateBasicBlock(); |
- next_block->SetInitialEnvironment(graph()->start_environment()); |
- HGoto* jump = new(zone()) HGoto(next_block); |
- graph()->entry_block()->Finish(jump); |
- set_current_block(next_block); |
- int major_key = stub()->MajorKey(); |
- CodeStubInterfaceDescriptor* descriptor = |
- info_.isolate()->code_stub_interface_descriptor(major_key); |
- if (descriptor->register_param_count_ < 0) { |
- stub()->InitializeInterfaceDescriptor(info_.isolate(), descriptor); |
- } |
- parameters_.Reset(new HParameter*[descriptor->register_param_count_]); |
+ Zone* zone = this->zone(); |
+ HEnvironment* start_environment = |
+ new(zone) HEnvironment(zone, descriptor_->register_param_count_); |
+ HBasicBlock* next_block = CreateBasicBlock(start_environment); |
- HConstant* undefined_constant = new(zone()) HConstant( |
+ current_block()->Goto(next_block); |
+ next_block->SetJoinId(BailoutId::StubEntry()); |
+ set_current_block(next_block); |
+ |
+ HConstant* undefined_constant = new(zone) HConstant( |
isolate()->factory()->undefined_value(), Representation::Tagged()); |
AddInstruction(undefined_constant); |
graph()->set_undefined_constant(undefined_constant); |
- HGraph* graph = this->graph(); |
- Zone* zone = this->zone(); |
- for (int i = 0; i < descriptor->register_param_count_; ++i) { |
+ int param_count = descriptor_->register_param_count_; |
+ for (int i = 0; i < param_count; ++i) { |
HParameter* param = |
new(zone) HParameter(i, HParameter::REGISTER_PARAMETER); |
AddInstruction(param); |
- graph->start_environment()->Push(param); |
+ start_environment->Bind(i, param); |
parameters_[i] = param; |
} |
context_ = new(zone) HContext(); |
AddInstruction(context_); |
+ start_environment->Bind(param_count, context_); |
AddSimulate(BailoutId::StubEntry()); |
@@ -184,8 +188,6 @@ void CodeStubGraphBuilder<TransitionElementsKindStub>::BuildCodeStub() { |
new(zone) HBoundsCheck(array_length, max_alloc_size, |
DONT_ALLOW_SMI_KEY, Representation::Integer32())); |
- current_block()->UpdateEnvironment(new(zone) HEnvironment(zone)); |
- |
IfBuilder if_builder(this); |
if_builder.BeginTrue(array_length, graph()->GetConstant0(), Token::EQ); |