refactored compile_if_expression() a bit
This commit is contained in:
parent
569ee2424d
commit
b2ac09072b
@ -6299,7 +6299,7 @@ static int compile_if_expression (moo_t* moo)
|
|||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
int falseblock = 0;
|
enum { COND_NORMAL, COND_TRUE, COND_FALSE } cond_type = COND_NORMAL; /* normal condition */
|
||||||
|
|
||||||
GET_TOKEN (moo); /* get ( */
|
GET_TOKEN (moo); /* get ( */
|
||||||
precondpos = cc->mth.code.len;
|
precondpos = cc->mth.code.len;
|
||||||
@ -6313,23 +6313,14 @@ static int compile_if_expression (moo_t* moo)
|
|||||||
if (precondpos + 1 == postcondpos && cc->mth.code.ptr[precondpos] == push_true_inst)
|
if (precondpos + 1 == postcondpos && cc->mth.code.ptr[precondpos] == push_true_inst)
|
||||||
{
|
{
|
||||||
/* got 'if (true)' or 'ifnot (false)' */
|
/* got 'if (true)' or 'ifnot (false)' */
|
||||||
|
|
||||||
/* do not generate jump */
|
|
||||||
jumptonext = INVALID_IP; /* indicate that the jump has not been emitted */
|
jumptonext = INVALID_IP; /* indicate that the jump has not been emitted */
|
||||||
falseblock = 0;
|
cond_type = COND_TRUE;
|
||||||
|
|
||||||
/* eliminate PUSH_TRUE as well */
|
|
||||||
eliminate_instructions (moo, precondpos, cc->mth.code.len - 1);
|
|
||||||
postcondpos = precondpos;
|
|
||||||
}
|
}
|
||||||
else if (precondpos + 1 == postcondpos && cc->mth.code.ptr[precondpos] == push_false_inst)
|
else if (precondpos + 1 == postcondpos && cc->mth.code.ptr[precondpos] == push_false_inst)
|
||||||
{
|
{
|
||||||
/* got 'if (false)' or 'ifnot (true)' */
|
/* got 'if (false)' or 'ifnot (true)' */
|
||||||
|
|
||||||
jumptonext = INVALID_IP; /* indicate that the jump has not been emitted */
|
jumptonext = INVALID_IP; /* indicate that the jump has not been emitted */
|
||||||
|
cond_type = COND_FALSE; /* mark that the conditional is false. instructions will get eliminated below */
|
||||||
/* mark that the conditional is false. instructions will get eliminated below */
|
|
||||||
falseblock = 1;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -6344,29 +6335,39 @@ static int compile_if_expression (moo_t* moo)
|
|||||||
brace_loc = *TOKEN_LOC(moo);
|
brace_loc = *TOKEN_LOC(moo);
|
||||||
if (compile_braced_block(moo) <= -1) goto oops;
|
if (compile_braced_block(moo) <= -1) goto oops;
|
||||||
|
|
||||||
if (jumptonext == INVALID_IP)
|
switch (cond_type)
|
||||||
{
|
{
|
||||||
if (falseblock)
|
case COND_TRUE:
|
||||||
{
|
MOO_ASSERT (moo, jumptonext == INVALID_IP);
|
||||||
|
|
||||||
|
/* eliminate PUSH_TRUE */
|
||||||
|
eliminate_instructions (moo, precondpos, precondpos);
|
||||||
|
postcondpos = precondpos;
|
||||||
|
|
||||||
|
if (endoftrueblock == INVALID_IP)
|
||||||
|
{
|
||||||
|
/* update the end position of the first true block */
|
||||||
|
endoftrueblock = cc->mth.code.len;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case COND_FALSE:
|
||||||
|
MOO_ASSERT (moo, jumptonext == INVALID_IP);
|
||||||
|
|
||||||
/* the conditional was false. eliminate instructions emitted
|
/* the conditional was false. eliminate instructions emitted
|
||||||
* for the block attached to the conditional */
|
* for the block attached to the conditional */
|
||||||
eliminate_instructions (moo, precondpos, cc->mth.code.len - 1);
|
eliminate_instructions (moo, precondpos, cc->mth.code.len - 1);
|
||||||
postcondpos = precondpos;
|
postcondpos = precondpos;
|
||||||
}
|
break;
|
||||||
else if (endoftrueblock == INVALID_IP)
|
|
||||||
{
|
case COND_NORMAL:
|
||||||
/* update the end position of the first true block */
|
MOO_ASSERT (moo, jumptonext != INVALID_IP);
|
||||||
endoftrueblock = cc->mth.code.len;
|
if (endoftrueblock == INVALID_IP)
|
||||||
}
|
{
|
||||||
}
|
/* emit an instruction to jump to the end */
|
||||||
else
|
if (add_to_oow_pool(moo, &jumptoend, cc->mth.code.len) <= -1 ||
|
||||||
{
|
emit_single_param_instruction(moo, BCODE_JUMP_FORWARD, MAX_CODE_JUMP, TOKEN_LOC(moo)) <= -1) goto oops;
|
||||||
if (endoftrueblock == INVALID_IP)
|
}
|
||||||
{
|
|
||||||
/* emit an instruction to jump to the end */
|
|
||||||
if (add_to_oow_pool(moo, &jumptoend, cc->mth.code.len) <= -1 ||
|
|
||||||
emit_single_param_instruction(moo, BCODE_JUMP_FORWARD, MAX_CODE_JUMP, TOKEN_LOC(moo)) <= -1) goto oops;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GET_TOKEN (moo); /* get the next token after } */
|
GET_TOKEN (moo); /* get the next token after } */
|
||||||
|
Loading…
Reference in New Issue
Block a user