summaryrefslogtreecommitdiff
path: root/src/node_api.cc
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2018-02-21 15:24:18 +0100
committerBen Noordhuis <info@bnoordhuis.nl>2018-02-21 15:24:18 +0100
commit992703f2b50f6b3483e9b930737d177b9e01256d (patch)
tree7d9b2752b6021d7653d426bbebdc80a437624a47 /src/node_api.cc
parente53275d819fb21d4bb15a27a714f134551233cf9 (diff)
downloadnode-new-992703f2b50f6b3483e9b930737d177b9e01256d.tar.gz
src: prevent persistent handle resource leaks
Replace v8::Persistent with node::Persistent, a specialization that resets the persistent handle on destruction. Prevents accidental resource leaks when forgetting to call .Reset() manually. I'm fairly confident this commit fixes a number of resource leaks that have gone undiagnosed so far. PR-URL: https://github.com/nodejs/node/pull/18656 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Diffstat (limited to 'src/node_api.cc')
-rw-r--r--src/node_api.cc26
1 files changed, 13 insertions, 13 deletions
diff --git a/src/node_api.cc b/src/node_api.cc
index 2c5f3066f7..7b0e110579 100644
--- a/src/node_api.cc
+++ b/src/node_api.cc
@@ -38,10 +38,10 @@ struct napi_env__ {
accessor_data_template.Reset();
}
v8::Isolate* isolate;
- v8::Persistent<v8::Value> last_exception;
- v8::Persistent<v8::ObjectTemplate> wrap_template;
- v8::Persistent<v8::ObjectTemplate> function_data_template;
- v8::Persistent<v8::ObjectTemplate> accessor_data_template;
+ node::Persistent<v8::Value> last_exception;
+ node::Persistent<v8::ObjectTemplate> wrap_template;
+ node::Persistent<v8::ObjectTemplate> function_data_template;
+ node::Persistent<v8::ObjectTemplate> accessor_data_template;
napi_extended_error_info last_error;
int open_handle_scopes = 0;
int open_callback_scopes = 0;
@@ -274,13 +274,13 @@ static_assert(sizeof(v8::Local<v8::Value>) == sizeof(napi_value),
"Cannot convert between v8::Local<v8::Value> and napi_value");
static
-napi_deferred JsDeferredFromV8Persistent(v8::Persistent<v8::Value>* local) {
+napi_deferred JsDeferredFromNodePersistent(node::Persistent<v8::Value>* local) {
return reinterpret_cast<napi_deferred>(local);
}
static
-v8::Persistent<v8::Value>* V8PersistentFromJsDeferred(napi_deferred local) {
- return reinterpret_cast<v8::Persistent<v8::Value>*>(local);
+node::Persistent<v8::Value>* NodePersistentFromJsDeferred(napi_deferred local) {
+ return reinterpret_cast<node::Persistent<v8::Value>*>(local);
}
static
@@ -360,7 +360,7 @@ class Finalizer {
void* _finalize_hint;
};
-// Wrapper around v8::Persistent that implements reference counting.
+// Wrapper around node::Persistent that implements reference counting.
class Reference : private Finalizer {
private:
Reference(napi_env env,
@@ -470,7 +470,7 @@ class Reference : private Finalizer {
}
}
- v8::Persistent<v8::Value> _persistent;
+ node::Persistent<v8::Value> _persistent;
uint32_t _refcount;
bool _delete_self;
};
@@ -846,8 +846,8 @@ napi_status ConcludeDeferred(napi_env env,
CHECK_ARG(env, result);
v8::Local<v8::Context> context = env->isolate->GetCurrentContext();
- v8::Persistent<v8::Value>* deferred_ref =
- V8PersistentFromJsDeferred(deferred);
+ node::Persistent<v8::Value>* deferred_ref =
+ NodePersistentFromJsDeferred(deferred);
v8::Local<v8::Value> v8_deferred =
v8::Local<v8::Value>::New(env->isolate, *deferred_ref);
@@ -3493,10 +3493,10 @@ napi_status napi_create_promise(napi_env env,
CHECK_MAYBE_EMPTY(env, maybe, napi_generic_failure);
auto v8_resolver = maybe.ToLocalChecked();
- auto v8_deferred = new v8::Persistent<v8::Value>();
+ auto v8_deferred = new node::Persistent<v8::Value>();
v8_deferred->Reset(env->isolate, v8_resolver);
- *deferred = v8impl::JsDeferredFromV8Persistent(v8_deferred);
+ *deferred = v8impl::JsDeferredFromNodePersistent(v8_deferred);
*promise = v8impl::JsValueFromV8LocalValue(v8_resolver->GetPromise());
return GET_RETURN_STATUS(env);
}