// Copyright 2018 the Deno authors. All rights reserved. MIT license. #ifndef INTERNAL_H_ #define INTERNAL_H_ #include #include #include "deno.h" #include "third_party/v8/include/v8.h" #include "third_party/v8/src/base/logging.h" namespace deno { // deno_s = Wrapped Isolate. class DenoIsolate { public: DenoIsolate(deno_config config) : isolate_(nullptr), shared_(config.shared), current_args_(nullptr), snapshot_creator_(nullptr), global_import_buf_ptr_(nullptr), recv_cb_(config.recv_cb), resolve_cb_(config.resolve_cb), next_req_id_(0), user_data_(nullptr) { array_buffer_allocator_ = v8::ArrayBuffer::Allocator::NewDefaultAllocator(); if (config.load_snapshot.data_ptr) { snapshot_.data = reinterpret_cast(config.load_snapshot.data_ptr); snapshot_.raw_size = static_cast(config.load_snapshot.data_len); } } ~DenoIsolate() { if (snapshot_creator_) { delete snapshot_creator_; } else { isolate_->Dispose(); } delete array_buffer_allocator_; } void AddIsolate(v8::Isolate* isolate); void RegisterModule(const char* filename, v8::Local module); void ResolveOk(const char* filename, const char* source); void ClearModules(); v8::Local GetBuiltinModules(); v8::Isolate* isolate_; v8::ArrayBuffer::Allocator* array_buffer_allocator_; deno_buf shared_; const v8::FunctionCallbackInfo* current_args_; v8::SnapshotCreator* snapshot_creator_; void* global_import_buf_ptr_; deno_recv_cb recv_cb_; deno_resolve_cb resolve_cb_; int32_t next_req_id_; void* user_data_; // identity hash -> filename, module (avoid hash collision) std::multimap>> module_info_map_; // filename -> Module std::map> module_map_; // Set by deno_resolve_ok v8::Persistent resolve_module_; v8::Persistent builtin_modules_; v8::Persistent context_; std::map> async_data_map_; std::map> pending_promise_map_; std::string last_exception_; v8::Persistent recv_; v8::StartupData snapshot_; v8::Persistent global_import_buf_; v8::Persistent shared_ab_; }; class UserDataScope { DenoIsolate* deno_; void* prev_data_; void* data_; // Not necessary; only for sanity checking. public: UserDataScope(DenoIsolate* deno, void* data) : deno_(deno), data_(data) { CHECK(deno->user_data_ == nullptr || deno->user_data_ == data_); prev_data_ = deno->user_data_; deno->user_data_ = data; } ~UserDataScope() { CHECK(deno_->user_data_ == data_); deno_->user_data_ = prev_data_; } }; struct InternalFieldData { uint32_t data; }; static inline v8::Local v8_str(const char* x, bool internalize = false) { return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), x, internalize ? v8::NewStringType::kInternalized : v8::NewStringType::kNormal) .ToLocalChecked(); } void Print(const v8::FunctionCallbackInfo& args); void Recv(const v8::FunctionCallbackInfo& args); void Send(const v8::FunctionCallbackInfo& args); void Shared(v8::Local property, const v8::PropertyCallbackInfo& info); void BuiltinModules(v8::Local property, const v8::PropertyCallbackInfo& info); static intptr_t external_references[] = { reinterpret_cast(Print), reinterpret_cast(Recv), reinterpret_cast(Send), reinterpret_cast(Shared), reinterpret_cast(BuiltinModules), 0}; static const deno_buf empty_buf = {nullptr, 0, nullptr, 0}; Deno* NewFromSnapshot(void* user_data, deno_recv_cb cb); void InitializeContext(v8::Isolate* isolate, v8::Local context); void HandleException(v8::Local context, v8::Local exception); void DeserializeInternalFields(v8::Local holder, int index, v8::StartupData payload, void* data); v8::StartupData SerializeInternalFields(v8::Local holder, int index, void* data); v8::Local ImportBuf(DenoIsolate* d, deno_buf buf); void DeleteDataRef(DenoIsolate* d, int32_t req_id); bool Execute(v8::Local context, const char* js_filename, const char* js_source); bool ExecuteMod(v8::Local context, const char* js_filename, const char* js_source); } // namespace deno extern "C" { // This is just to workaround the linker. struct deno_s { deno::DenoIsolate isolate; }; } #endif // INTERNAL_H_