diff --git a/jerry-core/ecma/operations/ecma-proxy-object.c b/jerry-core/ecma/operations/ecma-proxy-object.c index 93ce2b52f..e051a8b12 100644 --- a/jerry-core/ecma/operations/ecma-proxy-object.c +++ b/jerry-core/ecma/operations/ecma-proxy-object.c @@ -806,6 +806,7 @@ ecma_proxy_object_get_own_property_descriptor (ecma_object_t *obj_p, /**< proxy is_extensible); bool target_has_desc = ecma_is_value_true (target_status); + bool target_is_writable = (target_desc.flags & ECMA_PROP_IS_WRITABLE) ; bool target_is_configurable = false; if (target_has_desc) @@ -829,6 +830,14 @@ ecma_proxy_object_get_own_property_descriptor (ecma_object_t *obj_p, /**< proxy ecma_free_property_descriptor (prop_desc_p); return ecma_raise_type_error (ECMA_ERR_MSG ("Not compatible.")); } + + /* ES11: 17.b */ + if ((prop_desc_p->flags & (ECMA_PROP_IS_WRITABLE_DEFINED | ECMA_PROP_IS_WRITABLE)) == ECMA_PROP_IS_WRITABLE_DEFINED + && target_is_writable) + { + ecma_free_property_descriptor (prop_desc_p); + return ecma_raise_type_error (ECMA_ERR_MSG ("Not compatible.")); + } } return ECMA_VALUE_TRUE; } /* ecma_proxy_object_get_own_property_descriptor */ @@ -967,6 +976,16 @@ ecma_proxy_object_define_own_property (ecma_object_t *obj_p, /**< proxy object * ret_value = ecma_raise_type_error (ECMA_ERR_MSG ("Trap returned truish for defining non-configurable property " "which is configurable in the target")); } + /* ES11: 16.c */ + else if ((target_desc.flags & (ECMA_PROP_IS_VALUE_DEFINED | ECMA_PROP_IS_WRITABLE_DEFINED)) != 0 + && (prop_desc_p->flags & (ECMA_PROP_IS_WRITABLE_DEFINED | ECMA_PROP_IS_WRITABLE)) + == ECMA_PROP_IS_WRITABLE_DEFINED + && (target_desc.flags & (ECMA_PROP_IS_WRITABLE | ECMA_PROP_IS_CONFIGURABLE)) == ECMA_PROP_IS_WRITABLE) + + { + ret_value = ecma_raise_type_error (ECMA_ERR_MSG ("Trap returned truish for defining non-configurable property " + "which is configurable in the target")); + } ecma_free_property_descriptor (&target_desc); @@ -1389,6 +1408,13 @@ ecma_proxy_object_delete_property (ecma_object_t *obj_p, /**< proxy object */ ret_value = ecma_raise_type_error (ECMA_ERR_MSG ("Trap returned truish for property which is " "non-configurable in the proxy target.")); } + /* 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_MSG ("Trap returned truish for target is not extensible")); + } ecma_free_property_descriptor (&target_desc); diff --git a/tests/jerry/es.next/proxy_define_own_property.js b/tests/jerry/es.next/proxy_define_own_property.js index 5f05b995e..cef7e391f 100644 --- a/tests/jerry/es.next/proxy_define_own_property.js +++ b/tests/jerry/es.next/proxy_define_own_property.js @@ -174,3 +174,27 @@ try { } catch (e) { assert(e instanceof TypeError); } + +var trapCalls = 0; +var p = new Proxy({}, { + defineProperty: function(t, prop, desc) { + Object.defineProperty(t, prop, { + configurable: false, + writable: true, + }); + + trapCalls++; + return true; + }, +}); + +try { + Reflect.defineProperty (p, "prop", { + writable: false, + }); + assert (false); +} catch (e) { + assert (e instanceof TypeError); +} + +assert (trapCalls == 1) diff --git a/tests/jerry/es.next/proxy_delete.js b/tests/jerry/es.next/proxy_delete.js index 1cd21ce74..74367f018 100644 --- a/tests/jerry/es.next/proxy_delete.js +++ b/tests/jerry/es.next/proxy_delete.js @@ -162,3 +162,21 @@ try { } catch (e) { assert(e instanceof TypeError); } + +var trapCalls = 0; +var p = new Proxy({prop: 1}, { + deleteProperty: function(t, prop) { + Object.preventExtensions(t); + trapCalls++; + return true; + }, +}); + +try { + Reflect.deleteProperty (p, "prop"); + assert (false); +} catch (e) { + assert (e instanceof TypeError); +} + +assert (trapCalls == 1); diff --git a/tests/jerry/es.next/proxy_get_own_property_descriptor.js b/tests/jerry/es.next/proxy_get_own_property_descriptor.js index aa8f2919f..37acd2f06 100644 --- a/tests/jerry/es.next/proxy_get_own_property_descriptor.js +++ b/tests/jerry/es.next/proxy_get_own_property_descriptor.js @@ -282,3 +282,30 @@ Object.assign({}, proxy); assert(result.length === 2); assert(result[0] === "foo"); assert(result[1] === "bar"); + + +var trapCalls = 0; +var p = new Proxy({}, { + getOwnPropertyDescriptor: function(t, prop) { + Object.defineProperty(t, prop, { + configurable: false, + writable: true, + }); + + trapCalls++; + return { + configurable: false, + writable: false, + }; + }, +}); + +try +{ + Object.getOwnPropertyDescriptor(p, "prop"); + assert (false) +} +catch (e) +{ + assert(e instanceof TypeError) +} diff --git a/tests/test262-esnext-excludelist.xml b/tests/test262-esnext-excludelist.xml index 377092e9e..925e832b1 100644 --- a/tests/test262-esnext-excludelist.xml +++ b/tests/test262-esnext-excludelist.xml @@ -1341,12 +1341,10 @@ - - @@ -1355,7 +1353,6 @@ -