Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index b5c4eabf7a95010a9d94948abe36b1a1e0cb603c..9cc715c07bff81e3ba906fda6c02c221ed6d41f4 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -3646,7 +3646,7 @@ HGraph::HGraph(CompilationInfo* info) |
start_environment_ = |
new(zone_) HEnvironment(NULL, info->scope(), info->closure(), zone_); |
} |
- start_environment_->set_ast_id(BailoutId::FunctionEntry()); |
+ start_environment_->set_ast_id(BailoutId::Prologue()); |
entry_block_ = CreateBasicBlock(); |
entry_block_->SetInitialEnvironment(start_environment_); |
} |
@@ -4408,12 +4408,6 @@ bool HOptimizedGraphBuilder::BuildGraph() { |
return false; |
} |
- int slots = current_info()->num_heap_slots() - Context::MIN_CONTEXT_SLOTS; |
- if (current_info()->scope()->is_script_scope() && slots > 0) { |
- Bailout(kScriptContext); |
- return false; |
- } |
- |
Scope* scope = current_info()->scope(); |
SetUpScope(scope); |
@@ -4617,36 +4611,50 @@ HInstruction* HOptimizedGraphBuilder::PreProcessCall(Instruction* call) { |
void HOptimizedGraphBuilder::SetUpScope(Scope* scope) { |
+ HEnvironment* prolog_env = environment(); |
+ int parameter_count = environment()->parameter_count(); |
+ ZoneList<HValue*> parameters(parameter_count, zone()); |
+ for (int i = 0; i < parameter_count; ++i) { |
+ HInstruction* parameter = Add<HParameter>(static_cast<unsigned>(i)); |
+ parameters.Add(parameter, zone()); |
+ environment()->Bind(i, parameter); |
+ } |
+ |
+ HConstant* undefined_constant = graph()->GetConstantUndefined(); |
+ // Initialize specials and locals to undefined. |
+ for (int i = parameter_count + 1; i < environment()->length(); ++i) { |
+ environment()->Bind(i, undefined_constant); |
+ } |
+ Add<HPrologue>(); |
+ |
+ HEnvironment* initial_env = environment()->CopyWithoutHistory(); |
+ HBasicBlock* body_entry = CreateBasicBlock(initial_env); |
+ GotoNoSimulate(body_entry); |
+ set_current_block(body_entry); |
+ |
+ // Initialize context of prolog environment to undefined. |
+ prolog_env->BindContext(undefined_constant); |
+ |
// First special is HContext. |
HInstruction* context = Add<HContext>(); |
environment()->BindContext(context); |
// Create an arguments object containing the initial parameters. Set the |
// initial values of parameters including "this" having parameter index 0. |
- DCHECK_EQ(scope->num_parameters() + 1, environment()->parameter_count()); |
- HArgumentsObject* arguments_object = |
- New<HArgumentsObject>(environment()->parameter_count()); |
- for (int i = 0; i < environment()->parameter_count(); ++i) { |
- HInstruction* parameter = Add<HParameter>(i); |
+ DCHECK_EQ(scope->num_parameters() + 1, parameter_count); |
+ HArgumentsObject* arguments_object = New<HArgumentsObject>(parameter_count); |
+ for (int i = 0; i < parameter_count; ++i) { |
+ HValue* parameter = parameters.at(i); |
arguments_object->AddArgument(parameter, zone()); |
- environment()->Bind(i, parameter); |
} |
+ |
AddInstruction(arguments_object); |
graph()->SetArgumentsObject(arguments_object); |
- HConstant* undefined_constant = graph()->GetConstantUndefined(); |
- // Initialize specials and locals to undefined. |
- for (int i = environment()->parameter_count() + 1; |
- i < environment()->length(); |
- ++i) { |
- environment()->Bind(i, undefined_constant); |
- } |
- |
// Handle the arguments and arguments shadow variables specially (they do |
// not have declarations). |
if (scope->arguments() != NULL) { |
- environment()->Bind(scope->arguments(), |
- graph()->GetArgumentsObject()); |
+ environment()->Bind(scope->arguments(), graph()->GetArgumentsObject()); |
} |
int rest_index; |
@@ -4659,6 +4667,11 @@ void HOptimizedGraphBuilder::SetUpScope(Scope* scope) { |
scope->new_target_var() != nullptr) { |
return Bailout(kSuperReference); |
} |
+ |
+ // Trace the call. |
+ if (FLAG_trace && top_info()->IsOptimizing()) { |
+ Add<HCallRuntime>(Runtime::FunctionForId(Runtime::kTraceEnter), 0); |
+ } |
} |
@@ -12996,6 +13009,12 @@ void HEnvironment::Drop(int count) { |
} |
+void HEnvironment::Print() const { |
+ OFStream os(stdout); |
+ os << *this << "\n"; |
+} |
+ |
+ |
HEnvironment* HEnvironment::Copy() const { |
return new(zone()) HEnvironment(this, zone()); |
} |