@@ -158,23 +158,26 @@ struct napi_env__ {
158158 (out) = v8::type::New ((buffer), (byte_offset), (length)); \
159159 } while (0 )
160160
161- #define NAPI_CALL_INTO_MODULE (env, call, handle_exception ) \
162- do { \
163- int open_handle_scopes = (env)->open_handle_scopes ; \
164- int open_callback_scopes = (env)->open_callback_scopes ; \
165- napi_clear_last_error ((env)); \
166- call; \
167- CHECK_EQ ((env)->open_handle_scopes , open_handle_scopes); \
168- CHECK_EQ ((env)->open_callback_scopes , open_callback_scopes); \
169- if (!(env)->last_exception .IsEmpty ()) { \
170- handle_exception ( \
171- v8::Local<v8::Value>::New ((env)->isolate , (env)->last_exception )); \
172- (env)->last_exception .Reset (); \
173- } \
174- } while (0 )
161+ template <typename T, typename U>
162+ void NapiCallIntoModule (napi_env env, T&& call, U&& handle_exception) {
163+ int open_handle_scopes = env->open_handle_scopes ;
164+ int open_callback_scopes = env->open_callback_scopes ;
165+ napi_clear_last_error (env);
166+ call ();
167+ CHECK_EQ (env->open_handle_scopes , open_handle_scopes);
168+ CHECK_EQ (env->open_callback_scopes , open_callback_scopes);
169+ if (!env->last_exception .IsEmpty ()) {
170+ handle_exception (env->last_exception .Get (env->isolate ));
171+ env->last_exception .Reset ();
172+ }
173+ }
175174
176- #define NAPI_CALL_INTO_MODULE_THROW (env, call ) \
177- NAPI_CALL_INTO_MODULE ((env), call, (env)->isolate->ThrowException)
175+ template <typename T>
176+ void NapiCallIntoModuleThrow (napi_env env, T&& call) {
177+ NapiCallIntoModule (env, call, [&](v8::Local<v8::Value> value) {
178+ env->isolate ->ThrowException (value);
179+ });
180+ }
178181
179182namespace {
180183namespace v8impl {
@@ -354,11 +357,12 @@ class Finalizer {
354357 static void FinalizeBufferCallback (char * data, void * hint) {
355358 Finalizer* finalizer = static_cast <Finalizer*>(hint);
356359 if (finalizer->_finalize_callback != nullptr ) {
357- NAPI_CALL_INTO_MODULE_THROW (finalizer->_env ,
360+ NapiCallIntoModuleThrow (finalizer->_env , [&]() {
358361 finalizer->_finalize_callback (
359362 finalizer->_env ,
360363 data,
361- finalizer->_finalize_hint ));
364+ finalizer->_finalize_hint );
365+ });
362366 }
363367
364368 Delete (finalizer);
@@ -493,11 +497,12 @@ class Reference : private Finalizer {
493497 napi_env env = reference->_env ;
494498
495499 if (reference->_finalize_callback != nullptr ) {
496- NAPI_CALL_INTO_MODULE_THROW (env,
500+ NapiCallIntoModuleThrow (env, [&]() {
497501 reference->_finalize_callback (
498502 reference->_env ,
499503 reference->_finalize_data ,
500- reference->_finalize_hint ));
504+ reference->_finalize_hint );
505+ });
501506 }
502507
503508 // this is safe because if a request to delete the reference
@@ -612,7 +617,7 @@ class CallbackWrapperBase : public CallbackWrapper {
612617 napi_callback cb = _bundle->*FunctionField;
613618
614619 napi_value result;
615- NAPI_CALL_INTO_MODULE_THROW (env, result = cb (env, cbinfo_wrapper));
620+ NapiCallIntoModuleThrow (env, [&]() { result = cb (env, cbinfo_wrapper); } );
616621
617622 if (result != nullptr ) {
618623 this ->SetReturnValue (result);
@@ -1309,8 +1314,9 @@ void napi_module_register_by_symbol(v8::Local<v8::Object> exports,
13091314 napi_env env = v8impl::GetEnv (context);
13101315
13111316 napi_value _exports;
1312- NAPI_CALL_INTO_MODULE_THROW (env,
1313- _exports = init (env, v8impl::JsValueFromV8LocalValue (exports)));
1317+ NapiCallIntoModuleThrow (env, [&]() {
1318+ _exports = init (env, v8impl::JsValueFromV8LocalValue (exports));
1319+ });
13141320
13151321 // If register function returned a non-null exports object different from
13161322 // the exports object we passed it, set that as the "exports" property of
@@ -3941,14 +3947,14 @@ class Work : public node::AsyncResource, public node::ThreadPoolWork {
39413947 // stored.
39423948 napi_env env = _env;
39433949
3944- NAPI_CALL_INTO_MODULE (env,
3945- _complete (_env, ConvertUVErrorCode (status), _data),
3946- [env] (v8::Local<v8::Value> local_err) {
3947- // If there was an unhandled exception in the complete callback,
3948- // report it as a fatal exception. (There is no JavaScript on the
3949- // callstack that can possibly handle it.)
3950- v8impl::trigger_fatal_exception (env, local_err);
3951- });
3950+ NapiCallIntoModule (env, [&]() {
3951+ _complete (_env, ConvertUVErrorCode (status), _data);
3952+ }, [env](v8::Local<v8::Value> local_err) {
3953+ // If there was an unhandled exception in the complete callback,
3954+ // report it as a fatal exception. (There is no JavaScript on the
3955+ // callstack that can possibly handle it.)
3956+ v8impl::trigger_fatal_exception (env, local_err);
3957+ });
39523958
39533959 // Note: Don't access `work` after this point because it was
39543960 // likely deleted by the complete callback.
0 commit comments