diff --git a/jerry-core/vm/vm.c b/jerry-core/vm/vm.c index ad0cf16543..16f4962481 100644 --- a/jerry-core/vm/vm.c +++ b/jerry-core/vm/vm.c @@ -1421,17 +1421,31 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ JERRY_ASSERT (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE); JERRY_ASSERT (prev_lex_env_p != NULL && ecma_get_lex_env_type (prev_lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE); - JERRY_ASSERT (ecma_find_named_property (prev_lex_env_p, name_p) == NULL); + ecma_property_t *property_p = ecma_find_named_property (prev_lex_env_p, name_p); ecma_property_value_t *property_value_p; - property_value_p = ecma_create_named_data_property (prev_lex_env_p, - name_p, - ECMA_PROPERTY_CONFIGURABLE_WRITABLE, - NULL); - if (lit_value == ECMA_VALUE_UNDEFINED) + if (property_p == NULL) { - continue; + property_value_p = ecma_create_named_data_property (prev_lex_env_p, + name_p, + ECMA_PROPERTY_CONFIGURABLE_WRITABLE, + NULL); + + if (lit_value == ECMA_VALUE_UNDEFINED) + { + continue; + } + } + else + { + if (lit_value == ECMA_VALUE_UNDEFINED) + { + continue; + } + + property_value_p = ECMA_PROPERTY_VALUE_PTR (property_p); + ecma_free_value_if_not_object (property_value_p->value); } property_value_p->value = lit_value; diff --git a/tests/jerry/es2015/function-scope2.js b/tests/jerry/es2015/function-scope2.js index 6f86436914..6b44768652 100644 --- a/tests/jerry/es2015/function-scope2.js +++ b/tests/jerry/es2015/function-scope2.js @@ -95,3 +95,17 @@ function i([a], get = () => a, set = (v) => a = v) { assert(get() === 3); } i([1]); + +function j(a = eval()) { + var a = 3.14; + + try { + eval("throw 1; function a() { return 8; }") + assert(false) + } catch (e) { + assert(e === 1) + } + + assert(a() === 8) +} +j() diff --git a/tests/jerry/es2015/regresssion-test-issue-3888.js b/tests/jerry/es2015/regresssion-test-issue-3888.js new file mode 100644 index 0000000000..65d3e39974 --- /dev/null +++ b/tests/jerry/es2015/regresssion-test-issue-3888.js @@ -0,0 +1,19 @@ +// 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. + +function i(id_0, b = (eval("var x"))) { + function x() {} + eval(!eval("var x = {}; x instanceof assert;")) +} +i()