Skip to content

Commit ecf1597

Browse files
authored
Rework the Reflect.defineProperty method (#3770)
Also a minor update to the FromPropertyDescriptor operation since in ES6 we can use a property descriptor whitout any keys JerryScript-DCO-1.0-Signed-off-by: Adam Szilagyi aszilagy@inf.u-szeged.hu
1 parent 1105b43 commit ecf1597

3 files changed

Lines changed: 51 additions & 38 deletions

File tree

jerry-core/ecma/builtin-objects/ecma-builtin-reflect.c

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -261,20 +261,32 @@ ecma_builtin_reflect_dispatch_routine (uint16_t builtin_routine_id, /**< built-i
261261
return ECMA_VALUE_ERROR;
262262
}
263263

264-
ecma_value_t result = ecma_builtin_object_object_define_property (obj_p, name_str_p, arguments_list[2]);
265-
ecma_deref_ecma_string (name_str_p);
266-
bool is_error = ECMA_IS_VALUE_ERROR (result);
264+
ecma_property_descriptor_t prop_desc;
265+
ecma_value_t conv_result = ecma_op_to_property_descriptor (arguments_list[2], &prop_desc);
267266

268-
if (is_error)
267+
if (ECMA_IS_VALUE_ERROR (conv_result))
269268
{
270-
jcontext_release_exception ();
269+
ecma_deref_ecma_string (name_str_p);
270+
return conv_result;
271271
}
272-
else
272+
273+
prop_desc.flags |= ECMA_PROP_IS_THROW;
274+
275+
ecma_value_t result = ecma_op_object_define_own_property (obj_p,
276+
name_str_p,
277+
&prop_desc);
278+
279+
ecma_deref_ecma_string (name_str_p);
280+
ecma_free_property_descriptor (&prop_desc);
281+
282+
if (ECMA_IS_VALUE_ERROR (result))
273283
{
274-
ecma_free_value (result);
284+
return result;
275285
}
276286

277-
return ecma_make_boolean_value (!is_error);
287+
bool boolean_result = ecma_op_to_boolean (result);
288+
289+
return ecma_make_boolean_value (boolean_result);
278290
}
279291
case ECMA_REFLECT_OBJECT_GET_OWN_PROPERTY_DESCRIPTOR:
280292
{

jerry-core/ecma/operations/ecma-conversion.c

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -594,38 +594,42 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t *src_prop_des
594594
}
595595
else
596596
{
597-
/* 4. */
597+
#if !ENABLED (JERRY_ES2015)
598598
JERRY_ASSERT (src_prop_desc_p->flags & (ECMA_PROP_IS_GET_DEFINED | ECMA_PROP_IS_SET_DEFINED));
599-
600-
/* a. */
601-
if (src_prop_desc_p->get_p == NULL)
602-
{
603-
prop_desc.value = ECMA_VALUE_UNDEFINED;
604-
}
605-
else
599+
#else /* ENABLED (JERRY_ES2015) */
600+
if (src_prop_desc_p->flags & (ECMA_PROP_IS_GET_DEFINED | ECMA_PROP_IS_SET_DEFINED))
601+
#endif /* ENABLED (JERRY_ES2015) */
606602
{
607-
prop_desc.value = ecma_make_object_value (src_prop_desc_p->get_p);
608-
}
603+
/* a. */
604+
if (src_prop_desc_p->get_p == NULL)
605+
{
606+
prop_desc.value = ECMA_VALUE_UNDEFINED;
607+
}
608+
else
609+
{
610+
prop_desc.value = ecma_make_object_value (src_prop_desc_p->get_p);
611+
}
609612

610-
completion = ecma_op_object_define_own_property (obj_p,
611-
ecma_get_magic_string (LIT_MAGIC_STRING_GET),
612-
&prop_desc);
613-
JERRY_ASSERT (ecma_is_value_true (completion));
613+
completion = ecma_op_object_define_own_property (obj_p,
614+
ecma_get_magic_string (LIT_MAGIC_STRING_GET),
615+
&prop_desc);
616+
JERRY_ASSERT (ecma_is_value_true (completion));
614617

615-
/* b. */
616-
if (src_prop_desc_p->set_p == NULL)
617-
{
618-
prop_desc.value = ECMA_VALUE_UNDEFINED;
619-
}
620-
else
621-
{
622-
prop_desc.value = ecma_make_object_value (src_prop_desc_p->set_p);
623-
}
618+
/* b. */
619+
if (src_prop_desc_p->set_p == NULL)
620+
{
621+
prop_desc.value = ECMA_VALUE_UNDEFINED;
622+
}
623+
else
624+
{
625+
prop_desc.value = ecma_make_object_value (src_prop_desc_p->set_p);
626+
}
624627

625-
completion = ecma_op_object_define_own_property (obj_p,
626-
ecma_get_magic_string (LIT_MAGIC_STRING_SET),
627-
&prop_desc);
628-
JERRY_ASSERT (ecma_is_value_true (completion));
628+
completion = ecma_op_object_define_own_property (obj_p,
629+
ecma_get_magic_string (LIT_MAGIC_STRING_SET),
630+
&prop_desc);
631+
JERRY_ASSERT (ecma_is_value_true (completion));
632+
}
629633
}
630634

631635
prop_desc.value = ecma_make_boolean_value (src_prop_desc_p->flags & ECMA_PROP_IS_ENUMERABLE);

tests/test262-es6-excludelist.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,6 @@
161161
<test id="built-ins/Promise/reject/name.js"><reason></reason></test>
162162
<test id="built-ins/Promise/resolve/name.js"><reason></reason></test>
163163
<test id="built-ins/Promise/symbol-species-name.js"><reason></reason></test>
164-
<test id="built-ins/Proxy/defineProperty/trap-return-is-false.js"><reason></reason></test>
165164
<test id="built-ins/Proxy/enumerate/call-parameters.js"><reason></reason></test>
166165
<test id="built-ins/Proxy/enumerate/return-is-abrupt.js"><reason></reason></test>
167166
<test id="built-ins/Proxy/enumerate/return-trap-result.js"><reason></reason></test>
@@ -175,8 +174,6 @@
175174
<test id="built-ins/Reflect/apply/name.js"><reason></reason></test>
176175
<test id="built-ins/Reflect/construct/name.js"><reason></reason></test>
177176
<test id="built-ins/Reflect/defineProperty/name.js"><reason></reason></test>
178-
<test id="built-ins/Reflect/defineProperty/return-abrupt-from-attributes.js"><reason></reason></test>
179-
<test id="built-ins/Reflect/defineProperty/return-abrupt-from-result.js"><reason></reason></test>
180177
<test id="built-ins/Reflect/deleteProperty/name.js"><reason></reason></test>
181178
<test id="built-ins/Reflect/enumerate/does-not-iterate-over-symbol-properties.js"><reason></reason></test>
182179
<test id="built-ins/Reflect/enumerate/enumerate.js"><reason></reason></test>

0 commit comments

Comments
 (0)