Remove all memory leaks
This commit is contained in:
parent
eba53956fc
commit
193489d698
2 changed files with 41 additions and 4 deletions
|
@ -15,6 +15,15 @@ typedef struct {
|
||||||
value_t *value;
|
value_t *value;
|
||||||
} return_state_t;
|
} return_state_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ht_t **envs;
|
||||||
|
int length;
|
||||||
|
int capacity;
|
||||||
|
} ht_array_t;
|
||||||
|
|
||||||
|
ht_array_t *hts;
|
||||||
|
#define DEFAULT_ENVS_SIZE 50
|
||||||
|
|
||||||
void evaluate_statement(stmt_t *stmt, ht_t *env, return_state_t *state);
|
void evaluate_statement(stmt_t *stmt, ht_t *env, return_state_t *state);
|
||||||
|
|
||||||
void free_val(value_t *value)
|
void free_val(value_t *value)
|
||||||
|
@ -406,12 +415,30 @@ void evaluate_statements(stmt_array_t *array, ht_t *env, return_state_t *state)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ht_array_add(ht_array_t *array, ht_t *env)
|
||||||
|
{
|
||||||
|
if (array->length == array->capacity) {
|
||||||
|
array->capacity *= 2;
|
||||||
|
array->envs = realloc(array->envs, array->capacity * sizeof(ht_t *));
|
||||||
|
}
|
||||||
|
array->envs[array->length++] = env;
|
||||||
|
}
|
||||||
|
|
||||||
|
void free_hts(ht_array_t *array)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < array->length; i++) {
|
||||||
|
ht_free(array->envs[i]);
|
||||||
|
}
|
||||||
|
free(array->envs);
|
||||||
|
free(array);
|
||||||
|
}
|
||||||
|
|
||||||
void evaluate_block(stmt_array_t *array, ht_t *cur_env, ht_t *scope_env, return_state_t *state)
|
void evaluate_block(stmt_array_t *array, ht_t *cur_env, ht_t *scope_env, return_state_t *state)
|
||||||
{
|
{
|
||||||
ht_t *previous = cur_env;
|
ht_t *previous = cur_env;
|
||||||
cur_env = scope_env;
|
cur_env = scope_env;
|
||||||
|
ht_array_add(hts, scope_env);
|
||||||
evaluate_statements(array, cur_env, state);
|
evaluate_statements(array, cur_env, state);
|
||||||
/* ht_free(scope_env); */
|
|
||||||
cur_env = previous;
|
cur_env = previous;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -434,7 +461,6 @@ value_t *_call(fn_t *fn, val_array_t *arguments, ht_t *env)
|
||||||
|
|
||||||
evaluate_block(fn->stmt->as.function.body->as.block.statements, env, fn_env, &state);
|
evaluate_block(fn->stmt->as.function.body->as.block.statements, env, fn_env, &state);
|
||||||
|
|
||||||
/* ht_free(fn_env); */
|
|
||||||
if (state.has_returned) {
|
if (state.has_returned) {
|
||||||
return state.value;
|
return state.value;
|
||||||
}
|
}
|
||||||
|
@ -446,12 +472,14 @@ void evaluate_statement(stmt_t *stmt, ht_t *env, return_state_t *state)
|
||||||
if (state && state->has_returned)
|
if (state && state->has_returned)
|
||||||
return;
|
return;
|
||||||
switch (stmt->type) {
|
switch (stmt->type) {
|
||||||
case STMT_IF:
|
case STMT_IF:;
|
||||||
if (is_truthy(evaluate(stmt->as._if.condition, env))) {
|
value_t *result = evaluate(stmt->as._if.condition, env);
|
||||||
|
if (is_truthy(result)) {
|
||||||
evaluate_statement(stmt->as._if.then_branch, env, state);
|
evaluate_statement(stmt->as._if.then_branch, env, state);
|
||||||
} else if (stmt->as._if.else_branch) {
|
} else if (stmt->as._if.else_branch) {
|
||||||
evaluate_statement(stmt->as._if.else_branch, env, state);
|
evaluate_statement(stmt->as._if.else_branch, env, state);
|
||||||
}
|
}
|
||||||
|
free_val(result);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STMT_PRINT:;
|
case STMT_PRINT:;
|
||||||
|
@ -539,7 +567,12 @@ void interpret(stmt_array_t *array)
|
||||||
|
|
||||||
return_state_t state = { 0, NULL };
|
return_state_t state = { 0, NULL };
|
||||||
|
|
||||||
|
hts = malloc(sizeof(ht_array_t));
|
||||||
|
hts->envs = malloc(DEFAULT_ENVS_SIZE * sizeof (ht_t *));
|
||||||
|
hts->length = 0;
|
||||||
|
hts->capacity = DEFAULT_ENVS_SIZE;
|
||||||
evaluate_statements(array, env, &state);
|
evaluate_statements(array, env, &state);
|
||||||
|
free_hts(hts);
|
||||||
ht_free(env);
|
ht_free(env);
|
||||||
free(clock_fn);
|
free(clock_fn);
|
||||||
free(fn);
|
free(fn);
|
||||||
|
|
|
@ -57,6 +57,10 @@ void free_expr(expr_t *expr)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EXPR_LITERAL:
|
case EXPR_LITERAL:
|
||||||
|
if (expr->as.literal.value->type == VAL_STRING) {
|
||||||
|
if (expr->as.literal.value->as.string)
|
||||||
|
free(expr->as.literal.value->as.string);
|
||||||
|
}
|
||||||
free(expr->as.literal.value);
|
free(expr->as.literal.value);
|
||||||
free(expr);
|
free(expr);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue