Index: src/objects.h |
diff --git a/src/objects.h b/src/objects.h |
index ea086931a4d53768ab85c93eeb9a98d5669e4aa8..c81cfbbb7e2da1747f61f5efed28f889817c8729 100644 |
--- a/src/objects.h |
+++ b/src/objects.h |
@@ -71,6 +71,7 @@ |
// - JSValue |
// - JSDate |
// - JSMessageObject |
+// - JSModuleNamespace |
// - JSProxy |
// - FixedArrayBase |
// - ByteArray |
@@ -416,6 +417,7 @@ const int kStubMinorKeyBits = kSmiValueSize - kStubMajorKeyBits - 1; |
V(JS_ARGUMENTS_TYPE) \ |
V(JS_CONTEXT_EXTENSION_OBJECT_TYPE) \ |
V(JS_GENERATOR_OBJECT_TYPE) \ |
+ V(JS_MODULE_NAMESPACE_TYPE) \ |
V(JS_GLOBAL_OBJECT_TYPE) \ |
V(JS_GLOBAL_PROXY_TYPE) \ |
V(JS_API_OBJECT_TYPE) \ |
@@ -717,6 +719,7 @@ enum InstanceType { |
JS_ARGUMENTS_TYPE, |
JS_CONTEXT_EXTENSION_OBJECT_TYPE, |
JS_GENERATOR_OBJECT_TYPE, |
+ JS_MODULE_NAMESPACE_TYPE, |
JS_ARRAY_TYPE, |
JS_ARRAY_BUFFER_TYPE, |
JS_TYPED_ARRAY_TYPE, |
@@ -886,6 +889,7 @@ class LayoutDescriptor; |
class LiteralsArray; |
class LookupIterator; |
class FieldType; |
+class Module; |
class ModuleDescriptor; |
class ModuleInfoEntry; |
class ModuleInfo; |
@@ -970,6 +974,7 @@ template <class C> inline bool Is(Object* obj); |
V(JSObject) \ |
V(JSContextExtensionObject) \ |
V(JSGeneratorObject) \ |
+ V(JSModuleNamespace) \ |
V(Map) \ |
V(DescriptorArray) \ |
V(FrameArray) \ |
@@ -3950,6 +3955,9 @@ class ObjectHashTable: public HashTable<ObjectHashTable, |
Object* Lookup(Handle<Object> key, int32_t hash); |
Object* Lookup(Isolate* isolate, Handle<Object> key, int32_t hash); |
+ // Returns the value at entry. |
+ Object* ValueAt(int entry); |
+ |
// Adds (or overwrites) the value associated with the given key. |
static Handle<ObjectHashTable> Put(Handle<ObjectHashTable> table, |
Handle<Object> key, |
@@ -7898,6 +7906,29 @@ class JSGeneratorObject: public JSObject { |
DISALLOW_IMPLICIT_CONSTRUCTORS(JSGeneratorObject); |
}; |
+// When importing a module namespace (import * as foo from "bar"), a |
+// JSModuleNamespace object (representing module "bar") is created and bound to |
+// the declared variable (foo). A module can have at most one namespace object. |
+class JSModuleNamespace : public JSObject { |
+ public: |
+ DECLARE_CAST(JSModuleNamespace) |
+ DECLARE_VERIFIER(JSModuleNamespace) |
+ |
+ // The actual module whose namespace is being represented. |
+ DECL_ACCESSORS(module, Module) |
+ |
+ // Retrieve the value exported by [module] under the given [name]. If there is |
+ // no such export, return Just(undefined). If the export is uninitialized, |
+ // schedule an exception and return Nothing. |
+ MUST_USE_RESULT MaybeHandle<Object> GetExport(Handle<String> name); |
+ |
+ static const int kModuleOffset = JSObject::kHeaderSize; |
+ static const int kSize = kModuleOffset + kPointerSize; |
+ |
+ private: |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(JSModuleNamespace); |
+}; |
+ |
// A Module object is a mapping from export names to cells |
// This is still very much in flux. |
class Module : public Struct { |
@@ -7906,13 +7937,15 @@ class Module : public Struct { |
DECLARE_VERIFIER(Module) |
DECLARE_PRINTER(Module) |
- // The code representing this Module, either a |
- // SharedFunctionInfo or a JSFunction depending |
- // on whether it's been instantiated. |
+ // The code representing this Module, either a SharedFunctionInfo or a |
+ // JSFunction depending on whether it's been instantiated. |
DECL_ACCESSORS(code, Object) |
DECL_ACCESSORS(exports, ObjectHashTable) |
+ // The namespace object (or undefined). |
+ DECL_ACCESSORS(module_namespace, HeapObject) |
+ |
// [[RequestedModules]]: Modules imported or re-exported by this module. |
// Corresponds 1-to-1 to the module specifier strings in |
// ModuleInfo::module_requests. |
@@ -7922,7 +7955,7 @@ class Module : public Struct { |
// are only evaluated a single time. |
DECL_BOOLEAN_ACCESSORS(evaluated) |
- // Storage for [[Evaluated]] |
+ // Storage for [[Evaluated]]. |
DECL_INT_ACCESSORS(flags) |
// Embedder-specified data |
@@ -7955,12 +7988,18 @@ class Module : public Struct { |
static Handle<Object> LoadImport(Handle<Module> module, Handle<String> name, |
int module_request); |
+ // Get the namespace object for [module_request] of [module]. If it doesn't |
+ // exist yet, it is created. |
+ static Handle<JSModuleNamespace> GetModuleNamespace(Handle<Module> module, |
+ int module_request); |
+ |
static const int kCodeOffset = HeapObject::kHeaderSize; |
static const int kExportsOffset = kCodeOffset + kPointerSize; |
static const int kRequestedModulesOffset = kExportsOffset + kPointerSize; |
static const int kFlagsOffset = kRequestedModulesOffset + kPointerSize; |
static const int kEmbedderDataOffset = kFlagsOffset + kPointerSize; |
- static const int kSize = kEmbedderDataOffset + kPointerSize; |
+ static const int kModuleNamespaceOffset = kEmbedderDataOffset + kPointerSize; |
+ static const int kSize = kModuleNamespaceOffset + kPointerSize; |
private: |
enum { kEvaluatedBit }; |
@@ -7969,6 +8008,10 @@ class Module : public Struct { |
static void CreateIndirectExport(Handle<Module> module, Handle<String> name, |
Handle<ModuleInfoEntry> entry); |
+ // Get the namespace object for [module]. If it doesn't exist yet, it is |
+ // created. |
+ static Handle<JSModuleNamespace> GetModuleNamespace(Handle<Module> module); |
+ |
// The [must_resolve] argument indicates whether or not an exception should be |
// thrown in case the module does not provide an export named [name] |
// (including when a cycle is detected). An exception is always thrown in the |