@@ -48,6 +48,7 @@ struct napi_env__ {
48
48
v8::Persistent<v8::ObjectTemplate> accessor_data_template;
49
49
bool has_instance_available;
50
50
napi_extended_error_info last_error;
51
+ int open_handle_scopes = 0 ;
51
52
};
52
53
53
54
#define ENV_OBJECT_TEMPLATE (env, prefix, destination, field_count ) \
@@ -508,12 +509,16 @@ class CallbackWrapperBase : public CallbackWrapper {
508
509
// Make sure any errors encountered last time we were in N-API are gone.
509
510
napi_clear_last_error (env);
510
511
512
+ int open_handle_scopes = env->open_handle_scopes ;
513
+
511
514
napi_value result = cb (env, cbinfo_wrapper);
512
515
513
516
if (result != nullptr ) {
514
517
this ->SetReturnValue (result);
515
518
}
516
519
520
+ CHECK_EQ (env->open_handle_scopes , open_handle_scopes);
521
+
517
522
if (!env->last_exception .IsEmpty ()) {
518
523
isolate->ThrowException (
519
524
v8::Local<v8::Value>::New (isolate, env->last_exception ));
@@ -2587,6 +2592,7 @@ napi_status napi_open_handle_scope(napi_env env, napi_handle_scope* result) {
2587
2592
2588
2593
*result = v8impl::JsHandleScopeFromV8HandleScope (
2589
2594
new v8impl::HandleScopeWrapper (env->isolate ));
2595
+ env->open_handle_scopes ++;
2590
2596
return napi_clear_last_error (env);
2591
2597
}
2592
2598
@@ -2595,7 +2601,11 @@ napi_status napi_close_handle_scope(napi_env env, napi_handle_scope scope) {
2595
2601
// JS exceptions.
2596
2602
CHECK_ENV (env);
2597
2603
CHECK_ARG (env, scope);
2604
+ if (env->open_handle_scopes == 0 ) {
2605
+ return napi_handle_scope_mismatch;
2606
+ }
2598
2607
2608
+ env->open_handle_scopes --;
2599
2609
delete v8impl::V8HandleScopeFromJsHandleScope (scope);
2600
2610
return napi_clear_last_error (env);
2601
2611
}
@@ -2610,6 +2620,7 @@ napi_status napi_open_escapable_handle_scope(
2610
2620
2611
2621
*result = v8impl::JsEscapableHandleScopeFromV8EscapableHandleScope (
2612
2622
new v8impl::EscapableHandleScopeWrapper (env->isolate ));
2623
+ env->open_handle_scopes ++;
2613
2624
return napi_clear_last_error (env);
2614
2625
}
2615
2626
@@ -2620,8 +2631,12 @@ napi_status napi_close_escapable_handle_scope(
2620
2631
// JS exceptions.
2621
2632
CHECK_ENV (env);
2622
2633
CHECK_ARG (env, scope);
2634
+ if (env->open_handle_scopes == 0 ) {
2635
+ return napi_handle_scope_mismatch;
2636
+ }
2623
2637
2624
2638
delete v8impl::V8EscapableHandleScopeFromJsEscapableHandleScope (scope);
2639
+ env->open_handle_scopes --;
2625
2640
return napi_clear_last_error (env);
2626
2641
}
2627
2642
0 commit comments