diff --git a/static_core/plugins/ets/runtime/napi/ets_napi.h b/static_core/plugins/ets/runtime/napi/ets_napi.h index 03971e06f5f4b65cf80be22ddbd462a0a9bf425c..de9e6d529994de7fe3e17df366354a7ed939ee03 100644 --- a/static_core/plugins/ets/runtime/napi/ets_napi.h +++ b/static_core/plugins/ets/runtime/napi/ets_napi.h @@ -454,7 +454,8 @@ typedef enum { ETS_RUN_GC_IN_PLACE, ETS_INTERPRETER_TYPE, ETS_NATIVE_LIBRARY_PATH, - ETS_VERIFICATION_MODE + ETS_VERIFICATION_MODE, + ETS_INTEROP_JSENV, } EtsOptionType; typedef struct EtsVMOption { diff --git a/static_core/plugins/ets/runtime/napi/ets_napi_invoke_interface.cpp b/static_core/plugins/ets/runtime/napi/ets_napi_invoke_interface.cpp index 3fa4bc73bbd6e49ede01fa5124e1bfb8e78e424f..2d96607d76963aafb11654ae3ac5cc5dac3d583e 100644 --- a/static_core/plugins/ets/runtime/napi/ets_napi_invoke_interface.cpp +++ b/static_core/plugins/ets/runtime/napi/ets_napi_invoke_interface.cpp @@ -272,6 +272,10 @@ static void ParseOptionsHelper(RuntimeOptions &runtimeOptions, ParsedOptions &pa case EtsOptionType::ETS_VERIFICATION_MODE: runtimeOptions.SetVerificationMode(extraStr); break; + case EtsOptionType::ETS_INTEROP_JSENV: + runtimeOptions.interopJSEnv = o.extraInfo; + break; + default: LOG(ERROR, RUNTIME) << "No such option"; } @@ -296,6 +300,27 @@ static bool ParseOptions(const EtsVMInitArgs *args, RuntimeOptions &runtimeOptio return true; } +static bool RegisterTimerModule(napi_env jsEnv) +{ + EtsVM *vm = nullptr; + ets_size count = 0; + ETS_GetCreatedVMs(&vm, 1, &count); + if (count != 1) { + LogError("No one VM is created"); + return false; + } + EtsEnv *etsEnv = nullptr; + vm->GetEnv(&etsEnv, ETS_NAPI_VERSION_1_0); + return TimerModule::Init(etsEnv, jsEnv); +} + +static void RegisterEventLoopModule() +{ + auto coro = EtsCoroutine::GetCurrent(); + ASSERT(coro == coro->GetPandaVM()->GetCoroutineManager()->GetMainThread()); + coro->GetPandaVM()->CreateCallbackPosterFactory(); +} + extern "C" ETS_EXPORT ets_int ETS_CreateVM(EtsVM **pVm, EtsEnv **pEnv, EtsVMInitArgs *vmArgs) { trace::ScopedTrace scopedTrace(__FUNCTION__); @@ -320,6 +345,19 @@ extern "C" ETS_EXPORT ets_int ETS_CreateVM(EtsVM **pVm, EtsEnv **pEnv, EtsVMInit return ETS_ERR; } + if (runtimeOptions.interopJSEnv != nullptr) { + // TODO: import these functionality from lib_ets_interop_js_napi.so for dedupliation + bool res = RegisterTimerModule(env); + RegisterEventLoopModule(); + if (res) { + auto coro = EtsCoroutine::GetCurrent(); + ScopedManagedCodeThread scoped(coro); + napi_add_env_cleanup_hook( + env, [](void *) { DestroyRuntime(); }, nullptr); + InteropCtx::Init(coro, env); + } + } + ASSERT(Runtime::GetCurrent() != nullptr); auto coroutine = EtsCoroutine::GetCurrent(); diff --git a/static_core/runtime/include/runtime_options.h b/static_core/runtime/include/runtime_options.h index a9ab544c3a28c1d556724fd032b879e74cce4a66..224c2998c7ee464b18c7a4b8826a2a7da37c0c8a 100644 --- a/static_core/runtime/include/runtime_options.h +++ b/static_core/runtime/include/runtime_options.h @@ -213,6 +213,8 @@ public: SetBootIntrinsicSpaces(loadRuntimes); } } + // FixMe: replace with private + const void *interopJSEnv; private: // Fix default value for possible missing plugins.