@@ -42,6 +42,7 @@ struct napi_env__ {
4242 v8::Persistent<v8::ObjectTemplate> function_data_template;
4343 v8::Persistent<v8::ObjectTemplate> accessor_data_template;
4444 napi_extended_error_info last_error;
45+ int open_handle_scopes = 0 ;
4546};
4647
4748#define ENV_OBJECT_TEMPLATE (env, prefix, destination, field_count ) \
@@ -499,12 +500,16 @@ class CallbackWrapperBase : public CallbackWrapper {
499500 // Make sure any errors encountered last time we were in N-API are gone.
500501 napi_clear_last_error (env);
501502
503+ int open_handle_scopes = env->open_handle_scopes ;
504+
502505 napi_value result = cb (env, cbinfo_wrapper);
503506
504507 if (result != nullptr ) {
505508 this ->SetReturnValue (result);
506509 }
507510
511+ CHECK_EQ (env->open_handle_scopes , open_handle_scopes);
512+
508513 if (!env->last_exception .IsEmpty ()) {
509514 isolate->ThrowException (
510515 v8::Local<v8::Value>::New (isolate, env->last_exception ));
@@ -2580,6 +2585,7 @@ napi_status napi_open_handle_scope(napi_env env, napi_handle_scope* result) {
25802585
25812586 *result = v8impl::JsHandleScopeFromV8HandleScope (
25822587 new v8impl::HandleScopeWrapper (env->isolate ));
2588+ env->open_handle_scopes ++;
25832589 return napi_clear_last_error (env);
25842590}
25852591
@@ -2588,7 +2594,11 @@ napi_status napi_close_handle_scope(napi_env env, napi_handle_scope scope) {
25882594 // JS exceptions.
25892595 CHECK_ENV (env);
25902596 CHECK_ARG (env, scope);
2597+ if (env->open_handle_scopes == 0 ) {
2598+ return napi_handle_scope_mismatch;
2599+ }
25912600
2601+ env->open_handle_scopes --;
25922602 delete v8impl::V8HandleScopeFromJsHandleScope (scope);
25932603 return napi_clear_last_error (env);
25942604}
@@ -2603,6 +2613,7 @@ napi_status napi_open_escapable_handle_scope(
26032613
26042614 *result = v8impl::JsEscapableHandleScopeFromV8EscapableHandleScope (
26052615 new v8impl::EscapableHandleScopeWrapper (env->isolate ));
2616+ env->open_handle_scopes ++;
26062617 return napi_clear_last_error (env);
26072618}
26082619
@@ -2613,8 +2624,12 @@ napi_status napi_close_escapable_handle_scope(
26132624 // JS exceptions.
26142625 CHECK_ENV (env);
26152626 CHECK_ARG (env, scope);
2627+ if (env->open_handle_scopes == 0 ) {
2628+ return napi_handle_scope_mismatch;
2629+ }
26162630
26172631 delete v8impl::V8EscapableHandleScopeFromJsEscapableHandleScope (scope);
2632+ env->open_handle_scopes --;
26182633 return napi_clear_last_error (env);
26192634}
26202635
0 commit comments