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:
parent
1a787b514c
commit
83c6067ac6
@ -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_;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user