From f4cfbf4c9e397572368e34f5c99a1cc05e3ccf09 Mon Sep 17 00:00:00 2001 From: Anto Aravinth Date: Sun, 10 Feb 2019 11:33:40 +0530 Subject: [PATCH] process: move setup of process warnings into node.js To clarify the side effects and conditions of the warning setup during bootstrap. PR-URL: https://github.com/nodejs/node/pull/25263 Reviewed-By: Gus Caplan Reviewed-By: Anna Henningsen Reviewed-By: Minwoo Jung Backport-PR-URL: https://github.com/nodejs/node/pull/26025 --- lib/internal/bootstrap/node.js | 10 ++- lib/internal/process/warning.js | 149 ++++++++++++++++---------------- 2 files changed, 83 insertions(+), 76 deletions(-) diff --git a/lib/internal/bootstrap/node.js b/lib/internal/bootstrap/node.js index 45cae2ac59fd4f..27eb50f8d60ebf 100644 --- a/lib/internal/bootstrap/node.js +++ b/lib/internal/bootstrap/node.js @@ -112,7 +112,15 @@ function startup() { process.exit = wrapped.exit; } - NativeModule.require('internal/process/warning').setup(); + const { + onWarning, + emitWarning + } = NativeModule.require('internal/process/warning'); + if (!process.noProcessWarnings && process.env.NODE_NO_WARNINGS !== '1') { + process.on('warning', onWarning); + } + process.emitWarning = emitWarning; + const { nextTick, runNextTicks diff --git a/lib/internal/process/warning.js b/lib/internal/process/warning.js index 9416f15383b088..eb90a7092959d8 100644 --- a/lib/internal/process/warning.js +++ b/lib/internal/process/warning.js @@ -3,8 +3,6 @@ const prefix = `(${process.release.name}:${process.pid}) `; const { ERR_INVALID_ARG_TYPE } = require('internal/errors').codes; -exports.setup = setupProcessWarnings; - let options; function lazyOption(name) { if (!options) { @@ -85,79 +83,80 @@ function doEmitWarning(warning) { }; } -function setupProcessWarnings() { - if (!process.noProcessWarnings && process.env.NODE_NO_WARNINGS !== '1') { - process.on('warning', (warning) => { - if (!(warning instanceof Error)) return; - const isDeprecation = warning.name === 'DeprecationWarning'; - if (isDeprecation && process.noDeprecation) return; - const trace = process.traceProcessWarnings || - (isDeprecation && process.traceDeprecation); - var msg = prefix; - if (warning.code) - msg += `[${warning.code}] `; - if (trace && warning.stack) { - msg += `${warning.stack}`; - } else { - const toString = - typeof warning.toString === 'function' ? - warning.toString : Error.prototype.toString; - msg += `${toString.apply(warning)}`; - } - if (typeof warning.detail === 'string') { - msg += `\n${warning.detail}`; - } - output(msg); - }); +function onWarning(warning) { + if (!(warning instanceof Error)) return; + const isDeprecation = warning.name === 'DeprecationWarning'; + if (isDeprecation && process.noDeprecation) return; + const trace = process.traceProcessWarnings || + (isDeprecation && process.traceDeprecation); + var msg = prefix; + if (warning.code) + msg += `[${warning.code}] `; + if (trace && warning.stack) { + msg += `${warning.stack}`; + } else { + const toString = + typeof warning.toString === 'function' ? + warning.toString : Error.prototype.toString; + msg += `${toString.apply(warning)}`; } + if (typeof warning.detail === 'string') { + msg += `\n${warning.detail}`; + } + output(msg); +} - // process.emitWarning(error) - // process.emitWarning(str[, type[, code]][, ctor]) - // process.emitWarning(str[, options]) - process.emitWarning = (warning, type, code, ctor, now) => { - let detail; - if (type !== null && typeof type === 'object' && !Array.isArray(type)) { - ctor = type.ctor; - code = type.code; - if (typeof type.detail === 'string') - detail = type.detail; - type = type.type || 'Warning'; - } else if (typeof type === 'function') { - ctor = type; - code = undefined; - type = 'Warning'; - } - if (type !== undefined && typeof type !== 'string') { - throw new ERR_INVALID_ARG_TYPE('type', 'string', type); - } - if (typeof code === 'function') { - ctor = code; - code = undefined; - } else if (code !== undefined && typeof code !== 'string') { - throw new ERR_INVALID_ARG_TYPE('code', 'string', code); - } - if (typeof warning === 'string') { - // Improve error creation performance by skipping the error frames. - // They are added in the `captureStackTrace()` function below. - const tmpStackLimit = Error.stackTraceLimit; - Error.stackTraceLimit = 0; - // eslint-disable-next-line no-restricted-syntax - warning = new Error(warning); - Error.stackTraceLimit = tmpStackLimit; - warning.name = String(type || 'Warning'); - if (code !== undefined) warning.code = code; - if (detail !== undefined) warning.detail = detail; - Error.captureStackTrace(warning, ctor || process.emitWarning); - } else if (!(warning instanceof Error)) { - throw new ERR_INVALID_ARG_TYPE('warning', ['Error', 'string'], warning); - } - if (warning.name === 'DeprecationWarning') { - if (process.noDeprecation) - return; - if (process.throwDeprecation) - throw warning; - } - if (now) process.emit('warning', warning); - else process.nextTick(doEmitWarning(warning)); - }; +// process.emitWarning(error) +// process.emitWarning(str[, type[, code]][, ctor]) +// process.emitWarning(str[, options]) +function emitWarning(warning, type, code, ctor, now) { + let detail; + if (type !== null && typeof type === 'object' && !Array.isArray(type)) { + ctor = type.ctor; + code = type.code; + if (typeof type.detail === 'string') + detail = type.detail; + type = type.type || 'Warning'; + } else if (typeof type === 'function') { + ctor = type; + code = undefined; + type = 'Warning'; + } + if (type !== undefined && typeof type !== 'string') { + throw new ERR_INVALID_ARG_TYPE('type', 'string', type); + } + if (typeof code === 'function') { + ctor = code; + code = undefined; + } else if (code !== undefined && typeof code !== 'string') { + throw new ERR_INVALID_ARG_TYPE('code', 'string', code); + } + if (typeof warning === 'string') { + // Improve error creation performance by skipping the error frames. + // They are added in the `captureStackTrace()` function below. + const tmpStackLimit = Error.stackTraceLimit; + Error.stackTraceLimit = 0; + // eslint-disable-next-line no-restricted-syntax + warning = new Error(warning); + Error.stackTraceLimit = tmpStackLimit; + warning.name = String(type || 'Warning'); + if (code !== undefined) warning.code = code; + if (detail !== undefined) warning.detail = detail; + Error.captureStackTrace(warning, ctor || process.emitWarning); + } else if (!(warning instanceof Error)) { + throw new ERR_INVALID_ARG_TYPE('warning', ['Error', 'string'], warning); + } + if (warning.name === 'DeprecationWarning') { + if (process.noDeprecation) + return; + if (process.throwDeprecation) + throw warning; + } + if (now) process.emit('warning', warning); + else process.nextTick(doEmitWarning(warning)); } + +module.exports = { + onWarning, + emitWarning +};