diff --git a/lib/internal/bootstrap/switches/does_own_process_state.js b/lib/internal/bootstrap/switches/does_own_process_state.js index 85b5c3dfcb09ed..8f457de3e1183e 100644 --- a/lib/internal/bootstrap/switches/does_own_process_state.js +++ b/lib/internal/bootstrap/switches/does_own_process_state.js @@ -2,6 +2,12 @@ const credentials = internalBinding('credentials'); const rawMethods = internalBinding('process_methods'); +const { + namespace: { + addSerializeCallback, + isBuildingSnapshot, + }, +} = require('internal/v8/startup_snapshot'); process.abort = rawMethods.abort; process.umask = wrappedUmask; @@ -107,6 +113,12 @@ function wrapPosixCredentialSetters(credentials) { // directory is changed by `chdir`, it'll be updated. let cachedCwd = ''; +if (isBuildingSnapshot()) { + addSerializeCallback(() => { + cachedCwd = ''; + }); +} + function wrappedChdir(directory) { validateString(directory, 'directory'); rawMethods.chdir(directory); diff --git a/test/fixtures/snapshot/cwd.js b/test/fixtures/snapshot/cwd.js new file mode 100644 index 00000000000000..4860cc6662af8a --- /dev/null +++ b/test/fixtures/snapshot/cwd.js @@ -0,0 +1,10 @@ +const { + setDeserializeMainFunction, +} = require('v8').startupSnapshot; + +// To make sure the cwd is present in the cache +process.cwd(); + +setDeserializeMainFunction(() => { + console.log(process.cwd()); +}); diff --git a/test/parallel/test-snapshot-cwd.js b/test/parallel/test-snapshot-cwd.js new file mode 100644 index 00000000000000..c41ded27b45a3e --- /dev/null +++ b/test/parallel/test-snapshot-cwd.js @@ -0,0 +1,47 @@ +'use strict'; + +// This tests that process.cwd() is accurate when +// restoring state from a snapshot + +require('../common'); +const { spawnSyncAndExitWithoutError } = require('../common/child_process'); +const tmpdir = require('../common/tmpdir'); +const fixtures = require('../common/fixtures'); +const fs = require('fs'); + +tmpdir.refresh(); +const blobPath = tmpdir.resolve('snapshot.blob'); +const file = fixtures.path('snapshot', 'cwd.js'); + +const subdir = tmpdir.resolve('foo'); +fs.mkdirSync(subdir); + +{ + // Create the snapshot. + spawnSyncAndExitWithoutError(process.execPath, [ + '--snapshot-blob', + blobPath, + '--build-snapshot', + file, + ], { + cwd: tmpdir.path, + encoding: 'utf8' + }, { + status: 0, + }); +} + +{ + spawnSyncAndExitWithoutError(process.execPath, [ + '--snapshot-blob', + blobPath, + file, + ], { + cwd: subdir, + encoding: 'utf8' + }, { + status: 0, + trim: true, + stdout: subdir, + }); +}