mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Fix ${.sh.subshell} counter to actually count level of subshells
This counter is documented as follows:
"The current depth for subshells and command substitution."
But before this commit, the actual behaviour was that the counter
was reset to zero whenever a subshell forked for any reason: a
pipe, background job, running 'ulimit', redirecting stdout in a
command substitution, and more. This behaviour was:
1. Not consistent with the documentation. Non-forked (a.k.a.
virtual) subshells are an internal implementation detail which
scripts should not have to be concerned with. The manual page
doesn't mention them at all.
2. Inherently broken. Since a subshell may fork for any number of
reasons, even mid-run, and those reasons may change with
bugfixes and further development, scripts have never actually
been able to rely on the value of ${.sh.subshell}.
So, this commit fixes the counter to count the levels of all
subshells, both virtual and forked.
src/cmd/ksh93/sh/xec.c: _sh_fork():
- Increase ${.sh.subshell} whenever we fork.
src/cmd/ksh93/sh/subshell.c:
- sh_subfork():
* Fix comment to properly explain what it does. It doesn't
"create" a subshell, it forks off an existing virtual subshell.
* Don't zero ${.sh.subshell}. Instead, since sh_fork() increases
it but we're forking an existing subshell, undo the increase.
- sh_subshell():
* Remove 'int16_t subshell' variable. It was unnecessary and
mostly unused. It was also the wrong type: it was assigned the
value from shp->subshell which is of type short.
* Increase and decrease the level of virtual subshells and
${.sh.subshell} independently.
src/cmd/ksh93/tests/variables.sh:
- Add regression tests for ${.sh.subshell} in virtual and forked
subshells of several kinds: comsub, parentheses, pipe, bg job.
- Undo wrong error test count fix from 04b4aef0.
(cherry picked from commit a0e0e29e7e0dbf21e4b3958ae02bde6665fb2696)
This commit is contained in:
parent
6c68b53170
commit
8e97419b0b
4 changed files with 33 additions and 10 deletions
|
|
@ -621,8 +621,25 @@ function a.set
|
|||
[[ ${.sh.subshell} == 1 ]] || err_exit '${.sh.subshell} should be 1'
|
||||
(
|
||||
[[ ${.sh.subshell} == 2 ]] || err_exit '${.sh.subshell} should be 2'
|
||||
exit $Errors
|
||||
)
|
||||
)
|
||||
Errors=$? # ensure error count survives subshell
|
||||
|
||||
actual=$(
|
||||
{
|
||||
(
|
||||
echo ${.sh.subshell} | cat # left element of pipe should increase ${.sh.subshell}
|
||||
echo ${.sh.subshell}
|
||||
ulimit -t unlimited # fork
|
||||
echo ${.sh.subshell} # should be same after forking existing virtual subshell
|
||||
)
|
||||
echo ${.sh.subshell} # a background job should also increase ${.sh.subshell}
|
||||
} & wait "$!"
|
||||
echo ${.sh.subshell}
|
||||
)
|
||||
expect=$'4\n3\n3\n2\n1'
|
||||
[[ $actual == "$expect" ]] || err_exit "\${.sh.subshell} failure (expected $(printf %q "$expect"), got $(printf %q "$actual"))"
|
||||
|
||||
set -- {1..32768}
|
||||
(( $# == 32768 )) || err_exit "\$# failed -- expected 32768, got $#"
|
||||
|
|
@ -657,7 +674,7 @@ set --
|
|||
|
||||
exit $Errors
|
||||
)
|
||||
let "Errors += $?" # ensure error count survives subshell
|
||||
Errors=$? # ensure error count survives subshell
|
||||
|
||||
cd $tmp
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue