diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index 9569b497a4e95b7befd9c5c256b7d7a257c0fab2..1b68fbb421d8ea5a8e854c893acb3e58715f1421 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -1672,6 +1672,24 @@ OH_JSVM_CreateVM(const JSVM_CreateVMOptions* options, JSVM_VM* result) { return JSVM_OK; } +JSVM_Status OH_JSVM_SetMicrotaskPolicy(JSVM_VM vm, + JSVM_MicrotaskPolicy policy) { + static constexpr v8::MicrotasksPolicy converter[] = { + v8::MicrotasksPolicy::kExplicit, + v8::MicrotasksPolicy::kAuto + }; + constexpr size_t policyCount = node::arraysize(converter); + + if (!vm || policy >= policyCount) { + return JSVM_INVALID_ARG; + } + + auto isolate = reinterpret_cast(vm); + isolate->SetMicrotasksPolicy(converter[policy]); + + return JSVM_OK; +} + JSVM_Status JSVM_CDECL OH_JSVM_DestroyVM(JSVM_VM vm) { if (vm == nullptr) { diff --git a/src/jsvm.h b/src/jsvm.h index 3d87e7ec6517da1e0f31cc7182e13ffe26a4b030..95ffabed4d70693d4fb650dcb57827f4bb432cc8 100644 --- a/src/jsvm.h +++ b/src/jsvm.h @@ -341,6 +341,18 @@ JSVM_EXTERN JSVM_Status OH_JSVM_Init(const JSVM_InitOptions* options); JSVM_EXTERN JSVM_Status OH_JSVM_CreateVM(const JSVM_CreateVMOptions* options, JSVM_VM* result); +/** + * @brief This function controls how Microtasks are invoked of the vm. If the method is not + * called, the default microtask policy of vm is JSVM_MicrotaskPolicy::JSVM_MICROTASK_AUTO. + * + * @param vm The VM instance to set mircrotasks policy. + * @param policy Policy for running microtasks. + * @return Returns JSVM_OK if the API succeeded. + * @since 16 + */ +JSVM_EXTERN JSVM_Status OH_JSVM_SetMicrotaskPolicy(JSVM_VM vm, + JSVM_MicrotaskPolicy policy); + /** * @brief Destroys VM instance. * diff --git a/src/jsvm_types.h b/src/jsvm_types.h index 7d0d88ec93f72e3f19513396f214fd39c3f97169..d7ce91181531987af6ed3d97d80c9ddeb147da46 100644 --- a/src/jsvm_types.h +++ b/src/jsvm_types.h @@ -718,6 +718,17 @@ typedef enum { JSVM_CACHE_TYPE_WASM, } JSVM_CacheType; +/** + * @brief Microtask policies of JSVM. +typedef enum { + /** Microtasks are invoked with the OH_JSVM_PerformMicrotaskCheckpoint() method. */ + JSVM_MICROTASK_EXPLICIT = 0, + /** Microtasks are invoked when the script call depth decrements to zero. + * Default mode. + */ + JSVM_MICROTASK_AUTO, +} JSVM_MicrotaskPolicy; + /** * @brief compile profile passed with JSVM_COMPILE_COMPILE_PROFILE * @@ -771,7 +782,6 @@ typedef enum { } JSVM_InitializedFlag; /** @} */ - /** * @brief Trace category for jsvm internal trace events. *