Skip to content

Commit c1cfc4e

Browse files
committedJul 11, 2020
Convert the recursive code for freeing AST into an interative one
Profiling showed that a lot of time is spent in freeing up the tree - making it non-recursive should speed it up
1 parent 5c49704 commit c1cfc4e

File tree

3 files changed

+63
-2
lines changed

3 files changed

+63
-2
lines changed
 

‎parser.c

+29
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,35 @@ regex_free(regex_t *regex)
409409
free(regex);
410410
}
411411

412+
void
413+
free_expression2(expression_node_t *exp)
414+
{
415+
cm_stack *stack = cm_stack_init(64);
416+
cm_stack_push(stack, exp);
417+
while (stack->length > 0) {
418+
expression_node_t *e = (expression_node_t *) cm_stack_pop(stack);
419+
if (e->type == CHAR_LITERAL || e->type == CHAR_LITERAL) {
420+
free(e);
421+
continue;
422+
}
423+
if (e->type == INFIX_EXPRESSION) {
424+
infix_expression_t *infix = (infix_expression_t *) e;
425+
cm_stack_push(stack, infix->left);
426+
cm_stack_push(stack, infix->right);
427+
free(e);
428+
continue;
429+
}
430+
if (e->type == POSTFIX_EXPRESSION) {
431+
postfix_expression_t *postfix = (postfix_expression_t *) e;
432+
cm_stack_push(stack, postfix->left);
433+
free(e);
434+
continue;
435+
}
436+
free(e);
437+
}
438+
cm_stack_free(stack);
439+
}
440+
412441
void
413442
free_expression(expression_node_t *exp)
414443
{

‎re_utils.c

+28-2
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ cm_list_free(cm_list *list, void (*free_data) (void *))
7878
while (list_node != NULL) {
7979
if (free_data)
8080
free_data(list_node->data);
81-
else
82-
free(list_node->data);
81+
// else
82+
// free(list_node->data);
8383
temp_node = list_node->next;
8484
free(list_node);
8585
list_node = temp_node;
@@ -466,3 +466,29 @@ pointer_equals(void *key1, void*key2)
466466
{
467467
return key1 == key2;
468468
}
469+
470+
void
471+
cm_stack_push(cm_stack *stack, void *v)
472+
{
473+
cm_array_list *l = (cm_array_list *) stack;
474+
cm_array_list_add(l, v);
475+
}
476+
477+
void *
478+
cm_stack_pop(cm_stack *stack)
479+
{
480+
stack->length--;
481+
return stack->array[stack->length];
482+
}
483+
484+
cm_stack *
485+
cm_stack_init(size_t init_size)
486+
{
487+
return (cm_stack *) cm_array_list_init(init_size, NULL);
488+
}
489+
490+
void
491+
cm_stack_free(cm_stack *stack)
492+
{
493+
cm_array_list_free((cm_array_list *) stack);
494+
}

‎re_utils.h

+6
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ typedef struct cm_hash_table {
6969
void (*free_value) (void *);
7070
} cm_hash_table;
7171

72+
typedef cm_array_list cm_stack;
73+
7274

7375
cm_list *cm_list_init(void);
7476
int cm_list_add(cm_list *, void *);
@@ -83,6 +85,10 @@ void *cm_array_list_last(cm_array_list *);
8385
void *cm_array_list_first(cm_array_list *);
8486
void cm_array_list_remove(cm_array_list *, size_t);
8587
void cm_array_list_free(cm_array_list *);
88+
void * cm_stack_pop(cm_stack *);
89+
void cm_stack_push(cm_stack *, void *);
90+
cm_stack *cm_stack_init(size_t);
91+
void cm_stack_free(cm_stack *);
8692
char *cm_array_string_list_join(cm_array_list *, const char *);
8793
cm_array_list *cm_array_list_copy(cm_array_list *, void * (*copy_func) (void *));
8894

0 commit comments

Comments
 (0)
Please sign in to comment.