Skip to content

Commit

Permalink
bootstrap: do not expand process.argv[1] for snapshot entry points
Browse files Browse the repository at this point in the history
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: #47466
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
  • Loading branch information
joyeecheung authored and MoLow committed Jul 6, 2023
1 parent a0b9853 commit 0165a76
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 1 deletion.
3 changes: 2 additions & 1 deletion lib/internal/v8/startup_snapshot.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});
Expand Down
58 changes: 58 additions & 0 deletions test/parallel/test-snapshot-argv1.js
Original file line number Diff line number Diff line change
@@ -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);
}

0 comments on commit 0165a76

Please sign in to comment.