From cdca219de68ca9f0d73f6a004e7e0fd51e71a50a Mon Sep 17 00:00:00 2001 From: Jinho Bang Date: Tue, 2 Oct 2018 10:10:10 +0900 Subject: [PATCH] Implement CallbackScope class This is a wrapper class to support the following N-APIs. - napi_open_callback_scope() - napi_close_callback_scope() Refs: https://nodejs.org/api/n-api.html#n_api_napi_open_callback_scope --- napi-inl.h | 25 +++++++++++++++++++++++++ napi.h | 15 +++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/napi-inl.h b/napi-inl.h index aead8b9ce..d4b85fc0f 100644 --- a/napi-inl.h +++ b/napi-inl.h @@ -3288,6 +3288,31 @@ inline Value EscapableHandleScope::Escape(napi_value escapee) { return Value(_env, result); } +//////////////////////////////////////////////////////////////////////////////// +// CallbackScope class +//////////////////////////////////////////////////////////////////////////////// + +inline CallbackScope::CallbackScope( + napi_env env, napi_callback_scope scope) : _env(env), _scope(scope) { +} + +inline CallbackScope::CallbackScope(napi_env env) : _env(env) { + napi_status status = napi_open_callback_scope(_env, nullptr, nullptr, &_scope); + NAPI_THROW_IF_FAILED_VOID(_env, status); +} + +inline CallbackScope::~CallbackScope() { + napi_close_callback_scope(_env, _scope); +} + +inline CallbackScope::operator napi_callback_scope() const { + return _scope; +} + +inline Napi::Env CallbackScope::Env() const { + return Napi::Env(_env); +} + //////////////////////////////////////////////////////////////////////////////// // AsyncContext class //////////////////////////////////////////////////////////////////////////////// diff --git a/napi.h b/napi.h index ed86272c3..7ae0a6630 100644 --- a/napi.h +++ b/napi.h @@ -1597,6 +1597,21 @@ namespace Napi { napi_escapable_handle_scope _scope; }; + class CallbackScope { + public: + CallbackScope(napi_env env, napi_callback_scope scope); + explicit CallbackScope(napi_env env); + virtual ~CallbackScope(); + + operator napi_callback_scope() const; + + Napi::Env Env() const; + + private: + napi_env _env; + napi_callback_scope _scope; + }; + class AsyncContext { public: explicit AsyncContext(napi_env env, const char* resource_name);