| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent b9d21e5 commit 39063b3
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -32,21 +32,30 @@ namespace v8impl { | |||
| 32 | 32 | ||
| 33 | 33 | namespace { | |
| 34 | 34 | ||
| 35 | - class BufferFinalizer: private Finalizer { | ||
| 35 | + class BufferFinalizer : private Finalizer { | ||
| 36 | 36 | public: | |
| 37 | 37 | // node::Buffer::FreeCallback | |
| 38 | 38 | static void FinalizeBufferCallback(char* data, void* hint) { | |
| 39 | 39 | BufferFinalizer* finalizer = static_cast<BufferFinalizer*>(hint); | |
| 40 | - if (finalizer->_finalize_callback != nullptr) { | ||
| 41 | - NapiCallIntoModuleThrow(finalizer->_env, [&]() { | ||
| 42 | - finalizer->_finalize_callback( | ||
| 43 | - finalizer->_env, | ||
| 44 | - data, | ||
| 45 | - finalizer->_finalize_hint); | ||
| 46 | - }); | ||
| 47 | - } | ||
| 40 | + finalizer->_finalize_data = data; | ||
| 41 | + static_cast<node_napi_env>(finalizer->_env)->node_env() | ||
| 42 | + ->SetImmediate([](node::Environment* env, void* hint) { | ||
| 43 | + BufferFinalizer* finalizer = static_cast<BufferFinalizer*>(hint); | ||
| 44 | + | ||
| 45 | + if (finalizer->_finalize_callback != nullptr) { | ||
| 46 | + v8::HandleScope handle_scope(finalizer->_env->isolate); | ||
| 47 | + v8::Context::Scope context_scope(finalizer->_env->context()); | ||
| 48 | + | ||
| 49 | + NapiCallIntoModuleThrow(finalizer->_env, [&]() { | ||
| 50 | + finalizer->_finalize_callback( | ||
| 51 | + finalizer->_env, | ||
| 52 | + finalizer->_finalize_data, | ||
| 53 | + finalizer->_finalize_hint); | ||
| 54 | + }); | ||
| 55 | + } | ||
| 48 | 56 | ||
| 49 | - Delete(finalizer); | ||
| 57 | + Delete(finalizer); | ||
| 58 | + }, hint); | ||
| 50 | 59 | } | |
| 51 | 60 | }; | |
| 52 | 61 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -4,18 +4,25 @@ | |||
| 4 | 4 | const common = require('../../common'); | |
| 5 | 5 | const binding = require(`./build/${common.buildType}/test_buffer`); | |
| 6 | 6 | const assert = require('assert'); | |
| 7 | + const setImmediatePromise = require('util').promisify(setImmediate); | ||
| 7 | 8 | ||
| 8 | - assert.strictEqual(binding.newBuffer().toString(), binding.theText); | ||
| 9 | - assert.strictEqual(binding.newExternalBuffer().toString(), binding.theText); | ||
| 10 | - console.log('gc1'); | ||
| 11 | - global.gc(); | ||
| 12 | - assert.strictEqual(binding.getDeleterCallCount(), 1); | ||
| 13 | - assert.strictEqual(binding.copyBuffer().toString(), binding.theText); | ||
| 9 | + (async function() { | ||
| 10 | + assert.strictEqual(binding.newBuffer().toString(), binding.theText); | ||
| 11 | + assert.strictEqual(binding.newExternalBuffer().toString(), binding.theText); | ||
| 12 | + console.log('gc1'); | ||
| 13 | + global.gc(); | ||
| 14 | + assert.strictEqual(binding.getDeleterCallCount(), 0); | ||
| 15 | + await setImmediatePromise(); | ||
| 16 | + assert.strictEqual(binding.getDeleterCallCount(), 1); | ||
| 17 | + assert.strictEqual(binding.copyBuffer().toString(), binding.theText); | ||
| 14 | 18 | ||
| 15 | - let buffer = binding.staticBuffer(); | ||
| 16 | - assert.strictEqual(binding.bufferHasInstance(buffer), true); | ||
| 17 | - assert.strictEqual(binding.bufferInfo(buffer), true); | ||
| 18 | - buffer = null; | ||
| 19 | - global.gc(); | ||
| 20 | - console.log('gc2'); | ||
| 21 | - assert.strictEqual(binding.getDeleterCallCount(), 2); | ||
| 19 | + let buffer = binding.staticBuffer(); | ||
| 20 | + assert.strictEqual(binding.bufferHasInstance(buffer), true); | ||
| 21 | + assert.strictEqual(binding.bufferInfo(buffer), true); | ||
| 22 | + buffer = null; | ||
| 23 | + global.gc(); | ||
| 24 | + assert.strictEqual(binding.getDeleterCallCount(), 1); | ||
| 25 | + await setImmediatePromise(); | ||
| 26 | + console.log('gc2'); | ||
| 27 | + assert.strictEqual(binding.getDeleterCallCount(), 2); | ||
| 28 | + })().then(common.mustCall()); | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -9,7 +9,10 @@ const test_exception = require(`./build/${common.buildType}/test_exception`); | |||
| 9 | 9 | function testFinalize(binding) { | |
| 10 | 10 | let x = test_exception[binding](); | |
| 11 | 11 | x = null; | |
| 12 | - assert.throws(() => { global.gc(); }, /Error during Finalize/); | ||
| 12 | + global.gc(); | ||
| 13 | + process.on('uncaughtException', (err) => { | ||
| 14 | + assert.strictEqual(err.message, 'Error during Finalize'); | ||
| 15 | + }); | ||
| 13 | 16 | ||
| 14 | 17 | // To assuage the linter's concerns. | |
| 15 | 18 | (function() {})(x); | |
| Back | FazBrowse Home | New Git URL |
0 commit comments