Skip to content

Commit a412d5c

Browse files
addaleaxtargos
authored andcommitted
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 e712db5 commit a412d5c

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
@@ -400,63 +400,64 @@ void Worker::New(const FunctionCallbackInfo<Value>& args) {
400400
std::vector<std::string> exec_argv_out;
401401
bool has_explicit_exec_argv = false;
402402

403+
CHECK_EQ(args.Length(), 2);
403404
// Argument might be a string or URL
404-
if (args.Length() > 0 && !args[0]->IsNullOrUndefined()) {
405+
if (!args[0]->IsNullOrUndefined()) {
405406
Utf8Value value(
406407
args.GetIsolate(),
407408
args[0]->ToString(env->context()).FromMaybe(v8::Local<v8::String>()));
408409
url.append(value.out(), value.length());
410+
}
409411

410-
if (args.Length() > 1 && args[1]->IsArray()) {
411-
v8::Local<v8::Array> array = args[1].As<v8::Array>();
412-
// The first argument is reserved for program name, but we don't need it
413-
// in workers.
414-
has_explicit_exec_argv = true;
415-
std::vector<std::string> exec_argv = {""};
416-
uint32_t length = array->Length();
417-
for (uint32_t i = 0; i < length; i++) {
418-
v8::Local<v8::Value> arg;
419-
if (!array->Get(env->context(), i).ToLocal(&arg)) {
420-
return;
421-
}
422-
v8::MaybeLocal<v8::String> arg_v8_string =
423-
arg->ToString(env->context());
424-
if (arg_v8_string.IsEmpty()) {
425-
return;
426-
}
427-
Utf8Value arg_utf8_value(
428-
args.GetIsolate(),
429-
arg_v8_string.FromMaybe(v8::Local<v8::String>()));
430-
std::string arg_string(arg_utf8_value.out(), arg_utf8_value.length());
431-
exec_argv.push_back(arg_string);
412+
if (args[1]->IsArray()) {
413+
v8::Local<v8::Array> array = args[1].As<v8::Array>();
414+
// The first argument is reserved for program name, but we don't need it
415+
// in workers.
416+
has_explicit_exec_argv = true;
417+
std::vector<std::string> exec_argv = {""};
418+
uint32_t length = array->Length();
419+
for (uint32_t i = 0; i < length; i++) {
420+
v8::Local<v8::Value> arg;
421+
if (!array->Get(env->context(), i).ToLocal(&arg)) {
422+
return;
432423
}
433-
434-
std::vector<std::string> invalid_args{};
435-
std::vector<std::string> errors{};
436-
per_isolate_opts.reset(new PerIsolateOptions());
437-
438-
// Using invalid_args as the v8_args argument as it stores unknown
439-
// options for the per isolate parser.
440-
options_parser::Parse(
441-
&exec_argv,
442-
&exec_argv_out,
443-
&invalid_args,
444-
per_isolate_opts.get(),
445-
kDisallowedInEnvironment,
446-
&errors);
447-
448-
// The first argument is program name.
449-
invalid_args.erase(invalid_args.begin());
450-
if (errors.size() > 0 || invalid_args.size() > 0) {
451-
v8::Local<v8::Value> error =
452-
ToV8Value(env->context(),
453-
errors.size() > 0 ? errors : invalid_args)
454-
.ToLocalChecked();
455-
Local<String> key =
456-
FIXED_ONE_BYTE_STRING(env->isolate(), "invalidExecArgv");
457-
USE(args.This()->Set(env->context(), key, error).FromJust());
424+
v8::MaybeLocal<v8::String> arg_v8_string =
425+
arg->ToString(env->context());
426+
if (arg_v8_string.IsEmpty()) {
458427
return;
459428
}
429+
Utf8Value arg_utf8_value(
430+
args.GetIsolate(),
431+
arg_v8_string.FromMaybe(v8::Local<v8::String>()));
432+
std::string arg_string(arg_utf8_value.out(), arg_utf8_value.length());
433+
exec_argv.push_back(arg_string);
434+
}
435+
436+
std::vector<std::string> invalid_args{};
437+
std::vector<std::string> errors{};
438+
per_isolate_opts.reset(new PerIsolateOptions());
439+
440+
// Using invalid_args as the v8_args argument as it stores unknown
441+
// options for the per isolate parser.
442+
options_parser::Parse(
443+
&exec_argv,
444+
&exec_argv_out,
445+
&invalid_args,
446+
per_isolate_opts.get(),
447+
kDisallowedInEnvironment,
448+
&errors);
449+
450+
// The first argument is program name.
451+
invalid_args.erase(invalid_args.begin());
452+
if (errors.size() > 0 || invalid_args.size() > 0) {
453+
v8::Local<v8::Value> error =
454+
ToV8Value(env->context(),
455+
errors.size() > 0 ? errors : invalid_args)
456+
.ToLocalChecked();
457+
Local<String> key =
458+
FIXED_ONE_BYTE_STRING(env->isolate(), "invalidExecArgv");
459+
USE(args.This()->Set(env->context(), key, error).FromJust());
460+
return;
460461
}
461462
}
462463
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)