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

Re: [BUG] Anonymous functions cause funcfiletrace to produce function-relative line numbers



On Sun, 10 Dec 2017 17:28:03 -0600
dana <dana@xxxxxxx> wrote:
> I was experimenting with line-number tracing today and i found that anonymous
> functions have an undesirable effect on funcfiletrace:
> 
>   % cat -n tracetest.zsh
>        1  #
>        2  foo() {
>        3    #
>        4    #
>        5    #
>        6    #
>        7    #
>        8    () { () { print -rC2 -- $functrace $funcfiletrace } }
>        9  }
>       10  foo
>   % zsh tracetest.zsh
>   (anon):0          tracetest.zsh:6
>   foo:6             tracetest.zsh:8
>   tracetest.zsh:10  tracetest.zsh:10
> 
> Note that the top call from (anon) is listed as tracetest.zsh:6 (actually the
> relative line number within the function foo) rather than the expected
> tracetest.zsh:8 (the absolute line number within the file).

I don't think this is just anonymous functions; I think the problem is
the temptation to use nested functions is just greater with anonymous
functions.

Perhaps...?

pws

diff --git a/Src/exec.c b/Src/exec.c
index fc6d02d..03b7f3d 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -5669,11 +5669,11 @@ doshfunc(Shfunc shfunc, LinkList doshargs, int noreturnval)
 	funcsave->fstack.caller = funcstack ? funcstack->name :
 	    dupstring(funcsave->argv0 ? funcsave->argv0 : argzero);
 	funcsave->fstack.lineno = lineno;
+	funcsave->fstack.flineno = funcstack->flineno + shfunc->lineno;
 	funcsave->fstack.prev = funcstack;
 	funcsave->fstack.tp = FS_FUNC;
 	funcstack = &funcsave->fstack;
 
-	funcsave->fstack.flineno = shfunc->lineno;
 	funcsave->fstack.filename = getshfuncfile(shfunc);
 
 	prog = shfunc->funcdef;



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