From cffb299f37206679f7f1b7d740a952ce2fa220ba Mon Sep 17 00:00:00 2001 From: Robert Fancsik Date: Wed, 13 Feb 2019 18:32:36 +0100 Subject: [PATCH] Ensure that symbol properties can be set via computed object literals (#2747) JerryScript-DCO-1.0-Signed-off-by: Robert Fancsik frobert@inf.u-szeged.hu --- jerry-core/vm/vm.c | 48 ++++--------------- .../es2015/symbol-computed-object-literal.js | 38 +++++++++++++++ 2 files changed, 48 insertions(+), 38 deletions(-) create mode 100644 tests/jerry/es2015/symbol-computed-object-literal.js diff --git a/jerry-core/vm/vm.c b/jerry-core/vm/vm.c index a87f7aa91..40c77adf5 100644 --- a/jerry-core/vm/vm.c +++ b/jerry-core/vm/vm.c @@ -1199,29 +1199,18 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ JERRY_ASSERT ((opcode_data >> VM_OC_NON_STATIC_SHIFT) <= 0x1); - result = right_value; + ecma_string_t *prop_name_p = ecma_op_to_prop_name (right_value); - if (JERRY_UNLIKELY (!ecma_is_value_string (right_value))) + if (JERRY_UNLIKELY (prop_name_p == NULL)) { - result = ecma_op_to_string (right_value); - - if (ECMA_IS_VALUE_ERROR (result)) - { - goto error; - } + result = ECMA_VALUE_ERROR; + goto error; } - ecma_string_t *prop_name_p = ecma_get_string_from_value (result); - #ifndef CONFIG_DISABLE_ES2015_CLASS if (JERRY_UNLIKELY (ecma_compare_ecma_string_to_magic_id (prop_name_p, LIT_MAGIC_STRING_PROTOTYPE)) && !(opcode_data & VM_OC_NON_STATIC_FLAG)) { - if (!ecma_is_value_string (right_value)) - { - ecma_deref_ecma_string (prop_name_p); - } - result = ecma_raise_type_error (ECMA_ERR_MSG ("prototype property of a class is non-configurable")); goto error; } @@ -1257,10 +1246,7 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ ecma_named_data_property_assign_value (object_p, prop_value_p, left_value); - if (!ecma_is_value_string (right_value)) - { - ecma_deref_ecma_string (prop_name_p); - } + ecma_deref_ecma_string (prop_name_p); goto free_both_values; } @@ -1269,29 +1255,18 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ { JERRY_ASSERT ((opcode_data >> VM_OC_NON_STATIC_SHIFT) <= 0x1); - result = left_value; + ecma_string_t *prop_name_p = ecma_op_to_prop_name (left_value); - if (JERRY_UNLIKELY (!ecma_is_value_string (left_value))) + if (JERRY_UNLIKELY (prop_name_p == NULL)) { - result = ecma_op_to_string (left_value); - - if (ECMA_IS_VALUE_ERROR (result)) - { - goto error; - } + result = ECMA_VALUE_ERROR; + goto error; } - ecma_string_t *prop_name_p = ecma_get_string_from_value (result); - #ifndef CONFIG_DISABLE_ES2015_CLASS if (JERRY_UNLIKELY (ecma_compare_ecma_string_to_magic_id (prop_name_p, LIT_MAGIC_STRING_PROTOTYPE)) && !(opcode_data & VM_OC_NON_STATIC_FLAG)) { - if (!ecma_is_value_string (left_value)) - { - ecma_deref_ecma_string (prop_name_p); - } - result = ecma_raise_type_error (ECMA_ERR_MSG ("prototype property of a class is non-configurable")); goto error; } @@ -1306,10 +1281,7 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ prop_name_p, right_value); - if (!ecma_is_value_string (left_value)) - { - ecma_deref_ecma_string (prop_name_p); - } + ecma_deref_ecma_string (prop_name_p); goto free_both_values; } diff --git a/tests/jerry/es2015/symbol-computed-object-literal.js b/tests/jerry/es2015/symbol-computed-object-literal.js new file mode 100644 index 000000000..1cf37b021 --- /dev/null +++ b/tests/jerry/es2015/symbol-computed-object-literal.js @@ -0,0 +1,38 @@ +/* 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. + */ + +var symbolFoo = Symbol ('foo'); +var symbolBar = Symbol ('bar'); + +var obj = { + _a : 5, + get [symbolFoo]() { + return this._a; + }, + set [symbolFoo](a) { + this._a = a; + }, + [symbolBar] : 10 +} + +/* Test accessor properties */ +assert (obj[symbolFoo] === 5); +obj[symbolFoo] = 6; +assert (obj[symbolFoo] === 6); + +/* Test nameddata properties */ +assert (obj[symbolBar] === 10); +obj[symbolBar] = 20; +assert (obj[symbolBar] === 20);