| Index: src/full-codegen.cc
 | 
| diff --git a/src/full-codegen.cc b/src/full-codegen.cc
 | 
| index 3386ce12e5546c95dd13733564a667c40e98c033..0dac7d2e0b0bcec68e53eb19192e54fb88793a4e 100644
 | 
| --- a/src/full-codegen.cc
 | 
| +++ b/src/full-codegen.cc
 | 
| @@ -41,11 +41,6 @@ void BreakableStatementChecker::VisitFunctionDeclaration(
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void BreakableStatementChecker::VisitModuleDeclaration(
 | 
| -    ModuleDeclaration* decl) {
 | 
| -}
 | 
| -
 | 
| -
 | 
|  void BreakableStatementChecker::VisitImportDeclaration(
 | 
|      ImportDeclaration* decl) {
 | 
|  }
 | 
| @@ -56,22 +51,6 @@ void BreakableStatementChecker::VisitExportDeclaration(
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void BreakableStatementChecker::VisitModuleLiteral(ModuleLiteral* module) {
 | 
| -}
 | 
| -
 | 
| -
 | 
| -void BreakableStatementChecker::VisitModulePath(ModulePath* module) {
 | 
| -}
 | 
| -
 | 
| -
 | 
| -void BreakableStatementChecker::VisitModuleUrl(ModuleUrl* module) {
 | 
| -}
 | 
| -
 | 
| -
 | 
| -void BreakableStatementChecker::VisitModuleStatement(ModuleStatement* stmt) {
 | 
| -}
 | 
| -
 | 
| -
 | 
|  void BreakableStatementChecker::VisitBlock(Block* stmt) {
 | 
|  }
 | 
|  
 | 
| @@ -634,138 +613,14 @@ void FullCodeGenerator::DoTest(const TestContext* context) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void FullCodeGenerator::AllocateModules(ZoneList<Declaration*>* declarations) {
 | 
| -  DCHECK(scope_->is_script_scope());
 | 
| -
 | 
| -  for (int i = 0; i < declarations->length(); i++) {
 | 
| -    ModuleDeclaration* declaration = declarations->at(i)->AsModuleDeclaration();
 | 
| -    if (declaration != NULL) {
 | 
| -      ModuleLiteral* module = declaration->module()->AsModuleLiteral();
 | 
| -      if (module != NULL) {
 | 
| -        Comment cmnt(masm_, "[ Link nested modules");
 | 
| -        Scope* scope = module->body()->scope();
 | 
| -        DCHECK(scope->module()->IsFrozen());
 | 
| -
 | 
| -        scope->module()->Allocate(scope->module_var()->index());
 | 
| -
 | 
| -        // Set up module context.
 | 
| -        DCHECK(scope->module()->Index() >= 0);
 | 
| -        __ Push(Smi::FromInt(scope->module()->Index()));
 | 
| -        __ Push(scope->GetScopeInfo(isolate()));
 | 
| -        __ CallRuntime(Runtime::kPushModuleContext, 2);
 | 
| -        StoreToFrameField(StandardFrameConstants::kContextOffset,
 | 
| -                          context_register());
 | 
| -
 | 
| -        AllocateModules(scope->declarations());
 | 
| -
 | 
| -        // Pop module context.
 | 
| -        LoadContextField(context_register(), Context::PREVIOUS_INDEX);
 | 
| -        // Update local stack frame context field.
 | 
| -        StoreToFrameField(StandardFrameConstants::kContextOffset,
 | 
| -                          context_register());
 | 
| -      }
 | 
| -    }
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -
 | 
| -// Modules have their own local scope, represented by their own context.
 | 
| -// Module instance objects have an accessor for every export that forwards
 | 
| -// access to the respective slot from the module's context. (Exports that are
 | 
| -// modules themselves, however, are simple data properties.)
 | 
| -//
 | 
| -// All modules have a _hosting_ scope/context, which (currently) is the
 | 
| -// enclosing script scope. To deal with recursion, nested modules are hosted
 | 
| -// by the same scope as global ones.
 | 
| -//
 | 
| -// For every (global or nested) module literal, the hosting context has an
 | 
| -// internal slot that points directly to the respective module context. This
 | 
| -// enables quick access to (statically resolved) module members by 2-dimensional
 | 
| -// access through the hosting context. For example,
 | 
| -//
 | 
| -//   module A {
 | 
| -//     let x;
 | 
| -//     module B { let y; }
 | 
| -//   }
 | 
| -//   module C { let z; }
 | 
| -//
 | 
| -// allocates contexts as follows:
 | 
| -//
 | 
| -// [header| .A | .B | .C | A | C ]  (global)
 | 
| -//           |    |    |
 | 
| -//           |    |    +-- [header| z ]  (module)
 | 
| -//           |    |
 | 
| -//           |    +------- [header| y ]  (module)
 | 
| -//           |
 | 
| -//           +------------ [header| x | B ]  (module)
 | 
| -//
 | 
| -// Here, .A, .B, .C are the internal slots pointing to the hosted module
 | 
| -// contexts, whereas A, B, C hold the actual instance objects (note that every
 | 
| -// module context also points to the respective instance object through its
 | 
| -// extension slot in the header).
 | 
| -//
 | 
| -// To deal with arbitrary recursion and aliases between modules,
 | 
| -// they are created and initialized in several stages. Each stage applies to
 | 
| -// all modules in the hosting script scope, including nested ones.
 | 
| -//
 | 
| -// 1. Allocate: for each module _literal_, allocate the module contexts and
 | 
| -//    respective instance object and wire them up. This happens in the
 | 
| -//    PushModuleContext runtime function, as generated by AllocateModules
 | 
| -//    (invoked by VisitDeclarations in the hosting scope).
 | 
| -//
 | 
| -// 2. Bind: for each module _declaration_ (i.e. literals as well as aliases),
 | 
| -//    assign the respective instance object to respective local variables. This
 | 
| -//    happens in VisitModuleDeclaration, and uses the instance objects created
 | 
| -//    in the previous stage.
 | 
| -//    For each module _literal_, this phase also constructs a module descriptor
 | 
| -//    for the next stage. This happens in VisitModuleLiteral.
 | 
| -//
 | 
| -// 3. Populate: invoke the DeclareModules runtime function to populate each
 | 
| -//    _instance_ object with accessors for it exports. This is generated by
 | 
| -//    DeclareModules (invoked by VisitDeclarations in the hosting scope again),
 | 
| -//    and uses the descriptors generated in the previous stage.
 | 
| -//
 | 
| -// 4. Initialize: execute the module bodies (and other code) in sequence. This
 | 
| -//    happens by the separate statements generated for module bodies. To reenter
 | 
| -//    the module scopes properly, the parser inserted ModuleStatements.
 | 
| -
 | 
|  void FullCodeGenerator::VisitDeclarations(
 | 
|      ZoneList<Declaration*>* declarations) {
 | 
| -  Handle<FixedArray> saved_modules = modules_;
 | 
| -  int saved_module_index = module_index_;
 | 
|    ZoneList<Handle<Object> >* saved_globals = globals_;
 | 
|    ZoneList<Handle<Object> > inner_globals(10, zone());
 | 
|    globals_ = &inner_globals;
 | 
|  
 | 
| -  if (scope_->num_modules() != 0) {
 | 
| -    // This is a scope hosting modules. Allocate a descriptor array to pass
 | 
| -    // to the runtime for initialization.
 | 
| -    Comment cmnt(masm_, "[ Allocate modules");
 | 
| -    DCHECK(scope_->is_script_scope());
 | 
| -    modules_ =
 | 
| -        isolate()->factory()->NewFixedArray(scope_->num_modules(), TENURED);
 | 
| -    module_index_ = 0;
 | 
| -
 | 
| -    // Generate code for allocating all modules, including nested ones.
 | 
| -    // The allocated contexts are stored in internal variables in this scope.
 | 
| -    AllocateModules(declarations);
 | 
| -  }
 | 
| -
 | 
|    AstVisitor::VisitDeclarations(declarations);
 | 
|  
 | 
| -  if (scope_->num_modules() != 0) {
 | 
| -    // TODO(ES6): This step, which creates module instance objects,
 | 
| -    // can probably be delayed until an "import *" declaration
 | 
| -    // reifies a module instance. Until imports are implemented,
 | 
| -    // we skip it altogether.
 | 
| -    //
 | 
| -    // Initialize modules from descriptor array.
 | 
| -    //  DCHECK(module_index_ == modules_->length());
 | 
| -    //  DeclareModules(modules_);
 | 
| -    modules_ = saved_modules;
 | 
| -    module_index_ = saved_module_index;
 | 
| -  }
 | 
| -
 | 
|    if (!globals_->is_empty()) {
 | 
|      // Invoke the platform-dependent code generator to do the actual
 | 
|      // declaration of the global functions and variables.
 | 
| @@ -780,54 +635,6 @@ void FullCodeGenerator::VisitDeclarations(
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void FullCodeGenerator::VisitModuleLiteral(ModuleLiteral* module) {
 | 
| -  Block* block = module->body();
 | 
| -  Scope* saved_scope = scope();
 | 
| -  scope_ = block->scope();
 | 
| -  ModuleDescriptor* descriptor = scope_->module();
 | 
| -
 | 
| -  Comment cmnt(masm_, "[ ModuleLiteral");
 | 
| -  SetStatementPosition(block);
 | 
| -
 | 
| -  DCHECK(!modules_.is_null());
 | 
| -  DCHECK(module_index_ < modules_->length());
 | 
| -  int index = module_index_++;
 | 
| -
 | 
| -  // Set up module context.
 | 
| -  DCHECK(descriptor->Index() >= 0);
 | 
| -  __ Push(Smi::FromInt(descriptor->Index()));
 | 
| -  __ Push(Smi::FromInt(0));
 | 
| -  __ CallRuntime(Runtime::kPushModuleContext, 2);
 | 
| -  StoreToFrameField(StandardFrameConstants::kContextOffset, context_register());
 | 
| -
 | 
| -  {
 | 
| -    Comment cmnt(masm_, "[ Declarations");
 | 
| -    VisitDeclarations(scope_->declarations());
 | 
| -  }
 | 
| -
 | 
| -  // Populate the module description.
 | 
| -  Handle<ModuleInfo> description =
 | 
| -      ModuleInfo::Create(isolate(), descriptor, scope_);
 | 
| -  modules_->set(index, *description);
 | 
| -
 | 
| -  scope_ = saved_scope;
 | 
| -  // Pop module context.
 | 
| -  LoadContextField(context_register(), Context::PREVIOUS_INDEX);
 | 
| -  // Update local stack frame context field.
 | 
| -  StoreToFrameField(StandardFrameConstants::kContextOffset, context_register());
 | 
| -}
 | 
| -
 | 
| -
 | 
| -// TODO(adamk): Delete ModulePath.
 | 
| -void FullCodeGenerator::VisitModulePath(ModulePath* module) {
 | 
| -}
 | 
| -
 | 
| -
 | 
| -// TODO(adamk): Delete ModuleUrl.
 | 
| -void FullCodeGenerator::VisitModuleUrl(ModuleUrl* module) {
 | 
| -}
 | 
| -
 | 
| -
 | 
|  int FullCodeGenerator::DeclareGlobalsFlags() {
 | 
|    DCHECK(DeclareGlobalsLanguageMode::is_valid(language_mode()));
 | 
|    return DeclareGlobalsEvalFlag::encode(is_eval()) |
 | 
| @@ -1061,28 +868,6 @@ void FullCodeGenerator::VisitBlock(Block* stmt) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void FullCodeGenerator::VisitModuleStatement(ModuleStatement* stmt) {
 | 
| -  Comment cmnt(masm_, "[ Module context");
 | 
| -
 | 
| -  DCHECK(stmt->body()->scope()->is_module_scope());
 | 
| -
 | 
| -  __ Push(Smi::FromInt(stmt->body()->scope()->module()->Index()));
 | 
| -  __ Push(Smi::FromInt(0));
 | 
| -  __ CallRuntime(Runtime::kPushModuleContext, 2);
 | 
| -  StoreToFrameField(
 | 
| -      StandardFrameConstants::kContextOffset, context_register());
 | 
| -
 | 
| -  Scope* saved_scope = scope_;
 | 
| -  scope_ = stmt->body()->scope();
 | 
| -  VisitStatements(stmt->body()->statements());
 | 
| -  scope_ = saved_scope;
 | 
| -  LoadContextField(context_register(), Context::PREVIOUS_INDEX);
 | 
| -  // Update local stack frame context field.
 | 
| -  StoreToFrameField(StandardFrameConstants::kContextOffset,
 | 
| -                    context_register());
 | 
| -}
 | 
| -
 | 
| -
 | 
|  void FullCodeGenerator::VisitExpressionStatement(ExpressionStatement* stmt) {
 | 
|    Comment cmnt(masm_, "[ ExpressionStatement");
 | 
|    SetStatementPosition(stmt);
 | 
| 
 |