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();
