src: fix abort-on-uncaught-exception
This PR fixes 0af4c9ea so that node aborts at the right time when throwing an error and using --abort-on-uncaught-exception.
Basically, it wraps most node internal callbacks with:
if (!domain || domain.emittingTopLevelError)
runCallback();
else {
try {
runCallback();
} catch (err) {
process._fatalException(err);
}
}
so that V8 can abort properly in Isolate::Throw
if
--abort-on-uncaught-exception
was passed on the command line, and domain
can handle the error if one is active and not already in the top level
domain's error handler.
It also reverts 921f2de6 partially:
node::FatalException
does not abort anymore because at that time, it's
already too late.
It adds process._forceTickDone
, which is really a hack to allow
test-next-tick-error-spin.js
to pass and start the discussion. It's here to basically avoid an
infinite recursion when throwing in a domain from a nextTick callback,
and queuing the same callback on the next tick from the domain's error
handler.
This change is an alternative approach to #3036 for fixing #3035 (closed).
Fixes #3035 (closed).
/cc @nodejs/post-mortem