Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: PM_TAGGED and PM_TAGGED_LOCAL being set simultaneously (functions -T -t f)



Peter Stephenson wrote on Thu, Apr 15, 2021 at 19:38:28 +0100:
> On Thu, 2021-04-15 at 16:21 +0000, Daniel Shahaf wrote:
> > > > f() g
> > > > g() :
> > > > functions -T f
> > > > functions -t f
> > > > f
> > > > 
> > > > Should XTRACE be on or off when g is run?  Or should an error be raised
> > > > before g is called?
> > > > 
> > > > And if -t were set first and -T second?
> > > 
> > > The way the documentation is written:
> > > 
> > >   The flag -t turns on execution tracing for  this  function;
> > >   the  flag -T does the same, but turns off tracing for any named (not
> > >   anonymous) function called from the present one, unless  that  func‐
> > >   tion  also  has  the  -t  or -T flag.
> > > 
> > > makes it sound as if turning off for called functions is more
> > > powerful behaviour, in which case -T should always be used if
> > > specified.  But it doesn't actually *say* that and could be
> > > rewritten anyway, so it's not much of a steer.  Having one flag
> > > cause another to be ignored is pretty standard behaviour and
> > > relatively straightforward to implement, though.
> > 
> > So, to be clear, you're proposing that setting either flag should unset
> > the other?  Sounds good to me; just making sure we're on the same page.
> 
> Actually, the suggestion was even simpler --- leave them both set, but
> just allow the -T behaviour to be used if both are set.  I think this is
> how it's currently implemented, so it would just mean updating the
> documentation.

Yes, that's how it's currently implemented.

> However, actually unsetting the other one is entirely rational, too.
> Which is least surprising depends how you think of the options: whether you
> think of the option settings as strict alternatives, or you think of
> them as two separate options that happen to have an overlapping function
> of which you have to pick one.  So I can't really express a preference,
> except to say if there's no good reason to change we should just
> document what we have.

Personally, I think it's actually easier to sell the "last one wins"
semantics: there's no logical reason why the behaviour of «functions -Tt
foo» should depend on which of -T/-t was implemented in a later version
of zsh, but every reason for the behaviour to depend on whether the call
passed -Tt or -tT.

That would, however, be an incompatible change ☹

I figured I'd write a test to at least ensure we don't change the
behaviour by accident (it would be too easy to change the if/else chain
that tests the bitflags), but ran into another question along the way.
Look at the first added test:

diff --git a/Test/E02xtrace.ztst b/Test/E02xtrace.ztst
index 10e8b8886..520b7745f 100644
--- a/Test/E02xtrace.ztst
+++ b/Test/E02xtrace.ztst
@@ -225,3 +225,38 @@
 >the definition didn't execute it
 >runs
 
+ f() g
+ g() :
+ functions -t f
+ f
+0:functions -t smoke test #1
+?+f:4> g
+?+g:4> :
+
+ f() g
+ g() { () : }
+ functions -t f
+ f
+0:functions -t smoke test #2
+?+f:4> g
+?+g:0> '(anon)'
+?+(anon):0> :
+
+ f() g
+ g() :
+ (
+  functions -T f
+  functions -t f
+  f
+ )
+ (
+  functions -t f
+  functions -T f
+  f
+ )
+0:ensure the behaviour  of 'functions -Tt f' doesn't change surreptitiously
+?+f:6> g
+?+f:11> g
+F:If this test fails, the new behaviour may be 
+F:workers/48591.
+

PS4 at the time is at its default value, %N:%i:

       %i     The line number currently being executed in the script, sourced
              file, or shell function given by %N. […]

       %N     The name of the script, sourced file, or shell function that zsh
              is currently executing, whichever was started most recently. […]

Given this, isn't the output «g:4» (last line of the first new test) wrong?

Thanks for the answer, Peter.

Cheers,

Daniel




Messages sorted by: Reverse Date, Date, Thread, Author