From 4e3b919602046dd22d69c8d58839cb33b62b1a85 Mon Sep 17 00:00:00 2001 From: Thing1 Date: Fri, 13 Sep 2024 15:48:02 +0100 Subject: implemeted an allocator and defering memory manager --- comp/lucas-standen-NEA/code2/Makefile | 2 +- comp/lucas-standen-NEA/code2/comp.c | 31 ++++++++++++++++++++++++++++--- comp/lucas-standen-NEA/code2/sample | Bin 15256 -> 15624 bytes comp/lucas-standen-NEA/code2/sample.zpy | 25 ++++++++++++++++++------- comp/lucas-standen-NEA/code2/zpy | Bin 21336 -> 34792 bytes comp/lucas-standen-NEA/code2/zpy.sh | 3 ++- 6 files changed, 49 insertions(+), 12 deletions(-) (limited to 'comp/lucas-standen-NEA/code2') diff --git a/comp/lucas-standen-NEA/code2/Makefile b/comp/lucas-standen-NEA/code2/Makefile index a3aa9b2..728fa1d 100644 --- a/comp/lucas-standen-NEA/code2/Makefile +++ b/comp/lucas-standen-NEA/code2/Makefile @@ -1,5 +1,5 @@ CC = cc -CFLAGS = -O3 +CFLAGS = -O0 -ggdb all: _zpy _parser _tokenizer _comp _appendsnprintf _util _debug ${CC} zpy.o parser.o tokenizer.o comp.o appendsnprintf.o util.o debug.o -o zpy ${CFLAGS} diff --git a/comp/lucas-standen-NEA/code2/comp.c b/comp/lucas-standen-NEA/code2/comp.c index f37ffed..7fb975a 100644 --- a/comp/lucas-standen-NEA/code2/comp.c +++ b/comp/lucas-standen-NEA/code2/comp.c @@ -35,10 +35,16 @@ char *names[] = { "exit", // 21 "return", // 22 + + "alloc", // takes a size and allocates a block of it // 23 }; char *compile(astNode *node); +char *tofree[256]; +int freeptr = 0; +bool neededmemptr = false; + char *vartypeToC(char *str, char *out){ char *name = malloc(strlen(str)); char *type = malloc(strlen(str)); @@ -112,16 +118,25 @@ char *compile(astNode *node){ out = appendsnprintf(out, MAXOUTLEN, "){\n"); } else if (strcmp(names[1], node->func) == 0){ + for (int i = 0; i < 256; i++){ + if (tofree[i] != NULL){ + out = appendsnprintf(out, MAXOUTLEN, "free(%s);\n", tofree[i]); + } else{ + for (int j = 0; j < 256; j++){ + tofree[j] = NULL; + } + freeptr = 0; + break; + } + } out = appendsnprintf(out, MAXOUTLEN, "}\n"); } else if (strcmp(names[2], node->func) == 0){ - out = appendsnprintf(out, MAXOUTLEN, "const "); out = vartypeToC(node->args[0], out); out = appendsnprintf(out, MAXOUTLEN, " = %s;\n", node->args[1]); } else if (strcmp(names[3], node->func) == 0){ - out = vartypeToC(node->args[0], out); - out = appendsnprintf(out, MAXOUTLEN, " = %s;\n", node->args[1]); + out = appendsnprintf(out, MAXOUTLEN, "%s = %s;\n", node->args[0], node->args[1]); } else if (strcmp(names[4], node->func) == 0){ out = appendsnprintf(out, MAXOUTLEN, "if (%s", node->args[0]); @@ -152,6 +167,7 @@ char *compile(astNode *node){ out = appendsnprintf(out, MAXOUTLEN, "%s %s(", node->args[1], node->args[0]); int i = 2; while (node->args[i] != NULL){ + if (i != 2) out = appendsnprintf(out, MAXOUTLEN, ",", node->args[i]); out = vartypeToC(node->args[i], out); i++; } @@ -163,6 +179,10 @@ char *compile(astNode *node){ else if (strcmp(names[22], node->func) == 0){ out = appendsnprintf(out, MAXOUTLEN, "return %s;\n", node->args[0]); } + else if (strcmp(names[23], node->func) == 0){ + out = appendsnprintf(out, MAXOUTLEN, "calloc(0, %s)", node->args[0]); + neededmemptr = true; + } else { // arithmetic operators and comparitors @@ -188,6 +208,11 @@ end: void Compile(astNode *line, FILE *f){ char *code = compile(line); + if (neededmemptr == true){ + tofree[freeptr] = getVarName(line->args[0]); + freeptr++; + neededmemptr = false; + } int len = strlen(code); if (code[len-2] == ';' || code[len-2] == '{' || code[len-2] == '}') fprintf(f, "%s", code); else fprintf(f, "%s;\n", code); diff --git a/comp/lucas-standen-NEA/code2/sample b/comp/lucas-standen-NEA/code2/sample index 411368d..96a8c07 100755 Binary files a/comp/lucas-standen-NEA/code2/sample and b/comp/lucas-standen-NEA/code2/sample differ diff --git a/comp/lucas-standen-NEA/code2/sample.zpy b/comp/lucas-standen-NEA/code2/sample.zpy index 98bbf44..1eea0f4 100644 --- a/comp/lucas-standen-NEA/code2/sample.zpy +++ b/comp/lucas-standen-NEA/code2/sample.zpy @@ -1,11 +1,22 @@ -(defun fib int n:int) - (if (<= n 1)) - (return n) - (endif) - (return (+ (fib (- n 1)) (fib (- n 2)))) +(symbol putchar int c:int) +(symbol getchar int) + +(defun read char* str:char*) + (let count:int 0) + (for c:char (getchar) (!= c '\n') 0) + (set str[count] c) + (set c (getchar)) + (set count (+ count 1)) + (endfor) + (return str) (endfun) (defun main int) - (fib 43) - (return 0) + (let str:char* (alloc 10)) + + (set str (read str)) + + (for i:int 0 (< i 10) 1) + (putchar str[i]) + (endfor) (endfun) diff --git a/comp/lucas-standen-NEA/code2/zpy b/comp/lucas-standen-NEA/code2/zpy index 2251a3f..5bbab13 100755 Binary files a/comp/lucas-standen-NEA/code2/zpy and b/comp/lucas-standen-NEA/code2/zpy differ diff --git a/comp/lucas-standen-NEA/code2/zpy.sh b/comp/lucas-standen-NEA/code2/zpy.sh index 1db747f..bd212fb 100755 --- a/comp/lucas-standen-NEA/code2/zpy.sh +++ b/comp/lucas-standen-NEA/code2/zpy.sh @@ -1,3 +1,4 @@ #!/bin/sh CC=cc -./zpy $1 | ${CC} -O3 -x c - -Wno-implicit -Wno-missing-declarations -o $2 +warnings="-Wno-builtin-declaration-mismatch -Wno-implicit -Wno-missing-declarations" +./zpy $1 | ${CC} ${warnings} -x c - -o $2 -- cgit v1.2.3