diff --git a/src/node.cc b/src/node.cc index bdae47ee6c8211..bd8248b2e3c9b4 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1274,6 +1274,7 @@ Local MakeCallback(Environment* env, if (tick_info->length() == 0) { tick_info->set_index(0); + return ret; } if (env->tick_callback_function()->Call(process, 0, nullptr).IsEmpty()) { diff --git a/test/parallel/test-no-enter-tickcallback.js b/test/parallel/test-no-enter-tickcallback.js new file mode 100644 index 00000000000000..e06628628955be --- /dev/null +++ b/test/parallel/test-no-enter-tickcallback.js @@ -0,0 +1,32 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +var allsGood = false; +var cntr = 0; + +process.on('exit', () => { + assert.ok(cntr > 0, '_tickDomainCallback was never called'); +}); + +/** + * This test relies upon the following internals to work as specified: + * - require('domain') causes node::Environment::set_tick_callback_function() + * to use process._tickDomainCallback() to process the nextTickQueue; + * replacing process._tickCallback(). + * - setImmediate() uses node::MakeCallback() instead of + * node::AsyncWrap::MakeCallback(). Otherwise the test will always pass. + * Have not found a way to verify that node::MakeCallback() is used. + */ +process._tickDomainCallback = function _tickDomainCallback() { + assert.ok(allsGood, '_tickDomainCallback should not have been called'); + cntr++; +}; + +setImmediate(common.mustCall(() => { + require('domain'); + setImmediate(common.mustCall(() => setImmediate(common.mustCall(() => { + allsGood = true; + process.nextTick(() => {}); + })))); +}));