commit d05bee02c73f8d2eb746b1bf3fef2aceee064943
parent 79d7ba828f72394e4a1a5a9560f77d2a5b39964b
Author: Paul Longtine <paullongtine@gmail.com>
Date: Tue, 26 Sep 2017 17:20:43 -0400
Fixed memory leaks
Diffstat:
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);