diff --git a/jerry-core/parser/js/js-parser-expr.c b/jerry-core/parser/js/js-parser-expr.c index eedeffd35..6da86ab1b 100644 --- a/jerry-core/parser/js/js-parser-expr.c +++ b/jerry-core/parser/js/js-parser-expr.c @@ -192,7 +192,6 @@ parser_emit_unary_lvalue_opcode (parser_context_t *context_p, /**< context */ parser_raise_error (context_p, PARSER_ERR_DELETE_IDENT_NOT_ALLOWED); } - context_p->status_flags |= PARSER_LEXICAL_ENV_NEEDED; unary_opcode = CBC_DELETE_IDENT_PUSH_RESULT; } else @@ -2006,6 +2005,8 @@ parser_process_unary_expression (parser_context_t *context_p, /**< context */ if (is_eval) { + context_p->status_flags |= PARSER_LEXICAL_ENV_NEEDED; + #if ENABLED (JERRY_ES2015) if (context_p->status_flags & (PARSER_ALLOW_SUPER_CALL | PARSER_ALLOW_SUPER | PARSER_ALLOW_NEW_TARGET)) { diff --git a/jerry-core/parser/js/js-parser-statm.c b/jerry-core/parser/js/js-parser-statm.c index 57085650f..be3eee35c 100644 --- a/jerry-core/parser/js/js-parser-statm.c +++ b/jerry-core/parser/js/js-parser-statm.c @@ -859,7 +859,7 @@ parser_parse_with_statement_start (parser_context_t *context_p) /**< context */ uint8_t inside_with = (context_p->status_flags & PARSER_INSIDE_WITH) != 0; - context_p->status_flags |= PARSER_INSIDE_WITH | PARSER_LEXICAL_ENV_NEEDED; + context_p->status_flags |= PARSER_INSIDE_WITH; parser_emit_cbc_ext_forward_branch (context_p, CBC_EXT_WITH_CREATE_CONTEXT, &with_statement.branch); diff --git a/jerry-core/parser/js/js-parser.c b/jerry-core/parser/js/js-parser.c index 8206dd87b..75babba82 100644 --- a/jerry-core/parser/js/js-parser.c +++ b/jerry-core/parser/js/js-parser.c @@ -1272,7 +1272,7 @@ parser_post_processing (parser_context_t *context_p) /**< context */ } /* Arguments is stored in the lexical environment. */ - context_p->status_flags |= PARSER_LEXICAL_ENV_NEEDED; + JERRY_ASSERT (context_p->status_flags & PARSER_LEXICAL_ENV_NEEDED); } if (!(context_p->status_flags & PARSER_LEXICAL_ENV_NEEDED)) diff --git a/tests/jerry/es2015/arrow-eval.js b/tests/jerry/es2015/arrow-eval.js new file mode 100644 index 000000000..84b74a85f --- /dev/null +++ b/tests/jerry/es2015/arrow-eval.js @@ -0,0 +1,41 @@ +/* Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +let a = 4 + +var f = () => { + eval("var a = 5") + assert(a === 5) +} +f() + +assert(a === 4) + +function g() { + eval("var b = 6") + + assert(b === 6) + + var h = () => delete b + h() + + try { + b + assert(false) + } catch (e) { + assert(e instanceof ReferenceError) + } +} +g()