fixed a bug in run_forin() in run.c
This commit is contained in:
parent
77640ef73c
commit
962b1d47dd
@ -2523,7 +2523,6 @@ static int run_forin (hawk_rtx_t* rtx, hawk_nde_forin_t* nde)
|
|||||||
hawk_oow_t old_forin_size, i;
|
hawk_oow_t old_forin_size, i;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
|
||||||
test = (hawk_nde_exp_t*)nde->test;
|
test = (hawk_nde_exp_t*)nde->test;
|
||||||
HAWK_ASSERT (test->type == HAWK_NDE_EXP_BIN && test->opcode == HAWK_BINOP_IN);
|
HAWK_ASSERT (test->type == HAWK_NDE_EXP_BIN && test->opcode == HAWK_BINOP_IN);
|
||||||
|
|
||||||
@ -2541,21 +2540,19 @@ static int run_forin (hawk_rtx_t* rtx, hawk_nde_forin_t* nde)
|
|||||||
if (rvtype == HAWK_VAL_NIL)
|
if (rvtype == HAWK_VAL_NIL)
|
||||||
{
|
{
|
||||||
/* just return without excuting the loop body */
|
/* just return without excuting the loop body */
|
||||||
goto done;
|
goto done1;
|
||||||
}
|
}
|
||||||
else if (rvtype != HAWK_VAL_MAP)
|
else if (rvtype != HAWK_VAL_MAP)
|
||||||
{
|
{
|
||||||
hawk_rtx_seterrnum (rtx, &test->right->loc, HAWK_ENOTMAPIN);
|
hawk_rtx_seterrnum (rtx, &test->right->loc, HAWK_ENOTMAPIN);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto done;
|
goto done1;
|
||||||
}
|
}
|
||||||
|
|
||||||
map = ((hawk_val_map_t*)rv)->map;
|
map = ((hawk_val_map_t*)rv)->map;
|
||||||
|
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
old_forin_size = rtx->forin.size;
|
old_forin_size = rtx->forin.size;
|
||||||
|
|
||||||
if (rtx->forin.capa - rtx->forin.size < hawk_map_getsize(map))
|
if (rtx->forin.capa - rtx->forin.size < hawk_map_getsize(map))
|
||||||
{
|
{
|
||||||
hawk_val_t** tmp;
|
hawk_val_t** tmp;
|
||||||
@ -2568,7 +2565,7 @@ static int run_forin (hawk_rtx_t* rtx, hawk_nde_forin_t* nde)
|
|||||||
{
|
{
|
||||||
ADJERR_LOC (rtx, &test->left->loc);
|
ADJERR_LOC (rtx, &test->left->loc);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto done;
|
goto done2;
|
||||||
}
|
}
|
||||||
|
|
||||||
rtx->forin.ptr = tmp;
|
rtx->forin.ptr = tmp;
|
||||||
@ -2588,7 +2585,7 @@ static int run_forin (hawk_rtx_t* rtx, hawk_nde_forin_t* nde)
|
|||||||
{
|
{
|
||||||
ADJERR_LOC (rtx, &test->left->loc);
|
ADJERR_LOC (rtx, &test->left->loc);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto done;
|
goto done2;
|
||||||
}
|
}
|
||||||
|
|
||||||
rtx->forin.ptr[rtx->forin.size++] = str;
|
rtx->forin.ptr[rtx->forin.size++] = str;
|
||||||
@ -2603,13 +2600,13 @@ static int run_forin (hawk_rtx_t* rtx, hawk_nde_forin_t* nde)
|
|||||||
if (HAWK_UNLIKELY(!do_assignment(rtx, test->left, rtx->forin.ptr[i])) || HAWK_UNLIKELY(run_statement(rtx, nde->body) <= -1))
|
if (HAWK_UNLIKELY(!do_assignment(rtx, test->left, rtx->forin.ptr[i])) || HAWK_UNLIKELY(run_statement(rtx, nde->body) <= -1))
|
||||||
{
|
{
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto done;
|
goto done2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rtx->exit_level == EXIT_BREAK)
|
if (rtx->exit_level == EXIT_BREAK)
|
||||||
{
|
{
|
||||||
rtx->exit_level = EXIT_NONE;
|
rtx->exit_level = EXIT_NONE;
|
||||||
goto done;
|
goto done2;
|
||||||
}
|
}
|
||||||
else if (rtx->exit_level == EXIT_CONTINUE)
|
else if (rtx->exit_level == EXIT_CONTINUE)
|
||||||
{
|
{
|
||||||
@ -2617,13 +2614,15 @@ static int run_forin (hawk_rtx_t* rtx, hawk_nde_forin_t* nde)
|
|||||||
}
|
}
|
||||||
else if (rtx->exit_level != EXIT_NONE)
|
else if (rtx->exit_level != EXIT_NONE)
|
||||||
{
|
{
|
||||||
goto done;
|
goto done2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done2:
|
||||||
while (rtx->forin.size > old_forin_size)
|
while (rtx->forin.size > old_forin_size)
|
||||||
hawk_rtx_refdownval (rtx, rtx->forin.ptr[--rtx->forin.size]);
|
hawk_rtx_refdownval (rtx, rtx->forin.ptr[--rtx->forin.size]);
|
||||||
|
|
||||||
|
done1:
|
||||||
hawk_rtx_refdownval (rtx, rv);
|
hawk_rtx_refdownval (rtx, rv);
|
||||||
return ret;
|
return ret;
|
||||||
#else
|
#else
|
||||||
|
Loading…
x
Reference in New Issue
Block a user