r building snapshots, V8 does not install Error.stackTraceLimit and as // a result, if an error is created during the snapshot building process, error.stack would be // undefined. To prevent users from tripping over this, install Error.stackTraceLimit based on // --stack-trace-limit by ourselves (which defaults to 10). // See https://chromium-review.googlesource.com/c/v8/v8/+/3319481 const initialStackTraceLimitDesc = { value: getOptionValue('--stack-trace-limit'), configurable: true, writable: true, enumerable: true, __proto__: null, }; ObjectDefineProperty(Error, 'stackTraceLimit', initialStackTraceLimitDesc); let stackTraceLimitDescToRestore; // Error.stackTraceLimit needs to be removed during serialization, because when V8 deserializes // the snapshot, it expects Error.stackTraceLimit to be unset so that it can install it as a new property // using the value of --stack-trace-limit. addAfterUserSerializeCallback(() => { const desc = ObjectGetOwnPropertyDescriptor(Error, 'stackTraceLimit'); // If it's modified by users, emit a warning. if (desc && ( desc.value !== initialStackTraceLimitDesc.value || desc.configurable !== initialStackTraceLimitDesc.configurable || desc.writable !== initialStackTraceLimitDesc.writable || desc.enumerable !== initialStackTraceLimitDesc.enumerable )) { process._rawDebug('Error.stackTraceLimit has been modified by the snapshot builder script.'); // We want to use null-prototype objects to not rely on globally mutable // %Object.prototype%. if (desc.configurable) { stackTraceLimitDescToRestore = desc; ObjectSetPrototypeOf(stackTraceLimitDescToRestore, null); process._rawDebug('It will be preserved after snapshot deserialization and override ' + '--stack-trace-limit passed into the deserialized application.\n' + 'To allow --stack-trace-limit override in the deserialized application, ' + 'delete Error.stackTraceLimit.'); } else { process._rawDebug('It is not configurable and will crash the application upon deserialization.\n' + 'To fix the error, make Error.stackTraceLimit configurable.'); } } delete Error.stackTraceLimit; }); addDeserializeCallback(() => { if (stackTraceLimitDescToRestore) { ObjectDefineProperty(Error, 'stackTraceLimit', stackTraceLimitDescToRestore); } }); // TODO(addaleax): Make this `embedderRunCjs` once require('module') // is supported in snapshots. function minimalRunCjs(source) { let filename; let dirname; if (process.argv[1] === anonymousMainPath) { filename = dirname = process.argv[1]; } else { filename = path.resolve(process.argv[1]); dirname = path.dirname(filename); } const fn = compileSerializeMain(filename, source); return fn(requireForUserSnapshot, filename, dirname); } if (isExperimentalSeaWarningNeeded()) { emitExperimentalWarning('Single executable application'); } return [process, requireForUserSnapshot, minimalRunCjs]; } return main();