From 0121b2bbcfd9af7dec372937d73b14a1eb64fbc6 Mon Sep 17 00:00:00 2001 From: Zoltan Herczeg Date: Fri, 27 Sep 2019 10:28:53 +0200 Subject: [PATCH] Fix object initializers for get and set properties. (#3164) JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com --- jerry-core/parser/js/js-lexer.c | 12 ++++++++ jerry-core/parser/js/js-scanner.c | 37 ++++++++++++++++++++---- tests/jerry/es2015/object-initializer.js | 7 +++++ 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/jerry-core/parser/js/js-lexer.c b/jerry-core/parser/js/js-lexer.c index b72cd3dee..ecb7923a5 100644 --- a/jerry-core/parser/js/js-lexer.c +++ b/jerry-core/parser/js/js-lexer.c @@ -292,6 +292,8 @@ lexer_skip_empty_statements (parser_context_t *context_p) /**< context */ context_p->source_p++; lexer_skip_spaces (context_p); } + + context_p->token.flags = (uint8_t) (context_p->token.flags | LEXER_NO_SKIP_SPACES); } /* lexer_skip_empty_statements */ #endif /* ENABLED (JERRY_ES2015_CLASS) */ @@ -2305,8 +2307,13 @@ lexer_expect_object_literal_id (parser_context_t *context_p, /**< context */ && context_p->token.lit_location.length == 3) { lexer_skip_spaces (context_p); + context_p->token.flags = (uint8_t) (context_p->token.flags | LEXER_NO_SKIP_SPACES); if (context_p->source_p < context_p->source_end_p +#if ENABLED (JERRY_ES2015_OBJECT_INITIALIZER) + && context_p->source_p[0] != LIT_CHAR_COMMA + && context_p->source_p[0] != LIT_CHAR_RIGHT_BRACE +#endif /* ENABLED (JERRY_ES2015_OBJECT_INITIALIZER) */ && context_p->source_p[0] != LIT_CHAR_COLON) { if (lexer_compare_literal_to_string (context_p, "get", 3)) @@ -2421,8 +2428,13 @@ lexer_scan_identifier (parser_context_t *context_p, /**< context */ && context_p->token.lit_location.length == 3) { lexer_skip_spaces (context_p); + context_p->token.flags = (uint8_t) (context_p->token.flags | LEXER_NO_SKIP_SPACES); if (context_p->source_p < context_p->source_end_p +#if ENABLED (JERRY_ES2015_OBJECT_INITIALIZER) + && context_p->source_p[0] != LIT_CHAR_COMMA + && context_p->source_p[0] != LIT_CHAR_RIGHT_BRACE +#endif /* ENABLED (JERRY_ES2015_OBJECT_INITIALIZER) */ && context_p->source_p[0] != LIT_CHAR_COLON) { if (lexer_compare_literal_to_string (context_p, "get", 3)) diff --git a/jerry-core/parser/js/js-scanner.c b/jerry-core/parser/js/js-scanner.c index b6f953dd4..6bbbf2630 100644 --- a/jerry-core/parser/js/js-scanner.c +++ b/jerry-core/parser/js/js-scanner.c @@ -1955,6 +1955,14 @@ scanner_scan_all (parser_context_t *context_p, /**< context */ break; } + JERRY_ASSERT (context_p->token.type == LEXER_LITERAL); + +#if ENABLED (JERRY_ES2015_OBJECT_INITIALIZER) + parser_line_counter_t start_line = context_p->token.line; + parser_line_counter_t start_column = context_p->token.column; + bool is_ident = (context_p->token.lit_location.type == LEXER_IDENT_LITERAL); +#endif /* ENABLED (JERRY_ES2015_OBJECT_INITIALIZER) */ + lexer_next_token (context_p); #if ENABLED (JERRY_ES2015_OBJECT_INITIALIZER) @@ -1965,13 +1973,32 @@ scanner_scan_all (parser_context_t *context_p, /**< context */ continue; } - if (context_p->token.type == LEXER_COMMA) + if (is_ident + && (context_p->token.type == LEXER_COMMA || context_p->token.type == LEXER_RIGHT_BRACE)) { - continue; - } + context_p->source_p = context_p->token.lit_location.char_p; + context_p->line = start_line; + context_p->column = start_column; + + lexer_next_token (context_p); + + JERRY_ASSERT (context_p->token.type != LEXER_LITERAL + || context_p->token.lit_location.type == LEXER_IDENT_LITERAL); + + if (context_p->token.type != LEXER_LITERAL) + { + scanner_raise_error (context_p); + } + + lexer_next_token (context_p); + + if (context_p->token.type == LEXER_COMMA) + { + continue; + } + + JERRY_ASSERT (context_p->token.type == LEXER_RIGHT_BRACE); - if (context_p->token.type == LEXER_RIGHT_BRACE) - { parser_stack_pop_uint8 (context_p); scanner_context.mode = SCAN_MODE_POST_PRIMARY_EXPRESSION; break; diff --git a/tests/jerry/es2015/object-initializer.js b/tests/jerry/es2015/object-initializer.js index 26a7c3866..197678288 100644 --- a/tests/jerry/es2015/object-initializer.js +++ b/tests/jerry/es2015/object-initializer.js @@ -62,4 +62,11 @@ default: ({ true: true }); ({ 13: 13 }); ({ "x": "x" }); + + var get = 8; + var set = 12; + var o = ({ get, set }); + + assert(o.get == 8); + assert(o.set == 12); }