changed clear_method_data() to free goto and label information
This commit is contained in:
parent
24ada7f0be
commit
090a3cd6f7
@ -6647,6 +6647,7 @@ static int add_label (moo_t* moo, const moo_oocs_t* name)
|
|||||||
/* TODO: there is a duplicate label... */
|
/* TODO: there is a duplicate label... */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
lab = lab->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
lab = (moo_label_t*)moo_allocmem(moo, MOO_SIZEOF(*lab) + (name->len + 1) * MOO_SIZEOF(moo_ooch_t));
|
lab = (moo_label_t*)moo_allocmem(moo, MOO_SIZEOF(*lab) + (name->len + 1) * MOO_SIZEOF(moo_ooch_t));
|
||||||
@ -6758,8 +6759,7 @@ static int compile_special_statement (moo_t* moo)
|
|||||||
{
|
{
|
||||||
/* this is a label */
|
/* this is a label */
|
||||||
/* remember the label location with the block depth */
|
/* remember the label location with the block depth */
|
||||||
MOO_DEBUG2 (moo, "LABEL => %.*js\n", TOKEN_NAME_LEN(moo), TOKEN_NAME_PTR(moo));
|
if (add_label(moo, TOKEN_NAME(moo)) <= -1) return -1; /* TODO: pass level info */
|
||||||
/* TODO: if (add_label(moo, TOKEN_NAME(moo), level???) <= -1) return -1; */
|
|
||||||
GET_TOKEN (moo);
|
GET_TOKEN (moo);
|
||||||
return 8888; /* indicates that non-statement has been seen and processed.*/
|
return 8888; /* indicates that non-statement has been seen and processed.*/
|
||||||
}
|
}
|
||||||
@ -7186,6 +7186,24 @@ static void clear_method_data (moo_t* moo, moo_method_data_t* mth)
|
|||||||
if (mth->code.locptr) moo_freemem (moo, mth->code.locptr);
|
if (mth->code.locptr) moo_freemem (moo, mth->code.locptr);
|
||||||
if (mth->literals.ptr) moo_freemem (moo, mth->literals.ptr);
|
if (mth->literals.ptr) moo_freemem (moo, mth->literals.ptr);
|
||||||
if (mth->blk_tmprcnt) moo_freemem (moo, mth->blk_tmprcnt);
|
if (mth->blk_tmprcnt) moo_freemem (moo, mth->blk_tmprcnt);
|
||||||
|
|
||||||
|
/* this must not happen as loop data are cleared in functions that handle loop expressions().
|
||||||
|
* but let me have this here just in case */
|
||||||
|
while (mth->loop) pop_loop (moo);
|
||||||
|
|
||||||
|
while (mth->_label)
|
||||||
|
{
|
||||||
|
moo_label_t* tmp = mth->_label;
|
||||||
|
mth->_label = mth->_label->next;
|
||||||
|
moo_freemem (moo, tmp);
|
||||||
|
}
|
||||||
|
while (mth->_goto)
|
||||||
|
{
|
||||||
|
moo_goto_t* tmp = mth->_goto;
|
||||||
|
mth->_goto = mth->_goto->next;
|
||||||
|
moo_freemem (moo, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
MOO_MEMSET (mth, 0, MOO_SIZEOF(*mth));
|
MOO_MEMSET (mth, 0, MOO_SIZEOF(*mth));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7210,7 +7228,12 @@ static void reset_method_data (moo_t* moo, moo_method_data_t* mth)
|
|||||||
mth->pftype = PFTYPE_NONE;
|
mth->pftype = PFTYPE_NONE;
|
||||||
mth->pfnum = 0;
|
mth->pfnum = 0;
|
||||||
mth->blk_depth = 0;
|
mth->blk_depth = 0;
|
||||||
|
/* don't reset mth->blk_tmprcnt_capa as it indicates capacity for blk_tmprcnt */
|
||||||
mth->code.len = 0;
|
mth->code.len = 0;
|
||||||
|
|
||||||
|
MOO_ASSERT (moo, mth->loop == MOO_NULL);
|
||||||
|
MOO_ASSERT (moo, mth->_label == MOO_NULL);
|
||||||
|
MOO_ASSERT (moo, mth->_goto == MOO_NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int process_method_modifiers (moo_t* moo, moo_method_data_t* mth)
|
static int process_method_modifiers (moo_t* moo, moo_method_data_t* mth)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user