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; |