language

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit d05bee02c73f8d2eb746b1bf3fef2aceee064943
parent 79d7ba828f72394e4a1a5a9560f77d2a5b39964b
Author: Paul Longtine <paullongtine@gmail.com>
Date:   Tue, 26 Sep 2017 17:20:43 -0400

Fixed memory leaks

Diffstat:
Msrc/vm/inc/bc.h | 9+++++----
Msrc/vm/inc/ns.h | 7++++---
Msrc/vm/inc/rt.h | 2+-
Msrc/vm/inc/stk.h | 5++---
Msrc/vm/inc/var.h | 10++++++++++
Msrc/vm/src/bc.c | 26+++++++++++---------------
Msrc/vm/src/main.c | 3++-
Msrc/vm/src/ns.c | 49++++++++++++++++++++++---------------------------
Msrc/vm/src/pc.c | 4++--
Msrc/vm/src/rt.c | 9+++++----
Msrc/vm/src/stk.c | 27+++++----------------------
Msrc/vm/src/var.c | 42+++++++++++++++++++++++++-----------------
Msrc/vm/tests/cases/bc/test.c | 2+-
Msrc/vm/tests/cases/stk/test.c | 18+++++++++++++-----
14 files changed, 108 insertions(+), 105 deletions(-)

diff --git a/src/vm/inc/bc.h b/src/vm/inc/bc.h @@ -6,6 +6,7 @@ #include <stdlib.h> #include <stdio.h> +#include <string.h> #include "fh.h" #include "var.h" @@ -26,15 +27,15 @@ typedef struct bc_cont { } bc_cont; typedef struct bc_t { - bc_addr size; // Size of program - bc_cont** heap; // Heap of instructions + bc_addr size; // Size of program + bc_cont* heap; // Heap of instructions } bc_t; #include "is.h" /* Handles allocation for new `bc_cont` instances */ -bc_cont* bc_cont_new(void); +void bc_cont_new(bc_cont*); /* Deallocates all the things, assuming the arguement is the root. * bc_cont* - bytecode container, root node (hopefully) @@ -59,7 +60,7 @@ void process_args(bc_cont*); * FILE* - File descriptor * bc_addr* - pointer to size variable */ -bc_cont** bc_read(FILE* f, bc_addr*); +bc_cont* bc_read(FILE* f, bc_addr*); /* Reads program into bc_t instance * char* - filename diff --git a/src/vm/inc/ns.h b/src/vm/inc/ns.h @@ -11,10 +11,11 @@ typedef unsigned int ns_addr; +#define NS_CONT_MAX_NAMES 0xFFF typedef struct ns_cont { int level; ns_addr size; - var_cont** names; + var_cont* names[NS_CONT_MAX_NAMES]; struct ns_cont* next; } ns_cont; @@ -24,10 +25,10 @@ typedef struct ns_t { ns_cont* last; } ns_t; -#define NS_CTX_DEPTH 256 +#define NS_CTX_DEPTH 32 typedef struct ns_ctx { int ptr; - ns_t** spaces; + ns_t* spaces[NS_CTX_DEPTH]; } ns_ctx; /* Initializes namespace context diff --git a/src/vm/inc/rt.h b/src/vm/inc/rt.h @@ -34,8 +34,8 @@ typedef struct rt_t { stk_t* stack; stk_t* argstk; ns_t* vars; - ns_ctx* varctx; ns_t* names; + ns_ctx* varctx; } rt_t; /* Creates new runtime context. diff --git a/src/vm/inc/stk.h b/src/vm/inc/stk.h @@ -4,8 +4,7 @@ #ifndef STK_H #define STK_H -#define STACK_SIZE_LIMIT 0xFFFF -#define STACK_INIT_SIZE 0xFF +#define STACK_SIZE_LIMIT 0x100 #include <stdlib.h> #include <stdio.h> @@ -16,7 +15,7 @@ typedef struct stk_line { int ptr; size_t size; - var_cont** data; + var_cont* data[STACK_SIZE_LIMIT]; } stk_line; typedef struct stk_t { diff --git a/src/vm/inc/var.h b/src/vm/inc/var.h @@ -37,6 +37,14 @@ typedef struct var_cont { void* data; } var_cont; +#define MAXIMUM_TRACKING_VARS 0xFFFF +struct var_track { + int ptr; + var_cont* vars[MAXIMUM_TRACKING_VARS]; +}; + +struct var_track VAR_TRACK; + typedef struct var_data_type { b_type v; } var_data_type; @@ -98,6 +106,8 @@ typedef struct var_data_ptr { #include "bc.h" +void init_var_track(); + /* Initialze variable with type */ var_cont* var_new(b_type); diff --git a/src/vm/src/bc.c b/src/vm/src/bc.c @@ -1,5 +1,6 @@ #include <stdlib.h> #include <stdio.h> +#include <string.h> #include "bc.h" @@ -10,9 +11,9 @@ /* Handles allocation for new `bc_cont` instances */ -bc_cont* bc_cont_new(void) +void bc_cont_new(bc_cont* new) { - bc_cont *new = (bc_cont*)malloc(sizeof(bc_cont)); + //new = (bc_cont*)malloc(sizeof(bc_cont)); M_ASSERT(new); new->args[0] = NULL; @@ -26,8 +27,6 @@ bc_cont* bc_cont_new(void) new->sarg[0] = 0; new->sarg[1] = 0; new->sarg[2] = 0; - - return new; } void bc_cont_del(bc_cont* ins) @@ -41,8 +40,6 @@ void bc_cont_del(bc_cont* ins) if (ins->varg[0] != NULL) var_del(ins->varg[0]); if (ins->varg[1] != NULL) var_del(ins->varg[1]); if (ins->varg[2] != NULL) var_del(ins->varg[2]); - - free(ins); } } @@ -172,7 +169,7 @@ void process_args(bc_cont* ins) * FILE* - File descriptor * bc_addr* - pointer to size variable */ -bc_cont** bc_read(FILE* f, bc_addr* len) +bc_cont* bc_read(FILE* f, bc_addr* len) { N_ASSERT(f, "bc_read\n"); @@ -182,15 +179,15 @@ bc_cont** bc_read(FILE* f, bc_addr* len) bc_cont* ptr; byte_t byte; - bc_cont** heap = (bc_cont**)malloc(sizeof(bc_cont*)*fsize); + bc_cont* heap = (bc_cont*)malloc(sizeof(bc_cont)*fsize); N_ASSERT(heap, "bc_read\n"); /* Loop through file byte-by-byte */ while (ftell(f) < fsize) { + ptr = &heap[addr]; // Creates a new bc_cont instance - ptr = bc_cont_new(); - + bc_cont_new(ptr); // Gets the opcode byte = read_byte(f); // Gets opcode metadata @@ -199,10 +196,10 @@ bc_cont** bc_read(FILE* f, bc_addr* len) get_opcode_adata(f, ptr); // Process raw arguements process_args(ptr); + // Set the real address of instruction - ptr->real_addr = addr; - // Add instruction to program - heap[addr] = ptr; + heap[addr].real_addr = addr; + // Increment address addr++; } @@ -244,8 +241,7 @@ void bc_del(bc_t* program) int i; for (i=0; i < program->size; i++) { - if (program->heap[i] != NULL) - bc_cont_del(program->heap[i]); + bc_cont_del(&program->heap[i]); } free(program->heap); diff --git a/src/vm/src/main.c b/src/vm/src/main.c @@ -15,13 +15,14 @@ int main(int argc, char** argv) init_mdata(); // Initalize the instruction defs init_adata(); init_ins_def(); + init_var_track(); rt_t* runtime = proc_init(argv[1]); // Initalize process proc_run(runtime); // Execute runtime proc_clean(runtime); // Once `proc_run` returns, clean - // what sort of mess it made. + // what sort of mess it made.` return 0; } diff --git a/src/vm/src/ns.c b/src/vm/src/ns.c @@ -8,12 +8,9 @@ */ ns_ctx* ns_ctx_init(void) { - ns_ctx* new = (ns_ctx*)malloc(sizeof(ns_ctx*)); + ns_ctx* new = (ns_ctx*)malloc(sizeof(ns_ctx)); M_ASSERT(new); - new->spaces = (ns_t**)malloc(sizeof(ns_t*)*NS_CTX_DEPTH); - M_ASSERT(new->spaces); - new->ptr = 0; return new; } @@ -21,9 +18,6 @@ ns_ctx* ns_ctx_init(void) void ns_ctx_del(ns_ctx* ctx) { N_ASSERT(ctx, "ns_ctx_del\n"); - N_ASSERT(ctx->spaces, "ns_ctx_del\n"); - - free(ctx->spaces); free(ctx); } @@ -66,13 +60,10 @@ ns_cont* ns_cont_init(ns_addr size, int level) ns_cont* new = (ns_cont*)malloc(sizeof(ns_cont)); M_ASSERT(new); - new->names = (var_cont**)malloc(sizeof(var_cont*)*size); - M_ASSERT(new->names); - new->size = size; new->level = level; - for (int i = 0; i < size; i++) + for (int i = 0; i < NS_CONT_MAX_NAMES; i++) { new->names[i] = NULL; } @@ -132,33 +123,35 @@ var_cont* ns_cont_del(ns_cont* container, ns_addr to_return) } } } - - free(container->names); free(container); return rv; } +void ns_cont_free(ns_cont* container) +{ + N_ASSERT(container, "ns_cont_del\n"); + + if (container->next != NULL) + { + ns_cont_free(container->next); + } + + free(container); +} + /* Cleans up memory */ void ns_del(ns_t* ns) { N_ASSERT(ns, "ns_del\n"); - var_cont* var; - if (ns->last != NULL) + if (ns->root != NULL) { - while (ns->last->next != NULL) - { - var = ns_pop(ns); - if (var != NULL) - { - var_del(var); - } - } + ns_cont_free(ns->root); } - + free(ns); } @@ -183,7 +176,7 @@ var_cont* ns_pop(ns_t* ns) N_ASSERT(ns, "ns_pop\n"); // Define our return value - var_cont* rv; + var_cont* rv = NULL; // Is this the last link on the chain? if (ns->last->next != NULL) { // Get the next to last link on the chain @@ -193,6 +186,7 @@ var_cont* ns_pop(ns_t* ns) // Set the new last to the last link on the chain ns->last = newlast; } + return rv; } @@ -227,8 +221,9 @@ void ns_cont_dec(ns_cont* container, b_type type, ns_addr address) // Address must be in range SIZE_ASSERT( container->size > address ); // Initalize a variable container - container->names[ address ] = var_new(type); - // Set the ownership of this + var_cont* new_var = var_new(type); + container->names[ address ] = new_var; + // Set the ownership of this container->names[ address ]->ownership = container->level; } diff --git a/src/vm/src/pc.c b/src/vm/src/pc.c @@ -39,7 +39,7 @@ pc_addr_stk* pc_addr_stk_new(ns_addr address) pc_addr_stk* new = (pc_addr_stk*)malloc(sizeof(pc_addr_stk)); M_ASSERT(new); - new->addresses = (pc_addr*)malloc(sizeof(pc_addr)*PC_RETURN_DEPTH); + new->addresses = (pc_addr*)malloc(sizeof(pc_addr)*(PC_RETURN_DEPTH)); M_ASSERT(new->addresses); new->ptr = 0; @@ -85,7 +85,7 @@ void pc_update(pc_t* pc) N_ASSERT(pc, "pc_update\n"); ASSERT((pc->address < (pc->bc->size + 1)), "Address out of range\n"); // Update the pointer - pc->line = pc->bc->heap[pc->address]; + pc->line = &pc->bc->heap[pc->address]; } /* Increment program counter by +-addr diff --git a/src/vm/src/rt.c b/src/vm/src/rt.c @@ -27,8 +27,8 @@ rt_t* rt_ctx_new(char* fname, stk_t* args) ctx->stack = stk_new(); ctx->argstk = args; ctx->vars = ns_init(0xFFFF); - ctx->varctx = ns_ctx_init(); ctx->names = ns_init(0x7F); + ctx->varctx = ns_ctx_init(); var_data_object* namespace = var_data_alloc_OBJECT(rt_ns_del); namespace->ref = (void*)ctx->vars; @@ -66,10 +66,11 @@ void rt_ctx_del(rt_t* ctx) N_ASSERT(ctx->vars, "rt_ctx_del\n"); ns_del(ctx->vars); - N_ASSERT(ctx->varctx, "rt_ctx_del\n"); - ns_ctx_del(ctx->varctx); - N_ASSERT(ctx->names, "rt_ctx_del\n"); ns_del(ctx->names); + N_ASSERT(ctx->varctx, "rt_ctx_del\n"); + ns_ctx_del(ctx->varctx); + + free(ctx); } diff --git a/src/vm/src/stk.c b/src/vm/src/stk.c @@ -10,7 +10,7 @@ stk_t* stk_new( void ) stk_t* new = (stk_t*)malloc(sizeof(stk_t)); M_ASSERT(new); - new->stack = stk_line_new(STACK_INIT_SIZE); + new->stack = stk_line_new(STACK_SIZE_LIMIT); new->next = NULL; return new; @@ -23,11 +23,8 @@ stk_line* stk_line_new(size_t size) stk_line* new = (stk_line*)malloc(sizeof(stk_line)); M_ASSERT(new); - new->data = (var_cont**)malloc(sizeof(var_cont*)*size); - M_ASSERT(new); - int i; - for (i = 0; i < size; i++) + for (i = 0; i < STACK_SIZE_LIMIT; i++) { new->data[i] = NULL; } @@ -47,6 +44,8 @@ void stk_del(stk_t* stack) stk_poplevel(&stack); } + stk_line_del(stack->stack); + free(stack); } @@ -64,7 +63,6 @@ void stk_line_del(stk_line* stack) } } - free(stack->data); free(stack); } @@ -98,18 +96,6 @@ void stk_poplevel(stk_t** stack) } } -/* Scales the stack by n^2 - * stk_t* - stack instance - */ -void stk_scale(stk_line* stack) -{ - N_ASSERT(stack, "stk_scale\n"); - - size_t newsize = stack->size * stack->size; - - stack->data = realloc(stack->data, sizeof(var_cont*) * newsize); -} - /* Pop the first element of the stack * stk_t* - stack instance */ @@ -137,10 +123,7 @@ void stk_push(stk_t* stack, var_cont* data) N_ASSERT(stack, "stk_push\n"); N_ASSERT(data, "stk_push\n"); - if ((stack->stack->ptr + 1) < stack->stack->size) - { - stk_scale(stack->stack); - } + ASSERT(((stack->stack->ptr + 1) < stack->stack->size), "STACK OVERFLOW!"); stack->stack->data[stack->stack->ptr] = data; diff --git a/src/vm/src/var.c b/src/vm/src/var.c @@ -6,6 +6,14 @@ #include "helper.h" +void init_var_track() +{ + for (int i = 0; i < MAXIMUM_TRACKING_VARS; i++) + { + VAR_TRACK.vars[i] = NULL; + } +} + void* var_data_alloc_TYPE(b_type type) { var_data_type* rv = (var_data_type*)malloc(sizeof(var_data_type)); @@ -115,6 +123,14 @@ var_cont* var_new(b_type type) var_cont* new = (var_cont*)malloc(sizeof(var_cont)); M_ASSERT(new); + if (VAR_TRACK.ptr < MAXIMUM_TRACKING_VARS) + VAR_TRACK.vars[VAR_TRACK.ptr++] = new; + else // Here's where some properly implemented garbage collector should sit + { + VAR_TRACK.ptr = 0; + VAR_TRACK.vars[VAR_TRACK.ptr++] = new; + } + new->ownership = -1; new->type = type; @@ -126,13 +142,10 @@ var_cont* var_new(b_type type) void var_del(var_cont* var) { - if (var != NULL) - { - if (var->data != NULL) - var_data_free(var->data, var->type); + if (var->data != NULL) + var_data_free(var->data, var->type); - free(var); - } + free(var); } void var_data_free(void* data, b_type type) @@ -164,39 +177,34 @@ void var_data_free(void* data, b_type type) var_data_free_PLIST(data); } - if (data != NULL) + if (type != VOID) free(data); } void var_data_free_PLIST(void* data) { var_data_plist* d = data; - if (d->v != NULL) - free(d->v); + free(d->v); } void var_data_free_FUNC(void* data) { var_data_func* d = data; - if (d->param != NULL) - free(d->param); + free(d->param); } void var_data_free_OBJBLDR(void* data) { var_data_objbldr* d = data; - if (d->param != NULL) - free(d->param); + free(d->param); } void var_data_free_OBJECT(void* data) { var_data_object* d = data; - if (d->ref != NULL) - d->objfree(d->ref); + d->objfree(d->ref); } void var_data_free_G_STR(void* data) { var_data_str* d = data; - if (d->v != NULL) - free(d->v); + free(d->v); } void var_set(var_cont* var, void* data, b_type type) diff --git a/src/vm/tests/cases/bc/test.c b/src/vm/tests/cases/bc/test.c @@ -17,7 +17,7 @@ int main(int argc, char** argv) int i; for (i = 0; i < bc->size; i++) { - bc_print_op(bc->heap[i]); + bc_print_op(&bc->heap[i]); printf("\n"); } diff --git a/src/vm/tests/cases/stk/test.c b/src/vm/tests/cases/stk/test.c @@ -16,11 +16,17 @@ void printstk(stk_t* stk) void playstk(stk_t* new) { - stk_push(new, var_new(VOID)); - stk_push(new, var_new(G_INT)); - stk_push(new, var_new(G_FLOAT)); - stk_push(new, var_new(G_CHAR)); - stk_push(new, var_new(G_STR)); + var_cont* one = var_new(VOID); + var_cont* two = var_new(G_INT); + var_cont* three = var_new(G_FLOAT); + var_cont* four = var_new(G_CHAR); + var_cont* five = var_new(G_STR); + + stk_push(new, one); + stk_push(new, two); + stk_push(new, three); + stk_push(new, four); + stk_push(new, five); printf("init: \n"); printstk(new); @@ -50,6 +56,8 @@ void playstk(stk_t* new) int main(int argc, char* argv[]) { + init_var_track(); + stk_t* new = stk_new(); playstk(new);