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') {
}
+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)
{
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);
{ 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"),