Fix special level loader memory leaks
This commit is contained in:
+18
-6
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user