diff --git a/include/mcc/ast.h b/include/mcc/ast.h index 9a7aedd566f909961cebf3a6ad53d9352125c617..5ca073ceb7f36395acbb4b087dff72766910a1c7 100644 --- a/include/mcc/ast.h +++ b/include/mcc/ast.h @@ -386,9 +386,7 @@ void mcc_ast_delete_function(struct mcc_ast_function *function); struct mcc_ast_program { struct mcc_ast_node node; - int max; - int size; - struct mcc_ast_function* function_def[]; + Dynamic_Array *function_def; }; struct mcc_ast_program *mcc_ast_new_program(struct mcc_ast_function *function_def); diff --git a/src/ast.c b/src/ast.c index ab2d5f766dc72720fb9cae415ae6d58e9385a26a..51c36aa22d7f2b63ef4e4ede2a2b226e00dfb567 100644 --- a/src/ast.c +++ b/src/ast.c @@ -612,11 +612,10 @@ void mcc_ast_delete_function(struct mcc_ast_function *function) { struct mcc_ast_program *mcc_ast_new_program(struct mcc_ast_function *function_def) { assert(function_def); - struct mcc_ast_program *p = malloc(sizeof(*p) + sizeof(struct mcc_ast_function*) * MCC_PROGRAM_FUNCTION_DEF_SIZE); + struct mcc_ast_program *p = malloc(sizeof(*p)); - p -> size = 1; - p -> max = MCC_PROGRAM_FUNCTION_DEF_SIZE; - p -> function_def[0] = function_def; + p -> function_def = mcc_create_dynamic_array(MCC_PROGRAM_FUNCTION_DEF_SIZE); + mcc_add_to_array(p -> function_def, function_def); return p; } @@ -626,33 +625,23 @@ struct mcc_ast_program *mcc_ast_add_function(struct mcc_ast_function *function_d assert(program); assert(function_def); - int size = program -> size; - if (program -> size < program -> max) { - program -> function_def[size] = function_def; - program -> size += 1; - } else { - - program = realloc(program, sizeof(*program) + sizeof(struct mcc_ast_function*) * MCC_PROGRAM_FUNCTION_DEF_SIZE); - if(program == NULL ){ - mcc_ast_delete_program(program); - return NULL; - } - program -> max += MCC_PROGRAM_FUNCTION_DEF_SIZE; - program -> function_def[size] = function_def; - program -> size += 1; - } + if (mcc_add_to_array(program -> function_def, function_def) == 1) { + perror("Function def add error"); + }; return program; } +static void delete_func(void *function_def) { + struct mcc_ast_function *f = (struct mcc_ast_function*) function_def; + + mcc_ast_delete_function(f); +} + void mcc_ast_delete_program(struct mcc_ast_program *program) { assert(program); - for (int i = 0; i < program -> size; i++) { - mcc_ast_delete_function(program -> function_def[i]); - - } - + mcc_delete_array(program -> function_def, delete_func); free(program); } diff --git a/src/ast_print.c b/src/ast_print.c index 4860101812f079717ef96e7b9d0fdd7db4399c99..00590b4d67856198523d2376b3d66cee8fdf7217 100644 --- a/src/ast_print.c +++ b/src/ast_print.c @@ -460,15 +460,15 @@ static void print_dot_function(struct mcc_ast_function *function, void *data) // ------------------------------------------------------------------- Program -static void print_dot_program(struct mcc_ast_program *program, void *data) +static void print_dot_program(struct mcc_ast_program *program, void *data) { assert(program); assert(data); FILE *out = data; print_dot_node(out, program, "program"); - for (int i = 0; i < program->size; i++) { - print_dot_edge(out, program, program->function_def[i], + for (int i = 0; i < program-> function_def -> size; i++) { + print_dot_edge(out, program, program->function_def -> arr[i], "function_definition"); } } diff --git a/src/ast_visit.c b/src/ast_visit.c index 75780128c6f768e06bd48800e4ab55a1786be3ff..2f873b6ffb5ed85d7f06d90d692d0f136a5081b5 100644 --- a/src/ast_visit.c +++ b/src/ast_visit.c @@ -296,8 +296,8 @@ void mcc_ast_visit_program(struct mcc_ast_program *program, struct mcc_ast_visit assert(visitor); visit_if_pre_order(program, visitor->program, visitor); - for (int i = 0; i < program->size; i++) { - mcc_ast_visit_function(program->function_def[i], visitor); + for (int i = 0; i < program-> function_def -> size; i++) { + mcc_ast_visit_function(program->function_def -> arr [i], visitor); } visit_if_post_order(program, visitor->program, visitor); } diff --git a/src/symbol_table_parse.c b/src/symbol_table_parse.c index 12671fe4eb061f382b58352fb00e67a11adfdd16..a1456dab5ab921d3ede07c18c3f2805bea757d1e 100644 --- a/src/symbol_table_parse.c +++ b/src/symbol_table_parse.c @@ -319,8 +319,8 @@ int mcc_symbol_table_parse_program( assert(program); int function_parse = 0; - for(int i = 0; i < program->size; i++) { - function_parse = mcc_symbol_table_add_function_declaration(program->function_def[i], symbol_table, ec); + for(int i = 0; i < program -> function_def -> size; i++) { + function_parse = mcc_symbol_table_add_function_declaration(program->function_def -> arr[i], symbol_table, ec); if (function_parse) break; } @@ -329,8 +329,8 @@ int mcc_symbol_table_parse_program( if (function_parse == 0) { // parse all functions - for(int i = 0; i < program->size; i++) { - function_parse = mcc_symbol_table_parse_function(program->function_def[i], symbol_table, ec); + for(int i = 0; i < program-> function_def -> size; i++) { + function_parse = mcc_symbol_table_parse_function(program->function_def -> arr[i], symbol_table, ec); if (function_parse) break; } diff --git a/src/utils/mcc_scope.c b/src/utils/mcc_scope.c index 5152578aed786d9cedb3116cef9bb3b7ba6ce63f..1cae124b5a86204cbfcbea869f3e7b881088e127 100644 --- a/src/utils/mcc_scope.c +++ b/src/utils/mcc_scope.c @@ -9,8 +9,8 @@ struct mcc_ast_function *mcc_limit_scope_to_function(char* function_name, struct assert(p); struct mcc_ast_function *f; - for (int i = 0; i < p -> size; i++) { - f = p -> function_def[i]; + for (int i = 0; i < p -> function_def -> size; i++) { + f = p -> function_def -> arr[i]; if (f != NULL) { if (strcmp(function_name, f -> identifier ->i_value) == 0) {