diff --git a/jerry-core/parser/js/js-parser-expr.c b/jerry-core/parser/js/js-parser-expr.c index 380d45a06..78e7c8a6f 100644 --- a/jerry-core/parser/js/js-parser-expr.c +++ b/jerry-core/parser/js/js-parser-expr.c @@ -1460,16 +1460,27 @@ parser_parse_tagged_template_literal (parser_context_t *context_p) /**< context return call_arguments; } /* parser_parse_tagged_template_literal */ +/** + * Checks wheteher the current expression can be an assignment expression. + * + * @return true if the current expression can be an assignment expression, false otherwise + */ +static inline bool JERRY_ATTR_ALWAYS_INLINE +parser_is_assignment_expr (parser_context_t *context_p) +{ + return (context_p->stack_top_uint8 == LEXER_EXPRESSION_START + || context_p->stack_top_uint8 == LEXER_LEFT_PAREN + || context_p->stack_top_uint8 == LEXER_COMMA_SEP_LIST + || LEXER_IS_BINARY_LVALUE_TOKEN (context_p->stack_top_uint8)); +} /* parser_is_assignment_expr */ + /** * Throws an error if the current expression is not an assignment expression. */ static inline void JERRY_ATTR_ALWAYS_INLINE parser_check_assignment_expr (parser_context_t *context_p) { - if (context_p->stack_top_uint8 != LEXER_EXPRESSION_START - && context_p->stack_top_uint8 != LEXER_LEFT_PAREN - && context_p->stack_top_uint8 != LEXER_COMMA_SEP_LIST - && !LEXER_IS_BINARY_LVALUE_TOKEN (context_p->stack_top_uint8)) + if (!parser_is_assignment_expr (context_p)) { parser_raise_error (context_p, PARSER_ERR_ASSIGNMENT_EXPECTED); } @@ -1719,8 +1730,14 @@ parser_parse_unary_expression (parser_context_t *context_p, /**< context */ if (context_p->next_scanner_info_p->source_p == context_p->source_p) { JERRY_ASSERT (context_p->next_scanner_info_p->type == SCANNER_TYPE_INITIALIZER); - parser_parse_object_initializer (context_p, PARSER_PATTERN_NO_OPTS); - return false; + + if (parser_is_assignment_expr (context_p)) + { + parser_parse_object_initializer (context_p, PARSER_PATTERN_NO_OPTS); + return false; + } + + scanner_release_next (context_p, sizeof (scanner_location_info_t)); } #endif /* ENABLED (JERRY_ES2015) */ @@ -1733,8 +1750,14 @@ parser_parse_unary_expression (parser_context_t *context_p, /**< context */ if (context_p->next_scanner_info_p->source_p == context_p->source_p) { JERRY_ASSERT (context_p->next_scanner_info_p->type == SCANNER_TYPE_INITIALIZER); - parser_parse_array_initializer (context_p, PARSER_PATTERN_NO_OPTS); - return false; + + if (parser_is_assignment_expr (context_p)) + { + parser_parse_array_initializer (context_p, PARSER_PATTERN_NO_OPTS); + return false; + } + + scanner_release_next (context_p, sizeof (scanner_location_info_t)); } #endif /* ENABLED (JERRY_ES2015) */ diff --git a/tests/jerry/es2015/array-pattern.js b/tests/jerry/es2015/array-pattern.js index f962d1501..c2e3a90a7 100644 --- a/tests/jerry/es2015/array-pattern.js +++ b/tests/jerry/es2015/array-pattern.js @@ -304,3 +304,10 @@ mustThrow ("try { throw 5 } catch (e) {" + "var iter = __createIterableObject([], " + "{ 'return': function() { return 5; }});" + "var [a] = iter }"); + +try { + eval ("var a = 0; 1 + [a] = [1]"); + assert (false); +} catch (e) { + assert (e instanceof ReferenceError); +} diff --git a/tests/jerry/es2015/object-pattern.js b/tests/jerry/es2015/object-pattern.js index 420dc8a16..3db8a1c71 100644 --- a/tests/jerry/es2015/object-pattern.js +++ b/tests/jerry/es2015/object-pattern.js @@ -225,3 +225,10 @@ mustThrow ("function f ({}) {}; f();"); ({"a": ((a)) } = {a : 7}); assert (a === 7); }) (); + +try { + eval ("var a = 0; -{a} = {a:1}"); + assert (false); +} catch (e) { + assert (e instanceof ReferenceError); +}