process: move eval and exception bootstrap ito process/execution.js
This patch: - Moves `tryGetCwd`, `evalScript` and `fatalException` from `bootstrap/node.js` into `process/execution.js` so that they do have to be passed into the worker thread setup function, instead the worker code can require them when necessary. - Moves `setUncaughtExceptionCaptureCallback` and `hasUncaughtExceptionCaptureCallback` along with the two global state `exceptionHandlerState` and `shouldAbortOnUncaughtToggle` info `process.execution.js` as those are only used by the fatalException and these two accessors as one self-contained unit. PR-URL: https://github.com/nodejs/node/pull/25199 Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
da13c44b0d
commit
7163fbf066
@ -18,7 +18,6 @@
|
|||||||
|
|
||||||
const { internalBinding, NativeModule } = loaderExports;
|
const { internalBinding, NativeModule } = loaderExports;
|
||||||
|
|
||||||
const exceptionHandlerState = { captureFn: null };
|
|
||||||
let getOptionValue;
|
let getOptionValue;
|
||||||
|
|
||||||
function startup() {
|
function startup() {
|
||||||
@ -26,8 +25,23 @@ function startup() {
|
|||||||
|
|
||||||
setupProcessObject();
|
setupProcessObject();
|
||||||
|
|
||||||
// Do this good and early, since it handles errors.
|
// TODO(joyeecheung): this does not have to done so early, any fatal errors
|
||||||
setupProcessFatal();
|
// thrown before user code execution should simply crash the process
|
||||||
|
// and we do not care about any clean up at that point. We don't care
|
||||||
|
// about emitting any events if the process crash upon bootstrap either.
|
||||||
|
{
|
||||||
|
const {
|
||||||
|
fatalException,
|
||||||
|
setUncaughtExceptionCaptureCallback,
|
||||||
|
hasUncaughtExceptionCaptureCallback
|
||||||
|
} = NativeModule.require('internal/process/execution');
|
||||||
|
|
||||||
|
process._fatalException = fatalException;
|
||||||
|
process.setUncaughtExceptionCaptureCallback =
|
||||||
|
setUncaughtExceptionCaptureCallback;
|
||||||
|
process.hasUncaughtExceptionCaptureCallback =
|
||||||
|
hasUncaughtExceptionCaptureCallback;
|
||||||
|
}
|
||||||
|
|
||||||
setupGlobalVariables();
|
setupGlobalVariables();
|
||||||
|
|
||||||
@ -83,9 +97,7 @@ function startup() {
|
|||||||
process.reallyExit = rawMethods.reallyExit;
|
process.reallyExit = rawMethods.reallyExit;
|
||||||
process._kill = rawMethods._kill;
|
process._kill = rawMethods._kill;
|
||||||
|
|
||||||
const wrapped = perThreadSetup.wrapProcessMethods(
|
const wrapped = perThreadSetup.wrapProcessMethods(rawMethods);
|
||||||
rawMethods, exceptionHandlerState
|
|
||||||
);
|
|
||||||
process._rawDebug = wrapped._rawDebug;
|
process._rawDebug = wrapped._rawDebug;
|
||||||
process.hrtime = wrapped.hrtime;
|
process.hrtime = wrapped.hrtime;
|
||||||
process.hrtime.bigint = wrapped.hrtimeBigInt;
|
process.hrtime.bigint = wrapped.hrtimeBigInt;
|
||||||
@ -93,10 +105,6 @@ function startup() {
|
|||||||
process.memoryUsage = wrapped.memoryUsage;
|
process.memoryUsage = wrapped.memoryUsage;
|
||||||
process.kill = wrapped.kill;
|
process.kill = wrapped.kill;
|
||||||
process.exit = wrapped.exit;
|
process.exit = wrapped.exit;
|
||||||
process.setUncaughtExceptionCaptureCallback =
|
|
||||||
wrapped.setUncaughtExceptionCaptureCallback;
|
|
||||||
process.hasUncaughtExceptionCaptureCallback =
|
|
||||||
wrapped.hasUncaughtExceptionCaptureCallback;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NativeModule.require('internal/process/warning').setup();
|
NativeModule.require('internal/process/warning').setup();
|
||||||
@ -305,7 +313,7 @@ function startExecution() {
|
|||||||
// This means we are in a Worker context, and any script execution
|
// This means we are in a Worker context, and any script execution
|
||||||
// will be directed by the worker module.
|
// will be directed by the worker module.
|
||||||
if (internalBinding('worker').getEnvMessagePort() !== undefined) {
|
if (internalBinding('worker').getEnvMessagePort() !== undefined) {
|
||||||
NativeModule.require('internal/worker').setupChild(evalScript);
|
NativeModule.require('internal/worker').setupChild();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -376,7 +384,9 @@ function executeUserCode() {
|
|||||||
addBuiltinLibsToObject
|
addBuiltinLibsToObject
|
||||||
} = NativeModule.require('internal/modules/cjs/helpers');
|
} = NativeModule.require('internal/modules/cjs/helpers');
|
||||||
addBuiltinLibsToObject(global);
|
addBuiltinLibsToObject(global);
|
||||||
evalScript('[eval]', wrapForBreakOnFirstLine(getOptionValue('--eval')));
|
const source = getOptionValue('--eval');
|
||||||
|
const { evalScript } = NativeModule.require('internal/process/execution');
|
||||||
|
evalScript('[eval]', source, process._breakFirstLine);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -430,7 +440,8 @@ function executeUserCode() {
|
|||||||
|
|
||||||
// User passed '-e' or '--eval' along with `-i` or `--interactive`
|
// User passed '-e' or '--eval' along with `-i` or `--interactive`
|
||||||
if (process._eval != null) {
|
if (process._eval != null) {
|
||||||
evalScript('[eval]', wrapForBreakOnFirstLine(process._eval));
|
const { evalScript } = NativeModule.require('internal/process/execution');
|
||||||
|
evalScript('[eval]', process._eval, process._breakFirstLine);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -452,7 +463,8 @@ function readAndExecuteStdin() {
|
|||||||
checkScriptSyntax(code, '[stdin]');
|
checkScriptSyntax(code, '[stdin]');
|
||||||
} else {
|
} else {
|
||||||
process._eval = code;
|
process._eval = code;
|
||||||
evalScript('[stdin]', wrapForBreakOnFirstLine(process._eval));
|
const { evalScript } = NativeModule.require('internal/process/execution');
|
||||||
|
evalScript('[stdin]', process._eval, process._breakFirstLine);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -656,95 +668,6 @@ function setupDOMException() {
|
|||||||
registerDOMException(DOMException);
|
registerDOMException(DOMException);
|
||||||
}
|
}
|
||||||
|
|
||||||
function noop() {}
|
|
||||||
|
|
||||||
function setupProcessFatal() {
|
|
||||||
const {
|
|
||||||
executionAsyncId,
|
|
||||||
clearDefaultTriggerAsyncId,
|
|
||||||
clearAsyncIdStack,
|
|
||||||
hasAsyncIdStack,
|
|
||||||
afterHooksExist,
|
|
||||||
emitAfter
|
|
||||||
} = NativeModule.require('internal/async_hooks');
|
|
||||||
|
|
||||||
process._fatalException = (er) => {
|
|
||||||
// It's possible that defaultTriggerAsyncId was set for a constructor
|
|
||||||
// call that threw and was never cleared. So clear it now.
|
|
||||||
clearDefaultTriggerAsyncId();
|
|
||||||
|
|
||||||
if (exceptionHandlerState.captureFn !== null) {
|
|
||||||
exceptionHandlerState.captureFn(er);
|
|
||||||
} else if (!process.emit('uncaughtException', er)) {
|
|
||||||
// If someone handled it, then great. otherwise, die in C++ land
|
|
||||||
// since that means that we'll exit the process, emit the 'exit' event.
|
|
||||||
try {
|
|
||||||
if (!process._exiting) {
|
|
||||||
process._exiting = true;
|
|
||||||
process.exitCode = 1;
|
|
||||||
process.emit('exit', 1);
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
// Nothing to be done about it at this point.
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
const { kExpandStackSymbol } = NativeModule.require('internal/util');
|
|
||||||
if (typeof er[kExpandStackSymbol] === 'function')
|
|
||||||
er[kExpandStackSymbol]();
|
|
||||||
} catch {
|
|
||||||
// Nothing to be done about it at this point.
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we handled an error, then make sure any ticks get processed
|
|
||||||
// by ensuring that the next Immediate cycle isn't empty.
|
|
||||||
NativeModule.require('timers').setImmediate(noop);
|
|
||||||
|
|
||||||
// Emit the after() hooks now that the exception has been handled.
|
|
||||||
if (afterHooksExist()) {
|
|
||||||
do {
|
|
||||||
emitAfter(executionAsyncId());
|
|
||||||
} while (hasAsyncIdStack());
|
|
||||||
// Or completely empty the id stack.
|
|
||||||
} else {
|
|
||||||
clearAsyncIdStack();
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function wrapForBreakOnFirstLine(source) {
|
|
||||||
if (!process._breakFirstLine)
|
|
||||||
return source;
|
|
||||||
const fn = `function() {\n\n${source};\n\n}`;
|
|
||||||
return `process.binding('inspector').callAndPauseOnStart(${fn}, {})`;
|
|
||||||
}
|
|
||||||
|
|
||||||
function evalScript(name, body) {
|
|
||||||
const CJSModule = NativeModule.require('internal/modules/cjs/loader');
|
|
||||||
const path = NativeModule.require('path');
|
|
||||||
const { tryGetCwd } = NativeModule.require('internal/util');
|
|
||||||
const cwd = tryGetCwd(path);
|
|
||||||
|
|
||||||
const module = new CJSModule(name);
|
|
||||||
module.filename = path.join(cwd, name);
|
|
||||||
module.paths = CJSModule._nodeModulePaths(cwd);
|
|
||||||
const script = `global.__filename = ${JSON.stringify(name)};\n` +
|
|
||||||
'global.exports = exports;\n' +
|
|
||||||
'global.module = module;\n' +
|
|
||||||
'global.__dirname = __dirname;\n' +
|
|
||||||
'global.require = require;\n' +
|
|
||||||
'return require("vm").runInThisContext(' +
|
|
||||||
`${JSON.stringify(body)}, { filename: ` +
|
|
||||||
`${JSON.stringify(name)}, displayErrors: true });\n`;
|
|
||||||
const result = module._compile(script, `${name}-wrapper`);
|
|
||||||
if (getOptionValue('--print')) console.log(result);
|
|
||||||
// Handle any nextTicks added in the first tick of the program.
|
|
||||||
process._tickCallback();
|
|
||||||
}
|
|
||||||
|
|
||||||
function checkScriptSyntax(source, filename) {
|
function checkScriptSyntax(source, filename) {
|
||||||
const CJSModule = NativeModule.require('internal/modules/cjs/loader');
|
const CJSModule = NativeModule.require('internal/modules/cjs/loader');
|
||||||
const vm = NativeModule.require('vm');
|
const vm = NativeModule.require('vm');
|
||||||
|
@ -1,15 +1,14 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const path = require('path');
|
|
||||||
const CJSModule = require('internal/modules/cjs/loader');
|
const CJSModule = require('internal/modules/cjs/loader');
|
||||||
const { makeRequireFunction } = require('internal/modules/cjs/helpers');
|
const { makeRequireFunction } = require('internal/modules/cjs/helpers');
|
||||||
const { tryGetCwd } = require('internal/util');
|
const { tryGetCwd } = require('internal/process/execution');
|
||||||
const { addCommandLineAPI, consoleCall } = internalBinding('inspector');
|
const { addCommandLineAPI, consoleCall } = internalBinding('inspector');
|
||||||
|
|
||||||
// Wrap a console implemented by Node.js with features from the VM inspector
|
// Wrap a console implemented by Node.js with features from the VM inspector
|
||||||
function addInspectorApis(consoleFromNode, consoleFromVM) {
|
function addInspectorApis(consoleFromNode, consoleFromVM) {
|
||||||
// Setup inspector command line API.
|
// Setup inspector command line API.
|
||||||
const cwd = tryGetCwd(path);
|
const cwd = tryGetCwd();
|
||||||
const consoleAPIModule = new CJSModule('<inspector console>');
|
const consoleAPIModule = new CJSModule('<inspector console>');
|
||||||
consoleAPIModule.paths =
|
consoleAPIModule.paths =
|
||||||
CJSModule._nodeModulePaths(cwd).concat(CJSModule.globalPaths);
|
CJSModule._nodeModulePaths(cwd).concat(CJSModule.globalPaths);
|
||||||
|
149
lib/internal/process/execution.js
Normal file
149
lib/internal/process/execution.js
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const {
|
||||||
|
codes: {
|
||||||
|
ERR_INVALID_ARG_TYPE,
|
||||||
|
ERR_UNCAUGHT_EXCEPTION_CAPTURE_ALREADY_SET
|
||||||
|
}
|
||||||
|
} = require('internal/errors');
|
||||||
|
|
||||||
|
const {
|
||||||
|
executionAsyncId,
|
||||||
|
clearDefaultTriggerAsyncId,
|
||||||
|
clearAsyncIdStack,
|
||||||
|
hasAsyncIdStack,
|
||||||
|
afterHooksExist,
|
||||||
|
emitAfter
|
||||||
|
} = require('internal/async_hooks');
|
||||||
|
|
||||||
|
// shouldAbortOnUncaughtToggle is a typed array for faster
|
||||||
|
// communication with JS.
|
||||||
|
const { shouldAbortOnUncaughtToggle } = internalBinding('util');
|
||||||
|
|
||||||
|
function tryGetCwd() {
|
||||||
|
try {
|
||||||
|
return process.cwd();
|
||||||
|
} catch {
|
||||||
|
// getcwd(3) can fail if the current working directory has been deleted.
|
||||||
|
// Fall back to the directory name of the (absolute) executable path.
|
||||||
|
// It's not really correct but what are the alternatives?
|
||||||
|
return path.dirname(process.execPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function evalScript(name, body, breakFristLine) {
|
||||||
|
const CJSModule = require('internal/modules/cjs/loader');
|
||||||
|
if (breakFristLine) {
|
||||||
|
const fn = `function() {\n\n${body};\n\n}`;
|
||||||
|
body = `process.binding('inspector').callAndPauseOnStart(${fn}, {})`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const cwd = tryGetCwd();
|
||||||
|
|
||||||
|
const module = new CJSModule(name);
|
||||||
|
module.filename = path.join(cwd, name);
|
||||||
|
module.paths = CJSModule._nodeModulePaths(cwd);
|
||||||
|
const script = `global.__filename = ${JSON.stringify(name)};\n` +
|
||||||
|
'global.exports = exports;\n' +
|
||||||
|
'global.module = module;\n' +
|
||||||
|
'global.__dirname = __dirname;\n' +
|
||||||
|
'global.require = require;\n' +
|
||||||
|
'return require("vm").runInThisContext(' +
|
||||||
|
`${JSON.stringify(body)}, { filename: ` +
|
||||||
|
`${JSON.stringify(name)}, displayErrors: true });\n`;
|
||||||
|
const result = module._compile(script, `${name}-wrapper`);
|
||||||
|
if (require('internal/options').getOptionValue('--print')) {
|
||||||
|
console.log(result);
|
||||||
|
}
|
||||||
|
// Handle any nextTicks added in the first tick of the program.
|
||||||
|
process._tickCallback();
|
||||||
|
}
|
||||||
|
|
||||||
|
const exceptionHandlerState = { captureFn: null };
|
||||||
|
|
||||||
|
function setUncaughtExceptionCaptureCallback(fn) {
|
||||||
|
if (fn === null) {
|
||||||
|
exceptionHandlerState.captureFn = fn;
|
||||||
|
shouldAbortOnUncaughtToggle[0] = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (typeof fn !== 'function') {
|
||||||
|
throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'null'], fn);
|
||||||
|
}
|
||||||
|
if (exceptionHandlerState.captureFn !== null) {
|
||||||
|
throw new ERR_UNCAUGHT_EXCEPTION_CAPTURE_ALREADY_SET();
|
||||||
|
}
|
||||||
|
exceptionHandlerState.captureFn = fn;
|
||||||
|
shouldAbortOnUncaughtToggle[0] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasUncaughtExceptionCaptureCallback() {
|
||||||
|
return exceptionHandlerState.captureFn !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function noop() {}
|
||||||
|
|
||||||
|
// XXX(joyeecheung): for some reason this cannot be defined at the top-level
|
||||||
|
// and exported to be written to process._fatalException, it has to be
|
||||||
|
// returned as an *anonymous function* wrapped inside a factory function,
|
||||||
|
// otherwise it breaks the test-timers.setInterval async hooks test -
|
||||||
|
// this may indicate that node::FatalException should fix up the callback scope
|
||||||
|
// before calling into process._fatalException, or this function should
|
||||||
|
// take extra care of the async hooks before it schedules a setImmediate.
|
||||||
|
function createFatalException() {
|
||||||
|
return (er) => {
|
||||||
|
// It's possible that defaultTriggerAsyncId was set for a constructor
|
||||||
|
// call that threw and was never cleared. So clear it now.
|
||||||
|
clearDefaultTriggerAsyncId();
|
||||||
|
|
||||||
|
if (exceptionHandlerState.captureFn !== null) {
|
||||||
|
exceptionHandlerState.captureFn(er);
|
||||||
|
} else if (!process.emit('uncaughtException', er)) {
|
||||||
|
// If someone handled it, then great. otherwise, die in C++ land
|
||||||
|
// since that means that we'll exit the process, emit the 'exit' event.
|
||||||
|
try {
|
||||||
|
if (!process._exiting) {
|
||||||
|
process._exiting = true;
|
||||||
|
process.exitCode = 1;
|
||||||
|
process.emit('exit', 1);
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
// Nothing to be done about it at this point.
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const { kExpandStackSymbol } = require('internal/util');
|
||||||
|
if (typeof er[kExpandStackSymbol] === 'function')
|
||||||
|
er[kExpandStackSymbol]();
|
||||||
|
} catch {
|
||||||
|
// Nothing to be done about it at this point.
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we handled an error, then make sure any ticks get processed
|
||||||
|
// by ensuring that the next Immediate cycle isn't empty.
|
||||||
|
require('timers').setImmediate(noop);
|
||||||
|
|
||||||
|
// Emit the after() hooks now that the exception has been handled.
|
||||||
|
if (afterHooksExist()) {
|
||||||
|
do {
|
||||||
|
emitAfter(executionAsyncId());
|
||||||
|
} while (hasAsyncIdStack());
|
||||||
|
// Or completely empty the id stack.
|
||||||
|
} else {
|
||||||
|
clearAsyncIdStack();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
tryGetCwd,
|
||||||
|
evalScript,
|
||||||
|
fatalException: createFatalException(),
|
||||||
|
setUncaughtExceptionCaptureCallback,
|
||||||
|
hasUncaughtExceptionCaptureCallback
|
||||||
|
};
|
@ -12,7 +12,6 @@ const {
|
|||||||
ERR_INVALID_ARG_TYPE,
|
ERR_INVALID_ARG_TYPE,
|
||||||
ERR_INVALID_OPT_VALUE,
|
ERR_INVALID_OPT_VALUE,
|
||||||
ERR_OUT_OF_RANGE,
|
ERR_OUT_OF_RANGE,
|
||||||
ERR_UNCAUGHT_EXCEPTION_CAPTURE_ALREADY_SET,
|
|
||||||
ERR_UNKNOWN_SIGNAL
|
ERR_UNKNOWN_SIGNAL
|
||||||
}
|
}
|
||||||
} = require('internal/errors');
|
} = require('internal/errors');
|
||||||
@ -24,7 +23,7 @@ function assert(x, msg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The execution of this function itself should not cause any side effects.
|
// The execution of this function itself should not cause any side effects.
|
||||||
function wrapProcessMethods(binding, exceptionHandlerState) {
|
function wrapProcessMethods(binding) {
|
||||||
const {
|
const {
|
||||||
hrtime: _hrtime,
|
hrtime: _hrtime,
|
||||||
hrtimeBigInt: _hrtimeBigInt,
|
hrtimeBigInt: _hrtimeBigInt,
|
||||||
@ -185,29 +184,6 @@ function wrapProcessMethods(binding, exceptionHandlerState) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// shouldAbortOnUncaughtToggle is a typed array for faster
|
|
||||||
// communication with JS.
|
|
||||||
const { shouldAbortOnUncaughtToggle } = binding;
|
|
||||||
|
|
||||||
function setUncaughtExceptionCaptureCallback(fn) {
|
|
||||||
if (fn === null) {
|
|
||||||
exceptionHandlerState.captureFn = fn;
|
|
||||||
shouldAbortOnUncaughtToggle[0] = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (typeof fn !== 'function') {
|
|
||||||
throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'null'], fn);
|
|
||||||
}
|
|
||||||
if (exceptionHandlerState.captureFn !== null) {
|
|
||||||
throw new ERR_UNCAUGHT_EXCEPTION_CAPTURE_ALREADY_SET();
|
|
||||||
}
|
|
||||||
exceptionHandlerState.captureFn = fn;
|
|
||||||
shouldAbortOnUncaughtToggle[0] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function hasUncaughtExceptionCaptureCallback() {
|
|
||||||
return exceptionHandlerState.captureFn !== null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
_rawDebug,
|
_rawDebug,
|
||||||
@ -216,9 +192,7 @@ function wrapProcessMethods(binding, exceptionHandlerState) {
|
|||||||
cpuUsage,
|
cpuUsage,
|
||||||
memoryUsage,
|
memoryUsage,
|
||||||
kill,
|
kill,
|
||||||
exit,
|
exit
|
||||||
setUncaughtExceptionCaptureCallback,
|
|
||||||
hasUncaughtExceptionCaptureCallback
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -387,17 +387,6 @@ function once(callback) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function tryGetCwd(path) {
|
|
||||||
try {
|
|
||||||
return process.cwd();
|
|
||||||
} catch {
|
|
||||||
// getcwd(3) can fail if the current working directory has been deleted.
|
|
||||||
// Fall back to the directory name of the (absolute) executable path.
|
|
||||||
// It's not really correct but what are the alternatives?
|
|
||||||
return path.dirname(process.execPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
assertCrypto,
|
assertCrypto,
|
||||||
cachedResult,
|
cachedResult,
|
||||||
@ -417,7 +406,6 @@ module.exports = {
|
|||||||
once,
|
once,
|
||||||
promisify,
|
promisify,
|
||||||
spliceOne,
|
spliceOne,
|
||||||
tryGetCwd,
|
|
||||||
removeColors,
|
removeColors,
|
||||||
|
|
||||||
// Symbol used to customize promisify conversion
|
// Symbol used to customize promisify conversion
|
||||||
|
@ -432,7 +432,7 @@ if (!isMainThread) {
|
|||||||
|
|
||||||
let originalFatalException;
|
let originalFatalException;
|
||||||
|
|
||||||
function setupChild(evalScript) {
|
function setupChild() {
|
||||||
// Called during bootstrap to set up worker script execution.
|
// Called during bootstrap to set up worker script execution.
|
||||||
debug(`[${threadId}] is setting up worker child environment`);
|
debug(`[${threadId}] is setting up worker child environment`);
|
||||||
const port = getEnvMessagePort();
|
const port = getEnvMessagePort();
|
||||||
@ -453,6 +453,7 @@ function setupChild(evalScript) {
|
|||||||
port.unref();
|
port.unref();
|
||||||
port.postMessage({ type: messageTypes.UP_AND_RUNNING });
|
port.postMessage({ type: messageTypes.UP_AND_RUNNING });
|
||||||
if (doEval) {
|
if (doEval) {
|
||||||
|
const { evalScript } = require('internal/process/execution');
|
||||||
evalScript('[worker eval]', filename);
|
evalScript('[worker eval]', filename);
|
||||||
} else {
|
} else {
|
||||||
process.argv[1] = filename; // script filename
|
process.argv[1] = filename; // script filename
|
||||||
|
1
node.gyp
1
node.gyp
@ -142,6 +142,7 @@
|
|||||||
'lib/internal/print_help.js',
|
'lib/internal/print_help.js',
|
||||||
'lib/internal/priority_queue.js',
|
'lib/internal/priority_queue.js',
|
||||||
'lib/internal/process/esm_loader.js',
|
'lib/internal/process/esm_loader.js',
|
||||||
|
'lib/internal/process/execution.js',
|
||||||
'lib/internal/process/main_thread_only.js',
|
'lib/internal/process/main_thread_only.js',
|
||||||
'lib/internal/process/next_tick.js',
|
'lib/internal/process/next_tick.js',
|
||||||
'lib/internal/process/per_thread.js',
|
'lib/internal/process/per_thread.js',
|
||||||
|
@ -458,14 +458,6 @@ static void InitializeProcessMethods(Local<Object> target,
|
|||||||
env->SetMethod(target, "dlopen", binding::DLOpen);
|
env->SetMethod(target, "dlopen", binding::DLOpen);
|
||||||
env->SetMethod(target, "reallyExit", Exit);
|
env->SetMethod(target, "reallyExit", Exit);
|
||||||
env->SetMethodNoSideEffect(target, "uptime", Uptime);
|
env->SetMethodNoSideEffect(target, "uptime", Uptime);
|
||||||
|
|
||||||
Local<String> should_abort_on_uncaught_toggle =
|
|
||||||
FIXED_ONE_BYTE_STRING(env->isolate(), "shouldAbortOnUncaughtToggle");
|
|
||||||
CHECK(target
|
|
||||||
->Set(env->context(),
|
|
||||||
should_abort_on_uncaught_toggle,
|
|
||||||
env->should_abort_on_uncaught_toggle().GetJSArray())
|
|
||||||
.FromJust());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace node
|
} // namespace node
|
||||||
|
@ -233,6 +233,14 @@ void Initialize(Local<Object> target,
|
|||||||
target->Set(context,
|
target->Set(context,
|
||||||
FIXED_ONE_BYTE_STRING(env->isolate(), "propertyFilter"),
|
FIXED_ONE_BYTE_STRING(env->isolate(), "propertyFilter"),
|
||||||
constants).FromJust();
|
constants).FromJust();
|
||||||
|
|
||||||
|
Local<String> should_abort_on_uncaught_toggle =
|
||||||
|
FIXED_ONE_BYTE_STRING(env->isolate(), "shouldAbortOnUncaughtToggle");
|
||||||
|
CHECK(target
|
||||||
|
->Set(env->context(),
|
||||||
|
should_abort_on_uncaught_toggle,
|
||||||
|
env->should_abort_on_uncaught_toggle().GetJSArray())
|
||||||
|
.FromJust());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace util
|
} // namespace util
|
||||||
|
@ -8,7 +8,7 @@ SyntaxError: Strict mode code may not include a with statement
|
|||||||
at Object.runInThisContext (vm.js:*:*)
|
at Object.runInThisContext (vm.js:*:*)
|
||||||
at Object.<anonymous> ([eval]-wrapper:*:*)
|
at Object.<anonymous> ([eval]-wrapper:*:*)
|
||||||
at Module._compile (internal/modules/cjs/loader.js:*:*)
|
at Module._compile (internal/modules/cjs/loader.js:*:*)
|
||||||
at evalScript (internal/bootstrap/node.js:*:*)
|
at evalScript (internal/process/execution.js:*:*)
|
||||||
at executeUserCode (internal/bootstrap/node.js:*:*)
|
at executeUserCode (internal/bootstrap/node.js:*:*)
|
||||||
at startExecution (internal/bootstrap/node.js:*:*)
|
at startExecution (internal/bootstrap/node.js:*:*)
|
||||||
at startup (internal/bootstrap/node.js:*:*)
|
at startup (internal/bootstrap/node.js:*:*)
|
||||||
@ -25,7 +25,7 @@ Error: hello
|
|||||||
at Object.runInThisContext (vm.js:*:*)
|
at Object.runInThisContext (vm.js:*:*)
|
||||||
at Object.<anonymous> ([eval]-wrapper:*:*)
|
at Object.<anonymous> ([eval]-wrapper:*:*)
|
||||||
at Module._compile (internal/modules/cjs/loader.js:*:*)
|
at Module._compile (internal/modules/cjs/loader.js:*:*)
|
||||||
at evalScript (internal/bootstrap/node.js:*:*)
|
at evalScript (internal/process/execution.js:*:*)
|
||||||
at executeUserCode (internal/bootstrap/node.js:*:*)
|
at executeUserCode (internal/bootstrap/node.js:*:*)
|
||||||
at startExecution (internal/bootstrap/node.js:*:*)
|
at startExecution (internal/bootstrap/node.js:*:*)
|
||||||
at startup (internal/bootstrap/node.js:*:*)
|
at startup (internal/bootstrap/node.js:*:*)
|
||||||
@ -41,7 +41,7 @@ Error: hello
|
|||||||
at Object.runInThisContext (vm.js:*:*)
|
at Object.runInThisContext (vm.js:*:*)
|
||||||
at Object.<anonymous> ([eval]-wrapper:*:*)
|
at Object.<anonymous> ([eval]-wrapper:*:*)
|
||||||
at Module._compile (internal/modules/cjs/loader.js:*:*)
|
at Module._compile (internal/modules/cjs/loader.js:*:*)
|
||||||
at evalScript (internal/bootstrap/node.js:*:*)
|
at evalScript (internal/process/execution.js:*:*)
|
||||||
at executeUserCode (internal/bootstrap/node.js:*:*)
|
at executeUserCode (internal/bootstrap/node.js:*:*)
|
||||||
at startExecution (internal/bootstrap/node.js:*:*)
|
at startExecution (internal/bootstrap/node.js:*:*)
|
||||||
at startup (internal/bootstrap/node.js:*:*)
|
at startup (internal/bootstrap/node.js:*:*)
|
||||||
@ -57,7 +57,7 @@ ReferenceError: y is not defined
|
|||||||
at Object.runInThisContext (vm.js:*:*)
|
at Object.runInThisContext (vm.js:*:*)
|
||||||
at Object.<anonymous> ([eval]-wrapper:*:*)
|
at Object.<anonymous> ([eval]-wrapper:*:*)
|
||||||
at Module._compile (internal/modules/cjs/loader.js:*:*)
|
at Module._compile (internal/modules/cjs/loader.js:*:*)
|
||||||
at evalScript (internal/bootstrap/node.js:*:*)
|
at evalScript (internal/process/execution.js:*:*)
|
||||||
at executeUserCode (internal/bootstrap/node.js:*:*)
|
at executeUserCode (internal/bootstrap/node.js:*:*)
|
||||||
at startExecution (internal/bootstrap/node.js:*:*)
|
at startExecution (internal/bootstrap/node.js:*:*)
|
||||||
at startup (internal/bootstrap/node.js:*:*)
|
at startup (internal/bootstrap/node.js:*:*)
|
||||||
|
@ -8,7 +8,7 @@ SyntaxError: Strict mode code may not include a with statement
|
|||||||
at Object.runInThisContext (vm.js:*)
|
at Object.runInThisContext (vm.js:*)
|
||||||
at Object.<anonymous> ([stdin]-wrapper:*:*)
|
at Object.<anonymous> ([stdin]-wrapper:*:*)
|
||||||
at Module._compile (internal/modules/cjs/loader.js:*:*)
|
at Module._compile (internal/modules/cjs/loader.js:*:*)
|
||||||
at evalScript (internal/bootstrap/node.js:*:*)
|
at evalScript (internal/process/execution.js:*:*)
|
||||||
at Socket.process.stdin.on (internal/bootstrap/node.js:*:*)
|
at Socket.process.stdin.on (internal/bootstrap/node.js:*:*)
|
||||||
at Socket.emit (events.js:*:*)
|
at Socket.emit (events.js:*:*)
|
||||||
at endReadableNT (_stream_readable.js:*:*)
|
at endReadableNT (_stream_readable.js:*:*)
|
||||||
@ -25,7 +25,7 @@ Error: hello
|
|||||||
at Object.runInThisContext (vm.js:*)
|
at Object.runInThisContext (vm.js:*)
|
||||||
at Object.<anonymous> ([stdin]-wrapper:*:*)
|
at Object.<anonymous> ([stdin]-wrapper:*:*)
|
||||||
at Module._compile (internal/modules/cjs/loader.js:*:*)
|
at Module._compile (internal/modules/cjs/loader.js:*:*)
|
||||||
at evalScript (internal/bootstrap/node.js:*:*)
|
at evalScript (internal/process/execution.js:*:*)
|
||||||
at Socket.process.stdin.on (internal/bootstrap/node.js:*:*)
|
at Socket.process.stdin.on (internal/bootstrap/node.js:*:*)
|
||||||
at Socket.emit (events.js:*:*)
|
at Socket.emit (events.js:*:*)
|
||||||
at endReadableNT (_stream_readable.js:*:*)
|
at endReadableNT (_stream_readable.js:*:*)
|
||||||
@ -40,7 +40,7 @@ Error: hello
|
|||||||
at Object.runInThisContext (vm.js:*)
|
at Object.runInThisContext (vm.js:*)
|
||||||
at Object.<anonymous> ([stdin]-wrapper:*:*)
|
at Object.<anonymous> ([stdin]-wrapper:*:*)
|
||||||
at Module._compile (internal/modules/cjs/loader.js:*:*)
|
at Module._compile (internal/modules/cjs/loader.js:*:*)
|
||||||
at evalScript (internal/bootstrap/node.js:*:*)
|
at evalScript (internal/process/execution.js:*:*)
|
||||||
at Socket.process.stdin.on (internal/bootstrap/node.js:*:*)
|
at Socket.process.stdin.on (internal/bootstrap/node.js:*:*)
|
||||||
at Socket.emit (events.js:*:*)
|
at Socket.emit (events.js:*:*)
|
||||||
at endReadableNT (_stream_readable.js:*:*)
|
at endReadableNT (_stream_readable.js:*:*)
|
||||||
@ -56,7 +56,7 @@ ReferenceError: y is not defined
|
|||||||
at Object.runInThisContext (vm.js:*)
|
at Object.runInThisContext (vm.js:*)
|
||||||
at Object.<anonymous> ([stdin]-wrapper:*:*)
|
at Object.<anonymous> ([stdin]-wrapper:*:*)
|
||||||
at Module._compile (internal/modules/cjs/loader.js:*:*)
|
at Module._compile (internal/modules/cjs/loader.js:*:*)
|
||||||
at evalScript (internal/bootstrap/node.js:*:*)
|
at evalScript (internal/process/execution.js:*:*)
|
||||||
at Socket.process.stdin.on (internal/bootstrap/node.js:*:*)
|
at Socket.process.stdin.on (internal/bootstrap/node.js:*:*)
|
||||||
at Socket.emit (events.js:*:*)
|
at Socket.emit (events.js:*:*)
|
||||||
at endReadableNT (_stream_readable.js:*:*)
|
at endReadableNT (_stream_readable.js:*:*)
|
||||||
|
@ -9,7 +9,7 @@ const common = require('../common');
|
|||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
|
|
||||||
const isMainThread = common.isMainThread;
|
const isMainThread = common.isMainThread;
|
||||||
const kMaxModuleCount = isMainThread ? 62 : 84;
|
const kMaxModuleCount = isMainThread ? 63 : 85;
|
||||||
|
|
||||||
assert(list.length <= kMaxModuleCount,
|
assert(list.length <= kMaxModuleCount,
|
||||||
`Total length: ${list.length}\n` + list.join('\n')
|
`Total length: ${list.length}\n` + list.join('\n')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user