From dae6590d48a3060cb25cd24e731eef2f04f8bceb Mon Sep 17 00:00:00 2001 From: Robert Fancsik Date: Wed, 8 Dec 2021 09:20:58 +0100 Subject: [PATCH] Fix arguments object detection in non-complex param list This patch is the followup of #4849. JerryScript-DCO-1.0-Signed-off-by: Robert Fancsik robert.fancsik@h-lab.eu --- jerry-core/parser/js/js-scanner-util.c | 59 +++++++++++++------------- tests/jerry/es.next/arguments.js | 5 +++ 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/jerry-core/parser/js/js-scanner-util.c b/jerry-core/parser/js/js-scanner-util.c index fa95c46f22..29aa6fccec 100644 --- a/jerry-core/parser/js/js-scanner-util.c +++ b/jerry-core/parser/js/js-scanner-util.c @@ -1237,45 +1237,41 @@ scanner_filter_arguments (parser_context_t *context_p, /**< context */ JERRY_ASSERT (SCANNER_LITERAL_POOL_MAY_HAVE_ARGUMENTS (literal_pool_p->status_flags)); - if (can_eval) + if (JERRY_UNLIKELY (can_eval)) { if (prev_literal_pool_p != NULL) { prev_literal_pool_p->status_flags |= SCANNER_LITERAL_POOL_CAN_EVAL; } - if (has_arguments) - { - /* Force the lexically stored arguments object creation */ - literal_pool_p->status_flags |= (SCANNER_LITERAL_POOL_ARGUMENTS_IN_ARGS | SCANNER_LITERAL_POOL_NO_ARGUMENTS); - } + literal_pool_p->status_flags &= (uint16_t) ~SCANNER_LITERAL_POOL_CAN_EVAL; } - - literal_pool_p->status_flags &= (uint16_t) ~SCANNER_LITERAL_POOL_CAN_EVAL; - - parser_list_iterator_init (&literal_pool_p->literal_pool, &literal_iterator); - - while (true) + else { - literal_p = (lexer_lit_location_t *) parser_list_iterator_next (&literal_iterator); + parser_list_iterator_init (&literal_pool_p->literal_pool, &literal_iterator); - if (literal_p == NULL) + while (true) { - return; - } + literal_p = (lexer_lit_location_t *) parser_list_iterator_next (&literal_iterator); - if (can_eval || (literal_p->type & SCANNER_LITERAL_EARLY_CREATE)) - { - literal_p->type |= SCANNER_LITERAL_NO_REG | SCANNER_LITERAL_EARLY_CREATE; - } + if (literal_p == NULL) + { + return; + } - uint8_t type = literal_p->type; - const uint8_t mask = - (SCANNER_LITERAL_IS_ARG | SCANNER_LITERAL_IS_DESTRUCTURED_ARG | SCANNER_LITERAL_IS_ARROW_DESTRUCTURED_ARG); + if (can_eval || (literal_p->type & SCANNER_LITERAL_EARLY_CREATE)) + { + literal_p->type |= SCANNER_LITERAL_NO_REG | SCANNER_LITERAL_EARLY_CREATE; + } - if ((type & mask) != SCANNER_LITERAL_IS_ARG) - { - break; + uint8_t type = literal_p->type; + const uint8_t mask = + (SCANNER_LITERAL_IS_ARG | SCANNER_LITERAL_IS_DESTRUCTURED_ARG | SCANNER_LITERAL_IS_ARROW_DESTRUCTURED_ARG); + + if ((type & mask) != SCANNER_LITERAL_IS_ARG) + { + break; + } } } @@ -1309,10 +1305,7 @@ scanner_filter_arguments (parser_context_t *context_p, /**< context */ if (has_arguments && scanner_literal_is_arguments (literal_p)) { - /* 'arguments' function argument existence should prevent the arguments object construction */ - new_literal_pool_p->status_flags = - (uint16_t) (new_literal_pool_p->status_flags - & ~(SCANNER_LITERAL_POOL_ARGUMENTS_IN_ARGS | SCANNER_LITERAL_POOL_NO_ARGUMENTS)); + has_arguments = false; } if (type & (SCANNER_LITERAL_IS_DESTRUCTURED_ARG | SCANNER_LITERAL_IS_ARROW_DESTRUCTURED_ARG)) @@ -1371,6 +1364,12 @@ scanner_filter_arguments (parser_context_t *context_p, /**< context */ } } + if (has_arguments) + { + /* Force the lexically stored arguments object creation */ + new_literal_pool_p->status_flags |= (SCANNER_LITERAL_POOL_ARGUMENTS_IN_ARGS | SCANNER_LITERAL_POOL_NO_ARGUMENTS); + } + new_literal_pool_p->prev_p = prev_literal_pool_p; parser_list_free (&literal_pool_p->literal_pool); diff --git a/tests/jerry/es.next/arguments.js b/tests/jerry/es.next/arguments.js index 71878ec802..a6fef6a1e2 100644 --- a/tests/jerry/es.next/arguments.js +++ b/tests/jerry/es.next/arguments.js @@ -217,3 +217,8 @@ function f22 (arguments, [a = arguments]) { assert(arguments === 3.1); } f22(3.1, []); + +function f23(arguments, eval = () => eval()) { + assert(arguments === undefined); +} +f23(undefined);