From 6afe94b3c855a8c486ce2a593cf2f8cac3b4d711 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Tue, 23 Oct 2018 23:58:20 -0400 Subject: libdeno: clean up - Use a proper class for DenoIsolate. - Move extern C stuff to api.cc --- libdeno/internal.h | 98 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 76 insertions(+), 22 deletions(-) (limited to 'libdeno/internal.h') diff --git a/libdeno/internal.h b/libdeno/internal.h index be9651010..d71b36048 100644 --- a/libdeno/internal.h +++ b/libdeno/internal.h @@ -6,31 +6,66 @@ #include #include "deno.h" #include "third_party/v8/include/v8.h" +#include "third_party/v8/src/base/logging.h" + +namespace deno { -extern "C" { // deno_s = Wrapped Isolate. -struct deno_s { - v8::Isolate* isolate; - const v8::FunctionCallbackInfo* currentArgs; - 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; - void* global_import_buf_ptr; - - int32_t pending_promise_events; - v8::Persistent context; - std::map> async_data_map; - deno_recv_cb cb; - int32_t next_req_id; - void* user_data; +class DenoIsolate { + public: + DenoIsolate(deno_buf snapshot, deno_recv_cb cb) + : isolate_(nullptr), + current_args_(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_; + // Put v8::Isolate::CreateParams here.. + const v8::FunctionCallbackInfo* current_args_; + 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_; }; -} -namespace deno { +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; @@ -57,7 +92,26 @@ void InitializeContext(v8::Isolate* isolate, v8::Local context, const char* js_filename, const std::string& js_source, const std::string* source_map); -void AddIsolate(Deno* d, v8::Isolate* isolate); +void HandleException(v8::Local context, + v8::Local exception); + +void DeserializeInternalFields(v8::Local holder, int index, + v8::StartupData payload, 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_ -- cgit v1.2.3