Skip to content

Commit 5dbefe1

Browse files
cjihrigMylesBorins
authored andcommittedOct 24, 2017
src: increase usage of context in spawn_sync.cc
Backport-PR-URL: #16426 Refs: #15380 PR-URL: #16247 Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent 91dc6c7 commit 5dbefe1

File tree

1 file changed

+84
-47
lines changed

1 file changed

+84
-47
lines changed
 

‎src/spawn_sync.cc

+84-47
Original file line numberDiff line numberDiff line change
@@ -663,39 +663,47 @@ void SyncProcessRunner::SetPipeError(int pipe_error) {
663663

664664
Local<Object> SyncProcessRunner::BuildResultObject() {
665665
EscapableHandleScope scope(env()->isolate());
666+
Local<Context> context = env()->context();
666667

667668
Local<Object> js_result = Object::New(env()->isolate());
668669

669670
if (GetError() != 0) {
670-
js_result->Set(env()->error_string(),
671-
Integer::New(env()->isolate(), GetError()));
671+
js_result->Set(context, env()->error_string(),
672+
Integer::New(env()->isolate(), GetError())).FromJust();
672673
}
673674

674675
if (exit_status_ >= 0) {
675676
if (term_signal_ > 0) {
676-
js_result->Set(env()->status_string(), Null(env()->isolate()));
677+
js_result->Set(context, env()->status_string(),
678+
Null(env()->isolate())).FromJust();
677679
} else {
678-
js_result->Set(env()->status_string(),
679-
Number::New(env()->isolate(), static_cast<double>(exit_status_)));
680+
js_result->Set(context, env()->status_string(),
681+
Number::New(env()->isolate(),
682+
static_cast<double>(exit_status_))).FromJust();
680683
}
681684
} else {
682685
// If exit_status_ < 0 the process was never started because of some error.
683-
js_result->Set(env()->status_string(), Null(env()->isolate()));
686+
js_result->Set(context, env()->status_string(),
687+
Null(env()->isolate())).FromJust();
684688
}
685689

686690
if (term_signal_ > 0)
687-
js_result->Set(env()->signal_string(),
688-
String::NewFromUtf8(env()->isolate(), signo_string(term_signal_)));
691+
js_result->Set(context, env()->signal_string(),
692+
String::NewFromUtf8(env()->isolate(),
693+
signo_string(term_signal_))).FromJust();
689694
else
690-
js_result->Set(env()->signal_string(), Null(env()->isolate()));
695+
js_result->Set(context, env()->signal_string(),
696+
Null(env()->isolate())).FromJust();
691697

692698
if (exit_status_ >= 0)
693-
js_result->Set(env()->output_string(), BuildOutputArray());
699+
js_result->Set(context, env()->output_string(),
700+
BuildOutputArray()).FromJust();
694701
else
695-
js_result->Set(env()->output_string(), Null(env()->isolate()));
702+
js_result->Set(context, env()->output_string(),
703+
Null(env()->isolate())).FromJust();
696704

697-
js_result->Set(env()->pid_string(),
698-
Number::New(env()->isolate(), uv_process_.pid));
705+
js_result->Set(context, env()->pid_string(),
706+
Number::New(env()->isolate(), uv_process_.pid)).FromJust();
699707

700708
return scope.Escape(js_result);
701709
}
@@ -706,14 +714,15 @@ Local<Array> SyncProcessRunner::BuildOutputArray() {
706714
CHECK_NE(stdio_pipes_, nullptr);
707715

708716
EscapableHandleScope scope(env()->isolate());
717+
Local<Context> context = env()->context();
709718
Local<Array> js_output = Array::New(env()->isolate(), stdio_count_);
710719

711720
for (uint32_t i = 0; i < stdio_count_; i++) {
712721
SyncProcessStdioPipe* h = stdio_pipes_[i];
713722
if (h != nullptr && h->writable())
714-
js_output->Set(i, h->GetOutputAsBuffer(env()));
723+
js_output->Set(context, i, h->GetOutputAsBuffer(env())).FromJust();
715724
else
716-
js_output->Set(i, Null(env()->isolate()));
725+
js_output->Set(context, i, Null(env()->isolate())).FromJust();
717726
}
718727

719728
return scope.Escape(js_output);
@@ -727,86 +736,100 @@ int SyncProcessRunner::ParseOptions(Local<Value> js_value) {
727736
if (!js_value->IsObject())
728737
return UV_EINVAL;
729738

739+
Local<Context> context = env()->context();
730740
Local<Object> js_options = js_value.As<Object>();
731741

732-
Local<Value> js_file = js_options->Get(env()->file_string());
742+
Local<Value> js_file =
743+
js_options->Get(context, env()->file_string()).ToLocalChecked();
733744
r = CopyJsString(js_file, &file_buffer_);
734745
if (r < 0)
735746
return r;
736747
uv_process_options_.file = file_buffer_;
737748

738-
Local<Value> js_args = js_options->Get(env()->args_string());
749+
Local<Value> js_args =
750+
js_options->Get(context, env()->args_string()).ToLocalChecked();
739751
r = CopyJsStringArray(js_args, &args_buffer_);
740752
if (r < 0)
741753
return r;
742754
uv_process_options_.args = reinterpret_cast<char**>(args_buffer_);
743755

744-
745-
Local<Value> js_cwd = js_options->Get(env()->cwd_string());
756+
Local<Value> js_cwd =
757+
js_options->Get(context, env()->cwd_string()).ToLocalChecked();
746758
if (IsSet(js_cwd)) {
747759
r = CopyJsString(js_cwd, &cwd_buffer_);
748760
if (r < 0)
749761
return r;
750762
uv_process_options_.cwd = cwd_buffer_;
751763
}
752764

753-
Local<Value> js_env_pairs = js_options->Get(env()->env_pairs_string());
765+
Local<Value> js_env_pairs =
766+
js_options->Get(context, env()->env_pairs_string()).ToLocalChecked();
754767
if (IsSet(js_env_pairs)) {
755768
r = CopyJsStringArray(js_env_pairs, &env_buffer_);
756769
if (r < 0)
757770
return r;
758771

759772
uv_process_options_.env = reinterpret_cast<char**>(env_buffer_);
760773
}
761-
Local<Value> js_uid = js_options->Get(env()->uid_string());
774+
Local<Value> js_uid =
775+
js_options->Get(context, env()->uid_string()).ToLocalChecked();
762776
if (IsSet(js_uid)) {
763777
CHECK(js_uid->IsInt32());
764-
const int32_t uid = js_uid->Int32Value(env()->context()).FromJust();
778+
const int32_t uid = js_uid->Int32Value(context).FromJust();
765779
uv_process_options_.uid = static_cast<uv_uid_t>(uid);
766780
uv_process_options_.flags |= UV_PROCESS_SETUID;
767781
}
768782

769-
Local<Value> js_gid = js_options->Get(env()->gid_string());
783+
Local<Value> js_gid =
784+
js_options->Get(context, env()->gid_string()).ToLocalChecked();
770785
if (IsSet(js_gid)) {
771786
CHECK(js_gid->IsInt32());
772-
const int32_t gid = js_gid->Int32Value(env()->context()).FromJust();
787+
const int32_t gid = js_gid->Int32Value(context).FromJust();
773788
uv_process_options_.gid = static_cast<uv_gid_t>(gid);
774789
uv_process_options_.flags |= UV_PROCESS_SETGID;
775790
}
776791

777-
if (js_options->Get(env()->detached_string())->BooleanValue())
792+
Local<Value> js_detached =
793+
js_options->Get(context, env()->detached_string()).ToLocalChecked();
794+
if (js_detached->BooleanValue(context).FromJust())
778795
uv_process_options_.flags |= UV_PROCESS_DETACHED;
779796

780-
Local<String> win_hide = env()->windows_hide_string();
781-
782-
if (js_options->Get(win_hide)->BooleanValue())
797+
Local<Value> js_win_hide =
798+
js_options->Get(context, env()->windows_hide_string()).ToLocalChecked();
799+
if (js_win_hide->BooleanValue(context).FromJust())
783800
uv_process_options_.flags |= UV_PROCESS_WINDOWS_HIDE;
784801

785-
Local<String> wba = env()->windows_verbatim_arguments_string();
802+
Local<Value> js_wva =
803+
js_options->Get(context, env()->windows_verbatim_arguments_string())
804+
.ToLocalChecked();
786805

787-
if (js_options->Get(wba)->BooleanValue())
806+
if (js_wva->BooleanValue(context).FromJust())
788807
uv_process_options_.flags |= UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS;
789808

790-
Local<Value> js_timeout = js_options->Get(env()->timeout_string());
809+
Local<Value> js_timeout =
810+
js_options->Get(context, env()->timeout_string()).ToLocalChecked();
791811
if (IsSet(js_timeout)) {
792812
CHECK(js_timeout->IsNumber());
793-
int64_t timeout = js_timeout->IntegerValue();
813+
int64_t timeout = js_timeout->IntegerValue(context).FromJust();
794814
timeout_ = static_cast<uint64_t>(timeout);
795815
}
796816

797-
Local<Value> js_max_buffer = js_options->Get(env()->max_buffer_string());
817+
Local<Value> js_max_buffer =
818+
js_options->Get(context, env()->max_buffer_string()).ToLocalChecked();
798819
if (IsSet(js_max_buffer)) {
799820
CHECK(js_max_buffer->IsNumber());
800-
max_buffer_ = js_max_buffer->NumberValue();
821+
max_buffer_ = js_max_buffer->NumberValue(context).FromJust();
801822
}
802823

803-
Local<Value> js_kill_signal = js_options->Get(env()->kill_signal_string());
824+
Local<Value> js_kill_signal =
825+
js_options->Get(context, env()->kill_signal_string()).ToLocalChecked();
804826
if (IsSet(js_kill_signal)) {
805827
CHECK(js_kill_signal->IsInt32());
806-
kill_signal_ = js_kill_signal->Int32Value();
828+
kill_signal_ = js_kill_signal->Int32Value(context).FromJust();
807829
}
808830

809-
Local<Value> js_stdio = js_options->Get(env()->stdio_string());
831+
Local<Value> js_stdio =
832+
js_options->Get(context, env()->stdio_string()).ToLocalChecked();
810833
r = ParseStdioOptions(js_stdio);
811834
if (r < 0)
812835
return r;
@@ -822,6 +845,7 @@ int SyncProcessRunner::ParseStdioOptions(Local<Value> js_value) {
822845
if (!js_value->IsArray())
823846
return UV_EINVAL;
824847

848+
Local<Context> context = env()->context();
825849
js_stdio_options = js_value.As<Array>();
826850

827851
stdio_count_ = js_stdio_options->Length();
@@ -831,7 +855,8 @@ int SyncProcessRunner::ParseStdioOptions(Local<Value> js_value) {
831855
stdio_pipes_initialized_ = true;
832856

833857
for (uint32_t i = 0; i < stdio_count_; i++) {
834-
Local<Value> js_stdio_option = js_stdio_options->Get(i);
858+
Local<Value> js_stdio_option =
859+
js_stdio_options->Get(context, i).ToLocalChecked();
835860

836861
if (!js_stdio_option->IsObject())
837862
return UV_EINVAL;
@@ -850,7 +875,9 @@ int SyncProcessRunner::ParseStdioOptions(Local<Value> js_value) {
850875

851876
int SyncProcessRunner::ParseStdioOption(int child_fd,
852877
Local<Object> js_stdio_option) {
853-
Local<Value> js_type = js_stdio_option->Get(env()->type_string());
878+
Local<Context> context = env()->context();
879+
Local<Value> js_type =
880+
js_stdio_option->Get(context, env()->type_string()).ToLocalChecked();
854881

855882
if (js_type->StrictEquals(env()->ignore_string())) {
856883
return AddStdioIgnore(child_fd);
@@ -859,13 +886,17 @@ int SyncProcessRunner::ParseStdioOption(int child_fd,
859886
Local<String> rs = env()->readable_string();
860887
Local<String> ws = env()->writable_string();
861888

862-
bool readable = js_stdio_option->Get(rs)->BooleanValue();
863-
bool writable = js_stdio_option->Get(ws)->BooleanValue();
889+
bool readable = js_stdio_option->Get(context, rs)
890+
.ToLocalChecked()->BooleanValue(context).FromJust();
891+
bool writable =
892+
js_stdio_option->Get(context, ws)
893+
.ToLocalChecked()->BooleanValue(context).FromJust();
864894

865895
uv_buf_t buf = uv_buf_init(nullptr, 0);
866896

867897
if (readable) {
868-
Local<Value> input = js_stdio_option->Get(env()->input_string());
898+
Local<Value> input =
899+
js_stdio_option->Get(context, env()->input_string()).ToLocalChecked();
869900
if (Buffer::HasInstance(input)) {
870901
buf = uv_buf_init(Buffer::Data(input),
871902
static_cast<unsigned int>(Buffer::Length(input)));
@@ -881,7 +912,8 @@ int SyncProcessRunner::ParseStdioOption(int child_fd,
881912

882913
} else if (js_type->StrictEquals(env()->inherit_string()) ||
883914
js_type->StrictEquals(env()->fd_string())) {
884-
int inherit_fd = js_stdio_option->Get(env()->fd_string())->Int32Value();
915+
int inherit_fd = js_stdio_option->Get(context, env()->fd_string())
916+
.ToLocalChecked()->Int32Value(context).FromJust();
885917
return AddStdioInheritFD(child_fd, inherit_fd);
886918

887919
} else {
@@ -981,14 +1013,17 @@ int SyncProcessRunner::CopyJsStringArray(Local<Value> js_value,
9811013
if (!js_value->IsArray())
9821014
return UV_EINVAL;
9831015

1016+
Local<Context> context = env()->context();
9841017
js_array = js_value.As<Array>()->Clone().As<Array>();
9851018
length = js_array->Length();
9861019

9871020
// Convert all array elements to string. Modify the js object itself if
9881021
// needed - it's okay since we cloned the original object.
9891022
for (uint32_t i = 0; i < length; i++) {
990-
if (!js_array->Get(i)->IsString())
991-
js_array->Set(i, js_array->Get(i)->ToString(env()->isolate()));
1023+
auto value = js_array->Get(context, i).ToLocalChecked();
1024+
1025+
if (!value->IsString())
1026+
js_array->Set(context, i, value->ToString(env()->isolate())).FromJust();
9921027
}
9931028

9941029
// Index has a pointer to every string element, plus one more for a final
@@ -999,7 +1034,8 @@ int SyncProcessRunner::CopyJsStringArray(Local<Value> js_value,
9991034
// after every string. Align strings to cache lines.
10001035
data_size = 0;
10011036
for (uint32_t i = 0; i < length; i++) {
1002-
data_size += StringBytes::StorageSize(isolate, js_array->Get(i), UTF8) + 1;
1037+
auto value = js_array->Get(context, i).ToLocalChecked();
1038+
data_size += StringBytes::StorageSize(isolate, value, UTF8) + 1;
10031039
data_size = ROUND_UP(data_size, sizeof(void*));
10041040
}
10051041

@@ -1010,10 +1046,11 @@ int SyncProcessRunner::CopyJsStringArray(Local<Value> js_value,
10101046

10111047
for (uint32_t i = 0; i < length; i++) {
10121048
list[i] = buffer + data_offset;
1049+
auto value = js_array->Get(context, i).ToLocalChecked();
10131050
data_offset += StringBytes::Write(isolate,
10141051
buffer + data_offset,
10151052
-1,
1016-
js_array->Get(i),
1053+
value,
10171054
UTF8);
10181055
buffer[data_offset++] = '\0';
10191056
data_offset = ROUND_UP(data_offset, sizeof(void*));

0 commit comments

Comments
 (0)
Please sign in to comment.