int64_t
-njs_number_radix_parse(u_char *p, u_char *end, uint8_t radix, nxt_bool_t exact)
+njs_number_radix_parse(u_char **start, u_char *end, uint8_t radix)
{
+ u_char *p;
uint8_t d;
+ int64_t num;
uint64_t n;
static const int8_t digits[256]
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
};
+ num = -1;
n = 0;
- while (p < end) {
- d = digits[*p++];
+ for (p = *start; p < end; p++) {
+ d = digits[*p];
if (nxt_slow_path(d >= radix)) {
- return (exact) ? -1 : (int64_t) n;
+ break;
}
n = (n * radix) + d;
+ num = n;
}
- return n;
+ *start = p;
+
+ return num;
}
radix = 16;
}
- if (p == end) {
- goto done;
- }
-
- n = njs_number_radix_parse(p, end, radix, 0);
+ n = njs_number_radix_parse(&p, end, radix);
if (n >= 0) {
num = (minus) ? -n : n;
double njs_value_to_number(njs_value_t *value);
double njs_number_parse(const u_char **start, const u_char *end);
-int64_t njs_number_radix_parse(u_char *p, u_char *end, uint8_t radix,
- nxt_bool_t exact);
+int64_t njs_number_radix_parse(u_char **start, u_char *end, uint8_t radix);
njs_ret_t njs_number_to_string(njs_vm_t *vm, njs_value_t *string,
const njs_value_t *number);
njs_ret_t njs_number_constructor(njs_vm_t *vm, njs_value_t *args,
goto invalid;
}
- u = njs_number_radix_parse(src, hex_end, 16, 1);
- if (nxt_slow_path(u < 0)) {
+ u = njs_number_radix_parse(&src, hex_end, 16);
+
+ if (nxt_slow_path(src != hex_end)) {
goto invalid;
}
- src = hex_end + skip;
+ src += skip;
size += nxt_utf8_size(u);
length++;
{ nxt_string("'\\u'"),
nxt_string("SyntaxError: Invalid Unicode code point \"\\u\" in 1") },
+ { nxt_string("'\\uzzzz'"),
+ nxt_string("SyntaxError: Invalid Unicode code point \"\\uzzzz\" in 1") },
+
{ nxt_string("'\\u03B'"),
nxt_string("SyntaxError: Invalid Unicode code point \"\\u03B\" in 1") },
{ nxt_string("parseInt('0x')"),
nxt_string("NaN") },
- { nxt_string("parseInt('0x', 10)"),
- nxt_string("0") },
+ { nxt_string("parseInt('z')"),
+ nxt_string("NaN") },
+
+ { nxt_string("parseInt('0xz')"),
+ nxt_string("NaN") },
{ nxt_string("parseInt('0x', 16)"),
nxt_string("NaN") },