From 0165a765a09ec5c4de67c7c6ffb60838551064b3 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Mon, 10 Apr 2023 18:15:03 +0200 Subject: [PATCH] bootstrap: do not expand process.argv[1] for snapshot entry points In applications with entry points deserialized from snapshots, they don't need an additional CLI argument for the entry point script so process.argv[1] is going to be other user-defiend arguments. We could consider copying process.argv[0] as process.argv[1] like what we do for single executable applications, but for now just don't exapnd it so it's easier to backport to previous releases. PR-URL: https://github.com/nodejs/node/pull/47466 Reviewed-By: Colin Ihrig Reviewed-By: Chengzhong Wu --- lib/internal/v8/startup_snapshot.js | 3 +- test/parallel/test-snapshot-argv1.js | 58 ++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 test/parallel/test-snapshot-argv1.js 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); +}