attempting to adjust goto and label ips upon code elimination
This commit is contained in:
parent
e08edffb0c
commit
c30f7466a5
@ -2864,9 +2864,10 @@ static MOO_INLINE int update_loop_continues (moo_t* moo, moo_oow_t jt)
|
|||||||
|
|
||||||
static MOO_INLINE void adjust_all_loop_jumps_for_elimination (moo_t* moo, moo_oow_t start, moo_oow_t end)
|
static MOO_INLINE void adjust_all_loop_jumps_for_elimination (moo_t* moo, moo_oow_t start, moo_oow_t end)
|
||||||
{
|
{
|
||||||
|
moo_cunit_class_t* cc = (moo_cunit_class_t*)moo->c->cunit;
|
||||||
moo_loop_t* loop;
|
moo_loop_t* loop;
|
||||||
|
|
||||||
loop = ((moo_cunit_class_t*)moo->c->cunit)->mth.loop;
|
loop = cc->mth.loop;
|
||||||
while (loop)
|
while (loop)
|
||||||
{
|
{
|
||||||
adjust_loop_jumps_for_elimination (moo, &loop->break_ip_pool, start, end);
|
adjust_loop_jumps_for_elimination (moo, &loop->break_ip_pool, start, end);
|
||||||
@ -2875,6 +2876,66 @@ static MOO_INLINE void adjust_all_loop_jumps_for_elimination (moo_t* moo, moo_oo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static MOO_INLINE void adjust_gotos_for_elimination (moo_t* moo, moo_oow_t start, moo_oow_t end)
|
||||||
|
{
|
||||||
|
moo_cunit_class_t* cc = (moo_cunit_class_t*)moo->c->cunit;
|
||||||
|
moo_goto_t* _goto, *prev_goto, * next_goto;
|
||||||
|
|
||||||
|
_goto = cc->mth._goto;
|
||||||
|
prev_goto = MOO_NULL;
|
||||||
|
|
||||||
|
while (_goto)
|
||||||
|
{
|
||||||
|
if (_goto->ip >= start && _goto->ip <= end)
|
||||||
|
{
|
||||||
|
next_goto = _goto->next;
|
||||||
|
|
||||||
|
moo_freemem (moo, _goto);
|
||||||
|
|
||||||
|
if (prev_goto)
|
||||||
|
{
|
||||||
|
prev_goto->next = next_goto;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cc->mth._goto = next_goto;
|
||||||
|
}
|
||||||
|
|
||||||
|
_goto = next_goto;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_goto->ip > end)
|
||||||
|
{
|
||||||
|
_goto->ip -= end - start + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
prev_goto = _goto;
|
||||||
|
_goto = _goto->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static MOO_INLINE void adjust_labels_for_elimination (moo_t* moo, moo_oow_t start, moo_oow_t end)
|
||||||
|
{
|
||||||
|
moo_cunit_class_t* cc = (moo_cunit_class_t*)moo->c->cunit;
|
||||||
|
moo_label_t* _label;
|
||||||
|
|
||||||
|
_label = cc->mth._label;
|
||||||
|
while (_label)
|
||||||
|
{
|
||||||
|
if (_label->ip >= start && _label->ip <= end)
|
||||||
|
{
|
||||||
|
/* TODO: ERROR - cannot eliminate this part. caller must ensure this doesn't happen */
|
||||||
|
}
|
||||||
|
else if (_label->ip > end)
|
||||||
|
{
|
||||||
|
_label->ip -= end - start + 1;
|
||||||
|
}
|
||||||
|
_label = _label->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static MOO_INLINE moo_loop_t* unlink_loop (moo_t* moo)
|
static MOO_INLINE moo_loop_t* unlink_loop (moo_t* moo)
|
||||||
{
|
{
|
||||||
moo_cunit_class_t* cc = (moo_cunit_class_t*)moo->c->cunit;
|
moo_cunit_class_t* cc = (moo_cunit_class_t*)moo->c->cunit;
|
||||||
@ -2931,6 +2992,8 @@ static void eliminate_instructions (moo_t* moo, moo_oow_t start, moo_oow_t end)
|
|||||||
/* eliminate all instructions starting from the start index.
|
/* eliminate all instructions starting from the start index.
|
||||||
* setting the length to the start length will achieve this */
|
* setting the length to the start length will achieve this */
|
||||||
adjust_all_loop_jumps_for_elimination (moo, start, last);
|
adjust_all_loop_jumps_for_elimination (moo, start, last);
|
||||||
|
adjust_gotos_for_elimination (moo, start, last);
|
||||||
|
adjust_labels_for_elimination (moo, start, last);
|
||||||
cc->mth.code.len = start;
|
cc->mth.code.len = start;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -2940,6 +3003,8 @@ static void eliminate_instructions (moo_t* moo, moo_oow_t start, moo_oow_t end)
|
|||||||
/* eliminate a chunk in the middle of the instruction buffer.
|
/* eliminate a chunk in the middle of the instruction buffer.
|
||||||
* some copying is required */
|
* some copying is required */
|
||||||
adjust_all_loop_jumps_for_elimination (moo, start, end);
|
adjust_all_loop_jumps_for_elimination (moo, start, end);
|
||||||
|
adjust_gotos_for_elimination (moo, start, end);
|
||||||
|
adjust_labels_for_elimination (moo, start, end);
|
||||||
|
|
||||||
tail_len = cc->mth.code.len - end - 1;
|
tail_len = cc->mth.code.len - end - 1;
|
||||||
MOO_MEMMOVE (&cc->mth.code.ptr[start], &cc->mth.code.ptr[end + 1], tail_len * MOO_SIZEOF(cc->mth.code.ptr[0]));
|
MOO_MEMMOVE (&cc->mth.code.ptr[start], &cc->mth.code.ptr[end + 1], tail_len * MOO_SIZEOF(cc->mth.code.ptr[0]));
|
||||||
|
Loading…
Reference in New Issue
Block a user