From 4df833e7ad23b680d134ac37bdc68de27d544e4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20G=C3=A1l?= Date: Thu, 8 Oct 2020 10:00:47 +0200 Subject: [PATCH] Propagate strict mode for Proxy targets during delete (#4273) After ES5.1 if the delete returns false a TypeError should be thrown in strict mode. JerryScript-DCO-1.0-Signed-off-by: Peter Gal pgal.usz@partner.samsung.com --- jerry-core/ecma/operations/ecma-objects.c | 8 ++++---- jerry-core/ecma/operations/ecma-proxy-object.c | 5 +++-- jerry-core/ecma/operations/ecma-proxy-object.h | 3 ++- jerry-core/vm/opcodes.c | 7 +++++++ tests/test262-esnext-excludelist.xml | 3 --- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/jerry-core/ecma/operations/ecma-objects.c b/jerry-core/ecma/operations/ecma-objects.c index 6237f3589..69d97abda 100644 --- a/jerry-core/ecma/operations/ecma-objects.c +++ b/jerry-core/ecma/operations/ecma-objects.c @@ -1612,7 +1612,7 @@ ecma_op_object_delete_by_index (ecma_object_t *obj_p, /**< the object */ ecma_value_t ecma_op_object_delete (ecma_object_t *obj_p, /**< the object */ ecma_string_t *property_name_p, /**< property name */ - bool is_throw) /**< flag that controls failure handling */ + bool is_strict) /**< flag that controls failure handling */ { JERRY_ASSERT (obj_p != NULL && !ecma_is_lexical_environment (obj_p)); @@ -1626,14 +1626,14 @@ ecma_op_object_delete (ecma_object_t *obj_p, /**< the object */ { return ecma_op_arguments_object_delete (obj_p, property_name_p, - is_throw); + is_strict); } } #if ENABLED (JERRY_BUILTIN_PROXY) if (ECMA_OBJECT_IS_PROXY (obj_p)) { - return ecma_proxy_object_delete_property (obj_p, property_name_p); + return ecma_proxy_object_delete_property (obj_p, property_name_p, is_strict); } #endif /* ENABLED (JERRY_BUILTIN_PROXY) */ @@ -1641,7 +1641,7 @@ ecma_op_object_delete (ecma_object_t *obj_p, /**< the object */ return ecma_op_general_object_delete (obj_p, property_name_p, - is_throw); + is_strict); } /* ecma_op_object_delete */ /** diff --git a/jerry-core/ecma/operations/ecma-proxy-object.c b/jerry-core/ecma/operations/ecma-proxy-object.c index 1a466d290..1272d3969 100644 --- a/jerry-core/ecma/operations/ecma-proxy-object.c +++ b/jerry-core/ecma/operations/ecma-proxy-object.c @@ -1314,7 +1314,8 @@ ecma_proxy_object_set (ecma_object_t *obj_p, /**< proxy object */ */ ecma_value_t ecma_proxy_object_delete_property (ecma_object_t *obj_p, /**< proxy object */ - ecma_string_t *prop_name_p) /**< property name */ + ecma_string_t *prop_name_p, /**< property name */ + bool is_strict) /**< delete in strict mode? */ { JERRY_ASSERT (ECMA_OBJECT_IS_PROXY (obj_p)); @@ -1338,7 +1339,7 @@ ecma_proxy_object_delete_property (ecma_object_t *obj_p, /**< proxy object */ /* 8. */ if (ecma_is_value_undefined (trap)) { - return ecma_op_object_delete (target_obj_p, prop_name_p, false); + return ecma_op_object_delete (target_obj_p, prop_name_p, is_strict); } ecma_object_t *func_obj_p = ecma_get_object_from_value (trap); diff --git a/jerry-core/ecma/operations/ecma-proxy-object.h b/jerry-core/ecma/operations/ecma-proxy-object.h index a428d0ad5..97d33e01a 100644 --- a/jerry-core/ecma/operations/ecma-proxy-object.h +++ b/jerry-core/ecma/operations/ecma-proxy-object.h @@ -91,7 +91,8 @@ ecma_proxy_object_set (ecma_object_t *obj_p, ecma_value_t ecma_proxy_object_delete_property (ecma_object_t *obj_p, - ecma_string_t *prop_name_p); + ecma_string_t *prop_name_p, + bool is_strict); ecma_collection_t * ecma_proxy_object_own_property_keys (ecma_object_t *obj_p); diff --git a/jerry-core/vm/opcodes.c b/jerry-core/vm/opcodes.c index 39a4ad4fd..854c5cdb1 100644 --- a/jerry-core/vm/opcodes.c +++ b/jerry-core/vm/opcodes.c @@ -278,6 +278,13 @@ vm_op_delete_prop (ecma_value_t object, /**< base object */ ecma_deref_object (obj_p); ecma_deref_ecma_string (name_string_p); +#if ENABLED (JERRY_ESNEXT) + if (is_strict && ecma_is_value_false (delete_op_ret)) + { + return ecma_raise_type_error (ECMA_ERR_MSG ("delete returned false in strict mode.")); + } +#endif /* ENABLED (JERRY_ESNEXT) */ + return delete_op_ret; } /* vm_op_delete_prop */ diff --git a/tests/test262-esnext-excludelist.xml b/tests/test262-esnext-excludelist.xml index 890e68b5d..191ad361d 100644 --- a/tests/test262-esnext-excludelist.xml +++ b/tests/test262-esnext-excludelist.xml @@ -933,10 +933,7 @@ - - -