#include #include #include "V8Instance.hpp" #include "../APIHelper.hpp" #include "../Logger.hpp" using namespace v8; V8Instance::V8Instance(std::shared_ptr ah) { this->ah = ah; create(); } V8Instance::~V8Instance() { clean_up(); } void V8Instance::create() { Isolate::CreateParams create_params; create_params.array_buffer_allocator = ArrayBuffer::Allocator::NewDefaultAllocator(); isolate = Isolate::New(create_params); isolate->Enter(); Logger::write("[v8] Created isolate", Logger::LogLevel::Debug); Isolate::Scope isolate_scope(isolate); HandleScope handle_scope(isolate); // set global context Local context = create_context(); context->Enter(); Context::Scope context_scope(context); Logger::write("[v8] Created context and context scope", Logger::LogLevel::Debug); } v8::Local V8Instance::create_context() { Local global = ObjectTemplate::New(isolate); // bind print() function Local self = External::New(isolate, (void *) this); global->Set(String::NewFromUtf8(isolate, "print", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, V8Instance::js_print, self)); Logger::write("[v8] Created global obj, linked print function", Logger::LogLevel::Debug); return Context::New(isolate, NULL, global); } void V8Instance::clean_up() { Logger::write("[v8] Cleaning up", Logger::LogLevel::Debug); isolate->Exit(); isolate->Dispose(); delete array_buffer_allocator; } void V8Instance::reload() { clean_up(); create(); } void V8Instance::exec_js(std::string js, std::string channel_id) { HandleScope handle_scope(isolate); Local context(isolate->GetCurrentContext()); Logger::write("[v8] Executing JS: " + js, Logger::LogLevel::Debug); Local source = String::NewFromUtf8(isolate, js.c_str(), NewStringType::kNormal).ToLocalChecked(); // compile Logger::write("[v8] Isolate nullptr? " + std::to_string(isolate == nullptr) + " Context empty? " + std::to_string(context.IsEmpty()), Logger::LogLevel::Debug); TryCatch compile_try_catch(isolate); Local