Commit dc5c8781 by Vicent Marti

http-parser: Do not use bitfields

Bitfields suck. And if you make them with non-int types, they suck
in a non-standards compliant way. Like sucking sideways or something.

This commit removes all bitfields in the `http_parser` struct, and
replaces them with the minimal type needed to contain their values. Note
that the fields in the struct have been reordered so they can be packed
with 4-byte alignment.

This saves both memory on the parser (because non-int bitfields get expanded to
4byte in most compilers anyway) and time (because the fields are now
properly aligned and the compiler doesn't need to generate bit-level ops
to access them).
parent 40fe5fbe
...@@ -201,28 +201,29 @@ enum http_errno { ...@@ -201,28 +201,29 @@ enum http_errno {
struct http_parser { struct http_parser {
/** PRIVATE **/ /** PRIVATE **/
unsigned char type : 2; uint32_t nread;
unsigned char flags : 6; /* F_* values from 'flags' enum; semi-public */ int64_t content_length;
unsigned char type;
unsigned char flags; /* F_* values from 'flags' enum; semi-public */
unsigned char state; unsigned char state;
unsigned char header_state; unsigned char header_state;
unsigned char index; unsigned char index;
uint32_t nread;
int64_t content_length;
/** READ-ONLY **/ /** READ-ONLY **/
unsigned short http_major;
unsigned short http_minor;
unsigned short status_code; /* responses only */
unsigned char method; /* requests only */
unsigned char http_errno : 7;
/* 1 = Upgrade header was present and the parser has exited because of that. /* 1 = Upgrade header was present and the parser has exited because of that.
* 0 = No upgrade header present. * 0 = No upgrade header present.
* Should be checked when http_parser_execute() returns in addition to * Should be checked when http_parser_execute() returns in addition to
* error checking. * error checking.
*/ */
unsigned char upgrade : 1; unsigned char upgrade;
unsigned short http_major;
unsigned short http_minor;
unsigned short status_code; /* responses only */
unsigned char method; /* requests only */
unsigned char http_errno;
#if HTTP_PARSER_DEBUG #if HTTP_PARSER_DEBUG
uint32_t error_lineno; uint32_t error_lineno;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment