Skip to content

Commit 3ad8f61

Browse files
committed
worker: allow execArgv and eval in combination
It was likely an oversight that `execArgv` was only read when no filename/URL was provided. PR-URL: #26533 Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent 171b270 commit 3ad8f61

File tree

2 files changed

+56
-48
lines changed

2 files changed

+56
-48
lines changed

src/node_worker.cc

+49-48
Original file line numberDiff line numberDiff line change
@@ -439,63 +439,64 @@ void Worker::New(const FunctionCallbackInfo<Value>& args) {
439439
std::vector<std::string> exec_argv_out;
440440
bool has_explicit_exec_argv = false;
441441

442+
CHECK_EQ(args.Length(), 2);
442443
// Argument might be a string or URL
443-
if (args.Length() > 0 && !args[0]->IsNullOrUndefined()) {
444+
if (!args[0]->IsNullOrUndefined()) {
444445
Utf8Value value(
445446
args.GetIsolate(),
446447
args[0]->ToString(env->context()).FromMaybe(v8::Local<v8::String>()));
447448
url.append(value.out(), value.length());
449+
}
448450

449-
if (args.Length() > 1 && args[1]->IsArray()) {
450-
v8::Local<v8::Array> array = args[1].As<v8::Array>();
451-
// The first argument is reserved for program name, but we don't need it
452-
// in workers.
453-
has_explicit_exec_argv = true;
454-
std::vector<std::string> exec_argv = {""};
455-
uint32_t length = array->Length();
456-
for (uint32_t i = 0; i < length; i++) {
457-
v8::Local<v8::Value> arg;
458-
if (!array->Get(env->context(), i).ToLocal(&arg)) {
459-
return;
460-
}
461-
v8::MaybeLocal<v8::String> arg_v8_string =
462-
arg->ToString(env->context());
463-
if (arg_v8_string.IsEmpty()) {
464-
return;
465-
}
466-
Utf8Value arg_utf8_value(
467-
args.GetIsolate(),
468-
arg_v8_string.FromMaybe(v8::Local<v8::String>()));
469-
std::string arg_string(arg_utf8_value.out(), arg_utf8_value.length());
470-
exec_argv.push_back(arg_string);
451+
if (args[1]->IsArray()) {
452+
v8::Local<v8::Array> array = args[1].As<v8::Array>();
453+
// The first argument is reserved for program name, but we don't need it
454+
// in workers.
455+
has_explicit_exec_argv = true;
456+
std::vector<std::string> exec_argv = {""};
457+
uint32_t length = array->Length();
458+
for (uint32_t i = 0; i < length; i++) {
459+
v8::Local<v8::Value> arg;
460+
if (!array->Get(env->context(), i).ToLocal(&arg)) {
461+
return;
471462
}
472-
473-
std::vector<std::string> invalid_args{};
474-
std::vector<std::string> errors{};
475-
per_isolate_opts.reset(new PerIsolateOptions());
476-
477-
// Using invalid_args as the v8_args argument as it stores unknown
478-
// options for the per isolate parser.
479-
options_parser::Parse(
480-
&exec_argv,
481-
&exec_argv_out,
482-
&invalid_args,
483-
per_isolate_opts.get(),
484-
kDisallowedInEnvironment,
485-
&errors);
486-
487-
// The first argument is program name.
488-
invalid_args.erase(invalid_args.begin());
489-
if (errors.size() > 0 || invalid_args.size() > 0) {
490-
v8::Local<v8::Value> error =
491-
ToV8Value(env->context(),
492-
errors.size() > 0 ? errors : invalid_args)
493-
.ToLocalChecked();
494-
Local<String> key =
495-
FIXED_ONE_BYTE_STRING(env->isolate(), "invalidExecArgv");
496-
USE(args.This()->Set(env->context(), key, error).FromJust());
463+
v8::MaybeLocal<v8::String> arg_v8_string =
464+
arg->ToString(env->context());
465+
if (arg_v8_string.IsEmpty()) {
497466
return;
498467
}
468+
Utf8Value arg_utf8_value(
469+
args.GetIsolate(),
470+
arg_v8_string.FromMaybe(v8::Local<v8::String>()));
471+
std::string arg_string(arg_utf8_value.out(), arg_utf8_value.length());
472+
exec_argv.push_back(arg_string);
473+
}
474+
475+
std::vector<std::string> invalid_args{};
476+
std::vector<std::string> errors{};
477+
per_isolate_opts.reset(new PerIsolateOptions());
478+
479+
// Using invalid_args as the v8_args argument as it stores unknown
480+
// options for the per isolate parser.
481+
options_parser::Parse(
482+
&exec_argv,
483+
&exec_argv_out,
484+
&invalid_args,
485+
per_isolate_opts.get(),
486+
kDisallowedInEnvironment,
487+
&errors);
488+
489+
// The first argument is program name.
490+
invalid_args.erase(invalid_args.begin());
491+
if (errors.size() > 0 || invalid_args.size() > 0) {
492+
v8::Local<v8::Value> error =
493+
ToV8Value(env->context(),
494+
errors.size() > 0 ? errors : invalid_args)
495+
.ToLocalChecked();
496+
Local<String> key =
497+
FIXED_ONE_BYTE_STRING(env->isolate(), "invalidExecArgv");
498+
USE(args.This()->Set(env->context(), key, error).FromJust());
499+
return;
499500
}
500501
}
501502
if (!has_explicit_exec_argv)

test/parallel/test-worker-execargv.js

+7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@ if (!process.env.HAS_STARTED_WORKER) {
1919
/Warning: some warning[\s\S]*at Object\.<anonymous>/.test(error)
2020
);
2121
}));
22+
23+
new Worker(
24+
"require('worker_threads').parentPort.postMessage(process.execArgv)",
25+
{ eval: true, execArgv: ['--trace-warnings'] })
26+
.on('message', common.mustCall((data) => {
27+
assert.deepStrictEqual(data, ['--trace-warnings']);
28+
}));
2229
} else {
2330
process.emitWarning('some warning');
2431
assert.deepStrictEqual(process.execArgv, ['--trace-warnings']);

0 commit comments

Comments
 (0)