summaryrefslogtreecommitdiff
path: root/src/node_api.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/node_api.cc')
-rw-r--r--src/node_api.cc29
1 files changed, 19 insertions, 10 deletions
diff --git a/src/node_api.cc b/src/node_api.cc
index 91e6a14cdc..c4d8634286 100644
--- a/src/node_api.cc
+++ b/src/node_api.cc
@@ -32,21 +32,30 @@ namespace v8impl {
namespace {
-class BufferFinalizer: private Finalizer {
+class BufferFinalizer : private Finalizer {
public:
// node::Buffer::FreeCallback
static void FinalizeBufferCallback(char* data, void* hint) {
BufferFinalizer* finalizer = static_cast<BufferFinalizer*>(hint);
- if (finalizer->_finalize_callback != nullptr) {
- NapiCallIntoModuleThrow(finalizer->_env, [&]() {
- finalizer->_finalize_callback(
- finalizer->_env,
- data,
- finalizer->_finalize_hint);
- });
- }
+ finalizer->_finalize_data = data;
+ static_cast<node_napi_env>(finalizer->_env)->node_env()
+ ->SetImmediate([](node::Environment* env, void* hint) {
+ BufferFinalizer* finalizer = static_cast<BufferFinalizer*>(hint);
+
+ if (finalizer->_finalize_callback != nullptr) {
+ v8::HandleScope handle_scope(finalizer->_env->isolate);
+ v8::Context::Scope context_scope(finalizer->_env->context());
+
+ NapiCallIntoModuleThrow(finalizer->_env, [&]() {
+ finalizer->_finalize_callback(
+ finalizer->_env,
+ finalizer->_finalize_data,
+ finalizer->_finalize_hint);
+ });
+ }
- Delete(finalizer);
+ Delete(finalizer);
+ }, hint);
}
};