From 29b45337f097772c0de307e11c25f16d822b8611 Mon Sep 17 00:00:00 2001 From: bptato <60043228+bptato@users.noreply.github.com> Date: Tue, 16 Apr 2024 14:17:50 +0200 Subject: [PATCH] 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.) --- quickjs.c | 10 ++-------- tests/test_language.js | 11 +++++++++++ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/quickjs.c b/quickjs.c index 4741b41..e4d9d81 100644 --- a/quickjs.c +++ b/quickjs.c @@ -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) { diff --git a/tests/test_language.js b/tests/test_language.js index a1cc1bc..ba8f5d9 100644 --- a/tests/test_language.js +++ b/tests/test_language.js @@ -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();