diff options
author | Joyee Cheung <joyeec9h3@gmail.com> | 2018-11-09 11:33:12 +0800 |
---|---|---|
committer | Joyee Cheung <joyeec9h3@gmail.com> | 2018-11-14 02:58:22 +0800 |
commit | 83c6067ac6f20aa81f00fa020fe528ca27980b7d (patch) | |
tree | e7ede828cbb4b6a9bfc3a392619ee059666a29c8 /src | |
parent | 1a787b514cde6702bb7513f74392ae6a3b91e6f8 (diff) | |
download | android-node-v8-83c6067ac6f20aa81f00fa020fe528ca27980b7d.tar.gz android-node-v8-83c6067ac6f20aa81f00fa020fe528ca27980b7d.tar.bz2 android-node-v8-83c6067ac6f20aa81f00fa020fe528ca27980b7d.zip |
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>
Diffstat (limited to 'src')
-rw-r--r-- | src/node_http_parser.cc | 37 |
1 files changed, 14 insertions, 23 deletions
diff --git a/src/node_http_parser.cc b/src/node_http_parser.cc index c9e057711d..f752a003a2 100644 --- a/src/node_http_parser.cc +++ b/src/node_http_parser.cc @@ -73,7 +73,8 @@ const uint32_t kOnHeadersComplete = 1; const uint32_t kOnBody = 2; const uint32_t kOnMessageComplete = 3; 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 struct StringPtr { @@ -203,7 +204,7 @@ class Parser : public AsyncWrap, public StreamListener { if (num_fields_ == num_values_) { // start of new field name num_fields_++; - if (num_fields_ == arraysize(fields_)) { + if (num_fields_ == kMaxHeaderFieldsCount) { // ran out of space - flush to javascript land Flush(); num_fields_ = 1; @@ -212,7 +213,7 @@ class Parser : public AsyncWrap, public StreamListener { fields_[num_fields_ - 1].Reset(); } - CHECK_LT(num_fields_, arraysize(fields_)); + CHECK_LT(num_fields_, kMaxHeaderFieldsCount); CHECK_EQ(num_fields_, num_values_ + 1); fields_[num_fields_ - 1].Update(at, length); @@ -731,25 +732,15 @@ class Parser : public AsyncWrap, public StreamListener { } Local<Array> CreateHeaders() { - Local<Array> headers = Array::New(env()->isolate()); - Local<Function> fn = env()->push_values_to_array_function(); - Local<Value> argv[NODE_PUSH_VAL_TO_ARRAY_MAX * 2]; - size_t i = 0; - - do { - size_t j = 0; - while (i < num_values_ && j < arraysize(argv) / 2) { - 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_); + // There could be extra entries but the max size should be fixed + Local<Value> headers_v[kMaxHeaderFieldsCount * 2]; + + for (size_t i = 0; i < num_values_; ++i) { + headers_v[i * 2] = fields_[i].ToString(env()); + headers_v[i * 2 + 1] = values_[i].ToString(env()); + } - 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_; - StringPtr fields_[32]; // header fields - StringPtr values_[32]; // header values + StringPtr fields_[kMaxHeaderFieldsCount]; // header fields + StringPtr values_[kMaxHeaderFieldsCount]; // header values StringPtr url_; StringPtr status_message_; size_t num_fields_; |