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 <[email protected]>
Reviewed-By: Chengzhong Wu <[email protected]>
  • Loading branch information
joyeecheung authored and RafaelGSS committed Apr 13, 2023
1 parent d4b440b commit e50c6b9
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 e50c6b9

Please sign in to comment.