lib: make isStackOverflowError() engine-agnostic

Assumption that stack overflow exception has name == "RangeError" is
v8-specific.  Updated logic to dynamically capture error name when
capturing error message.

PR-URL: https://github.com/nodejs/node/pull/19705
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Tiancheng "Timothy" Gu <timothygu99@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Mike Kaufman 2018-03-30 10:07:49 -07:00 committed by Rich Trott
parent 4d749e1052
commit cd5f353405

View File

@ -572,25 +572,29 @@ function dnsException(err, syscall, hostname) {
return ex; return ex;
} }
let MAX_STACK_MESSAGE; let maxStack_ErrorName;
let maxStack_ErrorMessage;
/** /**
* Returns true if `err` is a `RangeError` with an engine-specific message. * Returns true if `err.name` and `err.message` are equal to engine-specific
* values indicating max call stack size has been exceeded.
* "Maximum call stack size exceeded" in V8. * "Maximum call stack size exceeded" in V8.
* *
* @param {Error} err * @param {Error} err
* @returns {boolean} * @returns {boolean}
*/ */
function isStackOverflowError(err) { function isStackOverflowError(err) {
if (MAX_STACK_MESSAGE === undefined) { if (maxStack_ErrorMessage === undefined) {
try { try {
function overflowStack() { overflowStack(); } function overflowStack() { overflowStack(); }
overflowStack(); overflowStack();
} catch (err) { } catch (err) {
MAX_STACK_MESSAGE = err.message; maxStack_ErrorMessage = err.message;
maxStack_ErrorName = err.name;
} }
} }
return err.name === 'RangeError' && err.message === MAX_STACK_MESSAGE; return err.name === maxStack_ErrorName &&
err.message === maxStack_ErrorMessage;
} }
module.exports = exports = { module.exports = exports = {