diff --git a/lib/internal/v8/startup_snapshot.js b/lib/internal/v8/startup_snapshot.js index 3f51ae5d0f0535..5d88748b1c4719 100644 --- a/lib/internal/v8/startup_snapshot.js +++ b/lib/internal/v8/startup_snapshot.js @@ -90,7 +90,8 @@ function setDeserializeMainFunction(callback, data) { // This should be in sync with run_main_module.js until we make that // a built-in main function. - prepareMainThreadExecution(true); + // TODO(joyeecheung): make a copy of argv[0] and insert it as argv[1]. + prepareMainThreadExecution(false); markBootstrapComplete(); callback(data); }); diff --git a/test/parallel/test-snapshot-argv1.js b/test/parallel/test-snapshot-argv1.js new file mode 100644 index 00000000000000..08ec7d905fd98e --- /dev/null +++ b/test/parallel/test-snapshot-argv1.js @@ -0,0 +1,58 @@ +'use strict'; + +// This tests snapshot JS API using the example in the docs. + +require('../common'); +const assert = require('assert'); +const { spawnSync } = require('child_process'); +const tmpdir = require('../common/tmpdir'); +const path = require('path'); +const fs = require('fs'); + +tmpdir.refresh(); +const blobPath = path.join(tmpdir.path, 'snapshot.blob'); +const code = ` +require('v8').startupSnapshot.setDeserializeMainFunction(() => { + console.log(JSON.stringify(process.argv)); +}); +`; +{ + fs.writeFileSync(path.join(tmpdir.path, 'entry.js'), code, 'utf8'); + const child = spawnSync(process.execPath, [ + '--snapshot-blob', + blobPath, + '--build-snapshot', + 'entry.js', + ], { + cwd: tmpdir.path + }); + if (child.status !== 0) { + console.log(child.stderr.toString()); + console.log(child.stdout.toString()); + assert.strictEqual(child.status, 0); + } + const stats = fs.statSync(path.join(tmpdir.path, 'snapshot.blob')); + assert(stats.isFile()); +} + +{ + const child = spawnSync(process.execPath, [ + '--snapshot-blob', + blobPath, + 'argv1', + 'argv2', + ], { + cwd: tmpdir.path, + env: { + ...process.env, + } + }); + + const stdout = JSON.parse(child.stdout.toString().trim()); + assert.deepStrictEqual(stdout, [ + process.execPath, + 'argv1', + 'argv2', + ]); + assert.strictEqual(child.status, 0); +}