@@ -1155,10 +1155,12 @@ Maybe<int> SyncProcessRunner::CopyJsStringArray(Local<Value> js_value,
11551155 if (!js_value->IsArray ()) return Just<int >(UV_EINVAL);
11561156
11571157 Local<Context> context = env ()->context ();
1158- js_array = js_value.As <Array>()-> Clone (). As <Array>() ;
1158+ js_array = js_value.As <Array>();
11591159 length = js_array->Length ();
11601160 data_size = 0 ;
11611161
1162+ Local<String> values[length];
1163+
11621164 // Index has a pointer to every string element, plus one more for a final
11631165 // null pointer.
11641166 list_size = (length + 1 ) * sizeof *list;
@@ -1173,17 +1175,19 @@ Maybe<int> SyncProcessRunner::CopyJsStringArray(Local<Value> js_value,
11731175 return Nothing<int >();
11741176 }
11751177
1176- if (!value->IsString ()) {
1178+ if (value->IsString ()) {
1179+ values[i] = value.As <String>();
1180+ } else {
11771181 Local<String> string;
11781182 if (!value->ToString (env ()->isolate ()->GetCurrentContext ())
1179- .ToLocal (&string) ||
1180- js_array->Set (context, i, string).IsNothing ()) {
1183+ .ToLocal (&string)) {
11811184 return Nothing<int >();
11821185 }
1186+ values[i] = string;
11831187 }
11841188
11851189 size_t maybe_size;
1186- if (!StringBytes::StorageSize (isolate, value , UTF8).To (&maybe_size)) {
1190+ if (!StringBytes::StorageSize (isolate, values[i] , UTF8).To (&maybe_size)) {
11871191 return Nothing<int >();
11881192 }
11891193 data_size += maybe_size + 1 ;
@@ -1197,14 +1201,10 @@ Maybe<int> SyncProcessRunner::CopyJsStringArray(Local<Value> js_value,
11971201
11981202 for (uint32_t i = 0 ; i < length; i++) {
11991203 list[i] = buffer + data_offset;
1200- Local<Value> value;
1201- if (!js_array->Get (context, i).ToLocal (&value)) {
1202- return Nothing<int >();
1203- }
12041204 data_offset += StringBytes::Write (isolate,
12051205 buffer + data_offset,
12061206 -1 ,
1207- value ,
1207+ values[i] ,
12081208 UTF8);
12091209 buffer[data_offset++] = ' \0 ' ;
12101210 data_offset = nbytes::RoundUp (data_offset, sizeof (void *));
0 commit comments