diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/function.c | 9 | ||||
| -rw-r--r-- | src/core/garbage.c | 60 | ||||
| -rw-r--r-- | src/core/garbage.h | 7 | ||||
| -rw-r--r-- | src/core/interpret.c | 66 | ||||
| -rw-r--r-- | src/core/symbol.c | 22 | ||||
| -rw-r--r-- | src/core/token.c | 4 |
6 files changed, 93 insertions, 75 deletions
diff --git a/src/core/function.c b/src/core/function.c index c25834d..4d25a60 100644 --- a/src/core/function.c +++ b/src/core/function.c @@ -62,9 +62,9 @@ _process(Interpret *p_interpret, Token *p_token_store, Token *p_token_op, #ifdef DEBUG_FUNCTION_PROCESS if (p_token_op2 == NULL) - printf("PROCESS OPERATOR %s\n", tt_get_name(tt_op)); + printf("DEBUG::FUNCTION::PROCESS: Operator %s\n", tt_get_name(tt_op)); else - printf("PROCESS OPERATOR %s %s\n", tt_get_name(tt_op), + printf("DEBUG::FUNCTION::PROCESS: Operator %s %s\n", tt_get_name(tt_op), tt_get_name(tt_op2)); token_print(p_token_next); @@ -161,7 +161,7 @@ _process(Interpret *p_interpret, Token *p_token_store, Token *p_token_op, TokenType tt_highest = convert_to_highest(p_token_store, p_token_next); #ifdef DEBUG_FUNCTION_PROCESS - printf("===> %s %s %s\n", + printf("DEBUG::FUNCTION::PROCESS: ===> %s %s %s\n", tt_get_name(tt_highest), tt_get_name(tt_op), tt_get_name(tt_highest)); @@ -643,7 +643,6 @@ function_process_buildin(Interpret *p_interpret, Token *p_token_ident, } else if (strcmp("gc", token_get_val(p_token_ident)) == 0) { int i_count = garbage_collect(); - printf("ICOUNT %d\n", i_count); Token *p_token = token_new_integer(i_count); stack_push(p_stack_args, p_token); @@ -815,7 +814,7 @@ function_process_buildin(Interpret *p_interpret, Token *p_token_ident, break; NO_DEFAULT; } - + } else if (strcmp("refs", token_get_val(p_token_ident)) == 0) { if (0 == stack_size(p_stack_args)) _FUNCTION_ERROR("No argument given", p_token_ident); diff --git a/src/core/garbage.c b/src/core/garbage.c index aba19c4..1ba6831 100644 --- a/src/core/garbage.c +++ b/src/core/garbage.c @@ -41,6 +41,7 @@ List *LIST_GARBAGE = NULL; typedef struct { void (*p_func)(void*); + void (*p_print)(void*); int *p_ref_count; void *p_2free; GarbageType type; @@ -52,32 +53,19 @@ garbage_init() { } void -_garbage_print(_Garbage *p_garbage) { - switch (p_garbage->type) { - case GC_TOKEN: - { - Token *p_token = p_garbage->p_2free; - token_print(p_token); - printf("\n"); - } - break; - } -} - -void garbage_destroy() { garbage_collect(); - if (!list_empty(LIST_GARBAGE)) { EPRINTF("The garbage collector still has %d registered items which don't have" " a zero ref count!\n", list_size(LIST_GARBAGE)); - ListIterator *p_iter = listiterator_new(LIST_GARBAGE); - while (listiterator_has_next(p_iter)) { - _Garbage *p_garbage = listiterator_next(p_iter); - _garbage_print(p_garbage); - } - listiterator_delete(p_iter); + /* + ListIterator *p_iter = listiterator_new(LIST_GARBAGE); + while (listiterator_has_next(p_iter)) { + _Garbage *p_garbage = listiterator_next(p_iter); + } + listiterator_delete(p_iter); + */ _GARBAGE_ERROR("Garbage left"); } @@ -95,7 +83,13 @@ garbage_collect() { _Garbage *p_garbage = listiterator_next(p_iter); if (p_garbage->p_ref_count == NULL || *p_garbage->p_ref_count <= 0) { - // _garbage_print(p_garbage); +#ifdef DEBUG_GC + printf("DEBUG::GC: Freeing "); + if (NULL != p_garbage->p_print) + (*p_garbage->p_print) (p_garbage->p_2free); + else + printf("0x%x\n", (int) p_garbage->p_2free); +#endif /* DEBUG_GC */ (*p_garbage->p_func) (p_garbage->p_2free); free(p_garbage); ++i_count; @@ -109,6 +103,9 @@ garbage_collect() { list_delete(LIST_GARBAGE); LIST_GARBAGE = p_list_garbage_new; +#ifdef DEBUG_GC + printf("DEBUG::GC: Freed %d items\n", i_count); +#endif /* DEBUG_GC */ return (i_count); } @@ -119,11 +116,25 @@ garbage_add(void *p, GarbageType type) { } void -garbage_add2(void *p, void (*p_func)(void*), int *p_ref_count, GarbageType type) { +garbage_add2(void *p, + void (*p_func)(void*), + int *p_ref_count, + GarbageType type) { + garbage_add3(p, free, p_func, NULL, type); +} + +void +garbage_add3(void *p, + void (*p_func)(void*), + void (*p_print)(void*), + int *p_ref_count, + GarbageType type) { + _Garbage *p_garbage = malloc(sizeof(_Garbage)); p_garbage->p_2free = p; p_garbage->p_func = p_func; + p_garbage->p_print = p_print; p_garbage->p_ref_count = p_ref_count; p_garbage->type = type; @@ -132,5 +143,8 @@ garbage_add2(void *p, void (*p_func)(void*), int *p_ref_count, GarbageType type) void garbage_add_token(Token *p_token) { - garbage_add2(p_token, token_delete_cb, &p_token->i_ref_count, GC_TOKEN); + garbage_add3(p_token, + token_delete_cb, + token_print_cb, + &p_token->i_ref_count, GC_TOKEN); } diff --git a/src/core/garbage.h b/src/core/garbage.h index 8a8a820..0855b65 100644 --- a/src/core/garbage.h +++ b/src/core/garbage.h @@ -47,7 +47,12 @@ void garbage_init(); void garbage_destroy(); int garbage_collect(); void garbage_add(void *p, GarbageType type); -void garbage_add2(void *p, void (*p_func)(void*), int *p_ref_count, +void garbage_add2(void *p, void (*p_func)(void*), + int *p_ref_count, + GarbageType type); +void garbage_add3(void *p, void (*p_func)(void*), + void (*p_print)(void*), + int *p_ref_count, GarbageType type); void garbage_add_token(Token *p_token); diff --git a/src/core/interpret.c b/src/core/interpret.c index 9dbd7df..1b388d3 100644 --- a/src/core/interpret.c +++ b/src/core/interpret.c @@ -222,40 +222,40 @@ _var_assign(Interpret *p_interpret) { if (p_interpret->tt == TT_ASSIGN) { _NEXT - if (p_interpret->tt == TT_VID) { - _NEXT - if (p_interpret->tt != TT_IDENT) - _INTERPRET_ERROR("Expected identifier", p_interpret->p_token); + if (p_interpret->tt == TT_VID) { + _NEXT + if (p_interpret->tt != TT_IDENT) + _INTERPRET_ERROR("Expected identifier", p_interpret->p_token); - char *c_name_ = token_get_val(p_interpret->p_token); - Symbol *p_symbol = scope_get(p_interpret->p_scope, c_name_); + char *c_name_ = token_get_val(p_interpret->p_token); + Symbol *p_symbol = scope_get(p_interpret->p_scope, c_name_); - if (p_symbol == NULL) - _INTERPRET_ERROR("No such symbol", p_interpret->p_token); + if (p_symbol == NULL) + _INTERPRET_ERROR("No such symbol", p_interpret->p_token); - symbol_ref_up(p_symbol); - scope_newset(p_interpret->p_scope, c_name, p_symbol); - _NEXT + symbol_ref_up(p_symbol); + scope_newset(p_interpret->p_scope, c_name, p_symbol); + _NEXT - } else { - Stack *p_stack = p_interpret->p_stack; - p_interpret->p_stack = stack_new(); + } else { + Stack *p_stack = p_interpret->p_stack; + p_interpret->p_stack = stack_new(); - if (_expression_(p_interpret)) { - function_process_buildin(p_interpret, p_token, - p_interpret->p_stack); + if (_expression_(p_interpret)) { + function_process_buildin(p_interpret, p_token, + p_interpret->p_stack); - stack_merge(p_stack, p_interpret->p_stack); - stack_delete(p_interpret->p_stack); - p_interpret->p_stack = p_stack; + stack_merge(p_stack, p_interpret->p_stack); + stack_delete(p_interpret->p_stack); + p_interpret->p_stack = p_stack; - p_token = stack_top(p_interpret->p_stack); - Symbol *p_symbol = symbol_new(SYM_VARIABLE, p_token); - scope_newset(p_interpret->p_scope, c_name, p_symbol); - } else { - return (0); + p_token = stack_top(p_interpret->p_stack); + Symbol *p_symbol = symbol_new(SYM_VARIABLE, p_token); + scope_newset(p_interpret->p_scope, c_name, p_symbol); + } else { + return (0); + } } - } } else { Token *p_token = token_new_integer(0); Symbol *p_symbol = symbol_new(SYM_VARIABLE, p_token); @@ -304,9 +304,9 @@ _block_get(Interpret *p_interpret, List *p_list_block) { } #ifdef DEBUG_BLOCK_GET - printf("====> BLOCK\n"); + printf("DEBUG::BLOCK::GET: ====>\n"); list_iterate(p_list_block, token_print_cb); - printf("<==== BLOCK\n"); + printf("DEBUG::BLOCK::GET: <====\n"); #endif /* DEBUG_BLOCK_GET */ return (1); @@ -325,9 +325,9 @@ _expression_get(Interpret *p_interpret, List *p_list_expression) { } #ifdef DEBUG_EXPRESSION_GET - printf("====> EXPRESSION\n"); + printf("DEBUG::EXPRESSION::GET: ====>\n"); list_iterate(p_list_expression, token_print_cb); - printf("<==== EXPRESSION\n"); + printf("DEBUG::EXPRESSION::GET: <====\n"); #endif /* DEBUG_EXPRESSION_GET */ return (1); @@ -936,11 +936,11 @@ _term(Interpret *p_interpret) { char *c_name = token_get_val(p_interpret->p_token); Symbol *p_symbol = scope_get(p_interpret->p_scope, c_name); - if (p_symbol == NULL) - _INTERPRET_ERROR("No such symbol", p_interpret->p_token); + if (p_symbol == NULL) + _INTERPRET_ERROR("No such symbol", p_interpret->p_token); - Token *p_token_num_refs = token_new_integer(p_symbol->i_refs); + Token *p_token_num_refs = token_new_integer(p_symbol->i_refs); stack_push(p_interpret->p_stack, p_token_num_refs); _NEXT; diff --git a/src/core/symbol.c b/src/core/symbol.c index 37a0cae..b6fd2ed 100644 --- a/src/core/symbol.c +++ b/src/core/symbol.c @@ -49,18 +49,18 @@ symbol_new(SymbolType sym, void *p_val) { void symbol_delete(Symbol *p_symbol) { - if (--p_symbol->i_refs == 0) { - switch (symbol_get_sym(p_symbol)) { - case SYM_PROCEDURE: - { - List *p_list_token = symbol_get_val(p_symbol); - list_delete(p_list_token); + if (--p_symbol->i_refs == 0) { + switch (symbol_get_sym(p_symbol)) { + case SYM_PROCEDURE: + { + List *p_list_token = symbol_get_val(p_symbol); + list_delete(p_list_token); + } + break; + NO_DEFAULT; + } + free(p_symbol); } - break; - NO_DEFAULT; - } - free(p_symbol); - } } void diff --git a/src/core/token.c b/src/core/token.c index 2f08097..4fb298e 100644 --- a/src/core/token.c +++ b/src/core/token.c @@ -340,7 +340,7 @@ token_delete(Token *p_token) { if (token_ref_down(p_token) <= 0) { if (p_token->i_ref_count == 0) { #ifdef DEBUG_TOKEN_REFCOUNT - printf("Token refcount debug: Token ref count is 0 == %d\n", + printf("DEBUG::TOKEN::REFCOUNT: Token refcount debug: Token ref count is 0 == %d\n", p_token->i_ref_count); #endif /* DEBUG_TOKEN_REFCOUNT */ if (p_token->c_val) @@ -353,7 +353,7 @@ token_delete(Token *p_token) { } #ifdef DEBUG_TOKEN_REFCOUNT else { - printf("Token refcount debug: Token ref count is 0 > %d\n", + printf("DEBUG::TOKEN::REFCOUNT: Token refcount debug: Token ref count is 0 > %d\n", p_token->i_ref_count); } #endif /* DEBUG_TOKEN_REFCOUNT */ |
