]> git.kaiwu.me - njs.git/commitdiff
Added support of binary literals.
authorValentin Bartenev <vbart@nginx.com>
Sun, 1 Jul 2018 07:01:53 +0000 (10:01 +0300)
committerValentin Bartenev <vbart@nginx.com>
Sun, 1 Jul 2018 07:01:53 +0000 (10:01 +0300)
njs/njs_lexer.c
njs/njs_number.c
njs/njs_number.h
njs/test/njs_unit_test.c

index 2b17c4dd967cac9f2d0df21df321e1adb8c15133..7c60b02a4b900aa2a3280add676d33f66ac3dcca 100644 (file)
@@ -569,6 +569,27 @@ njs_lexer_number(njs_lexer_t *lexer)
             return NJS_TOKEN_NUMBER;
         }
 
+        /* Binary literal values. */
+
+        if (*p == 'b' || *p == 'B') {
+            p++;
+
+            if (p == lexer->end) {
+                return NJS_TOKEN_ILLEGAL;
+            }
+
+            lexer->start = p;
+            lexer->number = njs_number_bin_parse((const u_char **) &lexer->start,
+                                                 lexer->end);
+            p = lexer->start;
+
+            if (p < lexer->end && (*p >= '2' && *p <= '9')) {
+                return NJS_TOKEN_ILLEGAL;
+            }
+
+            return NJS_TOKEN_NUMBER;
+        }
+
         /* Legacy Octal literals are deprecated. */
 
         if (*p >= '0' && *p <= '9') {
index b9e642a6dda3327c55cb2363db4324ae044251d5..b49e8d448de77a53950e61eb47770a8880c8af60 100644 (file)
@@ -183,6 +183,35 @@ njs_number_oct_parse(const u_char **start, const u_char *end)
 }
 
 
+uint64_t
+njs_number_bin_parse(const u_char **start, const u_char *end)
+{
+    u_char        c;
+    uint64_t      num;
+    const u_char  *p;
+
+    p = *start;
+
+    num = 0;
+
+    while (p < end) {
+        /* Values less than '0' become >= 208. */
+        c = *p - '0';
+
+        if (nxt_slow_path(c > 1)) {
+            break;
+        }
+
+        num = num * 2 + c;
+        p++;
+    }
+
+    *start = p;
+
+    return num;
+}
+
+
 uint64_t
 njs_number_hex_parse(const u_char **start, const u_char *end)
 {
index a1edda844faf8078c5aeb78da39d74eb4c502a62..2b1fde27a4b8a33be03baef214b372325c108b7b 100644 (file)
@@ -14,6 +14,7 @@
 uint32_t njs_value_to_index(const njs_value_t *value);
 double njs_number_dec_parse(const u_char **start, const u_char *end);
 uint64_t njs_number_oct_parse(const u_char **start, const u_char *end);
+uint64_t njs_number_bin_parse(const u_char **start, const u_char *end);
 uint64_t njs_number_hex_parse(const u_char **start, const u_char *end);
 int64_t njs_number_radix_parse(const u_char **start, const u_char *end,
     uint8_t radix);
index 0a898ae3f6fad2a97bf8221718d2395197faa48c..c690b34b1d69361e00e7e3440295af29fe82db00 100644 (file)
@@ -147,6 +147,26 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("0O778"),
       nxt_string("SyntaxError: Unexpected token \"\" in 1") },
 
+    /* Binary Numbers. */
+
+    { nxt_string("0b0"),
+      nxt_string("0") },
+
+    { nxt_string("0B10"),
+      nxt_string("2") },
+
+    { nxt_string("0b0101"),
+      nxt_string("5") },
+
+    { nxt_string("-0B11111111"),
+      nxt_string("-255") },
+
+    { nxt_string("0b"),
+      nxt_string("SyntaxError: Unexpected token \"\" in 1") },
+
+    { nxt_string("0B12"),
+      nxt_string("SyntaxError: Unexpected token \"\" in 1") },
+
     /* Hex Numbers. */
 
     { nxt_string("0x0"),