@@ -1292,45 +1292,30 @@ void Http2Session::HandleHeadersFrame(const nghttp2_frame* frame) {
12921292 Local<String> value_str;
12931293
12941294 Local<Array> holder = Array::New(isolate);
1295- Local<Function> fn = env()->push_values_to_array_function();
1296- Local<Value> argv[NODE_PUSH_VAL_TO_ARRAY_MAX * 2];
1297-
12981295 // The headers are passed in above as a queue of nghttp2_header structs.
12991296 // The following converts that into a JS array with the structure:
13001297 // [name1, value1, name2, value2, name3, value3, name3, value4] and so on.
13011298 // That array is passed up to the JS layer and converted into an Object form
13021299 // like {name1: value1, name2: value2, name3: [value3, value4]}. We do it
13031300 // this way for performance reasons (it's faster to generate and pass an
13041301 // array than it is to generate and pass the object).
1305- size_t n = 0;
1306- while (n < headers.size()) {
1307- size_t j = 0;
1308- while (n < headers.size() && j < arraysize(argv) / 2) {
1309- nghttp2_header item = headers[n++];
1310- // The header name and value are passed as external one-byte strings
1311- name_str =
1312- ExternalHeader::New<true>(this, item.name).ToLocalChecked();
1313- value_str =
1314- ExternalHeader::New<false>(this, item.value).ToLocalChecked();
1315- argv[j * 2] = name_str;
1316- argv[j * 2 + 1] = value_str;
1317- j++;
1318- }
1319- // For performance, we pass name and value pairs to array.protototype.push
1320- // in batches of size NODE_PUSH_VAL_TO_ARRAY_MAX * 2 until there are no
1321- // more items to push.
1322- if (j > 0) {
1323- fn->Call(env()->context(), holder, j * 2, argv).ToLocalChecked();
1324- }
1302+ size_t headers_size = headers.size();
1303+ std::vector<Local<Value>> headers_v(headers_size * 2);
1304+ for (size_t i = 0; i < headers_size; ++i) {
1305+ const nghttp2_header& item = headers[i];
1306+ // The header name and value are passed as external one-byte strings
1307+ headers_v[i * 2] =
1308+ ExternalHeader::New<true>(this, item.name).ToLocalChecked();
1309+ headers_v[i * 2 + 1] =
1310+ ExternalHeader::New<false>(this, item.value).ToLocalChecked();
13251311 }
13261312
13271313 Local<Value> args[5] = {
1328- stream->object(),
1329- Integer::New(isolate, id),
1330- Integer::New(isolate, stream->headers_category()),
1331- Integer::New(isolate, frame->hd.flags),
1332- holder
1333- };
1314+ stream->object(),
1315+ Integer::New(isolate, id),
1316+ Integer::New(isolate, stream->headers_category()),
1317+ Integer::New(isolate, frame->hd.flags),
1318+ Array::New(isolate, headers_v.data(), headers_size * 2)};
13341319 MakeCallback(env()->onheaders_string(), arraysize(args), args);
13351320}
13361321
0 commit comments