commit bd24614ca384a69be2a3ebaa8d4c18183a0f77ff
parent af508dd43a9e6e755a4a44582eb3f4b0dd73bff0
Author: Paul Longtine <paul@nanner.co>
Date: Sat, 5 Dec 2020 22:43:15 -0500
Fixed memory issues!
Diffstat:
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);