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 @@
-