From eab77d5b25ffca5a2fce48ad1bc9223398b56d2b Mon Sep 17 00:00:00 2001 From: Elijah Cohen Date: Thu, 15 Aug 2024 20:56:20 +0000 Subject: [PATCH] fixed memory leaks in loading --- src/builtins.c | 19 ++++++++++--- src/builtins/arithmetic.c | 8 ++++-- src/builtins/core.c | 60 ++++++++++++++++++++++++++++++++------- src/test.c | 22 +++++++++++++- 4 files changed, 92 insertions(+), 17 deletions(-) diff --git a/src/builtins.c b/src/builtins.c index 90cf1c1..5bef3b4 100644 --- a/src/builtins.c +++ b/src/builtins.c @@ -38,10 +38,21 @@ uint64_t u64_get_num_args(Sexpr* b) { Sexpr* load_env(Sexpr* env) { - append_to_dict(env, from_sym("nil"), from_nil()); - append_to_dict(env, from_sym("t"), from_t()); - Sexpr* newenv = load_core_env(env); + Sexpr* nilk = from_sym("nil"); + Sexpr* nilv = from_nil(); + append_to_dict(env, nilk, nilv); + sexpr_free(nilk); + sexpr_free(nilv); + + Sexpr* tk = from_sym("t"); + Sexpr* tv = from_t(); + append_to_dict(env, tk, tv); + sexpr_free(tk); + sexpr_free(tv); + + Sexpr* newenv = env; + newenv = load_core_env(env); newenv = load_arith_env(newenv); - append_to_dict(env, from_sym("asdf"), from_uint(5455)); + //append_to_dict(env, from_sym("asdf"), from_uint(5455)); return newenv; } diff --git a/src/builtins/arithmetic.c b/src/builtins/arithmetic.c index fb2b16b..4a686c4 100644 --- a/src/builtins/arithmetic.c +++ b/src/builtins/arithmetic.c @@ -33,8 +33,12 @@ Sexpr* x_arith_dispatch(Sexpr* b, Sexpr* rest, Sexpr* env) { } Sexpr* load_arith_env(Sexpr* env) { - Sexpr* a_plus = from_opcode((ARITH_PREFIX << 8) | ARITH_PLUS); - append_to_dict(env, from_sym("+"), a_plus); + Sexpr* k; + k = from_sym("+"); + Sexpr* a_plus = from_opcode((ARITH_PREFIX << 8) | ARITH_PLUS); + append_to_dict(env, k, a_plus); + sexpr_free(a_plus); + sexpr_free(k); return env; } diff --git a/src/builtins/core.c b/src/builtins/core.c index ee739e4..7b1ff62 100644 --- a/src/builtins/core.c +++ b/src/builtins/core.c @@ -146,25 +146,65 @@ Sexpr* x_core_dispatch(Sexpr* b, Sexpr* rest, Sexpr* env) { Sexpr* load_core_env(Sexpr* env) { + Sexpr* k = from_sym("quote"); Sexpr* c_quote = from_opcode(CORE_QUOTE); - append_to_dict(env, from_sym("quote"), c_quote); + append_to_dict(env, k, c_quote); + sexpr_free(c_quote); + sexpr_free(k); + + k = from_sym("cons"); Sexpr* c_cons = from_opcode(CORE_CONS); - append_to_dict(env, from_sym("cons"), c_cons); + append_to_dict(env, k, c_cons); + sexpr_free(c_cons); + sexpr_free(k); + + k = from_sym("car"); Sexpr* c_car = from_opcode(CORE_CAR); - append_to_dict(env, from_sym("car"), c_car); + append_to_dict(env, k, c_car); + sexpr_free(c_car); + sexpr_free(k); + + k = from_sym("cdr"); Sexpr* c_cdr = from_opcode(CORE_CDR); - append_to_dict(env, from_sym("cdr"), c_cdr); + append_to_dict(env, k, c_cdr); + sexpr_free(c_cdr); + sexpr_free(k); + + k = from_sym("if"); Sexpr* c_if = from_opcode(CORE_IF); - append_to_dict(env, from_sym("if"), c_if); + append_to_dict(env, k, c_if); + sexpr_free(c_if); + sexpr_free(k); + + k = from_sym("eq"); Sexpr* c_eq = from_opcode(CORE_EQ); - append_to_dict(env, from_sym("eq"), c_eq); + append_to_dict(env, k, c_eq); + sexpr_free(c_eq); + sexpr_free(k); + + k = from_sym("not"); Sexpr* c_not = from_opcode(CORE_NOT); - append_to_dict(env, from_sym("not"), c_not); + append_to_dict(env, k, c_not); + sexpr_free(c_not); + sexpr_free(k); + + k = from_sym("atom"); Sexpr* c_atom = from_opcode(CORE_ATOM); - append_to_dict(env, from_sym("atom"), c_atom); + append_to_dict(env, k, c_atom); + sexpr_free(c_atom); + sexpr_free(k); + + k = from_sym("def"); Sexpr* c_def = from_opcode(CORE_DEF); - append_to_dict(env, from_sym("def"), c_def); + append_to_dict(env, k, c_def); + sexpr_free(c_def); + sexpr_free(k); + + k = from_sym("exit"); Sexpr* c_exit = from_opcode(CORE_EXIT); - append_to_dict(env, from_sym("exit"), c_exit); + append_to_dict(env, k, c_exit); + sexpr_free(c_exit); + sexpr_free(k); + return env; } diff --git a/src/test.c b/src/test.c index 6d5de14..eb24d98 100644 --- a/src/test.c +++ b/src/test.c @@ -205,10 +205,30 @@ void memtest_dict() { sexpr_free(d); } +void memtest_eval() { + printf("memtest eval\n"); + Sexpr* env = init_dict(); + load_env(env); + + Sexpr* parsed = parse("(cons 1 2)"); + Sexpr* val = eval(car(parsed), env); + char* out = sprint_sexpr(val); + printf(" - %s\n", out); + free(out); + sexpr_free(val); + printf("uh\n"); + sexpr_free(parsed); + printf("um\n"); + + + sexpr_free(env); +} + void run_tests(){ + memtest_eval(); //mem_testing(); //mem_parser(); - memtest_dict(); + //memtest_dict(); //mem_hammer(); //test_basics(); //test2(); -- 2.39.2