language

some fools attempt at an interpreted language
Log | Files | Refs | README

commit bd24614ca384a69be2a3ebaa8d4c18183a0f77ff
parent af508dd43a9e6e755a4a44582eb3f4b0dd73bff0
Author: Paul Longtine <paul@nanner.co>
Date:   Sat,  5 Dec 2020 22:43:15 -0500

Fixed memory issues!

Diffstat:
Msrc/vm/inc/var.h | 29+++++++++++++++++++++++------
Msrc/vm/src/bc.c | 12++++--------
Msrc/vm/src/ins_def.c | 4++--
Msrc/vm/src/rt.c | 1+
Msrc/vm/src/var.c | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------
5 files changed, 89 insertions(+), 30 deletions(-)

diff --git a/src/vm/inc/var.h b/src/vm/inc/var.h @@ -34,10 +34,11 @@ typedef enum { typedef struct var_cont { long ownership; b_type type; + unsigned int refstat; void* data; } var_cont; -#define MAXIMUM_TRACKING_VARS 0xFFFF +#define MAXIMUM_TRACKING_VARS 0xFFFFFF struct var_track { unsigned int ptr; var_cont* vars[MAXIMUM_TRACKING_VARS]; @@ -45,15 +46,22 @@ struct var_track { struct var_track VAR_TRACK; +typedef struct var_data { + long ownership; +} var_data; + typedef struct var_data_type { + long ownership; b_type v; } var_data_type; typedef struct var_data_plist { + long ownership; b_type* v; } var_data_plist; typedef struct var_data_func { + long ownership; bc_addr loc; bc_addr end; b_type type; @@ -63,6 +71,7 @@ typedef struct var_data_func { } var_data_func; typedef struct var_data_objbldr { + long ownership; ns_addr id; bc_addr loc; bc_addr end; @@ -73,28 +82,34 @@ typedef struct var_data_objbldr { } var_data_objbldr; typedef struct var_data_int { + long ownership; int v; } var_data_int; typedef struct var_data_float { + long ownership; double v; } var_data_float; typedef struct var_data_char { + long ownership; char v; } var_data_char; typedef struct var_data_str { + long ownership; size_t size; char* v; } var_data_str; typedef struct var_data_array { + long ownership; size_t size; var_cont* v; } var_data_array; typedef struct var_data_ptr { + long ownership; var_cont* v; } var_data_ptr; @@ -102,6 +117,8 @@ typedef struct var_data_ptr { void init_var_track(); +void var_clean(); + /* Initialze variable with type */ var_cont* var_new(b_type); @@ -155,32 +172,32 @@ var_cont* var_data_cpy(var_cont*); * int - offset * byte_t* - array of bytes */ -var_cont* raw_to_int(int, int, byte_t*); +var_cont* raw_to_int(int, int, byte_t*, long); /* Byte to b_type. * byte_t - value maps to enum b_type */ -var_cont* byte_to_type(byte_t); +var_cont* byte_to_type(byte_t, long); /* Converts array of bytes of size n into parameter list * * int - sizeof(bytes) * byte_t* - array of bytes */ -var_cont* raw_to_plist(int, byte_t*); +var_cont* raw_to_plist(int, byte_t*, long); /* Converts raw (ascii) string into normal string type * int - sizeof(bytes) * int - offset * byte_t* - array of bytes */ -var_cont* raw_to_str(int, int, byte_t*); +var_cont* raw_to_str(int, int, byte_t*, long); /* Raw variable to var_cont * * int - sizeof(bytes) * byte_t* - array of bytes */ -var_cont* raw_to_var(int, byte_t*); +var_cont* raw_to_var(int, byte_t*, long); #endif // var_H diff --git a/src/vm/src/bc.c b/src/vm/src/bc.c @@ -144,23 +144,19 @@ void process_args(bc_cont* ins) { if (arg_types[x] == BTOI) { - ins->varg[x] = raw_to_int(ins->sarg[x], 0, ins->args[x]); - ins->varg[x]->ownership = 0; + ins->varg[x] = raw_to_int(ins->sarg[x], 0, ins->args[x], 0); } else if (arg_types[x] == BTOT) { - ins->varg[x] = byte_to_type(ins->args[x][0]); - ins->varg[x]->ownership = 0; + ins->varg[x] = byte_to_type(ins->args[x][0], 0); } else if (arg_types[x] == DTOL) { - ins->varg[x] = raw_to_plist(ins->sarg[x], ins->args[x]); - ins->varg[x]->ownership = 0; + ins->varg[x] = raw_to_plist(ins->sarg[x], ins->args[x], 0); } else if (arg_types[x] == DTOV) { - ins->varg[x] = raw_to_var(ins->sarg[x], ins->args[x]); - ins->varg[x]->ownership = 0; + ins->varg[x] = raw_to_var(ins->sarg[x], ins->args[x], 0); } } } diff --git a/src/vm/src/ins_def.c b/src/vm/src/ins_def.c @@ -225,9 +225,9 @@ void _ins_def_CTV (rt_t* ctx, bc_cont* line) } void _ins_def_CTS (rt_t* ctx, bc_cont* line) { - var_cont* new = var_data_cpy(line->varg[0]); + //var_cont* new = var_data_cpy(line->varg[0]); - stk_push(ctx->stack, new); + stk_push(ctx->stack, line->varg[0]); pc_inc(ctx->pc, 1); } diff --git a/src/vm/src/rt.c b/src/vm/src/rt.c @@ -23,6 +23,7 @@ rt_t* rt_ctx_new(char* fname, stk_t* args) rt_t* ctx = (rt_t*)malloc(sizeof(rt_t)); M_ASSERT(ctx); + ctx->db = 0; ctx->pc = pc_new(fname); ctx->stack = stk_new(); ctx->argstk = args; diff --git a/src/vm/src/var.c b/src/vm/src/var.c @@ -20,6 +20,7 @@ void* var_data_alloc_TYPE(b_type type) var_data_type* rv = (var_data_type*)malloc(sizeof(var_data_type)); M_ASSERT(rv); + rv->ownership = -1; rv->v = type; return rv; @@ -30,6 +31,7 @@ void* var_data_alloc_PLIST(size_t size) var_data_plist* rv = (var_data_plist*)malloc(sizeof(var_data_plist)); M_ASSERT(rv); + rv->ownership = -1; rv->v = (b_type*)malloc(sizeof(b_type)*size); return rv; @@ -40,6 +42,7 @@ void* var_data_alloc_FUNC(b_type type) var_data_func* rv = (var_data_func*)malloc(sizeof(var_data_func)); M_ASSERT(rv); + rv->ownership = -1; rv->type = type; rv->loc = 0; rv->end = 0; @@ -54,6 +57,7 @@ void* var_data_alloc_OBJBLDR(void) var_data_objbldr* rv = (var_data_objbldr*)malloc(sizeof(var_data_objbldr)); M_ASSERT(rv); + rv->ownership = -1; rv->id = 0; rv->loc = 0; rv->end = 0; @@ -69,6 +73,7 @@ void* var_data_alloc_G_INT(int value) var_data_int* rv = (var_data_int*)malloc(sizeof(var_data_int)); M_ASSERT(rv); + rv->ownership = -1; rv->v = value; return rv; @@ -79,6 +84,7 @@ void* var_data_alloc_G_FLOAT(double value) var_data_float* rv = (var_data_float*)malloc(sizeof(var_data_float)); M_ASSERT(rv); + rv->ownership = -1; rv->v = value; return rv; @@ -89,6 +95,7 @@ void* var_data_alloc_G_CHAR(char value) var_data_char* rv = (var_data_char*)malloc(sizeof(var_data_char)); M_ASSERT(rv); + rv->ownership = -1; rv->v = value; return rv; @@ -99,6 +106,7 @@ void* var_data_alloc_G_STR(size_t size) var_data_str* rv = (var_data_str*)malloc(sizeof(var_data_str)); M_ASSERT(rv); + rv->ownership = -1; rv->size = size; rv->v = (char*)malloc(sizeof(char)*size); @@ -122,6 +130,7 @@ var_cont* var_new(b_type type) new->type = type; + new->refstat = 0; new->data = NULL; return new; @@ -130,9 +139,17 @@ var_cont* var_new(b_type type) void var_del(var_cont* var) { if (var->data != NULL) - var_data_free(var->data, var->type); + { + var_data* base = (var_data*)var->data; + if (base->ownership == var->ownership) + { + var_data_free(var->data, var->type); + } + } free(var); + + var = NULL; } void var_data_free(void* data, b_type type) @@ -157,33 +174,37 @@ void var_data_free(void* data, b_type type) object_del(data); break; default: - if (type != VOID) - { - free(data); - } break; } + + free(data); + + data = NULL; } void var_data_free_PLIST(void* data) { var_data_plist* d = data; free(d->v); + d->v = NULL; } void var_data_free_FUNC(void* data) { var_data_func* d = data; free(d->param); + d->param = NULL; } void var_data_free_OBJBLDR(void* data) { var_data_objbldr* d = data; free(d->param); + d->param = NULL; } void var_data_free_G_STR(void* data) { var_data_str* d = data; free(d->v); + d->v = NULL; } void var_set(var_cont* var, void* data, b_type type) @@ -195,8 +216,25 @@ void var_set(var_cont* var, void* data, b_type type) "Trying to set variable of different type without cast\n"); if (var->data != NULL) - var_data_free(var->data, type); - + { + var_data* base = (var_data*)var->data; + if (base->ownership == var->ownership) + { + var_data_free(var->data, type); + } + } + + if (data != NULL) + { + var_data* base = (var_data*)data; + + if (base->ownership == -1) + { + base->ownership = var->ownership; + } + } + + var->data = data; } @@ -369,10 +407,12 @@ var_cont* var_data_cpy(var_cont* var) * int - sizeof(bytes) * byte_t* - array of bytes */ -var_cont* raw_to_int(int size, int start, byte_t* bytes) +var_cont* raw_to_int(int size, int start, byte_t* bytes, long ownership) { var_cont* rv = var_new(G_INT); + rv->ownership = ownership; + int i, data; data = 0; @@ -389,10 +429,12 @@ var_cont* raw_to_int(int size, int start, byte_t* bytes) /* Byte to b_type. * byte_t - value maps to enum b_type */ -var_cont* byte_to_type(byte_t byte) +var_cont* byte_to_type(byte_t byte, long ownership) { var_cont* rv = var_new(TYPE); + rv->ownership = ownership; + var_set(rv, var_data_alloc_TYPE((b_type)byte), TYPE); return rv; @@ -403,10 +445,12 @@ var_cont* byte_to_type(byte_t byte) * int - sizeof(bytes) * byte_t* - array of bytes */ -var_cont* raw_to_plist(int n, byte_t* bytes) +var_cont* raw_to_plist(int n, byte_t* bytes, long ownership) { var_cont* rv = var_new(PLIST); + rv->ownership = ownership; + var_set(rv, var_data_alloc_PLIST(n), PLIST); b_type* var = var_data_get_PLIST(rv); @@ -426,9 +470,10 @@ var_cont* raw_to_plist(int n, byte_t* bytes) * int - offset * byte_t* - array of bytes */ -var_cont* raw_to_str(int n, int offset, byte_t* bytes) +var_cont* raw_to_str(int n, int offset, byte_t* bytes, long ownership) { var_cont* rv = var_new(G_STR); + rv->ownership = ownership; var_data_str* data = var_data_alloc_G_STR(n); int i; for (i = offset; n > i; i++) @@ -446,7 +491,7 @@ var_cont* raw_to_str(int n, int offset, byte_t* bytes) * int - sizeof(bytes) * byte_t* - array of bytes */ -var_cont* raw_to_var(int n, byte_t* bytes) +var_cont* raw_to_var(int n, byte_t* bytes, long ownership) { N_ASSERT(bytes, "raw_to_var\n"); @@ -456,11 +501,11 @@ var_cont* raw_to_var(int n, byte_t* bytes) if (type == G_INT) { - rv = raw_to_int(n, 1, bytes); + rv = raw_to_int(n, 1, bytes, ownership); } else if (type == G_STR) { - rv = raw_to_str(n, 1, bytes); + rv = raw_to_str(n, 1, bytes, ownership); } else { printf("Type {%x} is not a seralizeable type\n", type);