Replace recursions with iterations in the linked_list data structure
JerryScript-DCO-1.0-Signed-off-by: Roland Takacs rtakacs.u-szeged@partner.samsung.com
This commit is contained in:
@@ -57,11 +57,13 @@ linked_list_free (linked_list list)
|
|||||||
{
|
{
|
||||||
ASSERT_LIST (list);
|
ASSERT_LIST (list);
|
||||||
linked_list_header *header = (linked_list_header *) list;
|
linked_list_header *header = (linked_list_header *) list;
|
||||||
if (header->next)
|
|
||||||
|
while (header != null_list)
|
||||||
{
|
{
|
||||||
linked_list_free ((linked_list) header->next);
|
linked_list_header *next_header_p = header->next;
|
||||||
|
jsp_mm_free ((linked_list) header);
|
||||||
|
header = next_header_p;
|
||||||
}
|
}
|
||||||
jsp_mm_free (list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
@@ -69,45 +71,53 @@ linked_list_element (linked_list list, size_t element_num)
|
|||||||
{
|
{
|
||||||
ASSERT_LIST (list);
|
ASSERT_LIST (list);
|
||||||
linked_list_header *header = (linked_list_header *) list;
|
linked_list_header *header = (linked_list_header *) list;
|
||||||
|
|
||||||
size_t block_size = linked_list_block_size ();
|
size_t block_size = linked_list_block_size ();
|
||||||
linked_list raw = list + sizeof (linked_list_header);
|
size_t element_count = element_num;
|
||||||
if (block_size < header->element_size * (element_num + 1))
|
|
||||||
|
while (block_size < header->element_size * (element_count + 1))
|
||||||
{
|
{
|
||||||
if (header->next)
|
header = header->next;
|
||||||
{
|
|
||||||
return linked_list_element ((linked_list) header->next,
|
if (header == null_list)
|
||||||
element_num - (block_size / header->element_size));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
element_count = element_count - (block_size / header->element_size);
|
||||||
}
|
}
|
||||||
raw += header->element_size * element_num;
|
|
||||||
return raw;
|
uint8_t *raw_start_p = (linked_list) header + sizeof (linked_list_header);
|
||||||
|
|
||||||
|
return raw_start_p + (header->element_size * element_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
linked_list_set_element (linked_list list, size_t element_num, void *element)
|
linked_list_set_element (linked_list list, size_t element_num, void *element)
|
||||||
{
|
{
|
||||||
|
if (element == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ASSERT_LIST (list);
|
ASSERT_LIST (list);
|
||||||
linked_list_header *header = (linked_list_header *) list;
|
linked_list_header *header = (linked_list_header *) list;
|
||||||
|
|
||||||
size_t block_size = linked_list_block_size ();
|
size_t block_size = linked_list_block_size ();
|
||||||
uint8_t *raw = (uint8_t *) (header + 1);
|
size_t element_count = element_num;
|
||||||
if (block_size < header->element_size * (element_num + 1))
|
|
||||||
|
while (block_size < header->element_size * (element_count + 1))
|
||||||
{
|
{
|
||||||
if (header->next == null_list)
|
if (header->next == null_list)
|
||||||
{
|
{
|
||||||
header->next = (linked_list_header *) linked_list_init (header->element_size);
|
header->next = (linked_list_header *) linked_list_init (header->element_size);
|
||||||
}
|
}
|
||||||
linked_list_set_element ((linked_list) header->next,
|
|
||||||
element_num - (block_size / header->element_size),
|
header = header->next;
|
||||||
element);
|
element_count = element_count - (block_size / header->element_size);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
if (element == NULL)
|
|
||||||
{
|
uint8_t *raw_start_p = (linked_list) header + sizeof (linked_list_header);
|
||||||
return;
|
|
||||||
}
|
memcpy (raw_start_p + element_count * header->element_size, element, header->element_size);
|
||||||
memcpy (raw + element_num * header->element_size, element, header->element_size);
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user