/** * Construct a Function object for specified built-in routine * * See also: ECMA-262 v5, 15 * * @return pointer to constructed Function object */ ecma_object_t* ecma_builtin_make_function_object_for_routine (ecma_builtin_id_t builtin_id, /**< identifier of built-in object that initially contains property with the routine */ uint16_t routine_id, /**< builtin-wide identifier of the built-in object's routine property */ ecma_number_t length_prop_num_value) /**< ecma-number - value of 'length' property of function object to create */ { ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE); ecma_object_t *func_obj_p = ecma_create_object (prototype_obj_p, true, ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION); ecma_deref_object (prototype_obj_p); ecma_set_object_is_builtin (func_obj_p, true); uint64_t packed_value = jrt_set_bit_field_value (0, builtin_id, ECMA_BUILTIN_ROUTINE_ID_BUILT_IN_OBJECT_ID_POS, ECMA_BUILTIN_ROUTINE_ID_BUILT_IN_OBJECT_ID_WIDTH); packed_value = jrt_set_bit_field_value (packed_value, routine_id, ECMA_BUILTIN_ROUTINE_ID_BUILT_IN_ROUTINE_ID_POS, ECMA_BUILTIN_ROUTINE_ID_BUILT_IN_ROUTINE_ID_WIDTH); ecma_property_t *routine_id_prop_p = ecma_create_internal_property (func_obj_p, ECMA_INTERNAL_PROPERTY_BUILT_IN_ROUTINE_ID); JERRY_ASSERT ((uint32_t) packed_value == packed_value); routine_id_prop_p->u.internal_property.value = (uint32_t) packed_value; ecma_string_t* magic_string_length_p = ecma_get_magic_string (LIT_MAGIC_STRING_LENGTH); ecma_property_t *len_prop_p = ecma_create_named_data_property (func_obj_p, magic_string_length_p, false, false, false); ecma_deref_ecma_string (magic_string_length_p); ecma_number_t* len_p = ecma_alloc_number (); *len_p = length_prop_num_value; ecma_set_named_data_property_value (len_prop_p, ecma_make_number_value (len_p)); return func_obj_p; } /* ecma_builtin_make_function_object_for_routine */
/** * Set value field of ecma value * * @return ecma value with updated field */ static ecma_value_t __attr_pure___ ecma_set_value_value_field (ecma_value_t value, /**< ecma value to set field in */ uintptr_t value_field) /**< new field value */ { return (ecma_value_t) jrt_set_bit_field_value (value, value_field, ECMA_VALUE_VALUE_POS, ECMA_VALUE_VALUE_WIDTH); } /* ecma_set_value_value_field */
/** * Set GC reference counter of the object. */ static void ecma_gc_set_object_refs (ecma_object_t *object_p, /**< object */ uint32_t refs) /**< new reference counter */ { JERRY_ASSERT (object_p != NULL); object_p->container = jrt_set_bit_field_value (object_p->container, refs, ECMA_OBJECT_GC_REFS_POS, ECMA_OBJECT_GC_REFS_WIDTH); } /* ecma_gc_set_object_refs */
/** * Construct a Function object for specified built-in routine * * See also: ECMA-262 v5, 15 * * @return pointer to constructed Function object */ ecma_object_t * ecma_builtin_make_function_object_for_routine (ecma_builtin_id_t builtin_id, /**< identifier of built-in object that initially contains property with the routine */ uint16_t routine_id, /**< builtin-wide identifier of the built-in object's routine property */ uint8_t length_prop_value) /**< value of 'length' property of function object to create */ { ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE); ecma_object_t *func_obj_p = ecma_create_object (prototype_obj_p, true, ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION); ecma_deref_object (prototype_obj_p); ecma_set_object_is_builtin (func_obj_p, true); uint64_t packed_value = jrt_set_bit_field_value (0, builtin_id, ECMA_BUILTIN_ROUTINE_ID_BUILT_IN_OBJECT_ID_POS, ECMA_BUILTIN_ROUTINE_ID_BUILT_IN_OBJECT_ID_WIDTH); packed_value = jrt_set_bit_field_value (packed_value, routine_id, ECMA_BUILTIN_ROUTINE_ID_BUILT_IN_ROUTINE_ID_POS, ECMA_BUILTIN_ROUTINE_ID_BUILT_IN_ROUTINE_ID_WIDTH); packed_value = jrt_set_bit_field_value (packed_value, length_prop_value, ECMA_BUILTIN_ROUTINE_ID_LENGTH_VALUE_POS, ECMA_BUILTIN_ROUTINE_ID_LENGTH_VALUE_WIDTH); ecma_property_t *routine_desc_prop_p = ecma_create_internal_property (func_obj_p, ECMA_INTERNAL_PROPERTY_BUILT_IN_ROUTINE_DESC); JERRY_ASSERT ((uint32_t) packed_value == packed_value); routine_desc_prop_p->u.internal_property.value = (uint32_t) packed_value; return func_obj_p; } /* ecma_builtin_make_function_object_for_routine */
/** * Set next object in list of objects with same generation. */ static void ecma_gc_set_object_next (ecma_object_t *object_p, /**< object */ ecma_object_t *next_object_p) /**< next object */ { JERRY_ASSERT (object_p != NULL); uintptr_t next_cp; ECMA_SET_POINTER (next_cp, next_object_p); JERRY_ASSERT (sizeof (uintptr_t) * JERRY_BITSINBYTE >= ECMA_OBJECT_GC_NEXT_CP_WIDTH); object_p->container = jrt_set_bit_field_value (object_p->container, next_cp, ECMA_OBJECT_GC_NEXT_CP_POS, ECMA_OBJECT_GC_NEXT_CP_WIDTH); } /* ecma_gc_set_object_next */
/** * Set visited flag of the object. */ static void ecma_gc_set_object_visited (ecma_object_t *object_p, /**< object */ bool is_visited) /**< flag value */ { JERRY_ASSERT (object_p != NULL); if (ecma_gc_visited_flip_flag) { is_visited = !is_visited; } object_p->container = jrt_set_bit_field_value (object_p->container, is_visited, ECMA_OBJECT_GC_VISITED_POS, ECMA_OBJECT_GC_VISITED_WIDTH); } /* ecma_gc_set_object_visited */