Fix special level loader memory leaks

This commit is contained in:
Pasi Kallinen
2015-11-12 18:00:55 +02:00
parent f1106d136e
commit 0bcb713b4f
+18 -6
View File
@@ -471,6 +471,7 @@ opvar_var_conversion(coder, ov)
struct sp_coder *coder; struct sp_coder *coder;
struct opvar *ov; struct opvar *ov;
{ {
static const char nhFunc[] = "opvar_var_conversion";
struct splev_var *tmp; struct splev_var *tmp;
struct opvar *tmpov; struct opvar *tmpov;
struct opvar *array_idx = NULL; struct opvar *array_idx = NULL;
@@ -483,14 +484,14 @@ struct opvar *ov;
while (tmp) { while (tmp) {
if (!strcmp(tmp->name, OV_s(ov))) { if (!strcmp(tmp->name, OV_s(ov))) {
if ((tmp->svtyp & SPOVAR_ARRAY)) { if ((tmp->svtyp & SPOVAR_ARRAY)) {
array_idx = opvar_var_conversion( array_idx = opvar_var_conversion(coder, splev_stack_pop(coder->stack));
coder, splev_stack_pop(coder->stack));
if (!array_idx || OV_typ(array_idx) != SPOVAR_INT) if (!array_idx || OV_typ(array_idx) != SPOVAR_INT)
panic("array idx not an int"); panic("array idx not an int");
if (tmp->array_len < 1) if (tmp->array_len < 1)
panic("array len < 1"); panic("array len < 1");
OV_i(array_idx) = (OV_i(array_idx) % tmp->array_len); OV_i(array_idx) = (OV_i(array_idx) % tmp->array_len);
tmpov = opvar_clone(tmp->data.arrayvalues[OV_i(array_idx)]); tmpov = opvar_clone(tmp->data.arrayvalues[OV_i(array_idx)]);
opvar_free(array_idx);
return tmpov; return tmpov;
} else { } else {
tmpov = opvar_clone(tmp->data.value); tmpov = opvar_clone(tmp->data.value);
@@ -525,15 +526,21 @@ splev_stack_getdat(coder, typ)
struct sp_coder *coder; struct sp_coder *coder;
xchar typ; xchar typ;
{ {
static const char nhFunc[] = "splev_stack_getdat";
if (coder && coder->stack) { if (coder && coder->stack) {
struct opvar *tmp = splev_stack_pop(coder->stack); struct opvar *tmp = splev_stack_pop(coder->stack);
struct opvar *ret = NULL;
if (!tmp) if (!tmp)
panic("no value type %i in stack.", typ); panic("no value type %i in stack.", typ);
if (tmp->spovartyp == SPOVAR_VARIABLE) if (tmp->spovartyp == SPOVAR_VARIABLE) {
tmp = opvar_var_conversion(coder, tmp); ret = opvar_var_conversion(coder, tmp);
opvar_free(tmp);
tmp = ret;
}
if (tmp->spovartyp == typ) if (tmp->spovartyp == typ)
return tmp; return tmp;
else opvar_free(tmp);
} }
return NULL; return NULL;
} }
@@ -542,10 +549,14 @@ struct opvar *
splev_stack_getdat_any(coder) splev_stack_getdat_any(coder)
struct sp_coder *coder; struct sp_coder *coder;
{ {
static const char nhFunc[] = "splev_stack_getdat_any";
if (coder && coder->stack) { if (coder && coder->stack) {
struct opvar *tmp = splev_stack_pop(coder->stack); struct opvar *tmp = splev_stack_pop(coder->stack);
if (tmp && tmp->spovartyp == SPOVAR_VARIABLE) if (tmp && tmp->spovartyp == SPOVAR_VARIABLE) {
tmp = opvar_var_conversion(coder, tmp); struct opvar *ret = opvar_var_conversion(coder, tmp);
opvar_free(tmp);
return ret;
}
return tmp; return tmp;
} }
return NULL; return NULL;
@@ -4736,6 +4747,7 @@ struct sp_coder *coder;
break; break;
} }
opvar_free(r); opvar_free(r);
opvar_free(typ);
} }
void void