From 1a787b514cde6702bb7513f74392ae6a3b91e6f8 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Fri, 9 Nov 2018 11:32:27 +0800 Subject: [PATCH] http2: remove pushValueToArray in Http2Session::HandleOriginFrame Instead of calling into JS from C++ to push values into an array, use the new Array::New API that takes a pointer and a length directly. PR-URL: https://github.com/nodejs/node/pull/24264 Reviewed-By: Anna Henningsen Reviewed-By: Daniel Bevenius Reviewed-By: Refael Ackermann --- src/node_http2.cc | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/node_http2.cc b/src/node_http2.cc index e50cbfd939d..20b634f90fc 100644 --- a/src/node_http2.cc +++ b/src/node_http2.cc @@ -1424,25 +1424,17 @@ void Http2Session::HandleOriginFrame(const nghttp2_frame* frame) { nghttp2_extension ext = frame->ext; nghttp2_ext_origin* origin = static_cast(ext.payload); - Local holder = Array::New(isolate); - Local fn = env()->push_values_to_array_function(); - Local argv[NODE_PUSH_VAL_TO_ARRAY_MAX]; + size_t nov = origin->nov; + std::vector> origin_v(nov); - size_t n = 0; - while (n < origin->nov) { - size_t j = 0; - while (n < origin->nov && j < arraysize(argv)) { - auto entry = origin->ov[n++]; - argv[j++] = - String::NewFromOneByte(isolate, - entry.origin, - v8::NewStringType::kNormal, - entry.origin_len).ToLocalChecked(); - } - if (j > 0) - fn->Call(context, holder, j, argv).ToLocalChecked(); + for (size_t i = 0; i < nov; ++i) { + const nghttp2_origin_entry& entry = origin->ov[i]; + origin_v[i] = + String::NewFromOneByte( + isolate, entry.origin, v8::NewStringType::kNormal, entry.origin_len) + .ToLocalChecked(); } - + Local holder = Array::New(isolate, origin_v.data(), origin_v.size()); MakeCallback(env()->onorigin_string(), 1, &holder); }