zsh-workers
 help / color / mirror / code / Atom feed
From: "Rocky Bernstein" <rocky.bernstein@gmail.com>
To: "Peter Stephenson" <pws@csr.com>
Cc: "Zsh hackers list" <zsh-workers@sunsite.dk>
Subject: Re: PATCH: source file info from PS4
Date: Tue, 16 Sep 2008 12:17:25 -0400	[thread overview]
Message-ID: <6cd6de210809160917u49f75828g6633df9469640f2b@mail.gmail.com> (raw)
In-Reply-To: <6005.1221576641@csr.com>

[-- Attachment #1: Type: text/plain, Size: 22744 bytes --]

Thanks!

This is certainly something I've wanted ever since funcstack was improved
but had been holding back on.

The fretting about what letter to use after % would be reduced and if the
promptsubst option also applied to PS4. In my opinion not only is it more
readable and requires less memory on a users part, but is also more
flexible.


On Tue, Sep 16, 2008 at 10:50 AM, Peter Stephenson <pws@csr.com> wrote:

> Now we have logic for finding the source file and corresponding line
> number of executed code, this adds the prompt escapes %x and %I which
> are like %N and %i but for the file where the code was defined.  %x isn't
> ideal but upper and lower case %s, %f and %n are all used.  It stands
> for "execution file", or something.  The idea is that you set
> PS4='+%x:%I>'
>
> While doing this, I spotted that we could improve the information
> available to funcstack and the interface to doshfunc() by passing in a
> Shfunc instead of an Eprog.  This is a *much* cleaner interface.  Now
> the funcstack entry is guaranteed to get the details of the shell
> function correct.
>
> Index: Doc/Zsh/prompt.yo
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Doc/Zsh/prompt.yo,v
> retrieving revision 1.15
> diff -u -r1.15 prompt.yo
> --- Doc/Zsh/prompt.yo   24 Jun 2008 08:44:16 -0000      1.15
> +++ Doc/Zsh/prompt.yo   16 Sep 2008 14:41:10 -0000
> @@ -113,6 +113,11 @@
>  shell function given by tt(%N).  This is most useful for debugging as part
>  of tt($PS4).
>  )
> +item(tt(%I))(
> +The line number currently being executed in the file tt(%x).  This is
> +similar to tt(%i), but the line number is always a line number in the
> +file where the code was defined, even if the code is a shell function.
> +)
>  item(tt(%j))(
>  The number of jobs.
>  )
> @@ -126,6 +131,11 @@
>  the `tt(%)' to specify a number of trailing path components to show; zero
>  means the full path.  A negative integer specifies leading components.
>  )
> +item(tt(%x))(
> +The name of the file containing the source code currently being
> +executed.  This behaves as tt(%N) except that function and eval command
> +names are not shown, instead the file where they were defined.
> +)
>  xitem(tt(%c))
>  xitem(tt(%.))
>  item(tt(%C))(
> Index: Src/exec.c
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Src/exec.c,v
> retrieving revision 1.151
> diff -u -r1.151 exec.c
> --- Src/exec.c  11 Sep 2008 17:14:39 -0000      1.151
> +++ Src/exec.c  16 Sep 2008 14:41:10 -0000
> @@ -518,7 +518,7 @@
>        return 127;
>
>     pushnode(args, arg0);
> -    return doshfunc(shf->node.nam, shf->funcdef, args, shf->node.flags,
> 1);
> +    return doshfunc(shf, args, shf->node.flags, 1);
>  }
>
>  /* execute an external command */
> @@ -4064,7 +4064,7 @@
>     cmdsp = 0;
>     if ((osfc = sfcontext) == SFC_NONE)
>        sfcontext = SFC_DIRECT;
> -    doshfunc(shf->node.nam, shf->funcdef, args, shf->node.flags, 0);
> +    doshfunc(shf, args, shf->node.flags, 0);
>     sfcontext = osfc;
>     free(cmdstack);
>     cmdstack = ocs;
> @@ -4200,18 +4200,20 @@
>
>  /**/
>  mod_export int
> -doshfunc(char *name, Eprog prog, LinkList doshargs, int flags, int
> noreturnval)
> +doshfunc(Shfunc shfunc, LinkList doshargs, int flags, int noreturnval)
>  {
>     char **tab, **x, *oargv0;
>     int oldzoptind, oldlastval, oldoptcind, oldnumpipestats, ret;
>     int *oldpipestats = NULL;
> -    char saveopts[OPT_SIZE], *oldscriptname = scriptname, *fname =
> dupstring(name);
> +    char saveopts[OPT_SIZE], *oldscriptname = scriptname;
> +    char *name = shfunc->node.nam;
> +    char *fname = dupstring(name);
>     int obreaks, saveemulation ;
> +    Eprog prog;
>     struct funcstack fstack;
>  #ifdef MAX_FUNCTION_DEPTH
>     static int funcdepth;
>  #endif
> -    Shfunc shf;
>
>     pushheap();
>
> @@ -4291,14 +4293,10 @@
>     fstack.tp = FS_FUNC;
>     funcstack = &fstack;
>
> -    if ((shf = (Shfunc) shfunctab->getnode(shfunctab, name))) {
> -       fstack.flineno = shf->lineno;
> -       fstack.filename = dupstring(shf->filename);
> -    } else {
> -       fstack.flineno = 0;
> -       fstack.filename = dupstring(fstack.caller);
> -    }
> +    fstack.flineno = shfunc->lineno;
> +    fstack.filename = dupstring(shfunc->filename);
>
> +    prog = shfunc->funcdef;
>     if (prog->flags & EF_RUN) {
>        Shfunc shf;
>
> Index: Src/init.c
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Src/init.c,v
> retrieving revision 1.96
> diff -u -r1.96 init.c
> --- Src/init.c  11 Sep 2008 17:14:39 -0000      1.96
> +++ Src/init.c  16 Sep 2008 14:41:10 -0000
> @@ -149,7 +149,7 @@
>            int toksav = tok;
>
>            if (toplevel &&
> -               (getshfunc("preexec") != &dummy_eprog ||
> +               (getshfunc("preexec") ||
>                 paramtab->getnode(paramtab, "preexec_functions"))) {
>                LinkList args;
>                char *cmdstr;
> Index: Src/math.c
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Src/math.c,v
> retrieving revision 1.33
> diff -u -r1.33 math.c
> --- Src/math.c  12 Jun 2008 13:45:06 -0000      1.33
> +++ Src/math.c  16 Sep 2008 14:41:10 -0000
> @@ -868,11 +868,11 @@
>                                           argc <= f->maxargs)) {
>                    if (f->flags & MFF_USERFUNC) {
>                        char *shfnam = f->module ? f->module : n;
> -                       Eprog prog = getshfunc(shfnam);
> -                       if (prog == &dummy_eprog)
> +                       Shfunc shfunc = getshfunc(shfnam);
> +                       if (!shfunc)
>                            zerr("no such function: %s", shfnam);
>                        else {
> -                           doshfunc(n, prog, l, 0, 1);
> +                           doshfunc(shfunc, l, 0, 1);
>                            return lastmathval;
>                        }
>                    } else {
> Index: Src/prompt.c
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Src/prompt.c,v
> retrieving revision 1.53
> diff -u -r1.53 prompt.c
> --- Src/prompt.c        15 Sep 2008 16:18:06 -0000      1.53
> +++ Src/prompt.c        16 Sep 2008 14:41:11 -0000
> @@ -725,11 +725,37 @@
>                if(Rstring)
>                    stradd(Rstring);
>                break;
> +           case 'I':
> +               if (funcstack && funcstack->tp != FS_SOURCE) {
> +                   /*
> +                    * We're in a function or an eval with
> +                    * EVALLINENO.  Calculate the line number in
> +                    * the file.
> +                    */
> +                   zlong flineno = lineno + funcstack->flineno;
> +                   /* take account of eval line nos. starting at 1 */
> +                   if (funcstack->tp == FS_EVAL)
> +                       lineno--;
> +                   addbufspc(DIGBUFSIZE);
> +                   sprintf(bp, "%ld", (long)flineno);
> +                   bp += strlen(bp);
> +                   break;
> +               }
> +               /* else we're in a file and lineno is already correct */
> +               /* FALLTHROUGH */
>            case 'i':
>                addbufspc(DIGBUFSIZE);
>                sprintf(bp, "%ld", (long)lineno);
>                bp += strlen(bp);
>                break;
> +           case 'x':
> +               if (funcstack && funcstack->tp != FS_SOURCE)
> +                   promptpath(funcstack->filename ? funcstack->filename :
> "",
> +                              arg, 0);
> +               else
> +                   promptpath(scriptfilename ? scriptfilename : argzero,
> +                              arg, 0);
> +               break;
>            case '\0':
>                return 0;
>            case Meta:
> Index: Src/signals.c
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Src/signals.c,v
> retrieving revision 1.50
> diff -u -r1.50 signals.c
> --- Src/signals.c       11 Aug 2008 19:22:54 -0000      1.50
> +++ Src/signals.c       16 Sep 2008 14:41:11 -0000
> @@ -963,8 +963,7 @@
>     }
>
>     if (exittr) {
> -       dotrapargs(SIGEXIT, &exittr, (exittr & ZSIG_FUNC) ?
> -                  ((Shfunc)exitfn)->funcdef : (Eprog) exitfn);
> +       dotrapargs(SIGEXIT, &exittr, exitfn);
>        if (exittr & ZSIG_FUNC)
>            shfunctab->freenode((HashNode)exitfn);
>        else
> @@ -1077,8 +1076,16 @@
>  /**/
>  int trapisfunc;
>
> +/*
> + * sig is the signal number.
> + * *sigtr is the value to be taken as the field in sigtrapped (since
> + *   that may have changed by this point if we are exiting).
> + * sigfn is an Eprog with a non-function eval list, or a Shfunc
> + *   with a function trap.  It may be NULL with an ignored signal.
> + */
> +
>  /**/
> -void
> +static void
>  dotrapargs(int sig, int *sigtr, void *sigfn)
>  {
>     LinkList args;
> @@ -1153,7 +1160,7 @@
>        trapisfunc = isfunc = 1;
>
>        sfcontext = SFC_SIGNAL;
> -       doshfunc(name, sigfn, args, 0, 1);
> +       doshfunc((Shfunc)sigfn, args, 0, 1);
>        sfcontext = osc;
>        freelinklist(args, (FreeFunc) NULL);
>        zsfree(name);
> @@ -1162,7 +1169,7 @@
>        trap_state = TRAP_STATE_PRIMED;
>        trapisfunc = isfunc = 0;
>
> -       execode(sigfn, 1, 0);
> +       execode((Eprog)sigfn, 1, 0);
>     }
>     runhookdef(AFTERTRAPHOOK, NULL);
>
> @@ -1215,12 +1222,12 @@
>  void
>  dotrap(int sig)
>  {
> -    Eprog funcprog;
> +    void *funcprog;
>
>     if (sigtrapped[sig] & ZSIG_FUNC) {
>        HashNode hn = gettrapnode(sig, 0);
>        if (hn)
> -           funcprog = ((Shfunc)hn)->funcdef;
> +           funcprog = hn;
>        else {
>  #ifdef DEBUG
>            dputs("BUG: running function trap which has escaped.");
> @@ -1230,7 +1237,11 @@
>     } else
>        funcprog = siglists[sig];
>
> -    /* Copied from dotrapargs(). */
> +    /*
> +     * Copied from dotrapargs().
> +     * (In fact, the gain from duplicating this appears to be virtually
> +     * zero.  Not sure why it's here.)
> +     */
>     if ((sigtrapped[sig] & ZSIG_IGNORED) || !funcprog || errflag)
>        return;
>
> Index: Src/utils.c
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Src/utils.c,v
> retrieving revision 1.199
> diff -u -r1.199 utils.c
> --- Src/utils.c 11 Aug 2008 19:22:54 -0000      1.199
> +++ Src/utils.c 16 Sep 2008 14:41:11 -0000
> @@ -35,6 +35,8 @@
>  /**/
>  mod_export char *scriptname;     /* is sometimes a function name */
>
> +/* filename of script or other file containing code source e.g. autoload
> */
> +
>  /**/
>  mod_export char *scriptfilename;
>
> @@ -1134,7 +1136,7 @@
>  mod_export int
>  callhookfunc(char *name, LinkList lnklst, int arrayp, int *retval)
>  {
> -    Eprog prog;
> +    Shfunc shfunc;
>        /*
>         * Save stopmsg, since user doesn't get a chance to respond
>         * to a list of jobs generated in a hook.
> @@ -1143,8 +1145,8 @@
>
>     sfcontext = SFC_HOOK;
>
> -    if ((prog = getshfunc(name)) != &dummy_eprog) {
> -       ret = doshfunc(name, prog, lnklst, 0, 1);
> +    if ((shfunc = getshfunc(name))) {
> +       ret = doshfunc(shfunc, lnklst, 0, 1);
>        stat = 0;
>     }
>
> @@ -1159,8 +1161,8 @@
>
>        if ((arrptr = getaparam(arrnam))) {
>            for (; *arrptr; arrptr++) {
> -               if ((prog = getshfunc(*arrptr)) != &dummy_eprog) {
> -                   int newret = doshfunc(arrnam, prog, lnklst, 0, 1);
> +               if ((shfunc = getshfunc(*arrptr))) {
> +                   int newret = doshfunc(shfunc, lnklst, 0, 1);
>                    if (!ret)
>                        ret = newret;
>                    stat = 0;
> @@ -2893,15 +2895,10 @@
>  /* Get the definition of a shell function */
>
>  /**/
> -mod_export Eprog
> +mod_export Shfunc
>  getshfunc(char *nam)
>  {
> -    Shfunc shf;
> -
> -    if (!(shf = (Shfunc) shfunctab->getnode(shfunctab, nam)))
> -       return &dummy_eprog;
> -
> -    return shf->funcdef;
> +    return (Shfunc) shfunctab->getnode(shfunctab, nam);
>  }
>
>  /**/
> Index: Src/Modules/zftp.c
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Src/Modules/zftp.c,v
> retrieving revision 1.48
> diff -u -r1.48 zftp.c
> --- Src/Modules/zftp.c  4 Sep 2008 22:23:52 -0000       1.48
> +++ Src/Modules/zftp.c  16 Sep 2008 14:41:11 -0000
> @@ -1469,9 +1469,9 @@
>     char lsbuf[ZF_BUFSIZE], *ascbuf = NULL, *optr;
>     off_t sofar = 0, last_sofar = 0;
>     readwrite_t read_ptr = zfread, write_ptr = zfwrite;
> -    Eprog prog;
> +    Shfunc shfunc;
>
> -    if (progress && (prog = getshfunc("zftp_progress")) != &dummy_eprog) {
> +    if (progress && (shfunc = getshfunc("zftp_progress"))) {
>        /*
>         * progress to set up:  ZFTP_COUNT is zero.
>         * We do this here in case we needed to wait for a RETR
> @@ -1480,7 +1480,7 @@
>        int osc = sfcontext;
>
>        sfcontext = SFC_HOOK;
> -       doshfunc("zftp_progress", prog, NULL, 0, 1);
> +       doshfunc(shfunc, NULL, 0, 1);
>        sfcontext = osc;
>        /* Now add in the bit of the file we've got/sent already */
>        sofar = last_sofar = startat;
> @@ -1608,12 +1608,12 @@
>        } else
>            break;
>        if (!ret && sofar != last_sofar && progress &&
> -           (prog = getshfunc("zftp_progress")) != &dummy_eprog) {
> +           (shfunc = getshfunc("zftp_progress"))) {
>            int osc = sfcontext;
>
>            zfsetparam("ZFTP_COUNT", &sofar, ZFPM_READONLY|ZFPM_INTEGER);
>            sfcontext = SFC_HOOK;
> -           doshfunc("zftp_progress", prog, NULL, 0, 1);
> +           doshfunc(shfunc, NULL, 0, 1);
>            sfcontext = osc;
>            last_sofar = sofar;
>        }
> @@ -2364,7 +2364,7 @@
>  {
>     char *ptr, *eptr;
>     int endc;
> -    Eprog prog;
> +    Shfunc shfunc;
>
>     if (zfprefs & ZFPF_DUMB)
>        return 1;
> @@ -2391,11 +2391,11 @@
>      * front end.  By putting it here, and in close when ZFTP_PWD is unset,
>      * we at least cover the bases.
>      */
> -    if ((prog = getshfunc("zftp_chpwd")) != &dummy_eprog) {
> +    if ((shfunc = getshfunc("zftp_chpwd"))) {
>        int osc = sfcontext;
>
>        sfcontext = SFC_HOOK;
> -       doshfunc("zftp_chpwd", prog, NULL, 0, 1);
> +       doshfunc(shfunc, NULL, 0, 1);
>        sfcontext = osc;
>     }
>     return 0;
> @@ -2549,7 +2549,7 @@
>  {
>     int ret = 0, recv = (flags & ZFTP_RECV), getsize = 0, progress = 1;
>     char *cmd = recv ? "RETR " : (flags & ZFTP_APPE) ? "APPE " : "STOR ";
> -    Eprog prog;
> +    Shfunc shfunc;
>
>     /*
>      * At this point I'd like to set progress to 0 if we're
> @@ -2567,7 +2567,7 @@
>     for (; *args; args++) {
>        char *ln, *rest = NULL;
>        off_t startat = 0;
> -       if (progress && (prog = getshfunc("zftp_progress")) !=
> &dummy_eprog) {
> +       if (progress && (shfunc = getshfunc("zftp_progress"))) {
>            off_t sz = -1;
>            /*
>             * This calls the SIZE command to get the size for remote
> @@ -2608,14 +2608,14 @@
>         * if and only if we called zfsenddata();
>         */
>        if (progress && ret != 2 &&
> -           (prog = getshfunc("zftp_progress")) != &dummy_eprog) {
> +           (shfunc = getshfunc("zftp_progress"))) {
>            /* progress to finish: ZFTP_TRANSFER set to GF or PF */
>            int osc = sfcontext;
>
>            zfsetparam("ZFTP_TRANSFER", ztrdup(recv ? "GF" : "PF"),
>                       ZFPM_READONLY);
>            sfcontext = SFC_HOOK;
> -           doshfunc("zftp_progress", prog, NULL, 0, 1);
> +           doshfunc(shfunc, NULL, 0, 1);
>            sfcontext = osc;
>        }
>        if (rest) {
> @@ -2715,7 +2715,7 @@
>  zfclose(int leaveparams)
>  {
>     char **aptr;
> -    Eprog prog;
> +    Shfunc shfunc;
>
>     if (!zfsess->control)
>        return;
> @@ -2766,11 +2766,11 @@
>            zfunsetparam(*aptr);
>
>        /* Now ZFTP_PWD is unset.  It's up to zftp_chpwd to notice. */
> -       if ((prog = getshfunc("zftp_chpwd")) != &dummy_eprog) {
> +       if ((shfunc = getshfunc("zftp_chpwd"))) {
>            int osc = sfcontext;
>
>            sfcontext = SFC_HOOK;
> -           doshfunc("zftp_chpwd", prog, NULL, 0, 1);
> +           doshfunc(shfunc, NULL, 0, 1);
>            sfcontext = osc;
>        }
>     }
> Index: Src/Zle/compcore.c
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Src/Zle/compcore.c,v
> retrieving revision 1.96
> diff -u -r1.96 compcore.c
> --- Src/Zle/compcore.c  7 Jul 2008 08:33:28 -0000       1.96
> +++ Src/Zle/compcore.c  16 Sep 2008 14:41:12 -0000
> @@ -540,13 +540,13 @@
>  static void
>  callcompfunc(char *s, char *fn)
>  {
> -    Eprog prog;
> +    Shfunc shfunc;
>     int lv = lastval;
>     char buf[20];
>
>     METACHECK();
>
> -    if ((prog = getshfunc(fn)) != &dummy_eprog) {
> +    if ((shfunc = getshfunc(fn))) {
>        char **p, *tmp;
>        int aadd = 0, usea = 1, icf = incompfunc, osc = sfcontext;
>        unsigned int rset, kset;
> @@ -814,7 +814,7 @@
>                while (*p)
>                    addlinknode(largs, dupstring(*p++));
>            }
> -           doshfunc(fn, prog, largs, 0, 0);
> +           doshfunc(shfunc, largs, 0, 0);
>            cfret = lastval;
>            lastval = olv;
>        } OLDHEAPS;
> Index: Src/Zle/compctl.c
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Src/Zle/compctl.c,v
> retrieving revision 1.35
> diff -u -r1.35 compctl.c
> --- Src/Zle/compctl.c   3 Oct 2007 16:18:38 -0000       1.35
> +++ Src/Zle/compctl.c   16 Sep 2008 14:41:12 -0000
> @@ -3635,12 +3635,12 @@
>     }
>     if (cc->func) {
>        /* This handles the compctl -K flag. */
> -       Eprog prog;
> +       Shfunc shfunc;
>        char **r;
>        int lv = lastval;
>
>        /* Get the function. */
> -       if ((prog = getshfunc(cc->func)) != &dummy_eprog) {
> +       if ((shfunc = getshfunc(cc->func))) {
>            /* We have it, so build a argument list. */
>            LinkList args = newlinklist();
>            int osc = sfcontext;
> @@ -3664,7 +3664,7 @@
>                incompctlfunc = 1;
>            sfcontext = SFC_COMPLETE;
>            /* Call the function. */
> -           doshfunc(cc->func, prog, args, 0, 1);
> +           doshfunc(shfunc, args, 0, 1);
>            sfcontext = osc;
>            incompctlfunc = 0;
>            /* And get the result from the reply parameter. */
> @@ -3809,12 +3809,12 @@
>        /* generate the user-defined display list: if anything fails, *
>         * we silently allow the normal completion list to be used.   */
>        char **yaptr = NULL, *uv = NULL;
> -       Eprog prog;
> +       Shfunc shfunc;
>
>        if (cc->ylist[0] == '$' || cc->ylist[0] == '(') {
>            /* from variable */
>            uv = cc->ylist + (cc->ylist[0] == '$');
> -       } else if ((prog = getshfunc(cc->ylist)) != &dummy_eprog) {
> +       } else if ((shfunc = getshfunc(cc->ylist))) {
>            /* from function:  pass completions as arg list */
>            LinkList args = newlinklist();
>            LinkNode ln;
> @@ -3839,7 +3839,7 @@
>            if (incompfunc != 1)
>                incompctlfunc = 1;
>            sfcontext = SFC_COMPLETE;
> -           doshfunc(cc->ylist, prog, args, 0, 1);
> +           doshfunc(shfunc, args, 0, 1);
>            sfcontext = osc;
>            incompctlfunc = 0;
>            uv = "reply";
> Index: Src/Zle/zle_main.c
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Src/Zle/zle_main.c,v
> retrieving revision 1.115
> diff -u -r1.115 zle_main.c
> --- Src/Zle/zle_main.c  8 Sep 2008 06:24:23 -0000       1.115
> +++ Src/Zle/zle_main.c  16 Sep 2008 14:41:12 -0000
> @@ -1304,9 +1304,8 @@
>        r = 1;
>     } else {
>        Shfunc shf = (Shfunc) shfunctab->getnode(shfunctab, w->u.fnnam);
> -       Eprog prog = (shf ? shf->funcdef : &dummy_eprog);
>
> -       if(prog == &dummy_eprog) {
> +       if (!shf) {
>            /* the shell function doesn't exist */
>            char *nm = nicedup(w->u.fnnam, 0);
>            char *msg = tricat("No such shell function `", nm, "'");
> @@ -1330,7 +1329,7 @@
>            makezleparams(0);
>            sfcontext = SFC_WIDGET;
>            opts[XTRACE] = 0;
> -           ret = doshfunc(w->u.fnnam, prog, largs, shf->node.flags, 1);
> +           ret = doshfunc(shf, largs, shf->node.flags, 1);
>            opts[XTRACE] = oxt;
>            sfcontext = osc;
>            endparamscope();
> Index: Src/Zle/zle_misc.c
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Src/Zle/zle_misc.c,v
> retrieving revision 1.54
> diff -u -r1.54 zle_misc.c
> --- Src/Zle/zle_misc.c  4 May 2008 18:30:04 -0000       1.54
> +++ Src/Zle/zle_misc.c  16 Sep 2008 14:41:12 -0000
> @@ -1358,9 +1358,9 @@
>  iremovesuffix(ZLE_INT_T c, int keep)
>  {
>     if (suffixfunc) {
> -       Eprog prog = getshfunc(suffixfunc);
> +       Shfunc shfunc = getshfunc(suffixfunc);
>
> -       if (prog != &dummy_eprog) {
> +       if (shfunc) {
>            LinkList args = newlinklist();
>            char buf[20];
>            int osc = sfcontext;
> @@ -1384,7 +1384,7 @@
>            startparamscope();
>            makezleparams(0);
>            sfcontext = SFC_COMPLETE;
> -           doshfunc(suffixfunc, prog, args, 0, 1);
> +           doshfunc(shfunc, args, 0, 1);
>            sfcontext = osc;
>            endparamscope();
>
> Index: Test/E02xtrace.ztst
> ===================================================================
> RCS file: /cvsroot/zsh/zsh/Test/E02xtrace.ztst,v
> retrieving revision 1.7
> diff -u -r1.7 E02xtrace.ztst
> --- Test/E02xtrace.ztst 11 Aug 2008 08:40:58 -0000      1.7
> +++ Test/E02xtrace.ztst 16 Sep 2008 14:41:12 -0000
> @@ -90,3 +90,18 @@
>  >Tracing: function
>  ?+xtf:1> local regression_test_dummy_variable
>  ?+xtf:2> print 'Tracing: function'
> +
> + echo 'PS4="+%x:%I> "
> + fn() {
> +   print This is fn.
> + }
> + :
> + fn
> + ' >fnfile
> + $ZTST_testdir/../Src/zsh -fx ./fnfile
> +0:Trace output with sourcefile and line number.
> +>This is fn.
> +?+./fnfile:1> PS4='+%x:%I> '
> +?+./fnfile:5> :
> +?+./fnfile:6> fn
> +?+./fnfile:3> print This is fn.
>
>
> --
> Peter Stephenson <pws@csr.com>                  Software Engineer
> CSR PLC, Churchill House, Cambridge Business Park, Cowley Road
> Cambridge, CB4 0WZ, UK                          Tel: +44 (0)1223 692070
>

[-- Attachment #2: Type: text/html, Size: 34804 bytes --]

  reply	other threads:[~2008-09-16 16:18 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-09-16 14:50 Peter Stephenson
2008-09-16 16:17 ` Rocky Bernstein [this message]
2008-09-17 16:39 ` Rocky Bernstein
2008-09-18 12:13   ` Peter Stephenson
2008-09-18 15:05     ` Rocky Bernstein
2008-09-18 15:22       ` Rocky Bernstein
2008-09-18 15:25         ` Peter Stephenson
2008-09-18 15:39           ` Rocky Bernstein
2008-09-18 15:45             ` Peter Stephenson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6cd6de210809160917u49f75828g6633df9469640f2b@mail.gmail.com \
    --to=rocky.bernstein@gmail.com \
    --cc=pws@csr.com \
    --cc=zsh-workers@sunsite.dk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).