11cb0ef41Sopenharmony_ci#include <assert.h> 21cb0ef41Sopenharmony_ci#include <node.h> 31cb0ef41Sopenharmony_ci 41cb0ef41Sopenharmony_ciusing node::Environment; 51cb0ef41Sopenharmony_ciusing node::MultiIsolatePlatform; 61cb0ef41Sopenharmony_ciusing v8::Context; 71cb0ef41Sopenharmony_ciusing v8::FunctionCallbackInfo; 81cb0ef41Sopenharmony_ciusing v8::HandleScope; 91cb0ef41Sopenharmony_ciusing v8::Isolate; 101cb0ef41Sopenharmony_ciusing v8::Local; 111cb0ef41Sopenharmony_ciusing v8::Locker; 121cb0ef41Sopenharmony_ciusing v8::MaybeLocal; 131cb0ef41Sopenharmony_ciusing v8::Object; 141cb0ef41Sopenharmony_ciusing v8::SharedArrayBuffer; 151cb0ef41Sopenharmony_ciusing v8::String; 161cb0ef41Sopenharmony_ciusing v8::Unlocker; 171cb0ef41Sopenharmony_ciusing v8::Value; 181cb0ef41Sopenharmony_ci 191cb0ef41Sopenharmony_civoid RunInSeparateIsolate(const FunctionCallbackInfo<Value>& args) { 201cb0ef41Sopenharmony_ci Isolate* parent_isolate = args.GetIsolate(); 211cb0ef41Sopenharmony_ci 221cb0ef41Sopenharmony_ci assert(args[0]->IsString()); 231cb0ef41Sopenharmony_ci String::Utf8Value code(parent_isolate, args[0]); 241cb0ef41Sopenharmony_ci assert(*code != nullptr); 251cb0ef41Sopenharmony_ci assert(args[1]->IsSharedArrayBuffer()); 261cb0ef41Sopenharmony_ci auto arg_bs = args[1].As<SharedArrayBuffer>()->GetBackingStore(); 271cb0ef41Sopenharmony_ci 281cb0ef41Sopenharmony_ci Environment* parent_env = 291cb0ef41Sopenharmony_ci node::GetCurrentEnvironment(parent_isolate->GetCurrentContext()); 301cb0ef41Sopenharmony_ci assert(parent_env != nullptr); 311cb0ef41Sopenharmony_ci MultiIsolatePlatform* platform = node::GetMultiIsolatePlatform(parent_env); 321cb0ef41Sopenharmony_ci assert(parent_env != nullptr); 331cb0ef41Sopenharmony_ci 341cb0ef41Sopenharmony_ci { 351cb0ef41Sopenharmony_ci Unlocker unlocker(parent_isolate); 361cb0ef41Sopenharmony_ci 371cb0ef41Sopenharmony_ci std::vector<std::string> errors; 381cb0ef41Sopenharmony_ci const std::vector<std::string> empty_args; 391cb0ef41Sopenharmony_ci auto setup = 401cb0ef41Sopenharmony_ci node::CommonEnvironmentSetup::Create(platform, 411cb0ef41Sopenharmony_ci &errors, 421cb0ef41Sopenharmony_ci empty_args, 431cb0ef41Sopenharmony_ci empty_args, 441cb0ef41Sopenharmony_ci node::EnvironmentFlags::kNoFlags); 451cb0ef41Sopenharmony_ci assert(setup); 461cb0ef41Sopenharmony_ci 471cb0ef41Sopenharmony_ci { 481cb0ef41Sopenharmony_ci Locker locker(setup->isolate()); 491cb0ef41Sopenharmony_ci Isolate::Scope isolate_scope(setup->isolate()); 501cb0ef41Sopenharmony_ci HandleScope handle_scope(setup->isolate()); 511cb0ef41Sopenharmony_ci Context::Scope context_scope(setup->context()); 521cb0ef41Sopenharmony_ci auto arg = SharedArrayBuffer::New(setup->isolate(), arg_bs); 531cb0ef41Sopenharmony_ci auto result = setup->context()->Global()->Set( 541cb0ef41Sopenharmony_ci setup->context(), 551cb0ef41Sopenharmony_ci v8::String::NewFromUtf8Literal(setup->isolate(), "arg"), 561cb0ef41Sopenharmony_ci arg); 571cb0ef41Sopenharmony_ci assert(!result.IsNothing()); 581cb0ef41Sopenharmony_ci 591cb0ef41Sopenharmony_ci MaybeLocal<Value> loadenv_ret = 601cb0ef41Sopenharmony_ci node::LoadEnvironment(setup->env(), *code); 611cb0ef41Sopenharmony_ci assert(!loadenv_ret.IsEmpty()); 621cb0ef41Sopenharmony_ci 631cb0ef41Sopenharmony_ci (void)node::SpinEventLoop(setup->env()); 641cb0ef41Sopenharmony_ci 651cb0ef41Sopenharmony_ci node::Stop(setup->env()); 661cb0ef41Sopenharmony_ci } 671cb0ef41Sopenharmony_ci } 681cb0ef41Sopenharmony_ci} 691cb0ef41Sopenharmony_ci 701cb0ef41Sopenharmony_civoid Initialize(Local<Object> exports, 711cb0ef41Sopenharmony_ci Local<Value> module, 721cb0ef41Sopenharmony_ci Local<Context> context) { 731cb0ef41Sopenharmony_ci NODE_SET_METHOD(exports, "runInSeparateIsolate", RunInSeparateIsolate); 741cb0ef41Sopenharmony_ci} 751cb0ef41Sopenharmony_ci 761cb0ef41Sopenharmony_ciNODE_MODULE_CONTEXT_AWARE(NODE_GYP_MODULE_NAME, Initialize) 77