Chromium Code Reviews| Index: src/ast/scopes.cc | 
| diff --git a/src/ast/scopes.cc b/src/ast/scopes.cc | 
| index dfa66609b15c5340299dbc507c00f398e4c27c0e..a97725a4bf583232e597d5f0d99d40817c7c4be9 100644 | 
| --- a/src/ast/scopes.cc | 
| +++ b/src/ast/scopes.cc | 
| @@ -767,6 +767,7 @@ bool Scope::AllocateVariables(ParseInfo* info, AstNodeFactory* factory) { | 
| if (!ResolveVariablesRecursively(info, factory)) return false; | 
| // 3) Allocate variables. | 
| + if (info->is_module()) AllocateModuleVariables(); | 
| AllocateVariablesRecursively(info->ast_value_factory()); | 
| return true; | 
| @@ -857,6 +858,12 @@ Scope* Scope::ClosureScope() { | 
| return scope; | 
| } | 
| +Scope* Scope::ModuleScope() { | 
| + Scope* scope = this; | 
| + while (!scope->is_script_scope()) scope = scope->outer_scope(); | 
| + scope = scope->inner_scope(); | 
| 
 
adamk
2016/08/02 16:34:31
Why not just walk up till you hit the module scope
 
neis
2016/08/03 09:16:30
Because "this" may already be the script scope. Se
 
adamk
2016/08/03 17:51:26
But we'll walk _down_ the scope tree as part of an
 
 | 
| + return (scope == nullptr || !scope->is_module_scope()) ? nullptr : scope; | 
| +} | 
| Scope* Scope::ReceiverScope() { | 
| Scope* scope = this; | 
| @@ -979,6 +986,9 @@ static void PrintLocation(Variable* var) { | 
| case VariableLocation::LOOKUP: | 
| PrintF("lookup"); | 
| break; | 
| + case VariableLocation::MODULE: | 
| + PrintF("module"); | 
| + break; | 
| } | 
| } | 
| @@ -1588,6 +1598,23 @@ void Scope::AllocateNonParameterLocalsAndDeclaredGlobals( | 
| } | 
| } | 
| +void Scope::AllocateModuleVariables() { | 
| + Scope* module_scope = ModuleScope(); | 
| 
 
adamk
2016/08/02 16:34:31
Does this need to walk up to the ModuleScope? I wo
 
neis
2016/08/03 09:16:30
I'm calling AllocateModuleVariables inside Allocat
 
adamk
2016/08/03 17:51:26
See above, I was imagining that we'd check is_modu
 
 | 
| + ModuleDescriptor* mod = module_scope->module(); | 
| + for (auto entry : mod->imports()) { | 
| + if (entry->local_name == nullptr) continue; | 
| + if (entry->import_name == nullptr) continue; // Namespace import. | 
| + Variable* var = module_scope->LookupLocal(entry->local_name); | 
| + // TODO(neis): Use a meaningful index. | 
| + var->AllocateTo(VariableLocation::MODULE, 42); | 
| 
 
adamk
2016/08/02 16:34:31
For imports, I think we want to check Scope::MustA
 
neis
2016/08/03 09:16:30
Not sure I understand. Setting the VariableLocatio
 
adamk
2016/08/03 17:51:26
My understanding may be wrong, but I thought that
 
 | 
| + } | 
| + for (auto entry : mod->exports()) { | 
| + if (entry->local_name == nullptr) continue; | 
| + Variable* var = module_scope->LookupLocal(entry->local_name); | 
| + var->AllocateTo(VariableLocation::MODULE, 42); | 
| + } | 
| +} | 
| + | 
| void Scope::AllocateVariablesRecursively(AstValueFactory* ast_value_factory) { | 
| if (!already_resolved()) { | 
| num_stack_slots_ = 0; |