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