summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/node_api.cc15
-rw-r--r--src/node_api_types.h3
2 files changed, 17 insertions, 1 deletions
diff --git a/src/node_api.cc b/src/node_api.cc
index ea9bcfb980..1c3d0915ad 100644
--- a/src/node_api.cc
+++ b/src/node_api.cc
@@ -42,6 +42,7 @@ struct napi_env__ {
v8::Persistent<v8::ObjectTemplate> function_data_template;
v8::Persistent<v8::ObjectTemplate> accessor_data_template;
napi_extended_error_info last_error;
+ int open_handle_scopes = 0;
};
#define ENV_OBJECT_TEMPLATE(env, prefix, destination, field_count) \
@@ -499,12 +500,16 @@ class CallbackWrapperBase : public CallbackWrapper {
// Make sure any errors encountered last time we were in N-API are gone.
napi_clear_last_error(env);
+ int open_handle_scopes = env->open_handle_scopes;
+
napi_value result = cb(env, cbinfo_wrapper);
if (result != nullptr) {
this->SetReturnValue(result);
}
+ CHECK_EQ(env->open_handle_scopes, open_handle_scopes);
+
if (!env->last_exception.IsEmpty()) {
isolate->ThrowException(
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) {
*result = v8impl::JsHandleScopeFromV8HandleScope(
new v8impl::HandleScopeWrapper(env->isolate));
+ env->open_handle_scopes++;
return napi_clear_last_error(env);
}
@@ -2588,7 +2594,11 @@ napi_status napi_close_handle_scope(napi_env env, napi_handle_scope scope) {
// JS exceptions.
CHECK_ENV(env);
CHECK_ARG(env, scope);
+ if (env->open_handle_scopes == 0) {
+ return napi_handle_scope_mismatch;
+ }
+ env->open_handle_scopes--;
delete v8impl::V8HandleScopeFromJsHandleScope(scope);
return napi_clear_last_error(env);
}
@@ -2603,6 +2613,7 @@ napi_status napi_open_escapable_handle_scope(
*result = v8impl::JsEscapableHandleScopeFromV8EscapableHandleScope(
new v8impl::EscapableHandleScopeWrapper(env->isolate));
+ env->open_handle_scopes++;
return napi_clear_last_error(env);
}
@@ -2613,8 +2624,12 @@ napi_status napi_close_escapable_handle_scope(
// JS exceptions.
CHECK_ENV(env);
CHECK_ARG(env, scope);
+ if (env->open_handle_scopes == 0) {
+ return napi_handle_scope_mismatch;
+ }
delete v8impl::V8EscapableHandleScopeFromJsEscapableHandleScope(scope);
+ env->open_handle_scopes--;
return napi_clear_last_error(env);
}
diff --git a/src/node_api_types.h b/src/node_api_types.h
index 574cb6ff98..230c1f4ae3 100644
--- a/src/node_api_types.h
+++ b/src/node_api_types.h
@@ -69,7 +69,8 @@ typedef enum {
napi_generic_failure,
napi_pending_exception,
napi_cancelled,
- napi_escape_called_twice
+ napi_escape_called_twice,
+ napi_handle_scope_mismatch
} napi_status;
typedef napi_value (*napi_callback)(napi_env env,