Index: src/compiler/ast-graph-builder.cc |
diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc |
index d04fc62c71dc060cc321b5cb8fe3f3c8ad08875a..6aae85bc9b4a76c8b58b8b683778e850374bcbc6 100644 |
--- a/src/compiler/ast-graph-builder.cc |
+++ b/src/compiler/ast-graph-builder.cc |
@@ -3264,9 +3264,23 @@ Node* AstGraphBuilder::BuildVariableLoad(Variable* variable, |
case VariableLocation::GLOBAL: |
case VariableLocation::UNALLOCATED: { |
// Global var, const, or let variable. |
+ Node* script_context = current_context(); |
+ int slot_index = -1; |
+ if (variable->index() > 0) { |
+ DCHECK(variable->IsStaticGlobalObjectProperty()); |
+ // Each var occupies two slots in the context: for reads and writes. |
+ slot_index = variable->index(); |
+ int depth = current_scope()->ContextChainLength(variable->scope()); |
+ if (depth > 0) { |
+ const Operator* op = javascript()->LoadContext( |
+ depth - 1, Context::PREVIOUS_INDEX, true); |
+ script_context = NewNode(op, current_context()); |
+ } |
+ } |
Node* global = BuildLoadGlobalObject(); |
Handle<Name> name = variable->name(); |
- Node* value = BuildGlobalLoad(global, name, feedback, contextual_mode); |
+ Node* value = BuildGlobalLoad(script_context, global, name, feedback, |
+ contextual_mode, slot_index); |
states.AddToNode(value, bailout_id, combine); |
return value; |
} |
@@ -3404,10 +3418,24 @@ Node* AstGraphBuilder::BuildVariableAssignment( |
case VariableLocation::GLOBAL: |
case VariableLocation::UNALLOCATED: { |
// Global var, const, or let variable. |
+ Node* script_context = current_context(); |
+ int slot_index = -1; |
+ if (variable->index() > 0) { |
+ DCHECK(variable->IsStaticGlobalObjectProperty()); |
+ // Each var occupies two slots in the context: for reads and writes. |
+ slot_index = variable->index(); |
+ int depth = current_scope()->ContextChainLength(variable->scope()); |
+ if (depth > 0) { |
+ const Operator* op = javascript()->LoadContext( |
+ depth - 1, Context::PREVIOUS_INDEX, true); |
+ script_context = NewNode(op, current_context()); |
+ } |
+ } |
Node* global = BuildLoadGlobalObject(); |
Handle<Name> name = variable->name(); |
- Node* store = BuildGlobalStore(global, name, value, feedback, |
- TypeFeedbackId::None()); |
+ Node* store = |
+ BuildGlobalStore(script_context, global, name, value, feedback, |
+ TypeFeedbackId::None(), slot_index); |
states.AddToNode(store, bailout_id, combine); |
return store; |
} |
@@ -3611,23 +3639,25 @@ Node* AstGraphBuilder::BuildNamedSuperStore(Node* receiver, Node* home_object, |
} |
-Node* AstGraphBuilder::BuildGlobalLoad(Node* object, Handle<Name> name, |
+Node* AstGraphBuilder::BuildGlobalLoad(Node* script_context, Node* global, |
+ Handle<Name> name, |
const VectorSlotPair& feedback, |
- ContextualMode mode) { |
+ ContextualMode mode, int slot_index) { |
const Operator* op = |
- javascript()->LoadGlobal(MakeUnique(name), feedback, mode); |
- Node* node = NewNode(op, object, BuildLoadFeedbackVector()); |
+ javascript()->LoadGlobal(MakeUnique(name), feedback, mode, slot_index); |
+ Node* node = NewNode(op, script_context, global, BuildLoadFeedbackVector()); |
return Record(js_type_feedback_, node, feedback.slot()); |
} |
-Node* AstGraphBuilder::BuildGlobalStore(Node* object, Handle<Name> name, |
- Node* value, |
+Node* AstGraphBuilder::BuildGlobalStore(Node* script_context, Node* global, |
+ Handle<Name> name, Node* value, |
const VectorSlotPair& feedback, |
- TypeFeedbackId id) { |
- const Operator* op = |
- javascript()->StoreGlobal(language_mode(), MakeUnique(name), feedback); |
- Node* node = NewNode(op, object, value, BuildLoadFeedbackVector()); |
+ TypeFeedbackId id, int slot_index) { |
+ const Operator* op = javascript()->StoreGlobal( |
+ language_mode(), MakeUnique(name), feedback, slot_index); |
+ Node* node = |
+ NewNode(op, script_context, global, value, BuildLoadFeedbackVector()); |
if (FLAG_vector_stores) { |
return Record(js_type_feedback_, node, feedback.slot()); |
} |
@@ -3921,7 +3951,7 @@ Node** AstGraphBuilder::EnsureInputBufferSize(int size) { |
Node* AstGraphBuilder::MakeNode(const Operator* op, int value_input_count, |
Node** value_inputs, bool incomplete) { |
- DCHECK(op->ValueInputCount() == value_input_count); |
+ DCHECK_EQ(op->ValueInputCount(), value_input_count); |
bool has_context = OperatorProperties::HasContextInput(op); |
int frame_state_count = OperatorProperties::GetFrameStateInputCount(op); |