/** * Free the collection of ecma values. */ void ecma_free_values_collection (ecma_collection_header_t *header_p, /**< collection's header */ bool do_deref_if_object) /**< if the value is object value, decrement reference counter of the object */ { JERRY_ASSERT (header_p != NULL); const size_t values_in_chunk = JERRY_SIZE_OF_STRUCT_MEMBER (ecma_collection_chunk_t, data) / sizeof (ecma_value_t); ecma_collection_chunk_t *chunk_p = ECMA_GET_POINTER (ecma_collection_chunk_t, header_p->first_chunk_cp); ecma_length_t value_index = 0; while (chunk_p != NULL) { JERRY_ASSERT (value_index < header_p->unit_number); ecma_value_t *cur_value_buf_iter_p = (ecma_value_t *) chunk_p->data; ecma_value_t *cur_value_buf_end_p = cur_value_buf_iter_p + values_in_chunk; while (cur_value_buf_iter_p != cur_value_buf_end_p && value_index < header_p->unit_number) { JERRY_ASSERT (cur_value_buf_iter_p < cur_value_buf_end_p); if (do_deref_if_object) { ecma_free_value (*cur_value_buf_iter_p); } else { ecma_free_value_if_not_object (*cur_value_buf_iter_p); } cur_value_buf_iter_p++; value_index++; } ecma_collection_chunk_t *next_chunk_p = ECMA_GET_POINTER (ecma_collection_chunk_t, chunk_p->next_chunk_cp); ecma_dealloc_collection_chunk (chunk_p); chunk_p = next_chunk_p; } ecma_dealloc_collection_header (header_p); } /* ecma_free_values_collection */
/** * 'for-in' opcode handler * * See also: * ECMA-262 v5, 12.6.4 * * @return completion value * Returned value must be freed with ecma_free_value */ ecma_collection_header_t * opfunc_for_in (ecma_value_t left_value, /**< left value */ ecma_value_t *result_obj_p) /**< expression object */ { ecma_value_t compl_val = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY); ecma_collection_header_t *prop_names_p = NULL; /* 3. */ if (!ecma_is_value_undefined (left_value) && !ecma_is_value_null (left_value)) { /* 4. */ ECMA_TRY_CATCH (obj_expr_value, ecma_op_to_object (left_value), compl_val); ecma_object_t *obj_p = ecma_get_object_from_value (obj_expr_value); prop_names_p = ecma_op_object_get_property_names (obj_p, false, true, true); if (prop_names_p->unit_number != 0) { ecma_ref_object (obj_p); *result_obj_p = ecma_make_object_value (obj_p); } else { ecma_dealloc_collection_header (prop_names_p); prop_names_p = NULL; } ECMA_FINALIZE (obj_expr_value); } JERRY_ASSERT (ecma_is_value_empty (compl_val)); return prop_names_p; } /* opfunc_for_in */