Rename Interface to ModuleDescriptor
authoradamk <adamk@chromium.org>
Wed, 18 Feb 2015 18:25:00 +0000 (10:25 -0800)
committerCommit bot <commit-bot@chromium.org>
Wed, 18 Feb 2015 18:25:21 +0000 (18:25 +0000)
ModuleDescriptor will end up holding the set of data described in the
spec as a "Module record". This introduces a little bit of confusion
with ModuleInfo, but I hope that'll become clearer over time.

Also removed the interface-printing flags. We probably want
Module-printing flags, but that can wait until we have more
Module-related structures.

BUG=v8:1569
LOG=n

Review URL: https://codereview.chromium.org/935723004

Cr-Commit-Position: refs/heads/master@{#26728}

22 files changed:
BUILD.gn
src/arm/full-codegen-arm.cc
src/arm64/full-codegen-arm64.cc
src/ast.h
src/flag-definitions.h
src/full-codegen.cc
src/ia32/full-codegen-ia32.cc
src/interface.cc [deleted file]
src/interface.h [deleted file]
src/mips/full-codegen-mips.cc
src/mips64/full-codegen-mips64.cc
src/modules.cc [new file with mode: 0644]
src/modules.h [new file with mode: 0644]
src/parser.cc
src/ppc/full-codegen-ppc.cc
src/scopeinfo.cc
src/scopeinfo.h
src/scopes.cc
src/scopes.h
src/x64/full-codegen-x64.cc
src/x87/full-codegen-x87.cc
tools/gyp/v8.gyp

index 2a1a8fa64122906e1445264c6f30eb53061447da..713ab6de57d46176fdb9082bdc561c430e2ecbbc 100644 (file)
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -809,8 +809,6 @@ source_set("v8_base") {
     "src/ic/ic-compiler.h",
     "src/ic/stub-cache.cc",
     "src/ic/stub-cache.h",
-    "src/interface.cc",
-    "src/interface.h",
     "src/interface-descriptors.cc",
     "src/interface-descriptors.h",
     "src/interpreter-irregexp.cc",
@@ -847,6 +845,8 @@ source_set("v8_base") {
     "src/macro-assembler.h",
     "src/messages.cc",
     "src/messages.h",
+    "src/modules.cc",
+    "src/modules.h",
     "src/msan.h",
     "src/natives.h",
     "src/objects-debug.cc",
index 885f3ba2759493b761341418ca03e3b12a5f3023..15958ccf54561149055489f32188e1530473fb81 100644 (file)
@@ -957,16 +957,16 @@ void FullCodeGenerator::VisitFunctionDeclaration(
 
 void FullCodeGenerator::VisitModuleDeclaration(ModuleDeclaration* declaration) {
   Variable* variable = declaration->proxy()->var();
-  Interface* interface = declaration->module()->interface();
+  ModuleDescriptor* descriptor = declaration->module()->descriptor();
   DCHECK(variable->location() == Variable::CONTEXT);
-  DCHECK(interface->IsFrozen());
+  DCHECK(descriptor->IsFrozen());
 
   Comment cmnt(masm_, "[ ModuleDeclaration");
   EmitDebugCheckDeclarationContext(variable);
 
   // Load instance object.
   __ LoadContext(r1, scope_->ContextChainLength(scope_->ScriptScope()));
-  __ ldr(r1, ContextOperand(r1, interface->Index()));
+  __ ldr(r1, ContextOperand(r1, descriptor->Index()));
   __ ldr(r1, ContextOperand(r1, Context::EXTENSION_INDEX));
 
   // Assign it.
index d315e1404fa193b43ce9148a18ce112687fc6d92..265f75f97c4fd994e0f00373c5d21d89d9417105 100644 (file)
@@ -954,16 +954,16 @@ void FullCodeGenerator::VisitFunctionDeclaration(
 
 void FullCodeGenerator::VisitModuleDeclaration(ModuleDeclaration* declaration) {
   Variable* variable = declaration->proxy()->var();
-  Interface* interface = declaration->module()->interface();
+  ModuleDescriptor* descriptor = declaration->module()->descriptor();
   DCHECK(variable->location() == Variable::CONTEXT);
-  DCHECK(interface->IsFrozen());
+  DCHECK(descriptor->IsFrozen());
 
   Comment cmnt(masm_, "[ ModuleDeclaration");
   EmitDebugCheckDeclarationContext(variable);
 
   // Load instance object.
   __ LoadContext(x1, scope_->ContextChainLength(scope_->ScriptScope()));
-  __ Ldr(x1, ContextMemOperand(x1, interface->Index()));
+  __ Ldr(x1, ContextMemOperand(x1, descriptor->Index()));
   __ Ldr(x1, ContextMemOperand(x1, Context::EXTENSION_INDEX));
 
   // Assign it.
index 2f2de55e67647bd976858e81200b3f715998cae6..42c8177251e89824f04003e0905703f1c34fac9c 100644 (file)
--- a/src/ast.h
+++ b/src/ast.h
 #include "src/ast-value-factory.h"
 #include "src/bailout-reason.h"
 #include "src/factory.h"
-#include "src/interface.h"
 #include "src/isolate.h"
 #include "src/jsregexp.h"
 #include "src/list-inl.h"
+#include "src/modules.h"
 #include "src/runtime/runtime.h"
 #include "src/small-pointer-list.h"
 #include "src/smart-pointers.h"
@@ -646,21 +646,17 @@ class ExportDeclaration FINAL : public Declaration {
 
 class Module : public AstNode {
  public:
-  Interface* interface() const { return interface_; }
+  ModuleDescriptor* descriptor() const { return descriptor_; }
   Block* body() const { return body_; }
 
  protected:
   Module(Zone* zone, int pos)
-      : AstNode(pos),
-        interface_(Interface::New(zone)),
-        body_(NULL) {}
-  Module(Zone* zone, Interface* interface, int pos, Block* body = NULL)
-      : AstNode(pos),
-        interface_(interface),
-        body_(body) {}
+      : AstNode(pos), descriptor_(ModuleDescriptor::New(zone)), body_(NULL) {}
+  Module(Zone* zone, ModuleDescriptor* descriptor, int pos, Block* body = NULL)
+      : AstNode(pos), descriptor_(descriptor), body_(body) {}
 
  private:
-  Interface* interface_;
+  ModuleDescriptor* descriptor_;
   Block* body_;
 };
 
@@ -670,8 +666,8 @@ class ModuleLiteral FINAL : public Module {
   DECLARE_NODE_TYPE(ModuleLiteral)
 
  protected:
-  ModuleLiteral(Zone* zone, Block* body, Interface* interface, int pos)
-      : Module(zone, interface, pos, body) {}
+  ModuleLiteral(Zone* zone, Block* body, ModuleDescriptor* descriptor, int pos)
+      : Module(zone, descriptor, pos, body) {}
 };
 
 
@@ -3172,8 +3168,9 @@ class AstNodeFactory FINAL BASE_EMBEDDED {
     return new (zone_) ExportDeclaration(zone_, proxy, scope, pos);
   }
 
-  ModuleLiteral* NewModuleLiteral(Block* body, Interface* interface, int pos) {
-    return new (zone_) ModuleLiteral(zone_, body, interface, pos);
+  ModuleLiteral* NewModuleLiteral(Block* body, ModuleDescriptor* descriptor,
+                                  int pos) {
+    return new (zone_) ModuleLiteral(zone_, body, descriptor, pos);
   }
 
   ModulePath* NewModulePath(Module* origin, const AstRawString* name, int pos) {
index 989e19348c08d0c8ce5618fbca87127cda85640c..46d8aa94de04717ebb7d64384e8d6d8fa48150f0 100644 (file)
@@ -829,11 +829,6 @@ DEFINE_BOOL(print_global_handles, false, "report global handles after GC")
 DEFINE_BOOL(print_turbo_replay, false,
             "print C++ code to recreate TurboFan graphs")
 
-// interface.cc
-DEFINE_BOOL(print_interfaces, false, "print interfaces")
-DEFINE_BOOL(print_interface_details, false, "print interface inference details")
-DEFINE_INT(print_interface_depth, 5, "depth for printing interfaces")
-
 // objects.cc
 DEFINE_BOOL(trace_normalization, false,
             "prints when objects are turned into dictionaries.")
index 8cc7f8205941b16a4294d704f4e1f1d62a06a79e..6f43497a799ed73d0d6b1c6845d6bfcb400fb36f 100644 (file)
@@ -610,14 +610,13 @@ void FullCodeGenerator::AllocateModules(ZoneList<Declaration*>* declarations) {
       if (module != NULL) {
         Comment cmnt(masm_, "[ Link nested modules");
         Scope* scope = module->body()->scope();
-        Interface* interface = scope->interface();
-        DCHECK(interface->IsFrozen());
+        DCHECK(scope->module()->IsFrozen());
 
-        interface->Allocate(scope->module_var()->index());
+        scope->module()->Allocate(scope->module_var()->index());
 
         // Set up module context.
-        DCHECK(scope->interface()->Index() >= 0);
-        __ Push(Smi::FromInt(scope->interface()->Index()));
+        DCHECK(scope->module()->Index() >= 0);
+        __ Push(Smi::FromInt(scope->module()->Index()));
         __ Push(scope->GetScopeInfo(isolate()));
         __ CallRuntime(Runtime::kPushModuleContext, 2);
         StoreToFrameField(StandardFrameConstants::kContextOffset,
@@ -751,7 +750,7 @@ void FullCodeGenerator::VisitModuleLiteral(ModuleLiteral* module) {
   Block* block = module->body();
   Scope* saved_scope = scope();
   scope_ = block->scope();
-  Interface* interface = scope_->interface();
+  ModuleDescriptor* descriptor = scope_->module();
 
   Comment cmnt(masm_, "[ ModuleLiteral");
   SetStatementPosition(block);
@@ -761,8 +760,8 @@ void FullCodeGenerator::VisitModuleLiteral(ModuleLiteral* module) {
   int index = module_index_++;
 
   // Set up module context.
-  DCHECK(interface->Index() >= 0);
-  __ Push(Smi::FromInt(interface->Index()));
+  DCHECK(descriptor->Index() >= 0);
+  __ Push(Smi::FromInt(descriptor->Index()));
   __ Push(Smi::FromInt(0));
   __ CallRuntime(Runtime::kPushModuleContext, 2);
   StoreToFrameField(StandardFrameConstants::kContextOffset, context_register());
@@ -774,7 +773,7 @@ void FullCodeGenerator::VisitModuleLiteral(ModuleLiteral* module) {
 
   // Populate the module description.
   Handle<ModuleInfo> description =
-      ModuleInfo::Create(isolate(), interface, scope_);
+      ModuleInfo::Create(isolate(), descriptor, scope_);
   modules_->set(index, *description);
 
   scope_ = saved_scope;
@@ -785,26 +784,13 @@ void FullCodeGenerator::VisitModuleLiteral(ModuleLiteral* module) {
 }
 
 
+// TODO(adamk): Delete ModulePath.
 void FullCodeGenerator::VisitModulePath(ModulePath* module) {
-  // Nothing to do.
-  // The instance object is resolved statically through the module's interface.
 }
 
 
+// TODO(adamk): Delete ModuleUrl.
 void FullCodeGenerator::VisitModuleUrl(ModuleUrl* module) {
-  // TODO(rossberg): dummy allocation for now.
-  Scope* scope = module->body()->scope();
-  Interface* interface = scope_->interface();
-
-  DCHECK(interface->IsFrozen());
-  DCHECK(!modules_.is_null());
-  DCHECK(module_index_ < modules_->length());
-  interface->Allocate(scope->module_var()->index());
-  int index = module_index_++;
-
-  Handle<ModuleInfo> description =
-      ModuleInfo::Create(isolate(), interface, scope_);
-  modules_->set(index, *description);
 }
 
 
@@ -1095,7 +1081,7 @@ void FullCodeGenerator::VisitModuleStatement(ModuleStatement* stmt) {
 
   DCHECK(stmt->body()->scope()->is_module_scope());
 
-  __ Push(Smi::FromInt(stmt->body()->scope()->interface()->Index()));
+  __ Push(Smi::FromInt(stmt->body()->scope()->module()->Index()));
   __ Push(Smi::FromInt(0));
   __ CallRuntime(Runtime::kPushModuleContext, 2);
   StoreToFrameField(
index e70ac4c378a431e3db6e3ba8859118c32fde1d2c..b76592238d732a643d98f0cd32649feb6f875891 100644 (file)
@@ -893,16 +893,16 @@ void FullCodeGenerator::VisitFunctionDeclaration(
 
 void FullCodeGenerator::VisitModuleDeclaration(ModuleDeclaration* declaration) {
   Variable* variable = declaration->proxy()->var();
-  Interface* interface = declaration->module()->interface();
+  ModuleDescriptor* descriptor = declaration->module()->descriptor();
   DCHECK(variable->location() == Variable::CONTEXT);
-  DCHECK(interface->IsFrozen());
+  DCHECK(descriptor->IsFrozen());
 
   Comment cmnt(masm_, "[ ModuleDeclaration");
   EmitDebugCheckDeclarationContext(variable);
 
   // Load instance object.
   __ LoadContext(eax, scope_->ContextChainLength(scope_->ScriptScope()));
-  __ mov(eax, ContextOperand(eax, interface->Index()));
+  __ mov(eax, ContextOperand(eax, descriptor->Index()));
   __ mov(eax, ContextOperand(eax, Context::EXTENSION_INDEX));
 
   // Assign it.
diff --git a/src/interface.cc b/src/interface.cc
deleted file mode 100644 (file)
index 4e391ac..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2012 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "src/v8.h"
-
-#include "src/interface.h"
-
-#include "src/ast-value-factory.h"
-
-namespace v8 {
-namespace internal {
-
-// ---------------------------------------------------------------------------
-// Addition.
-
-#ifdef DEBUG
-// Current nesting depth for debug output.
-class Nesting {
- public:
-  Nesting()  { current_ += 2; }
-  ~Nesting() { current_ -= 2; }
-  static int current() { return current_; }
- private:
-  static int current_;
-};
-
-int Nesting::current_ = 0;
-#endif
-
-
-void Interface::Add(const AstRawString* name, Zone* zone, bool* ok) {
-  void* key = const_cast<AstRawString*>(name);
-
-#ifdef DEBUG
-  if (FLAG_print_interface_details) {
-    PrintF("%*s# Adding...\n", Nesting::current(), "");
-    PrintF("%*sthis = ", Nesting::current(), "");
-    this->Print(Nesting::current());
-    PrintF("%*s%.*s : ", Nesting::current(), "", name->length(),
-           name->raw_data());
-  }
-#endif
-
-  ZoneHashMap** map = &exports_;
-  ZoneAllocationPolicy allocator(zone);
-
-  if (*map == nullptr) {
-    *map = new(zone->New(sizeof(ZoneHashMap)))
-        ZoneHashMap(ZoneHashMap::PointersMatch,
-                    ZoneHashMap::kDefaultHashMapCapacity, allocator);
-  }
-
-  ZoneHashMap::Entry* p =
-      (*map)->Lookup(key, name->hash(), !IsFrozen(), allocator);
-  if (p == nullptr || p->value != nullptr) {
-    *ok = false;
-  }
-
-  p->value = key;
-
-#ifdef DEBUG
-  if (FLAG_print_interface_details) {
-    PrintF("%*sthis' = ", Nesting::current(), "");
-    this->Print(Nesting::current());
-    PrintF("%*s# Added.\n", Nesting::current(), "");
-  }
-#endif
-}
-
-
-// ---------------------------------------------------------------------------
-// Printing.
-
-#ifdef DEBUG
-void Interface::Print(int n) {
-  int n0 = n > 0 ? n : 0;
-
-  if (FLAG_print_interface_details) {
-    PrintF("%p ", static_cast<void*>(this));
-  }
-
-  PrintF("module %d %s{", Index(), IsFrozen() ? "" : "(unresolved) ");
-  ZoneHashMap* map = exports_;
-  if (map == nullptr || map->occupancy() == 0) {
-    PrintF("}\n");
-  } else if (n < 0 || n0 >= 2 * FLAG_print_interface_depth) {
-    // Avoid infinite recursion on cyclic types.
-    PrintF("...}\n");
-  } else {
-    PrintF("\n");
-    for (ZoneHashMap::Entry* p = map->Start(); p != nullptr; p = map->Next(p)) {
-      String* name = *static_cast<String**>(p->key);
-      PrintF("%*s%s : ", n0 + 2, "", name->ToAsciiArray());
-    }
-    PrintF("%*s}\n", n0, "");
-  }
-}
-#endif
-
-} }  // namespace v8::internal
diff --git a/src/interface.h b/src/interface.h
deleted file mode 100644 (file)
index 9c6e2c3..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2012 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef V8_INTERFACE_H_
-#define V8_INTERFACE_H_
-
-#include "src/zone.h"
-
-namespace v8 {
-namespace internal {
-
-
-class AstRawString;
-
-
-// This class represents the interface of a module: a set of exported names.
-//
-// TODO(adamk): Rename this to ModuleRecord, ModuleDescriptor, or similar.
-class Interface : public ZoneObject {
- public:
-  // ---------------------------------------------------------------------------
-  // Factory methods.
-
-  static Interface* New(Zone* zone) { return new (zone) Interface(); }
-
-  // ---------------------------------------------------------------------------
-  // Mutators.
-
-  // Add a name to the list of exports. If it already exists, or this interface
-  // is frozen, that's an error.
-  void Add(const AstRawString* name, Zone* zone, bool* ok);
-
-  // Do not allow any further refinements, directly or through unification.
-  void Freeze() { frozen_ = true; }
-
-  // Assign an index.
-  void Allocate(int index) {
-    DCHECK(IsFrozen() && index_ == -1);
-    index_ = index;
-  }
-
-  // ---------------------------------------------------------------------------
-  // Accessors.
-
-  // Check whether this is closed (i.e. fully determined).
-  bool IsFrozen() { return frozen_; }
-
-  int Length() {
-    DCHECK(IsFrozen());
-    ZoneHashMap* exports = exports_;
-    return exports ? exports->occupancy() : 0;
-  }
-
-  // The context slot in the hosting script context pointing to this module.
-  int Index() {
-    DCHECK(IsFrozen());
-    return index_;
-  }
-
-  // ---------------------------------------------------------------------------
-  // Iterators.
-
-  // Use like:
-  //   for (auto it = interface->iterator(); !it.done(); it.Advance()) {
-  //     ... it.name() ... it.interface() ...
-  //   }
-  class Iterator {
-   public:
-    bool done() const { return entry_ == NULL; }
-    const AstRawString* name() const {
-      DCHECK(!done());
-      return static_cast<const AstRawString*>(entry_->key);
-    }
-    void Advance() { entry_ = exports_->Next(entry_); }
-
-   private:
-    friend class Interface;
-    explicit Iterator(const ZoneHashMap* exports)
-        : exports_(exports), entry_(exports ? exports->Start() : NULL) {}
-
-    const ZoneHashMap* exports_;
-    ZoneHashMap::Entry* entry_;
-  };
-
-  Iterator iterator() const { return Iterator(this->exports_); }
-
-  // ---------------------------------------------------------------------------
-  // Debugging.
-#ifdef DEBUG
-  void Print(int n = 0);  // n = indentation; n < 0 => don't print recursively
-#endif
-
-  // ---------------------------------------------------------------------------
-  // Implementation.
- private:
-  bool frozen_;
-  ZoneHashMap* exports_;   // Module exports and their types (allocated lazily)
-  int index_;
-
-  Interface() : frozen_(false), exports_(NULL), index_(-1) {
-#ifdef DEBUG
-    if (FLAG_print_interface_details)
-      PrintF("# Creating %p\n", static_cast<void*>(this));
-#endif
-  }
-};
-
-} }  // namespace v8::internal
-
-#endif  // V8_INTERFACE_H_
index 494c65da194433e84166d6de53e23f675f7a7b08..c5749fcf3a6d472e83df5dc93e5403223c824698 100644 (file)
@@ -950,16 +950,16 @@ void FullCodeGenerator::VisitFunctionDeclaration(
 
 void FullCodeGenerator::VisitModuleDeclaration(ModuleDeclaration* declaration) {
   Variable* variable = declaration->proxy()->var();
-  Interface* interface = declaration->module()->interface();
+  ModuleDescriptor* descriptor = declaration->module()->descriptor();
   DCHECK(variable->location() == Variable::CONTEXT);
-  DCHECK(interface->IsFrozen());
+  DCHECK(descriptor->IsFrozen());
 
   Comment cmnt(masm_, "[ ModuleDeclaration");
   EmitDebugCheckDeclarationContext(variable);
 
   // Load instance object.
   __ LoadContext(a1, scope_->ContextChainLength(scope_->ScriptScope()));
-  __ lw(a1, ContextOperand(a1, interface->Index()));
+  __ lw(a1, ContextOperand(a1, descriptor->Index()));
   __ lw(a1, ContextOperand(a1, Context::EXTENSION_INDEX));
 
   // Assign it.
index ca9fb2ae661d7496b38be66b0ac9eb9c9bda9be6..5fe0c5a6ee9f8e349761b3b0a9e5c2e78a8d6ef8 100644 (file)
@@ -947,15 +947,15 @@ void FullCodeGenerator::VisitFunctionDeclaration(
 
 void FullCodeGenerator::VisitModuleDeclaration(ModuleDeclaration* declaration) {
   Variable* variable = declaration->proxy()->var();
-  Interface* interface = declaration->module()->interface();
+  ModuleDescriptor* descriptor = declaration->module()->descriptor();
   DCHECK(variable->location() == Variable::CONTEXT);
-  DCHECK(interface->IsFrozen());
+  DCHECK(descriptor->IsFrozen());
   Comment cmnt(masm_, "[ ModuleDeclaration");
   EmitDebugCheckDeclarationContext(variable);
 
   // Load instance object.
   __ LoadContext(a1, scope_->ContextChainLength(scope_->ScriptScope()));
-  __ ld(a1, ContextOperand(a1, interface->Index()));
+  __ ld(a1, ContextOperand(a1, descriptor->Index()));
   __ ld(a1, ContextOperand(a1, Context::EXTENSION_INDEX));
 
   // Assign it.
diff --git a/src/modules.cc b/src/modules.cc
new file mode 100644 (file)
index 0000000..eb01cf0
--- /dev/null
@@ -0,0 +1,38 @@
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/v8.h"
+
+#include "src/modules.h"
+
+#include "src/ast-value-factory.h"
+
+namespace v8 {
+namespace internal {
+
+// ---------------------------------------------------------------------------
+// Addition.
+
+void ModuleDescriptor::Add(const AstRawString* name, Zone* zone, bool* ok) {
+  void* key = const_cast<AstRawString*>(name);
+
+  ZoneHashMap** map = &exports_;
+  ZoneAllocationPolicy allocator(zone);
+
+  if (*map == nullptr) {
+    *map = new (zone->New(sizeof(ZoneHashMap)))
+        ZoneHashMap(ZoneHashMap::PointersMatch,
+                    ZoneHashMap::kDefaultHashMapCapacity, allocator);
+  }
+
+  ZoneHashMap::Entry* p =
+      (*map)->Lookup(key, name->hash(), !IsFrozen(), allocator);
+  if (p == nullptr || p->value != nullptr) {
+    *ok = false;
+  }
+
+  p->value = key;
+}
+}
+}  // namespace v8::internal
diff --git a/src/modules.h b/src/modules.h
new file mode 100644 (file)
index 0000000..ac04e47
--- /dev/null
@@ -0,0 +1,99 @@
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_MODULES_H_
+#define V8_MODULES_H_
+
+#include "src/zone.h"
+
+namespace v8 {
+namespace internal {
+
+
+class AstRawString;
+
+
+class ModuleDescriptor : public ZoneObject {
+ public:
+  // ---------------------------------------------------------------------------
+  // Factory methods.
+
+  static ModuleDescriptor* New(Zone* zone) {
+    return new (zone) ModuleDescriptor();
+  }
+
+  // ---------------------------------------------------------------------------
+  // Mutators.
+
+  // Add a name to the list of exports. If it already exists, or this descriptor
+  // is frozen, that's an error.
+  void Add(const AstRawString* name, Zone* zone, bool* ok);
+
+  // Do not allow any further refinements, directly or through unification.
+  void Freeze() { frozen_ = true; }
+
+  // Assign an index.
+  void Allocate(int index) {
+    DCHECK(IsFrozen() && index_ == -1);
+    index_ = index;
+  }
+
+  // ---------------------------------------------------------------------------
+  // Accessors.
+
+  // Check whether this is closed (i.e. fully determined).
+  bool IsFrozen() { return frozen_; }
+
+  int Length() {
+    DCHECK(IsFrozen());
+    ZoneHashMap* exports = exports_;
+    return exports ? exports->occupancy() : 0;
+  }
+
+  // The context slot in the hosting script context pointing to this module.
+  int Index() {
+    DCHECK(IsFrozen());
+    return index_;
+  }
+
+  // ---------------------------------------------------------------------------
+  // Iterators.
+
+  // Use like:
+  //   for (auto it = descriptor->iterator(); !it.done(); it.Advance()) {
+  //     ... it.name() ...
+  //   }
+  class Iterator {
+   public:
+    bool done() const { return entry_ == NULL; }
+    const AstRawString* name() const {
+      DCHECK(!done());
+      return static_cast<const AstRawString*>(entry_->key);
+    }
+    void Advance() { entry_ = exports_->Next(entry_); }
+
+   private:
+    friend class ModuleDescriptor;
+    explicit Iterator(const ZoneHashMap* exports)
+        : exports_(exports), entry_(exports ? exports->Start() : NULL) {}
+
+    const ZoneHashMap* exports_;
+    ZoneHashMap::Entry* entry_;
+  };
+
+  Iterator iterator() const { return Iterator(this->exports_); }
+
+  // ---------------------------------------------------------------------------
+  // Implementation.
+ private:
+  bool frozen_;
+  ZoneHashMap* exports_;   // Module exports and their types (allocated lazily)
+  int index_;
+
+  ModuleDescriptor() : frozen_(false), exports_(NULL), index_(-1) {}
+};
+
+} }  // namespace v8::internal
+
+#endif  // V8_MODULES_H_
index 87561ad2d25f75a0eb924fffeac3e767f108fcf3..bb8cb52b75068f0aee6941880fd7d1ecfe58bd29 100644 (file)
@@ -1278,9 +1278,9 @@ Statement* Parser::ParseModule(bool* ok) {
   body->set_scope(scope);
 
   // Check that all exports are bound.
-  Interface* interface = scope->interface();
-  for (Interface::Iterator it = interface->iterator();
-       !it.done(); it.Advance()) {
+  ModuleDescriptor* descriptor = scope->module();
+  for (ModuleDescriptor::Iterator it = descriptor->iterator(); !it.done();
+       it.Advance()) {
     if (scope->LookupLocal(it.name()) == NULL) {
       ParserTraits::ReportMessage("module_export_undefined", it.name());
       *ok = false;
@@ -1288,7 +1288,7 @@ Statement* Parser::ParseModule(bool* ok) {
     }
   }
 
-  scope->interface()->Freeze();
+  scope->module()->Freeze();
   return body;
 }
 
@@ -1500,7 +1500,7 @@ Statement* Parser::ParseExportDefault(bool* ok) {
     }
   }
 
-  // TODO(ES6): Add default export to scope_->interface()
+  // TODO(ES6): Add default export to scope_->module()
 
   return result;
 }
@@ -1605,16 +1605,12 @@ Statement* Parser::ParseExportDeclaration(bool* ok) {
   // TODO(ES6): Handle 'export from' once imports are properly implemented.
   // For now we just drop such exports on the floor.
   if (!is_export_from) {
-    // Extract declared names into export declarations and interface.
-    Interface* interface = scope_->interface();
+    // Extract declared names into export declarations and module descriptor.
+    ModuleDescriptor* descriptor = scope_->module();
     for (int i = 0; i < names.length(); ++i) {
-#ifdef DEBUG
-      if (FLAG_print_interface_details)
-        PrintF("# Export %.*s ", names[i]->length(), names[i]->raw_data());
-#endif
       // TODO(adamk): Make early errors here provide the right error message
       // (duplicate exported names).
-      interface->Add(names[i], zone(), CHECK_OK);
+      descriptor->Add(names[i], zone(), CHECK_OK);
       // TODO(rossberg): Rethink whether we actually need to store export
       // declarations (for compilation?).
       // ExportDeclaration* declaration =
index c71a95f6bff10a89bfbe488463e99c4b323c568d..213756e875bc2f2cab90f052442bf1125afb49cd 100644 (file)
@@ -890,16 +890,16 @@ void FullCodeGenerator::VisitFunctionDeclaration(
 
 void FullCodeGenerator::VisitModuleDeclaration(ModuleDeclaration* declaration) {
   Variable* variable = declaration->proxy()->var();
-  Interface* interface = declaration->module()->interface();
+  ModuleDescriptor* descriptor = declaration->module()->descriptor();
   DCHECK(variable->location() == Variable::CONTEXT);
-  DCHECK(interface->IsFrozen());
+  DCHECK(descriptor->IsFrozen());
 
   Comment cmnt(masm_, "[ ModuleDeclaration");
   EmitDebugCheckDeclarationContext(variable);
 
   // Load instance object.
   __ LoadContext(r4, scope_->ContextChainLength(scope_->ScriptScope()));
-  __ LoadP(r4, ContextOperand(r4, interface->Index()));
+  __ LoadP(r4, ContextOperand(r4, descriptor->Index()));
   __ LoadP(r4, ContextOperand(r4, Context::EXTENSION_INDEX));
 
   // Assign it.
index 2c4cc69c8d2345c8b1ff05746da291c9f0fddb52..74aefdb95489e25609136dc2687a071ebecd3c12 100644 (file)
@@ -552,13 +552,14 @@ void ScopeInfo::Print() {
 //---------------------------------------------------------------------------
 // ModuleInfo.
 
-Handle<ModuleInfo> ModuleInfo::Create(
-    Isolate* isolate, Interface* interface, Scope* scope) {
-  Handle<ModuleInfo> info = Allocate(isolate, interface->Length());
-  info->set_host_index(interface->Index());
+Handle<ModuleInfo> ModuleInfo::Create(Isolate* isolate,
+                                      ModuleDescriptor* descriptor,
+                                      Scope* scope) {
+  Handle<ModuleInfo> info = Allocate(isolate, descriptor->Length());
+  info->set_host_index(descriptor->Index());
   int i = 0;
-  for (Interface::Iterator it = interface->iterator();
-       !it.done(); it.Advance(), ++i) {
+  for (ModuleDescriptor::Iterator it = descriptor->iterator(); !it.done();
+       it.Advance(), ++i) {
     Variable* var = scope->LookupLocal(it.name());
     info->set_name(i, *(it.name()->string()));
     info->set_mode(i, var->mode());
index cfdd4b68dd64baf02d8b874b482b2c42e5a430ff..70a17cd7d4a945975ce7ed59f7dc73c9d42d569c 100644 (file)
@@ -6,7 +6,7 @@
 #define V8_SCOPEINFO_H_
 
 #include "src/allocation.h"
-#include "src/interface.h"
+#include "src/modules.h"
 #include "src/variables.h"
 
 namespace v8 {
@@ -120,8 +120,8 @@ class ModuleInfo: public FixedArray {
     return static_cast<ModuleInfo*>(FixedArray::cast(description));
   }
 
-  static Handle<ModuleInfo> Create(
-      Isolate* isolate, Interface* interface, Scope* scope);
+  static Handle<ModuleInfo> Create(Isolate* isolate,
+                                   ModuleDescriptor* descriptor, Scope* scope);
 
   // Index of module's context in host context.
   int host_index() { return Smi::cast(get(HOST_OFFSET))->value(); }
index b9301d833bcd01b35da59cd6602ceb65a317cf93..35449643cec2dce0742737c35b33e9b559b9ab0f 100644 (file)
@@ -74,8 +74,8 @@ Scope::Scope(Zone* zone, Scope* outer_scope, ScopeType scope_type,
       params_(4, zone),
       unresolved_(16, zone),
       decls_(4, zone),
-      interface_(scope_type == MODULE_SCOPE ? Interface::New(zone)
-                                            : NULL),
+      module_descriptor_(
+          scope_type == MODULE_SCOPE ? ModuleDescriptor::New(zone) : NULL),
       already_resolved_(false),
       ast_value_factory_(ast_value_factory),
       zone_(zone) {
@@ -95,7 +95,7 @@ Scope::Scope(Zone* zone, Scope* inner_scope, ScopeType scope_type,
       params_(4, zone),
       unresolved_(16, zone),
       decls_(4, zone),
-      interface_(NULL),
+      module_descriptor_(NULL),
       already_resolved_(true),
       ast_value_factory_(value_factory),
       zone_(zone) {
@@ -120,7 +120,7 @@ Scope::Scope(Zone* zone, Scope* inner_scope,
       params_(0, zone),
       unresolved_(0, zone),
       decls_(0, zone),
-      interface_(NULL),
+      module_descriptor_(NULL),
       already_resolved_(true),
       ast_value_factory_(value_factory),
       zone_(zone) {
@@ -272,11 +272,6 @@ bool Scope::Analyze(CompilationInfo* info) {
           : FLAG_print_scopes) {
     scope->Print();
   }
-
-  if (FLAG_harmony_modules && FLAG_print_interfaces && top->is_script_scope()) {
-    PrintF("global : ");
-    top->interface()->Print();
-  }
 #endif
 
   info->PrepareForCompilation(scope);
@@ -1366,7 +1361,7 @@ void Scope::AllocateVariablesRecursively(Isolate* isolate) {
 void Scope::AllocateModulesRecursively(Scope* host_scope) {
   if (already_resolved()) return;
   if (is_module_scope()) {
-    DCHECK(interface_->IsFrozen());
+    DCHECK(module_descriptor_->IsFrozen());
     DCHECK(module_var_ == NULL);
     module_var_ =
         host_scope->NewInternal(ast_value_factory_->dot_module_string());
index a0d5ff5021846faa95de8c55f7a2926048f0bb0e..c58d124939676e876a848d5741c94552bab76fa8 100644 (file)
@@ -388,8 +388,8 @@ class Scope: public ZoneObject {
   // The scope immediately surrounding this scope, or NULL.
   Scope* outer_scope() const { return outer_scope_; }
 
-  // The interface as inferred so far; only for module scopes.
-  Interface* interface() const { return interface_; }
+  // The ModuleDescriptor for this scope; only for module scopes.
+  ModuleDescriptor* module() const { return module_descriptor_; }
 
   // ---------------------------------------------------------------------------
   // Variable allocation.
@@ -518,8 +518,8 @@ class Scope: public ZoneObject {
   Variable* new_target_;
   // Convenience variable; function scopes only.
   Variable* arguments_;
-  // Interface; module scopes only.
-  Interface* interface_;
+  // Module descriptor; module scopes only.
+  ModuleDescriptor* module_descriptor_;
 
   // Illegal redeclaration.
   Expression* illegal_redecl_;
index 790fed4a1c88dfe88bd3be1857ff292e7f92ecb1..faf9e74dcf3a66e4be499e655ef6915ab816ff91 100644 (file)
@@ -917,16 +917,16 @@ void FullCodeGenerator::VisitFunctionDeclaration(
 
 void FullCodeGenerator::VisitModuleDeclaration(ModuleDeclaration* declaration) {
   Variable* variable = declaration->proxy()->var();
-  Interface* interface = declaration->module()->interface();
+  ModuleDescriptor* descriptor = declaration->module()->descriptor();
   DCHECK(variable->location() == Variable::CONTEXT);
-  DCHECK(interface->IsFrozen());
+  DCHECK(descriptor->IsFrozen());
 
   Comment cmnt(masm_, "[ ModuleDeclaration");
   EmitDebugCheckDeclarationContext(variable);
 
   // Load instance object.
   __ LoadContext(rax, scope_->ContextChainLength(scope_->ScriptScope()));
-  __ movp(rax, ContextOperand(rax, interface->Index()));
+  __ movp(rax, ContextOperand(rax, descriptor->Index()));
   __ movp(rax, ContextOperand(rax, Context::EXTENSION_INDEX));
 
   // Assign it.
index 6171240e7864329f1f938a79e3f9e894fb303ef8..b6e5c221a3b3ced9d17a0a9dd5f18c1ba1fc8718 100644 (file)
@@ -886,16 +886,16 @@ void FullCodeGenerator::VisitFunctionDeclaration(
 
 void FullCodeGenerator::VisitModuleDeclaration(ModuleDeclaration* declaration) {
   Variable* variable = declaration->proxy()->var();
-  Interface* interface = declaration->module()->interface();
+  ModuleDescriptor* descriptor = declaration->module()->descriptor();
   DCHECK(variable->location() == Variable::CONTEXT);
-  DCHECK(interface->IsFrozen());
+  DCHECK(descriptor->IsFrozen());
 
   Comment cmnt(masm_, "[ ModuleDeclaration");
   EmitDebugCheckDeclarationContext(variable);
 
   // Load instance object.
   __ LoadContext(eax, scope_->ContextChainLength(scope_->ScriptScope()));
-  __ mov(eax, ContextOperand(eax, interface->Index()));
+  __ mov(eax, ContextOperand(eax, descriptor->Index()));
   __ mov(eax, ContextOperand(eax, Context::EXTENSION_INDEX));
 
   // Assign it.
index eef1b813f9a20deb147489dafdea40204bc5048d..7f08ee2f86ed5809934e142273bc89d834c7e65a 100644 (file)
         '../../src/ic/ic.h',
         '../../src/ic/ic-compiler.cc',
         '../../src/ic/ic-compiler.h',
-        '../../src/interface.cc',
-        '../../src/interface.h',
         '../../src/interface-descriptors.cc',
         '../../src/interface-descriptors.h',
         '../../src/interpreter-irregexp.cc',
         '../../src/macro-assembler.h',
         '../../src/messages.cc',
         '../../src/messages.h',
+        '../../src/modules.cc',
+        '../../src/modules.h',
         '../../src/msan.h',
         '../../src/natives.h',
         '../../src/objects-debug.cc',