summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/function.c9
-rw-r--r--src/core/garbage.c60
-rw-r--r--src/core/garbage.h7
-rw-r--r--src/core/interpret.c66
-rw-r--r--src/core/symbol.c22
-rw-r--r--src/core/token.c4
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 */