Index: src/ast/scopes.cc |
diff --git a/src/ast/scopes.cc b/src/ast/scopes.cc |
index a11689f67a6a261717f4d8011a6a4173a46e6deb..fb170f2740b93ec387e946836d0c0f48d1bf3990 100644 |
--- a/src/ast/scopes.cc |
+++ b/src/ast/scopes.cc |
@@ -1084,6 +1084,9 @@ static void PrintLocation(Variable* var) { |
case VariableLocation::LOOKUP: |
PrintF("lookup"); |
break; |
+ case VariableLocation::MODULE: |
+ PrintF("module"); |
+ break; |
} |
} |
@@ -1492,6 +1495,7 @@ void Scope::PropagateScopeInfo(bool outer_scope_calls_sloppy_eval) { |
bool Scope::MustAllocate(Variable* var) { |
+ DCHECK(var->location() != VariableLocation::MODULE); |
// Give var a read/write use if there is a chance it might be accessed |
// via an eval() call. This is only possible if the variable has a |
// visible name. |
@@ -1711,6 +1715,21 @@ void DeclarationScope::AllocateLocals(AstValueFactory* ast_value_factory) { |
} |
} |
+void DeclarationScope::AllocateModuleVariables() { |
+ for (auto entry : module()->imports()) { |
+ if (entry->local_name == nullptr) continue; |
+ if (entry->import_name == nullptr) continue; // Namespace import. |
+ Variable* var = LookupLocal(entry->local_name); |
+ // TODO(neis): Use a meaningful index. |
+ var->AllocateTo(VariableLocation::MODULE, 42); |
+ } |
+ for (auto entry : module()->exports()) { |
+ if (entry->local_name == nullptr) continue; |
+ Variable* var = LookupLocal(entry->local_name); |
+ var->AllocateTo(VariableLocation::MODULE, 42); |
+ } |
+} |
+ |
void Scope::AllocateVariablesRecursively(AstValueFactory* ast_value_factory) { |
if (!already_resolved()) { |
num_stack_slots_ = 0; |
@@ -1729,7 +1748,11 @@ void Scope::AllocateVariablesRecursively(AstValueFactory* ast_value_factory) { |
// Allocate variables for this scope. |
// Parameters must be allocated first, if any. |
if (is_declaration_scope()) { |
- if (is_function_scope()) AsDeclarationScope()->AllocateParameterLocals(); |
+ if (is_module_scope()) { |
+ AsDeclarationScope()->AllocateModuleVariables(); |
+ } else if (is_function_scope()) { |
+ AsDeclarationScope()->AllocateParameterLocals(); |
+ } |
AsDeclarationScope()->AllocateReceiver(); |
} |
AllocateNonParameterLocalsAndDeclaredGlobals(ast_value_factory); |