1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-17 15:01:40 +02:00

39540: "! command" should suppress ERR_EXIT and ERR_RETURN

This commit is contained in:
Peter Stephenson 2016-10-02 19:16:03 +01:00
parent 4f2a1810f2
commit 6b2585147b
3 changed files with 48 additions and 2 deletions

View file

@ -1,3 +1,8 @@
2016-10-02 Peter Stephenson <p.w.stephenson@ntlworld.com>
* 39540: Src/exec.c, Test/C03traps.ztst: "! command" should
suppress ERR_EXIT and ERR_RETURN.
2016-09-30 Daniel Shahaf <d.s@daniel.shahaf.name> 2016-09-30 Daniel Shahaf <d.s@daniel.shahaf.name>
* 39495: Doc/Zsh/contrib.yo, Functions/Misc/add-zle-hook-widget: * 39495: Doc/Zsh/contrib.yo, Functions/Misc/add-zle-hook-widget:

View file

@ -1226,6 +1226,7 @@ execlist(Estate state, int dont_change_job, int exiting)
} }
while (wc_code(code) == WC_LIST && !breaks && !retflag && !errflag) { while (wc_code(code) == WC_LIST && !breaks && !retflag && !errflag) {
int donedebug; int donedebug;
int this_noerrexit = 0;
ltype = WC_LIST_TYPE(code); ltype = WC_LIST_TYPE(code);
csp = cmdsp; csp = cmdsp;
@ -1309,9 +1310,12 @@ execlist(Estate state, int dont_change_job, int exiting)
goto sublist_done; goto sublist_done;
} }
while (wc_code(code) == WC_SUBLIST) { while (wc_code(code) == WC_SUBLIST) {
int isend = (WC_SUBLIST_TYPE(code) == WC_SUBLIST_END);
next = state->pc + WC_SUBLIST_SKIP(code); next = state->pc + WC_SUBLIST_SKIP(code);
if (!oldnoerrexit) if (!oldnoerrexit)
noerrexit = (WC_SUBLIST_TYPE(code) != WC_SUBLIST_END); noerrexit = !isend;
if ((WC_SUBLIST_FLAGS(code) & WC_SUBLIST_NOT) && isend)
this_noerrexit = 1;
switch (WC_SUBLIST_TYPE(code)) { switch (WC_SUBLIST_TYPE(code)) {
case WC_SUBLIST_END: case WC_SUBLIST_END:
/* End of sublist; just execute, ignoring status. */ /* End of sublist; just execute, ignoring status. */
@ -1427,7 +1431,7 @@ sublist_done:
/* Check whether we are suppressing traps/errexit * /* Check whether we are suppressing traps/errexit *
* (typically in init scripts) and if we haven't * * (typically in init scripts) and if we haven't *
* already performed them for this sublist. */ * already performed them for this sublist. */
if (!noerrexit && !donetrap) { if (!noerrexit && !this_noerrexit && !donetrap) {
if (sigtrapped[SIGZERR] && lastval) { if (sigtrapped[SIGZERR] && lastval) {
dotrap(SIGZERR); dotrap(SIGZERR);
donetrap = 1; donetrap = 1;

View file

@ -519,6 +519,43 @@
>Yes >Yes
F:Must be tested with a top-level script rather than source or function F:Must be tested with a top-level script rather than source or function
fn() {
emulate -L zsh
setopt errreturn
print before
false
print after
}
fn
1:ERRRETURN, basic case
>before
fn() {
emulate -L zsh
setopt errreturn
print before
! true
! false
print after
}
fn
0:ERRETURN with "!"
>before
>after
fn() {
emulate -L zsh
setopt errreturn
print before
! true
! false
false
print after
}
fn
1:ERRETURN with "!" and a following false
>before
%clean %clean
rm -f TRAPEXIT rm -f TRAPEXIT