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

[PATCH] Make a function that redefines itself preserve its tracedness.



This makes it easy to apply local tracing ('functions -T') to autoloadable
functions that redefines themselves when first loaded.
---

Given how late we are in the release cycle, should I wait until after 5.8 to
push this?

Cheers,

Daniel


 Src/exec.c          | 6 ++++++
 Test/E02xtrace.ztst | 9 +++++++++
 2 files changed, 15 insertions(+)

diff --git a/Src/exec.c b/Src/exec.c
index fac095d64..356e2974b 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -5320,6 +5320,12 @@ execfuncdef(Estate state, Eprog redir_prog)
 		 */
 		removetrapnode(signum);
 	    }
+	    /* Is this function traced and redefining itself? */
+	    if (funcstack && funcstack->tp == FS_FUNC &&
+		    !strcmp(s, funcstack->name)) {
+		Shfunc old = ((Shfunc)shfunctab->getnode(shfunctab, s));
+		shf->node.flags |= old->node.flags & (PM_TAGGED|PM_TAGGED_LOCAL);
+	    }
 	    shfunctab->addnode(shfunctab, ztrdup(s), shf);
 	}
     }
diff --git a/Test/E02xtrace.ztst b/Test/E02xtrace.ztst
index da6191cd0..8d2c300cf 100644
--- a/Test/E02xtrace.ztst
+++ b/Test/E02xtrace.ztst
@@ -146,3 +146,12 @@
 ?+(anon):0> '(anon)'
 ?+(anon):0> true
 ?+fn:0> gn
+
+  f() {
+    f() { echo inner }
+  }
+  functions -T f
+  f
+  which f | grep '# traced'
+0:a function that redefines itself preserves tracing
+>	# traced



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