Fix member accesses for non-decimal numeric literals (#377)

* Fix member accesses for non-decimal numeric literals
    e.g. 0x0.a should return undefined, not SyntaxError.
* Remove ineffective non-decimal float parsing code and redundant checks on `is_float && radix != 10`
    (The code already wasn't doing anything because of the `is_float` check.)
This commit is contained in:
bptato 2024-04-16 14:17:50 +02:00 committed by GitHub
parent 5797f2a716
commit 29b45337f0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 13 additions and 8 deletions

View file

@ -10264,7 +10264,7 @@ static JSValue js_atof2(JSContext *ctx, const char *str, const char **pp,
to_digit((uint8_t)p[1]) < radix)) {
p++;
}
if (!(flags & ATOD_INT_ONLY)) {
if (!(flags & ATOD_INT_ONLY) && radix == 10) {
if (*p == '.' && (p > p_start || to_digit((uint8_t)p[1]) < radix)) {
is_float = TRUE;
p++;
@ -10274,9 +10274,7 @@ static JSValue js_atof2(JSContext *ctx, const char *str, const char **pp,
(*p == sep && to_digit((uint8_t)p[1]) < radix))
p++;
}
if (p > p_start &&
(((*p == 'e' || *p == 'E') && radix == 10) ||
((*p == 'p' || *p == 'P') && (radix == 2 || radix == 8 || radix == 16)))) {
if (p > p_start && (*p == 'e' || *p == 'E')) {
const char *p1 = p + 1;
is_float = TRUE;
if (*p1 == '+') {
@ -10317,11 +10315,7 @@ static JSValue js_atof2(JSContext *ctx, const char *str, const char **pp,
if (*p == 'n') {
p++;
atod_type = ATOD_TYPE_BIG_INT;
} else if (is_float && radix != 10) {
goto fail;
}
} else if ((atod_type == ATOD_TYPE_FLOAT64) && is_float && radix != 10) {
goto fail;
}
switch(atod_type) {

View file

@ -593,6 +593,16 @@ function test_reserved_names()
test_name('static', SyntaxError);
}
function test_number_literals()
{
assert(0.1.a, undefined);
assert(0x1.a, undefined);
assert(0b1.a, undefined);
assert(01.a, undefined);
assert(0o1.a, undefined);
test_expr('0.a', SyntaxError);
}
test_op1();
test_cvt();
test_eq();
@ -613,3 +623,4 @@ test_function_length();
test_argument_scope();
test_function_expr_name();
test_reserved_names();
test_number_literals();