]> git.eli173.com Git - klapaucius/commitdiff
fixed memory leaks in dict
authorElijah Cohen <cohen@eli173.com>
Thu, 15 Aug 2024 20:08:26 +0000 (20:08 +0000)
committerElijah Cohen <cohen@eli173.com>
Thu, 15 Aug 2024 20:08:26 +0000 (20:08 +0000)
src/Makefile
src/dict.c
src/repl.c
src/test.c

index 325e039c2cbde77bd083537c573bc2c30c05d801..4c65d969fc8fd42d6e93d20e886d890efc5bd5d4 100644 (file)
@@ -16,7 +16,7 @@ TEST_OBJS:= $(filter-out $(BUILD)/repl.o,$(OBJS))
 
 #LIBRARIES = poppler-glib MagickWand libexif taglib_c libmagic libavcodec libavformat sqlite3 uuid fuse3 libbsd-overlay
 
-LIBRARIES = uuid libedit
+LIBRARIES = libedit
 
 CFLAGS:= -g -Wall `pkg-config $(LIBRARIES) --cflags`
 LDFLAGS:= -g -Wall `pkg-config $(LIBRARIES) --libs`
index c28498e84c863973ad5a96af8a697c9f78254c7e..8c3176f788f0e447d99fbd57132ecdf81df4144a 100644 (file)
@@ -23,7 +23,7 @@ Sexpr* init_dict() {
 Sexpr* append_to_dict(Sexpr* dict, Sexpr* key, Sexpr* value) {
        // assumes dict well-formed, returns new dict
        // puts new things on the front of the dict, makes it so looking up gets the newest stuff first
-       Sexpr* new = cons(key, clone(value));
+       Sexpr* new = cons(clone(key), clone(value));
        // not yet sure if the above 'clone' is needed, or where the call should take place
        Sexpr* head = cons(new, car(dict));
        dict->value.c->car = head;
@@ -36,10 +36,13 @@ Sexpr* lookup(Sexpr* dict, Sexpr* key) {
        // returns nil if not found, returns (result) if it is
        Sexpr* node = car(dict);
                while(node->type != NIL) {
-                       if(equal(key, car(car(node)))->type == T) {
+                       Sexpr* eq = equal(key, car(car(node)));
+                       if(eq->type == T) {
                                Sexpr* value = clone(cdr(car(node)));
+                               sexpr_free(eq);
                                return cons(value, from_nil());
                        }
+                       sexpr_free(eq);
                        node = cdr(node);
        }
        return from_nil();
index 94420d8bbdb24cf7843b52b8da2d036c1a0ae42f..d72271569ba20c1af0580f3d639714309483227f 100644 (file)
@@ -2,7 +2,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <histedit.h>
+//#include <histedit.h>
 
 #include <editline/readline.h>
 
index d85f67d3a14afce66de67a78dafb98e71ebf5140..6d5de148429c10a26b671104a09e7cd3069f9151 100644 (file)
@@ -78,11 +78,23 @@ void test_eq() {
 
 void test_dict() {
        printf("testing dict\n");
+       printf("now with memory leak fixing\n");
        Sexpr* d = init_dict();
-       d = append_to_dict(d, from_sym("hello"), from_sym("world"));
-       d = append_to_dict(d, from_sym("asdf"), from_uint(544));
+       Sexpr* k = from_sym("hello");
+       Sexpr* v = from_sym("world");
+       d = append_to_dict(d, k, v);
+       sexpr_free(k);
+       sexpr_free(v);
+       k = from_sym("asdf");
+       v = from_uint(544);
+       d = append_to_dict(d, k, v);
+       sexpr_free(k);
+       sexpr_free(v);
        printf("lookup hello: %s\n", sprint_sexpr(lookup(d, from_sym("hello"))));
        printf("lookup asdf: %s\n", sprint_sexpr(lookup(d, from_sym("asdf"))));
+       sexpr_free(d);
+       
+
 }
 
 void mem_parser() {
@@ -140,20 +152,63 @@ void mem_testing() {
        sexpr_free(r);
        printf("%s\n", out);
        free(out);
-
-
-       
        Sexpr* c = cons_parse(b);
        sexpr_free(b);
        out = sprint_sexpr(c);
        sexpr_free(c);
        printf("%s\n", out);
        free(out);
+
+       a = from_uint(545);
+       b = from_uint(545);
+       Sexpr* e = equal(a,b);
+       sexpr_free(a);
+       sexpr_free(b);
+       sexpr_free(e);
+       a = from_sym("hi");
+       b = from_sym("hi");
+       e = equal(a,b);
+       sexpr_free(a);
+       sexpr_free(b);
+       sexpr_free(e);
+}
+
+void memtest_dict() {
+       printf("memtest dict\n");
+       Sexpr* d = init_dict();
+
+       Sexpr* k = from_sym("hello");
+       Sexpr* v = from_sym("world");
+       d = append_to_dict(d, k, v);
+       sexpr_free(k);
+       sexpr_free(v);
+       k = from_sym("asdf");
+       v = from_uint(454);
+       d = append_to_dict(d, k, v);
+       sexpr_free(k);
+       sexpr_free(v);
+       k = from_sym("hello");
+       v = lookup(d, k);
+       char* out = sprint_sexpr(v);
+       printf("lookup hello: %s\n", out);
+       free(out);
+       sexpr_free(k);
+       sexpr_free(v);
+       k = from_sym("asdf");
+       v = lookup(d, k);
+       out = sprint_sexpr(v);
+       printf("lookup hello: %s\n", out);
+       free(out);
+       sexpr_free(k);
+       sexpr_free(v);
+
+       sexpr_free(d);
 }
 
 void run_tests(){
-       mem_testing();
-       mem_parser();
+       //mem_testing();
+       //mem_parser();
+       memtest_dict();
        //mem_hammer();
        //test_basics();
        //test2();