From 38862c39a6d1243e9b111756afe33f0f611c9ebb Mon Sep 17 00:00:00 2001 From: Rafal Walczyna Date: Tue, 10 Mar 2020 18:14:54 +0100 Subject: [PATCH] Fix setting integrity level, when object has Symbol properties (#3602) Symbol type properties were not included in SetIntegrityLevel operation JerryScript-DCO-1.0-Signed-off-by: Rafal Walczyna r.walczyna@samsung.com --- .../builtin-objects/ecma-builtin-object.c | 11 ++++++-- .../jerry/es2015/object-freeze-with-symbol.js | 28 +++++++++++++++++++ tests/jerry/es2015/object-seal-with-symbol.js | 28 +++++++++++++++++++ 3 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 tests/jerry/es2015/object-freeze-with-symbol.js create mode 100644 tests/jerry/es2015/object-seal-with-symbol.js diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-object.c b/jerry-core/ecma/builtin-objects/ecma-builtin-object.c index 977fc58cf..9b55b5980 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-object.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-object.c @@ -291,7 +291,12 @@ ecma_builtin_object_set_integrity_level (ecma_object_t *obj_p, /**< object */ #endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */ /* 6. */ - ecma_collection_t *props_p = ecma_op_object_get_property_names (obj_p, ECMA_LIST_CONVERT_FAST_ARRAYS); + uint32_t opts = ECMA_LIST_CONVERT_FAST_ARRAYS; +#if ENABLED (JERRY_ES2015) + opts |= ECMA_LIST_SYMBOLS; +#endif /* ENABLED (JERRY_ES2015) */ + + ecma_collection_t *props_p = ecma_op_object_get_property_names (obj_p, opts); #if ENABLED (JERRY_ES2015_BUILTIN_PROXY) if (props_p == NULL) @@ -307,7 +312,7 @@ ecma_builtin_object_set_integrity_level (ecma_object_t *obj_p, /**< object */ /* 8.a */ for (uint32_t i = 0; i < props_p->item_count; i++) { - ecma_string_t *property_name_p = ecma_get_string_from_value (buffer_p[i]); + ecma_string_t *property_name_p = ecma_get_prop_name_from_value (buffer_p[i]); ecma_property_descriptor_t prop_desc; ecma_value_t status = ecma_op_object_get_own_property_descriptor (obj_p, property_name_p, &prop_desc); @@ -349,7 +354,7 @@ ecma_builtin_object_set_integrity_level (ecma_object_t *obj_p, /**< object */ /* 9.a */ for (uint32_t i = 0; i < props_p->item_count; i++) { - ecma_string_t *property_name_p = ecma_get_string_from_value (buffer_p[i]); + ecma_string_t *property_name_p = ecma_get_prop_name_from_value (buffer_p[i]); /* 9.1 */ ecma_property_descriptor_t prop_desc; diff --git a/tests/jerry/es2015/object-freeze-with-symbol.js b/tests/jerry/es2015/object-freeze-with-symbol.js new file mode 100644 index 000000000..15de72dee --- /dev/null +++ b/tests/jerry/es2015/object-freeze-with-symbol.js @@ -0,0 +1,28 @@ +/* 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 s1 = Symbol(); +var s2 = Symbol(); +var obj = {}; + +obj[s1] = 1; +Object.freeze(obj); + +obj[s1] = 2; +obj[s2] = 3 + +assert(obj[s1] === 1); +assert(obj[s2] === undefined); +assert(delete obj[s1] === false); diff --git a/tests/jerry/es2015/object-seal-with-symbol.js b/tests/jerry/es2015/object-seal-with-symbol.js new file mode 100644 index 000000000..8da1f7c48 --- /dev/null +++ b/tests/jerry/es2015/object-seal-with-symbol.js @@ -0,0 +1,28 @@ +/* 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 s1 = Symbol(); +var s2 = Symbol(); +var obj = {}; + +obj[s1] = 1; +Object.seal(obj); + +obj[s1] = 2; +obj[s2] = 3 + +assert(obj[s1] === 2); +assert(obj[s2] === undefined); +assert(delete obj[s1] === false);