From 79c8c7c838186394061e100ba690c523fcda3b98 Mon Sep 17 00:00:00 2001 From: Sai Asish Y Date: Wed, 26 Aug 2026 00:19:29 -0700 Subject: [PATCH] Fix double exception raise in Proxy [[Delete]] invariant checks JerryScript-DCO-1.0-Signed-off-by: Sai Asish Y say.apm35@gmail.com --- .../ecma/operations/ecma-proxy-object.c | 13 ++++++----- tests/jerry/proxy_delete.js | 22 +++++++++++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/jerry-core/ecma/operations/ecma-proxy-object.c b/jerry-core/ecma/operations/ecma-proxy-object.c index df864651d9..8e2a4f3bde 100644 --- a/jerry-core/ecma/operations/ecma-proxy-object.c +++ b/jerry-core/ecma/operations/ecma-proxy-object.c @@ -1443,12 +1443,15 @@ ecma_proxy_object_delete_property (ecma_object_t *obj_p, /**< proxy object */ { ret_value = ecma_raise_type_error (ECMA_ERR_TRAP_TRUISH_PROPERTY_NON_CONFIGURABLE); } - /* ES11: 13-14 */ - ecma_value_t extensible_target = ecma_builtin_object_object_is_extensible (target_obj_p); - - if (!ecma_is_value_true (extensible_target)) + else { - ret_value = ecma_raise_type_error (ECMA_ERR_TRAP_TRUISH_TARGET_NOT_EXTENSIBLE); + /* ES11: 13-14 */ + ecma_value_t extensible_target = ecma_builtin_object_object_is_extensible (target_obj_p); + + if (!ecma_is_value_true (extensible_target)) + { + ret_value = ecma_raise_type_error (ECMA_ERR_TRAP_TRUISH_TARGET_NOT_EXTENSIBLE); + } } ecma_free_property_descriptor (&target_desc); diff --git a/tests/jerry/proxy_delete.js b/tests/jerry/proxy_delete.js index 74367f018f..c8c240ca32 100644 --- a/tests/jerry/proxy_delete.js +++ b/tests/jerry/proxy_delete.js @@ -180,3 +180,25 @@ try { } assert (trapCalls == 1); + +// deleting a non-configurable property on a non-extensible target must raise a +// single TypeError, without attempting to raise a second pending exception +var target = {}; +Object.defineProperty(target, "foo", { + configurable: false, + value: "foo" +}); +Object.preventExtensions(target); + +var proxy = new Proxy(target, { + deleteProperty(obj, prop) { + return true; + } +}); + +try { + delete proxy.foo; + assert(false); +} catch (e) { + assert(e instanceof TypeError); +}