20 #include <libplatform/libplatform.h> 26 #ifdef V8_EMBEDDED_SNAPSHOT 28 void SetupV8Snapshots();
33 void OnPromiseReject(v8::PromiseRejectMessage
message) {
37 void InitializeV8IfNeeded() {
38 static v8::Platform* platform =
nullptr;
42 v8::V8::InitializeICU();
44 #ifdef V8_EMBEDDED_SNAPSHOT 48 platform = v8::platform::NewDefaultPlatform().release();
49 v8::V8::InitializePlatform(platform);
65 return context_.Get(isolate_)->Global();
69 return context_.Get(isolate_)->Global();
72 void JsEngine::OnPromiseReject(v8::PromiseRejectMessage message) {
76 if (message.GetEvent() == v8::PromiseRejectEvent::kPromiseRejectWithNoHandler)
77 promise_handler_.
AddPromise(message.GetPromise(), message.GetValue());
82 void JsEngine::AddDestructor(
void*
object,
83 std::function<
void(
void*)> destruct) {
84 destructors_.emplace(
object, destruct);
95 void* JsEngine::ArrayBufferAllocator::Allocate(
size_t length) {
96 void* data = AllocateUninitialized(length);
97 return !data ? data : std::memset(data, 0, length);
100 void* JsEngine::ArrayBufferAllocator::AllocateUninitialized(
size_t length) {
101 return std::malloc(length);
104 void JsEngine::ArrayBufferAllocator::Free(
void* data,
size_t ) {
105 auto* destructors = &
Instance()->destructors_;
106 if (destructors->count(data) > 0) {
107 destructors->at(data)(data);
108 destructors->erase(data);
113 v8::Isolate* JsEngine::CreateIsolate() {
114 InitializeV8IfNeeded();
116 v8::Isolate::CreateParams create_params;
117 create_params.array_buffer_allocator = &allocator_;
119 v8::Isolate* isolate = v8::Isolate::New(create_params);
121 isolate->SetCaptureStackTraceForUncaughtExceptions(
true);
122 isolate->SetPromiseRejectCallback(&::shaka::OnPromiseReject);
127 v8::Global<v8::Context> JsEngine::CreateContext() {
128 v8::Locker locker(isolate_);
129 v8::HandleScope handles(isolate_);
130 v8::Local<v8::Context> context = v8::Context::New(isolate_);
131 return v8::Global<v8::Context>(isolate_, context);
Handle< JsObject > global_handle()
void AddPromise(Handle< JsPromise > promise, Handle< JsValue > value)
ReturnVal< JsValue > global_value()
static JsEngine * Instance()
void RemovePromise(Handle< JsPromise > promise)