http: remove pushValueToArray in Parser::CreateHeaders()

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 <anna@addaleax.net>
Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com>
Reviewed-By: Refael Ackermann <refack@gmail.com>
This commit is contained in:
Joyee Cheung 2018-11-09 11:33:12 +08:00
parent 1a787b514c
commit 83c6067ac6
No known key found for this signature in database
GPG Key ID: 92B78A53C8303B8D

View File

@ -73,7 +73,8 @@ const uint32_t kOnHeadersComplete = 1;
const uint32_t kOnBody = 2; const uint32_t kOnBody = 2;
const uint32_t kOnMessageComplete = 3; const uint32_t kOnMessageComplete = 3;
const uint32_t kOnExecute = 4; const uint32_t kOnExecute = 4;
// Any more fields than this will be flushed into JS
const size_t kMaxHeaderFieldsCount = 32;
// helper class for the Parser // helper class for the Parser
struct StringPtr { struct StringPtr {
@ -203,7 +204,7 @@ class Parser : public AsyncWrap, public StreamListener {
if (num_fields_ == num_values_) { if (num_fields_ == num_values_) {
// start of new field name // start of new field name
num_fields_++; num_fields_++;
if (num_fields_ == arraysize(fields_)) { if (num_fields_ == kMaxHeaderFieldsCount) {
// ran out of space - flush to javascript land // ran out of space - flush to javascript land
Flush(); Flush();
num_fields_ = 1; num_fields_ = 1;
@ -212,7 +213,7 @@ class Parser : public AsyncWrap, public StreamListener {
fields_[num_fields_ - 1].Reset(); fields_[num_fields_ - 1].Reset();
} }
CHECK_LT(num_fields_, arraysize(fields_)); CHECK_LT(num_fields_, kMaxHeaderFieldsCount);
CHECK_EQ(num_fields_, num_values_ + 1); CHECK_EQ(num_fields_, num_values_ + 1);
fields_[num_fields_ - 1].Update(at, length); fields_[num_fields_ - 1].Update(at, length);
@ -731,25 +732,15 @@ class Parser : public AsyncWrap, public StreamListener {
} }
Local<Array> CreateHeaders() { Local<Array> CreateHeaders() {
Local<Array> headers = Array::New(env()->isolate()); // There could be extra entries but the max size should be fixed
Local<Function> fn = env()->push_values_to_array_function(); Local<Value> headers_v[kMaxHeaderFieldsCount * 2];
Local<Value> argv[NODE_PUSH_VAL_TO_ARRAY_MAX * 2];
size_t i = 0;
do { for (size_t i = 0; i < num_values_; ++i) {
size_t j = 0; headers_v[i * 2] = fields_[i].ToString(env());
while (i < num_values_ && j < arraysize(argv) / 2) { headers_v[i * 2 + 1] = values_[i].ToString(env());
argv[j * 2] = fields_[i].ToString(env());
argv[j * 2 + 1] = values_[i].ToString(env());
i++;
j++;
} }
if (j > 0) {
fn->Call(env()->context(), headers, j * 2, argv).ToLocalChecked();
}
} while (i < num_values_);
return headers; return Array::New(env()->isolate(), headers_v, num_values_ * 2);
} }
@ -824,8 +815,8 @@ class Parser : public AsyncWrap, public StreamListener {
} }
parser_t parser_; parser_t parser_;
StringPtr fields_[32]; // header fields StringPtr fields_[kMaxHeaderFieldsCount]; // header fields
StringPtr values_[32]; // header values StringPtr values_[kMaxHeaderFieldsCount]; // header values
StringPtr url_; StringPtr url_;
StringPtr status_message_; StringPtr status_message_;
size_t num_fields_; size_t num_fields_;