@@ -1403,40 +1403,58 @@ opfunc_private_set (ecma_value_t base, /**< this object */
14031403 ecma_value_t property , /**< property name */
14041404 ecma_value_t value ) /**< ecma value */
14051405{
1406- ecma_object_t * obj_p = ecma_get_object_from_value (base );
1406+ ecma_value_t base_obj = ecma_op_to_object (base );
1407+
1408+ if (ECMA_IS_VALUE_ERROR (base_obj ))
1409+ {
1410+ return base_obj ;
1411+ }
1412+
1413+ ecma_object_t * obj_p = ecma_get_object_from_value (base_obj );
14071414 ecma_string_t * prop_name_p = ecma_get_string_from_value (property );
14081415 ecma_string_t * private_key_p = NULL ;
14091416
14101417 ecma_property_t * prop_p = opfunc_find_private_element (obj_p , prop_name_p , & private_key_p , true);
14111418
1419+ ecma_value_t result ;
1420+
14121421 if (prop_p == NULL )
14131422 {
1414- return ecma_raise_type_error (ECMA_ERR_CANNOT_WRITE_PRIVATE_MEMBER_TO_AN_OBJECT_WHOSE_CLASS_DID_NOT_DECLARE_IT );
1423+ result = ecma_raise_type_error (ECMA_ERR_CANNOT_WRITE_PRIVATE_MEMBER_TO_AN_OBJECT_WHOSE_CLASS_DID_NOT_DECLARE_IT );
14151424 }
1416-
1417- if (* prop_p & ECMA_PROPERTY_FLAG_DATA )
1425+ else if (* prop_p & ECMA_PROPERTY_FLAG_DATA )
14181426 {
14191427 JERRY_ASSERT (ecma_prop_name_is_symbol (private_key_p ));
14201428
14211429 if (private_key_p -> u .hash & ECMA_SYMBOL_FLAG_PRIVATE_INSTANCE_METHOD )
14221430 {
1423- return ecma_raise_type_error (ECMA_ERR_PRIVATE_METHOD_IS_NOT_WRITABLE );
1431+ result = ecma_raise_type_error (ECMA_ERR_PRIVATE_METHOD_IS_NOT_WRITABLE );
1432+ }
1433+ else
1434+ {
1435+ ecma_value_assign_value (& ECMA_PROPERTY_VALUE_PTR (prop_p )-> value , value );
1436+ result = ecma_copy_value (value );
14241437 }
1425-
1426- ecma_value_assign_value (& ECMA_PROPERTY_VALUE_PTR (prop_p )-> value , value );
1427- return ecma_copy_value (value );
14281438 }
1439+ else
1440+ {
1441+ ecma_getter_setter_pointers_t * get_set_pair_p = ecma_get_named_accessor_property (ECMA_PROPERTY_VALUE_PTR (prop_p ));
14291442
1430- ecma_getter_setter_pointers_t * get_set_pair_p = ecma_get_named_accessor_property (ECMA_PROPERTY_VALUE_PTR (prop_p ));
1443+ if (get_set_pair_p -> setter_cp == JMEM_CP_NULL )
1444+ {
1445+ result = ecma_raise_type_error (ECMA_ERR_PRIVATE_FIELD_WAS_DEFINED_WITHOUT_A_SETTER );
1446+ }
1447+ else
1448+ {
1449+ ecma_object_t * setter_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t , get_set_pair_p -> setter_cp );
14311450
1432- if (get_set_pair_p -> setter_cp == JMEM_CP_NULL )
1433- {
1434- return ecma_raise_type_error (ECMA_ERR_PRIVATE_FIELD_WAS_DEFINED_WITHOUT_A_SETTER );
1451+ result = ecma_op_function_call (setter_p , base , & value , 1 );
1452+ }
14351453 }
14361454
1437- ecma_object_t * setter_p = ECMA_GET_NON_NULL_POINTER ( ecma_object_t , get_set_pair_p -> setter_cp );
1455+ ecma_deref_object ( obj_p );
14381456
1439- return ecma_op_function_call ( setter_p , base , & value , 1 ) ;
1457+ return result ;
14401458} /* opfunc_private_set */
14411459
14421460/**
0 commit comments