Commit dc5c87812c7328abc3f96e66b07e1c38885a51c1

Vicent Marti 2011-09-27T14:53:57

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).

diff --git a/deps/http-parser/http_parser.h b/deps/http-parser/http_parser.h
index 76a61f2..12be0d2 100644
--- a/deps/http-parser/http_parser.h
+++ b/deps/http-parser/http_parser.h
@@ -201,28 +201,29 @@ enum http_errno {
 
 struct http_parser {
   /** PRIVATE **/
-  unsigned char type : 2;
-  unsigned char flags : 6; /* F_* values from 'flags' enum; semi-public */
+  uint32_t nread;
+  int64_t content_length;
+
+  unsigned char type;
+  unsigned char flags; /* F_* values from 'flags' enum; semi-public */
   unsigned char state;
   unsigned char header_state;
   unsigned char index;
 
-  uint32_t nread;
-  int64_t content_length;
-
   /** 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.
    * 0 = No upgrade header present.
    * Should be checked when http_parser_execute() returns in addition to
    * 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
   uint32_t error_lineno;