Lines Matching refs:cstack

18 static char	*get_end_emsg(cstack_T *cstack);
339 do_errthrow(cstack_T *cstack, char_u *cmdname) in do_errthrow() argument
360 if (cstack != NULL) in do_errthrow()
361 do_throw(cstack); in do_errthrow()
374 do_intthrow(cstack_T *cstack) in do_intthrow() argument
414 do_throw(cstack); in do_intthrow()
942 enter_block(cstack_T *cstack) in enter_block() argument
944 ++cstack->cs_idx; in enter_block()
949 cstack->cs_script_var_len[cstack->cs_idx] = si->sn_var_vals.ga_len; in enter_block()
950 cstack->cs_block_id[cstack->cs_idx] = ++si->sn_last_block_id; in enter_block()
957 cstack->cs_script_var_len[cstack->cs_idx] = 0; in enter_block()
958 cstack->cs_block_id[cstack->cs_idx] = 0; in enter_block()
963 leave_block(cstack_T *cstack) in leave_block() argument
970 cstack->cs_flags[cstack->cs_idx] & CSF_FUNC_DEF; in leave_block()
972 for (i = cstack->cs_script_var_len[cstack->cs_idx]; in leave_block()
987 if (cstack->cs_idx == 0) in leave_block()
990 si->sn_current_block_id = cstack->cs_block_id[cstack->cs_idx - 1]; in leave_block()
992 --cstack->cs_idx; in leave_block()
1004 cstack_T *cstack = eap->cstack; in ex_if() local
1006 if (cstack->cs_idx == CSTACK_LEN - 1) in ex_if()
1010 enter_block(cstack); in ex_if()
1011 cstack->cs_flags[cstack->cs_idx] = 0; in ex_if()
1017 skip = did_emsg || got_int || did_throw || (cstack->cs_idx > 0 in ex_if()
1018 && !(cstack->cs_flags[cstack->cs_idx - 1] & CSF_ACTIVE)); in ex_if()
1025 cstack->cs_flags[cstack->cs_idx] = CSF_ACTIVE | CSF_TRUE; in ex_if()
1029 cstack->cs_flags[cstack->cs_idx] = CSF_TRUE; in ex_if()
1039 cstack_T *cstack = eap->cstack; in ex_endif() local
1044 if (cstack->cs_idx < 0 in ex_endif()
1045 || (cstack->cs_flags[cstack->cs_idx] in ex_endif()
1059 if (!(cstack->cs_flags[cstack->cs_idx] & CSF_TRUE) in ex_endif()
1061 (void)do_intthrow(cstack); in ex_endif()
1063 leave_block(cstack); in ex_endif()
1076 cstack_T *cstack = eap->cstack; in ex_else() local
1082 skip = did_emsg || got_int || did_throw || (cstack->cs_idx > 0 in ex_else()
1083 && !(cstack->cs_flags[cstack->cs_idx - 1] & CSF_ACTIVE)); in ex_else()
1085 if (cstack->cs_idx < 0 in ex_else()
1086 || (cstack->cs_flags[cstack->cs_idx] in ex_else()
1097 else if (cstack->cs_flags[cstack->cs_idx] & CSF_ELSE) in ex_else()
1109 if (skip || cstack->cs_flags[cstack->cs_idx] & CSF_TRUE) in ex_else()
1112 cstack->cs_flags[cstack->cs_idx] = CSF_TRUE; in ex_else()
1116 cstack->cs_flags[cstack->cs_idx] = CSF_ACTIVE; in ex_else()
1130 (void)do_intthrow(cstack); in ex_else()
1146 cstack->cs_flags[cstack->cs_idx] = CSF_ACTIVE | CSF_TRUE; in ex_else()
1148 cstack->cs_flags[cstack->cs_idx] = 0; in ex_else()
1152 cstack->cs_flags[cstack->cs_idx] = CSF_TRUE; in ex_else()
1155 cstack->cs_flags[cstack->cs_idx] |= CSF_ELSE; in ex_else()
1167 cstack_T *cstack = eap->cstack; in ex_while() local
1169 if (cstack->cs_idx == CSTACK_LEN - 1) in ex_while()
1178 if ((cstack->cs_lflags & CSL_HAD_LOOP) == 0) in ex_while()
1180 enter_block(cstack); in ex_while()
1181 ++cstack->cs_looplevel; in ex_while()
1182 cstack->cs_line[cstack->cs_idx] = -1; in ex_while()
1190 int func_defined = cstack->cs_flags[cstack->cs_idx] in ex_while()
1196 for (i = cstack->cs_script_var_len[cstack->cs_idx] + 1; in ex_while()
1211 cstack->cs_flags[cstack->cs_idx] = in ex_while()
1218 skip = did_emsg || got_int || did_throw || (cstack->cs_idx > 0 in ex_while()
1219 && !(cstack->cs_flags[cstack->cs_idx - 1] & CSF_ACTIVE)); in ex_while()
1236 if ((cstack->cs_lflags & CSL_HAD_LOOP) != 0) in ex_while()
1240 fi = cstack->cs_forinfo[cstack->cs_idx]; in ex_while()
1252 cstack->cs_forinfo[cstack->cs_idx] = fi; in ex_while()
1267 cstack->cs_forinfo[cstack->cs_idx] = NULL; in ex_while()
1279 cstack->cs_flags[cstack->cs_idx] |= (CSF_ACTIVE | CSF_TRUE); in ex_while()
1280 cstack->cs_lflags ^= CSL_HAD_LOOP; in ex_while()
1284 cstack->cs_lflags &= ~CSL_HAD_LOOP; in ex_while()
1290 cstack->cs_flags[cstack->cs_idx] |= CSF_TRUE; in ex_while()
1302 cstack_T *cstack = eap->cstack; in ex_continue() local
1304 if (cstack->cs_looplevel <= 0 || cstack->cs_idx < 0) in ex_continue()
1312 idx = cleanup_conditionals(cstack, CSF_WHILE | CSF_FOR, FALSE); in ex_continue()
1313 if (idx >= 0 && (cstack->cs_flags[idx] & (CSF_WHILE | CSF_FOR))) in ex_continue()
1315 rewind_conditionals(cstack, idx, CSF_TRY, &cstack->cs_trylevel); in ex_continue()
1321 cstack->cs_lflags |= CSL_HAD_CONT; // let do_cmdline() handle it in ex_continue()
1327 cstack->cs_pending[idx] = CSTP_CONTINUE; in ex_continue()
1340 cstack_T *cstack = eap->cstack; in ex_break() local
1342 if (cstack->cs_looplevel <= 0 || cstack->cs_idx < 0) in ex_break()
1350 idx = cleanup_conditionals(cstack, CSF_WHILE | CSF_FOR, TRUE); in ex_break()
1351 if (idx >= 0 && !(cstack->cs_flags[idx] & (CSF_WHILE | CSF_FOR))) in ex_break()
1353 cstack->cs_pending[idx] = CSTP_BREAK; in ex_break()
1365 cstack_T *cstack = eap->cstack; in ex_endwhile() local
1385 if (cstack->cs_looplevel <= 0 || cstack->cs_idx < 0) in ex_endwhile()
1389 fl = cstack->cs_flags[cstack->cs_idx]; in ex_endwhile()
1406 for (idx = cstack->cs_idx; idx > 0; --idx) in ex_endwhile()
1408 fl = cstack->cs_flags[idx]; in ex_endwhile()
1420 (void)cleanup_conditionals(cstack, CSF_WHILE | CSF_FOR, FALSE); in ex_endwhile()
1421 rewind_conditionals(cstack, idx, CSF_TRY, &cstack->cs_trylevel); in ex_endwhile()
1434 else if (cstack->cs_flags[cstack->cs_idx] & CSF_TRUE in ex_endwhile()
1435 && !(cstack->cs_flags[cstack->cs_idx] & CSF_ACTIVE) in ex_endwhile()
1437 (void)do_intthrow(cstack); in ex_endwhile()
1441 cstack->cs_lflags |= CSL_HAD_ENDLOOP; in ex_endwhile()
1451 cstack_T *cstack = eap->cstack; in ex_block() local
1453 if (cstack->cs_idx == CSTACK_LEN - 1) in ex_block()
1457 enter_block(cstack); in ex_block()
1458 cstack->cs_flags[cstack->cs_idx] = CSF_BLOCK | CSF_ACTIVE | CSF_TRUE; in ex_block()
1468 cstack_T *cstack = eap->cstack; in ex_endblock() local
1470 if (cstack->cs_idx < 0 in ex_endblock()
1471 || (cstack->cs_flags[cstack->cs_idx] & CSF_BLOCK) == 0) in ex_endblock()
1474 leave_block(cstack); in ex_endblock()
1480 cstack_T *cstack = eap->cstack; in inside_block() local
1483 for (i = 0; i <= cstack->cs_idx; ++i) in inside_block()
1484 if (cstack->cs_flags[cstack->cs_idx] & CSF_BLOCK) in inside_block()
1513 do_throw(eap->cstack); in ex_throw()
1523 do_throw(cstack_T *cstack) in do_throw() argument
1551 idx = cleanup_conditionals(cstack, 0, inactivate_try); in do_throw()
1567 if (!(cstack->cs_flags[idx] & CSF_CAUGHT)) in do_throw()
1569 if (cstack->cs_flags[idx] & CSF_ACTIVE) in do_throw()
1570 cstack->cs_flags[idx] |= CSF_THROWN; in do_throw()
1575 cstack->cs_flags[idx] &= ~CSF_THROWN; in do_throw()
1577 cstack->cs_flags[idx] &= ~CSF_ACTIVE; in do_throw()
1578 cstack->cs_exception[idx] = current_exception; in do_throw()
1607 cstack_T *cstack = eap->cstack; in ex_try() local
1612 if (cstack->cs_idx == CSTACK_LEN - 1) in ex_try()
1616 enter_block(cstack); in ex_try()
1617 ++cstack->cs_trylevel; in ex_try()
1618 cstack->cs_flags[cstack->cs_idx] = CSF_TRY; in ex_try()
1619 cstack->cs_pending[cstack->cs_idx] = CSTP_NONE; in ex_try()
1625 skip = did_emsg || got_int || did_throw || (cstack->cs_idx > 0 in ex_try()
1626 && !(cstack->cs_flags[cstack->cs_idx - 1] & CSF_ACTIVE)); in ex_try()
1633 cstack->cs_flags[cstack->cs_idx] |= CSF_ACTIVE | CSF_TRUE; in ex_try()
1661 elem->next = cstack->cs_emsg_silent_list; in ex_try()
1662 cstack->cs_emsg_silent_list = elem; in ex_try()
1663 cstack->cs_flags[cstack->cs_idx] |= CSF_SILENT; in ex_try()
1687 cstack_T *cstack = eap->cstack; in ex_catch() local
1693 if (cstack->cs_trylevel <= 0 || cstack->cs_idx < 0) in ex_catch()
1700 if (!(cstack->cs_flags[cstack->cs_idx] & CSF_TRY)) in ex_catch()
1704 eap->errmsg = get_end_emsg(cstack); in ex_catch()
1707 for (idx = cstack->cs_idx; idx > 0; --idx) in ex_catch()
1708 if (cstack->cs_flags[idx] & CSF_TRY) in ex_catch()
1710 if (cstack->cs_flags[idx] & CSF_TRY) in ex_catch()
1711 cstack->cs_flags[idx] |= CSF_CATCH; in ex_catch()
1712 if (cstack->cs_flags[idx] & CSF_FINALLY) in ex_catch()
1720 rewind_conditionals(cstack, idx, CSF_WHILE | CSF_FOR, in ex_catch()
1721 &cstack->cs_looplevel); in ex_catch()
1745 if (!did_throw || !(cstack->cs_flags[idx] & CSF_TRUE)) in ex_catch()
1753 if (!skip && (cstack->cs_flags[idx] & CSF_THROWN) in ex_catch()
1754 && !(cstack->cs_flags[idx] & CSF_CAUGHT)) in ex_catch()
1770 if (!dbg_check_skipped(eap) || !do_intthrow(cstack)) in ex_catch()
1813 cstack->cs_flags[idx] |= CSF_ACTIVE | CSF_CAUGHT; in ex_catch()
1815 catch_exception((except_T *)cstack->cs_exception[idx]); in ex_catch()
1821 if (cstack->cs_exception[cstack->cs_idx] != current_exception) in ex_catch()
1836 cleanup_conditionals(cstack, CSF_TRY, TRUE); in ex_catch()
1853 cstack_T *cstack = eap->cstack; in ex_finally() local
1858 if (cstack->cs_trylevel <= 0 || cstack->cs_idx < 0) in ex_finally()
1862 if (!(cstack->cs_flags[cstack->cs_idx] & CSF_TRY)) in ex_finally()
1864 eap->errmsg = get_end_emsg(cstack); in ex_finally()
1865 for (idx = cstack->cs_idx - 1; idx > 0; --idx) in ex_finally()
1866 if (cstack->cs_flags[idx] & CSF_TRY) in ex_finally()
1874 idx = cstack->cs_idx; in ex_finally()
1876 if (cstack->cs_flags[idx] & CSF_FINALLY) in ex_finally()
1882 rewind_conditionals(cstack, idx, CSF_WHILE | CSF_FOR, in ex_finally()
1883 &cstack->cs_looplevel); in ex_finally()
1893 skip = !(cstack->cs_flags[cstack->cs_idx] & CSF_TRUE); in ex_finally()
1906 (void)do_intthrow(cstack); in ex_finally()
1917 cleanup_conditionals(cstack, CSF_TRY, FALSE); in ex_finally()
1936 if (cstack->cs_pending[cstack->cs_idx] == CSTP_RETURN) in ex_finally()
1939 cstack->cs_rettv[cstack->cs_idx]); in ex_finally()
1940 discard_pending_return(cstack->cs_rettv[cstack->cs_idx]); in ex_finally()
1948 cstack->cs_pending[cstack->cs_idx] = pending; in ex_finally()
1957 if (did_throw && cstack->cs_exception[cstack->cs_idx] in ex_finally()
1969 cstack->cs_lflags |= CSL_HAD_FINA; in ex_finally()
1985 cstack_T *cstack = eap->cstack; in ex_endtry() local
1990 if (cstack->cs_trylevel <= 0 || cstack->cs_idx < 0) in ex_endtry()
2006 || !(cstack->cs_flags[cstack->cs_idx] & CSF_TRUE); in ex_endtry()
2008 if (!(cstack->cs_flags[cstack->cs_idx] & CSF_TRY)) in ex_endtry()
2010 eap->errmsg = get_end_emsg(cstack); in ex_endtry()
2013 idx = cstack->cs_idx; in ex_endtry()
2016 while (idx > 0 && !(cstack->cs_flags[idx] & CSF_TRY)); in ex_endtry()
2017 rewind_conditionals(cstack, idx, CSF_WHILE | CSF_FOR, in ex_endtry()
2018 &cstack->cs_looplevel); in ex_endtry()
2036 idx = cstack->cs_idx; in ex_endtry()
2040 && (cstack->cs_flags[idx] & (CSF_CATCH|CSF_FINALLY)) == 0) in ex_endtry()
2053 if (did_throw && (cstack->cs_flags[idx] & CSF_TRUE) in ex_endtry()
2054 && !(cstack->cs_flags[idx] & CSF_FINALLY)) in ex_endtry()
2066 && !(cstack->cs_flags[idx] & CSF_FINALLY) in ex_endtry()
2067 && !cstack->cs_pending[idx])) in ex_endtry()
2076 (void)do_intthrow(cstack); in ex_endtry()
2080 if (did_throw && !(cstack->cs_flags[idx] & CSF_FINALLY)) in ex_endtry()
2093 pending = cstack->cs_pending[idx]; in ex_endtry()
2094 cstack->cs_pending[idx] = CSTP_NONE; in ex_endtry()
2096 rettv = cstack->cs_rettv[idx]; in ex_endtry()
2098 current_exception = cstack->cs_exception[idx]; in ex_endtry()
2111 (void)cleanup_conditionals(cstack, CSF_TRY | CSF_SILENT, TRUE); in ex_endtry()
2113 if (cstack->cs_idx >= 0 in ex_endtry()
2114 && (cstack->cs_flags[cstack->cs_idx] & CSF_TRY)) in ex_endtry()
2115 leave_block(cstack); in ex_endtry()
2116 --cstack->cs_trylevel; in ex_endtry()
2167 do_throw(cstack); in ex_endtry()
2343 cstack_T *cstack, in cleanup_conditionals() argument
2350 for (idx = cstack->cs_idx; idx >= 0; --idx) in cleanup_conditionals()
2352 if (cstack->cs_flags[idx] & CSF_TRY) in cleanup_conditionals()
2360 if (did_emsg || got_int || (cstack->cs_flags[idx] & CSF_FINALLY)) in cleanup_conditionals()
2362 switch (cstack->cs_pending[idx]) in cleanup_conditionals()
2370 report_discard_pending(cstack->cs_pending[idx], NULL); in cleanup_conditionals()
2371 cstack->cs_pending[idx] = CSTP_NONE; in cleanup_conditionals()
2376 cstack->cs_rettv[idx]); in cleanup_conditionals()
2377 discard_pending_return(cstack->cs_rettv[idx]); in cleanup_conditionals()
2378 cstack->cs_pending[idx] = CSTP_NONE; in cleanup_conditionals()
2382 if (cstack->cs_flags[idx] & CSF_FINALLY) in cleanup_conditionals()
2384 if ((cstack->cs_pending[idx] & CSTP_THROW) in cleanup_conditionals()
2385 && cstack->cs_exception[idx] != NULL) in cleanup_conditionals()
2391 (except_T *)cstack->cs_exception[idx], in cleanup_conditionals()
2395 report_discard_pending(cstack->cs_pending[idx], in cleanup_conditionals()
2397 cstack->cs_pending[idx] = CSTP_NONE; in cleanup_conditionals()
2408 if (!(cstack->cs_flags[idx] & CSF_FINALLY)) in cleanup_conditionals()
2410 if ((cstack->cs_flags[idx] & CSF_ACTIVE) in cleanup_conditionals()
2411 && (cstack->cs_flags[idx] & CSF_CAUGHT) in cleanup_conditionals()
2412 && !(cstack->cs_flags[idx] & CSF_FINISHED)) in cleanup_conditionals()
2414 finish_exception((except_T *)cstack->cs_exception[idx]); in cleanup_conditionals()
2415 cstack->cs_flags[idx] |= CSF_FINISHED; in cleanup_conditionals()
2421 if (cstack->cs_flags[idx] & CSF_TRUE) in cleanup_conditionals()
2434 if (cstack->cs_flags[idx] & searched_cond) in cleanup_conditionals()
2440 cstack->cs_flags[idx] &= ~CSF_ACTIVE; in cleanup_conditionals()
2449 if ((cstack->cs_flags[idx] & CSF_TRY) in cleanup_conditionals()
2450 && (cstack->cs_flags[idx] & CSF_SILENT)) in cleanup_conditionals()
2454 elem = cstack->cs_emsg_silent_list; in cleanup_conditionals()
2455 cstack->cs_emsg_silent_list = elem->next; in cleanup_conditionals()
2458 cstack->cs_flags[idx] &= ~CSF_SILENT; in cleanup_conditionals()
2470 get_end_emsg(cstack_T *cstack) in get_end_emsg() argument
2472 if (cstack->cs_flags[cstack->cs_idx] & CSF_WHILE) in get_end_emsg()
2474 if (cstack->cs_flags[cstack->cs_idx] & CSF_FOR) in get_end_emsg()
2489 cstack_T *cstack, in rewind_conditionals() argument
2494 while (cstack->cs_idx > idx) in rewind_conditionals()
2496 if (cstack->cs_flags[cstack->cs_idx] & cond_type) in rewind_conditionals()
2498 if (cstack->cs_flags[cstack->cs_idx] & CSF_FOR) in rewind_conditionals()
2499 free_for_info(cstack->cs_forinfo[cstack->cs_idx]); in rewind_conditionals()
2500 leave_block(cstack); in rewind_conditionals()