/** * Create named accessor property with given name, attributes, getter and setter. * * @return pointer to newly created property */ ecma_property_t * ecma_create_named_accessor_property (ecma_object_t *object_p, /**< object */ ecma_string_t *name_p, /**< property name */ ecma_object_t *get_p, /**< getter */ ecma_object_t *set_p, /**< setter */ bool is_enumerable, /**< 'enumerable' attribute */ bool is_configurable) /**< 'configurable' attribute */ { JERRY_ASSERT (object_p != NULL && name_p != NULL); JERRY_ASSERT (ecma_find_named_property (object_p, name_p) == NULL); uint8_t type_and_flags = ECMA_PROPERTY_TYPE_NAMEDACCESSOR; if (is_configurable) { type_and_flags = (uint8_t) (type_and_flags | ECMA_PROPERTY_FLAG_CONFIGURABLE); } if (is_enumerable) { type_and_flags = (uint8_t) (type_and_flags | ECMA_PROPERTY_FLAG_ENUMERABLE); } name_p = ecma_copy_or_ref_ecma_string (name_p); ecma_property_t *property_p = ecma_create_property (object_p, name_p, type_and_flags); /* * Should be performed after linking the property into object's property list, because the setters assert that. */ ecma_set_named_accessor_property_getter (object_p, property_p, get_p); ecma_set_named_accessor_property_setter (object_p, property_p, set_p); ecma_lcache_invalidate (object_p, name_p, NULL); return property_p; } /* ecma_create_named_accessor_property */
/** * Create named data property with given name, attributes and undefined value * in the specified object. * * @return pointer to newly created property */ ecma_property_t * ecma_create_named_data_property (ecma_object_t *object_p, /**< object */ ecma_string_t *name_p, /**< property name */ bool is_writable, /**< 'Writable' attribute */ bool is_enumerable, /**< 'Enumerable' attribute */ bool is_configurable) /**< 'Configurable' attribute */ { JERRY_ASSERT (object_p != NULL && name_p != NULL); JERRY_ASSERT (ecma_find_named_property (object_p, name_p) == NULL); uint8_t type_and_flags = ECMA_PROPERTY_TYPE_NAMEDDATA; if (is_configurable) { type_and_flags = (uint8_t) (type_and_flags | ECMA_PROPERTY_FLAG_CONFIGURABLE); } if (is_enumerable) { type_and_flags = (uint8_t) (type_and_flags | ECMA_PROPERTY_FLAG_ENUMERABLE); } if (is_writable) { type_and_flags = (uint8_t) (type_and_flags | ECMA_PROPERTY_FLAG_WRITABLE); } name_p = ecma_copy_or_ref_ecma_string (name_p); ecma_property_t *property_p = ecma_create_property (object_p, name_p, type_and_flags); ecma_set_named_data_property_value (property_p, ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED)); ecma_lcache_invalidate (object_p, name_p, NULL); return property_p; } /* ecma_create_named_data_property */
/** * Create named accessor property with given name, attributes, getter and setter. * * @return pointer to the newly created property value */ ecma_property_value_t * ecma_create_named_accessor_property (ecma_object_t *object_p, /**< object */ ecma_string_t *name_p, /**< property name */ ecma_object_t *get_p, /**< getter */ ecma_object_t *set_p, /**< setter */ uint8_t prop_attributes, /**< property attributes */ ecma_property_t **out_prop_p) /**< [out] the property is also returned * if this field is non-NULL */ { JERRY_ASSERT (object_p != NULL && name_p != NULL); JERRY_ASSERT (ecma_find_named_property (object_p, name_p) == NULL); JERRY_ASSERT ((prop_attributes & ~ECMA_PROPERTY_CONFIGURABLE_ENUMERABLE) == 0); uint8_t type_and_flags = ECMA_PROPERTY_TYPE_NAMEDACCESSOR | prop_attributes; ecma_property_value_t value; #ifdef JERRY_CPOINTER_32_BIT ecma_getter_setter_pointers_t *getter_setter_pair_p; getter_setter_pair_p = jmem_pools_alloc (sizeof (ecma_getter_setter_pointers_t)); ECMA_SET_POINTER (getter_setter_pair_p->getter_p, get_p); ECMA_SET_POINTER (getter_setter_pair_p->setter_p, set_p); ECMA_SET_POINTER (value.getter_setter_pair_cp, getter_setter_pair_p); #else /* !JERRY_CPOINTER_32_BIT */ ECMA_SET_POINTER (value.getter_setter_pair.getter_p, get_p); ECMA_SET_POINTER (value.getter_setter_pair.setter_p, set_p); #endif /* JERRY_CPOINTER_32_BIT */ return ecma_create_property (object_p, name_p, type_and_flags, value, out_prop_p); } /* ecma_create_named_accessor_property */
/** * Create internal property in an object and link it into * the object's properties' linked-list (at start of the list). * * @return pointer to newly created property */ ecma_property_t * ecma_create_internal_property (ecma_object_t *object_p, /**< the object */ ecma_internal_property_id_t property_id) /**< internal property identifier */ { JERRY_ASSERT (ecma_find_internal_property (object_p, property_id) == NULL); uint8_t id_byte = (uint8_t) (property_id << ECMA_PROPERTY_FLAG_SHIFT); uint8_t type_and_flags = (uint8_t) (ECMA_PROPERTY_TYPE_INTERNAL | id_byte); ecma_property_value_t value; value.value = ECMA_NULL_POINTER; return ecma_create_property (object_p, NULL, type_and_flags, value); } /* ecma_create_internal_property */
/** * Create named data property with given name, attributes and undefined value * in the specified object. * * @return pointer to newly created property */ ecma_property_t * ecma_create_named_data_property (ecma_object_t *object_p, /**< object */ ecma_string_t *name_p, /**< property name */ uint8_t prop_attributes) /**< property attributes (See: ecma_property_flags_t) */ { JERRY_ASSERT (object_p != NULL && name_p != NULL); JERRY_ASSERT (ecma_find_named_property (object_p, name_p) == NULL); JERRY_ASSERT ((prop_attributes & ~ECMA_PROPERTY_CONFIGURABLE_ENUMERABLE_WRITABLE) == 0); uint8_t type_and_flags = ECMA_PROPERTY_TYPE_NAMEDDATA | prop_attributes; name_p = ecma_copy_or_ref_ecma_string (name_p); ecma_property_value_t value; value.value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); return ecma_create_property (object_p, name_p, type_and_flags, value); } /* ecma_create_named_data_property */
/** * Create named accessor property with given name, attributes, getter and setter. * * @return pointer to newly created property */ ecma_property_t * ecma_create_named_accessor_property (ecma_object_t *object_p, /**< object */ ecma_string_t *name_p, /**< property name */ ecma_object_t *get_p, /**< getter */ ecma_object_t *set_p, /**< setter */ uint8_t prop_attributes) /**< property attributes */ { JERRY_ASSERT (object_p != NULL && name_p != NULL); JERRY_ASSERT (ecma_find_named_property (object_p, name_p) == NULL); JERRY_ASSERT ((prop_attributes & ~ECMA_PROPERTY_CONFIGURABLE_ENUMERABLE) == 0); uint8_t type_and_flags = ECMA_PROPERTY_TYPE_NAMEDACCESSOR | prop_attributes; name_p = ecma_copy_or_ref_ecma_string (name_p); ecma_property_value_t value; ECMA_SET_POINTER (value.getter_setter_pair.getter_p, get_p); ECMA_SET_POINTER (value.getter_setter_pair.setter_p, set_p); return ecma_create_property (object_p, name_p, type_and_flags, value); } /* ecma_create_named_accessor_property */