diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | Doc/Zsh/builtins.yo | 7 | ||||
-rw-r--r-- | Src/options.c | 14 |
3 files changed, 27 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog index 9009bb157..867a702be 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2012-03-01 Peter Stephenson <pws@csr.com> + + * 30303: Doc/builtins.yo, Src/options.c: emulate executed inside + a function marked for execution tracing enables xtrace. + 2012-02-29 Barton E. Schaefer <schaefer@zsh.org> * 30272 (tweaked): Src/exec.c: most failures of fork() cause @@ -16050,5 +16055,5 @@ ***************************************************** * This is used by the shell to define $ZSH_PATCHLEVEL -* $Revision: 1.5599 $ +* $Revision: 1.5600 $ ***************************************************** diff --git a/Doc/Zsh/builtins.yo b/Doc/Zsh/builtins.yo index 5d717479a..706c2803f 100644 --- a/Doc/Zsh/builtins.yo +++ b/Doc/Zsh/builtins.yo @@ -366,6 +366,13 @@ noderef(Compatibility) )\ . +If the tt(emulate) command occurs inside a function that has been +marked for execution tracing with tt(functions -t) then the tt(xtrace) +option will be turned on regardless of emulation mode or other options. +Note that code executed inside the function by the tt(.), tt(source), or +tt(eval) commands is not considered to be running directly from the +function, hence does not provoke this behaviour. + If the tt(-R) option is given, all options are reset to their default value corresponding to the specified emulation mode, except for certain options describing the interactive diff --git a/Src/options.c b/Src/options.c index 5fbb06b11..48df16045 100644 --- a/Src/options.c +++ b/Src/options.c @@ -523,6 +523,20 @@ emulate(const char *zsh_name, int fully) if (fully) emulation |= EMULATE_FULLY; installemulation(); + + if (funcstack && funcstack->tp == FS_FUNC) { + /* + * We are inside a function. Decide if it's traced. + * Pedantic note: the function in the function table isn't + * guaranteed to be what we're executing, but it's + * close enough. + */ + Shfunc shf = (Shfunc)shfunctab->getnode(shfunctab, funcstack->name); + if (shf && (shf->node.flags & PM_TAGGED)) { + /* Tracing is on, so set xtrace */ + opts[XTRACE] = 1; + } + } } /* setopt, unsetopt */ |