#ifndef SRC_NODE_BUILTINS_H_ #define SRC_NODE_BUILTINS_H_ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS #include #include #include #include #include #include "node_mutex.h" #include "node_union_bytes.h" #include "v8.h" // Forward declare test fixture for `friend` declaration. class PerProcessTest; namespace node { class SnapshotBuilder; class ExternalReferenceRegistry; namespace builtins { using BuiltinSourceMap = std::map; using BuiltinCodeCacheMap = std::unordered_map>; struct CodeCacheInfo { std::string id; std::vector data; }; // Handles compilation and caching of built-in JavaScript modules and // bootstrap scripts, whose source are bundled into the binary as static data. class NODE_EXTERN_PRIVATE BuiltinLoader { public: BuiltinLoader(const BuiltinLoader&) = delete; BuiltinLoader& operator=(const BuiltinLoader&) = delete; static void RegisterExternalReferences(ExternalReferenceRegistry* registry); static void Initialize(v8::Local target, v8::Local unused, v8::Local context, void* priv); // The parameters used to compile the scripts are detected based on // the pattern of the id. static v8::MaybeLocal LookupAndCompile( v8::Local context, const char* id, Environment* optional_env); static v8::Local GetSourceObject(v8::Local context); // Returns config.gypi as a JSON string static v8::Local GetConfigString(v8::Isolate* isolate); static bool Exists(const char* id); static bool Add(const char* id, const UnionBytes& source); static bool CompileAllBuiltins(v8::Local context); static void RefreshCodeCache(const std::vector& in); static void CopyCodeCache(std::vector* out); private: // Only allow access from friends. friend class CodeCacheBuilder; BuiltinLoader(); static BuiltinLoader* GetInstance(); // Generated by tools/js2c.py as node_javascript.cc void LoadJavaScriptSource(); // Loads data into source_ UnionBytes GetConfig(); // Return data for config.gypi std::vector GetBuiltinIds(); struct BuiltinCategories { bool is_initialized = false; std::set can_be_required; std::set cannot_be_required; }; void InitializeBuiltinCategories(); const std::set& GetCannotBeRequired(); const std::set& GetCanBeRequired(); bool CanBeRequired(const char* id); bool CannotBeRequired(const char* id); BuiltinCodeCacheMap* code_cache(); const Mutex& code_cache_mutex() const { return code_cache_mutex_; } v8::ScriptCompiler::CachedData* GetCodeCache(const char* id) const; enum class Result { kWithCache, kWithoutCache }; v8::MaybeLocal LoadBuiltinSource(v8::Isolate* isolate, const char* id); // If an exception is encountered (e.g. source code contains // syntax error), the returned value is empty. v8::MaybeLocal LookupAndCompileInternal( v8::Local context, const char* id, std::vector>* parameters, Result* result); static void RecordResult(const char* id, BuiltinLoader::Result result, Environment* env); static void GetBuiltinCategories( v8::Local property, const v8::PropertyCallbackInfo& info); static void GetCacheUsage(const v8::FunctionCallbackInfo& args); // Passing ids of built-in source code into JS land as // internalBinding('builtins').builtinIds static void BuiltinIdsGetter(v8::Local property, const v8::PropertyCallbackInfo& info); // Passing config.gypi into JS land as internalBinding('builtins').config static void ConfigStringGetter( v8::Local property, const v8::PropertyCallbackInfo& info); // Compile a specific built-in as a function static void CompileFunction(const v8::FunctionCallbackInfo& args); static void HasCachedBuiltins( const v8::FunctionCallbackInfo& args); static BuiltinLoader instance_; BuiltinCategories builtin_categories_; BuiltinSourceMap source_; BuiltinCodeCacheMap code_cache_; UnionBytes config_; // Used to synchronize access to the code cache map Mutex code_cache_mutex_; bool has_code_cache_; friend class ::PerProcessTest; }; } // namespace builtins } // namespace node #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS #endif // SRC_NODE_BUILTINS_H_