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