// 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_buf snapshot, deno_recv_cb cb, deno_buf shared) : isolate_(nullptr), shared_(shared), current_args_(nullptr), snapshot_creator_(nullptr), global_import_buf_ptr_(nullptr), pending_promise_events_(0), cb_(cb), next_req_id_(0), user_data_(nullptr) { if (snapshot.data_ptr) { snapshot_.data = reinterpret_cast(snapshot.data_ptr); snapshot_.raw_size = static_cast(snapshot.data_len); } } void AddIsolate(v8::Isolate* isolate); v8::Isolate* isolate_; deno_buf shared_; const v8::FunctionCallbackInfo* current_args_; v8::SnapshotCreator* snapshot_creator_; void* global_import_buf_ptr_; int32_t pending_promise_events_; deno_recv_cb cb_; int32_t next_req_id_; void* user_data_; v8::Persistent context_; std::map> async_data_map_; std::string last_exception_; v8::Persistent recv_; v8::Persistent global_error_handler_; v8::Persistent promise_reject_handler_; v8::Persistent promise_error_examiner_; 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; }; 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 SetGlobalErrorHandler(const v8::FunctionCallbackInfo& args); void SetPromiseRejectHandler(const v8::FunctionCallbackInfo& args); void SetPromiseErrorExaminer(const v8::FunctionCallbackInfo& args); static intptr_t external_references[] = { reinterpret_cast(Print), reinterpret_cast(Recv), reinterpret_cast(Send), reinterpret_cast(Shared), reinterpret_cast(SetGlobalErrorHandler), reinterpret_cast(SetPromiseRejectHandler), reinterpret_cast(SetPromiseErrorExaminer), 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, const char* js_filename, const char* js_source, const char* source_map); 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); } // namespace deno extern "C" { // This is just to workaround the linker. struct deno_s { deno::DenoIsolate isolate; }; } #endif // INTERNAL_H_