| Index: src/compiler/ast-graph-builder.cc
|
| diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc
|
| index 18fb49135e1e8a5751f3a4ecab7ed812815f4429..306afb6c12b14b1fe1cc1735a03394ac24210e0b 100644
|
| --- a/src/compiler/ast-graph-builder.cc
|
| +++ b/src/compiler/ast-graph-builder.cc
|
| @@ -476,9 +476,7 @@ bool AstGraphBuilder::CreateGraph(bool constant_context, bool stack_check) {
|
| int heap_slots = info()->num_heap_slots() - Context::MIN_CONTEXT_SLOTS;
|
| if (heap_slots > 0) {
|
| // Push a new inner context scope for the function.
|
| - Node* closure = GetFunctionClosure();
|
| - Node* inner_context =
|
| - BuildLocalFunctionContext(function_context_.get(), closure);
|
| + Node* inner_context = BuildLocalFunctionContext(function_context_.get());
|
| ContextScope top_context(this, scope, inner_context);
|
| CreateGraphBody(stack_check);
|
| } else {
|
| @@ -2474,7 +2472,8 @@ void AstGraphBuilder::VisitDeclarations(ZoneList<Declaration*>* declarations) {
|
| Node* flags = jsgraph()->Constant(encoded_flags);
|
| Node* pairs = jsgraph()->Constant(data);
|
| const Operator* op = javascript()->CallRuntime(Runtime::kDeclareGlobals, 3);
|
| - NewNode(op, current_context(), pairs, flags);
|
| + Node* call = NewNode(op, current_context(), pairs, flags);
|
| + PrepareFrameState(call, BailoutId::Declarations());
|
| globals()->clear();
|
| }
|
|
|
| @@ -2633,10 +2632,14 @@ Node* AstGraphBuilder::BuildPatchReceiverToGlobalProxy(Node* receiver) {
|
| }
|
|
|
|
|
| -Node* AstGraphBuilder::BuildLocalFunctionContext(Node* context, Node* closure) {
|
| +Node* AstGraphBuilder::BuildLocalFunctionContext(Node* context) {
|
| + Node* closure = GetFunctionClosure();
|
| +
|
| // Allocate a new local context.
|
| - const Operator* op = javascript()->CreateFunctionContext();
|
| - Node* local_context = NewNode(op, closure);
|
| + Node* local_context =
|
| + info()->scope()->is_script_scope()
|
| + ? BuildLocalScriptContext(info()->scope())
|
| + : NewNode(javascript()->CreateFunctionContext(), closure);
|
|
|
| // Copy parameters into context if necessary.
|
| int num_parameters = info()->scope()->num_parameters();
|
| @@ -2656,12 +2659,25 @@ Node* AstGraphBuilder::BuildLocalFunctionContext(Node* context, Node* closure) {
|
| }
|
|
|
|
|
| +Node* AstGraphBuilder::BuildLocalScriptContext(Scope* scope) {
|
| + Node* closure = GetFunctionClosure();
|
| +
|
| + // Allocate a new local context.
|
| + const Operator* op = javascript()->CreateScriptContext();
|
| + Node* scope_info = jsgraph()->Constant(scope->GetScopeInfo(isolate()));
|
| + Node* local_context = NewNode(op, closure, scope_info);
|
| + PrepareFrameState(local_context, BailoutId::FunctionEntry());
|
| +
|
| + return local_context;
|
| +}
|
| +
|
| +
|
| Node* AstGraphBuilder::BuildLocalBlockContext(Scope* scope) {
|
| Node* closure = GetFunctionClosure();
|
|
|
| // Allocate a new local context.
|
| const Operator* op = javascript()->CreateBlockContext();
|
| - Node* scope_info = jsgraph()->Constant(scope->GetScopeInfo(info_->isolate()));
|
| + Node* scope_info = jsgraph()->Constant(scope->GetScopeInfo(isolate()));
|
| Node* local_context = NewNode(op, scope_info, closure);
|
|
|
| return local_context;
|
|
|