1 #ifndef SRC_MODULE_WRAP_H_
2 #define SRC_MODULE_WRAP_H_
3 
4 #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
5 
6 #include <unordered_map>
7 #include <string>
8 #include <vector>
9 #include "base_object.h"
10 
11 namespace node {
12 
13 class Environment;
14 class ExternalReferenceRegistry;
15 
16 namespace contextify {
17 class ContextifyContext;
18 }
19 
20 namespace loader {
21 
22 enum ScriptType : int {
23   kScript,
24   kModule,
25   kFunction,
26 };
27 
28 enum HostDefinedOptions : int {
29   kID = 8,
30   kLength = 9,
31 };
32 
33 class ModuleWrap : public BaseObject {
34  public:
35   enum InternalFields {
36     kModuleSlot = BaseObject::kInternalFieldCount,
37     kURLSlot,
38     kSyntheticEvaluationStepsSlot,
39     kContextObjectSlot,  // Object whose creation context is the target Context
40     kInternalFieldCount
41   };
42 
43   static void Initialize(v8::Local<v8::Object> target,
44                          v8::Local<v8::Value> unused,
45                          v8::Local<v8::Context> context,
46                          void* priv);
47   static void RegisterExternalReferences(ExternalReferenceRegistry* registry);
48   static void HostInitializeImportMetaObjectCallback(
49       v8::Local<v8::Context> context,
50       v8::Local<v8::Module> module,
51       v8::Local<v8::Object> meta);
52 
53   void MemoryInfo(MemoryTracker* tracker) const override {
54     tracker->TrackField("resolve_cache", resolve_cache_);
55   }
56 
57   v8::Local<v8::Context> context() const;
58 
59   SET_MEMORY_INFO_NAME(ModuleWrap)
60   SET_SELF_SIZE(ModuleWrap)
61 
62   bool IsNotIndicativeOfMemoryLeakAtExit() const override {
63     // XXX: The garbage collection rules for ModuleWrap are *super* unclear.
64     // Do these objects ever get GC'd? Are we just okay with leaking them?
65     return true;
66   }
67 
68  private:
69   ModuleWrap(Environment* env,
70              v8::Local<v8::Object> object,
71              v8::Local<v8::Module> module,
72              v8::Local<v8::String> url,
73              v8::Local<v8::Object> context_object,
74              v8::Local<v8::Value> synthetic_evaluation_step);
75   ~ModuleWrap() override;
76 
77   static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
78   static void Link(const v8::FunctionCallbackInfo<v8::Value>& args);
79   static void Instantiate(const v8::FunctionCallbackInfo<v8::Value>& args);
80   static void Evaluate(const v8::FunctionCallbackInfo<v8::Value>& args);
81   static void GetNamespace(const v8::FunctionCallbackInfo<v8::Value>& args);
82   static void GetStatus(const v8::FunctionCallbackInfo<v8::Value>& args);
83   static void GetError(const v8::FunctionCallbackInfo<v8::Value>& args);
84   static void GetStaticDependencySpecifiers(
85       const v8::FunctionCallbackInfo<v8::Value>& args);
86 
87   static void SetImportModuleDynamicallyCallback(
88       const v8::FunctionCallbackInfo<v8::Value>& args);
89   static void SetInitializeImportMetaObjectCallback(
90       const v8::FunctionCallbackInfo<v8::Value>& args);
91   static v8::MaybeLocal<v8::Value> SyntheticModuleEvaluationStepsCallback(
92       v8::Local<v8::Context> context, v8::Local<v8::Module> module);
93   static void SetSyntheticExport(
94       const v8::FunctionCallbackInfo<v8::Value>& args);
95   static void CreateCachedData(const v8::FunctionCallbackInfo<v8::Value>& args);
96 
97   static v8::MaybeLocal<v8::Module> ResolveModuleCallback(
98       v8::Local<v8::Context> context,
99       v8::Local<v8::String> specifier,
100       v8::Local<v8::FixedArray> import_attributes,
101       v8::Local<v8::Module> referrer);
102   static ModuleWrap* GetFromModule(node::Environment*, v8::Local<v8::Module>);
103 
104   v8::Global<v8::Module> module_;
105   std::unordered_map<std::string, v8::Global<v8::Promise>> resolve_cache_;
106   contextify::ContextifyContext* contextify_context_ = nullptr;
107   bool synthetic_ = false;
108   bool linked_ = false;
109   int module_hash_;
110 };
111 
112 }  // namespace loader
113 }  // namespace node
114 
115 #endif  // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
116 
117 #endif  // SRC_MODULE_WRAP_H_
118