diff --git a/jerry-core/ecma/operations/ecma-objects.c b/jerry-core/ecma/operations/ecma-objects.c index a110f30c3..0c0bfccf1 100644 --- a/jerry-core/ecma/operations/ecma-objects.c +++ b/jerry-core/ecma/operations/ecma-objects.c @@ -1934,8 +1934,10 @@ ecma_op_object_get_enumerable_property_names (ecma_object_t *obj_p, /**< routine return NULL; } + const bool is_enumerable = (prop_desc.flags & ECMA_PROP_IS_ENUMERABLE) != 0; + ecma_free_property_descriptor (&prop_desc); /* 4.a.ii */ - if ((prop_desc.flags & ECMA_PROP_IS_ENUMERABLE) != 0) + if (is_enumerable) { /* 4.a.ii.1 */ if (option == ECMA_ENUMERABLE_PROPERTY_KEYS) @@ -1976,11 +1978,6 @@ ecma_op_object_get_enumerable_property_names (ecma_object_t *obj_p, /**< routine } } } - - if (ecma_is_value_true (status)) - { - ecma_free_property_descriptor (&prop_desc); - } } } diff --git a/tests/jerry/es.next/object-entries.js b/tests/jerry/es.next/object-entries.js index 9d3505035..73be2583c 100644 --- a/tests/jerry/es.next/object-entries.js +++ b/tests/jerry/es.next/object-entries.js @@ -132,3 +132,15 @@ assert(entries[0][0] === "b"); assert(entries[0][1] === "bar"); assert(handlers.length === 3); assert(handlers.toString() === "D,D,G"); + +// exception during enumeration +var obj = { + get a() { throw "error" }, + get b() { throw "shouldn't run" } +}; + +try { + Object.entries(obj); +} catch (err) { + assert(err == "error") +} diff --git a/tests/jerry/es.next/object-values.js b/tests/jerry/es.next/object-values.js index 42223f83f..8840112d4 100644 --- a/tests/jerry/es.next/object-values.js +++ b/tests/jerry/es.next/object-values.js @@ -125,3 +125,15 @@ assert(values.length === 1); assert(values[0] === "bar") assert(handlers.length === 3); assert(handlers.toString() === "D,D,G"); + +// exception during enumeration +var obj = { + get a() { throw "error" }, + get b() { throw "shouldn't run" } +}; + +try { + Object.values(obj); +} catch (err) { + assert(err == "error") +}