zsh-workers
 help / color / mirror / code / Atom feed
* Speed improvement patch for __git_files and __git_files_relative
@ 2011-05-06 13:03 Nikolai Weibull
  2011-05-11 13:27 ` Frank Terbeck
  2011-05-17 12:55 ` Speed improvement patch for __git_files and __git_files_relative Nikolai Weibull
  0 siblings, 2 replies; 8+ messages in thread
From: Nikolai Weibull @ 2011-05-06 13:03 UTC (permalink / raw)
  To: Zsh Workers

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

Hi!

I’ve now put together a patch for __git_files and
__git_files_relative.  __git_files is a lot faster than previous
versions and __git_files_relative should be a lot faster too, now that
it only uses substitutions.  (Well, there’s a for loop that iterates
over the file names to determine the common path prefix, but I see no
way of avoiding it.)

It would be great if this could make it into the 4.3.12 release, so
please give it a try as soon as possible.

[-- Attachment #2: __git_files.patch --]
[-- Type: application/octet-stream, Size: 4144 bytes --]

diff --git a/Completion/Unix/Command/_git b/Completion/Unix/Command/_git
index 4664cfa..70992de 100644
--- a/Completion/Unix/Command/_git
+++ b/Completion/Unix/Command/_git
@@ -623,7 +623,11 @@ _git-diff () {
       case $CURRENT in
         (1)
           if [[ -n ${opt_args[(I)--]} ]]; then
-            __git_changed-in-working-tree_files && ret=0
+            if [[ -n ${opt_args[(I)--cached|--staged]} ]]; then
+              __git_changed-in-index_files && ret=0
+            else
+              __git_changed-in-working-tree_files && ret=0
+            fi
           else
             local files_alt='files::__git_changed-in-working-tree_files'
 
@@ -5146,45 +5150,32 @@ __git_notes_refs () {
 
 (( $+functions[__git_files_relative] )) ||
 __git_files_relative () {
-  local rawfiles files file f_parts prefix p_parts tmp
+  local files file f_parts prefix p_parts tmp
 
   prefix=$(_call_program gitprefix git rev-parse --show-prefix 2>/dev/null)
   __git_command_successful $pipestatus || return
 
-  # Empty prefix, no modifications
   if (( $#prefix == 0 )); then
     print $1
     return
   fi
 
-  rawfiles=(${(0)1})
   files=()
 
-  # Now we assume that we've given "absolute" paths list with "root"
-  # being repository top directory.  $prefix is also "absolute" path.
-  for file in $rawfiles; do
-    # Collapse "/./" and "//", strip "/." and "/" from tail (I know,
-    # this is a bit paranoid).
-    f_parts=(${(s:/:)"${${${${file//\/\///}//\/.\///}%%/.}%%/}"})
-    p_parts=(${(s:/:)"${${${${prefix//\/\///}//\/.\///}%%/.}%%/}"})
-    tmp=()
-
-    # Strip common path prefix.
-    while (( $#f_parts > 0 )) && (( $#p_parts > 0 )) && [[ $f_parts[1] == $p_parts[1] ]]; do
-      f_parts[1]=()
-      p_parts[1]=()
-    done
-
-    # If prefix still not empty, ascend up.
-    while (( $#p_parts > 0 )); do
-      tmp+=..
-      p_parts[1]=()
+  # Collapse “//” and “/./” into “/”. Strip any remaining “/.” and “/”.
+  for file in ${${${${${(0)1}//\/\///}//\/.\///}%/.}%/}; do
+    integer i n
+    (( n = $#file > $#prefix ? $#file : $#prefix ))
+    for (( i = 1; i <= n; i++ )); do
+      if [[ $file[i] != $prefix[i] ]]; then
+        while (( i > 0 )) && [[ $file[i-1] != / ]]; do
+          (( i-- ))
+        done
+        break
+      fi
     done
 
-    # Add remaining path.
-    tmp+=($f_parts)
-
-    files+=${(j:/:)tmp}
+    files+=${(l@${#prefix[i,-1]//[^\/]}*3@@../@)}${file[i,-1]}
   done
 
   print ${(pj:\0:)files}
@@ -5192,27 +5183,25 @@ __git_files_relative () {
 
 (( $+functions[__git_files] )) ||
 __git_files () {
-  local compadd_opts opts tag description gitdir gitcdup files expl
+  local compadd_opts opts tag description gitcdup gitprefix files expl
 
   zparseopts -D -E -a compadd_opts V: J: 1 2 n f X: M: P: S: r: R: q F:
   zparseopts -D -E -a opts -- -cached -deleted -modified -others -ignored -unmerged -killed x+: --exclude+:
   tag=$1 description=$2; shift 2
 
-  gitdir=$(_call_program gitdir git rev-parse --git-dir 2>/dev/null)
+  gitcdup=$(_call_program gitcdup git rev-parse --show-cdup 2>/dev/null)
   __git_command_successful $pipestatus || return
 
-  gitcdup=$(_call_program gitcdup git rev-parse --show-cdup 2>/dev/null)
+  gitprefix=$(_call_program gitprefix git rev-parse --show-prefix 2>/dev/null)
   __git_command_successful $pipestatus || return
 
-  opts+='--exclude-per-directory=.gitignore'
-  [[ -f "$gitdir/info/exclude" ]] && opts+="--exclude-from=$gitdir/info/exclude"
+  # TODO: --directory should probably be added to $opts when --others is given.
 
-  files=$(_call_program files git ls-files -z --full-name $opts -- $gitcdup 2>/dev/null)
-  __git_command_successful $pipestatus || return
-  files=(${(0)"$(__git_files_relative $files)"})
+  local pref=$gitcdup$gitprefix$PREFIX
+  files=(${(0)"$(_call_program files git ls-files -z --exclude-standard $opts -- ${pref:+$pref\*} 2>/dev/null)"})
   __git_command_successful $pipestatus || return
 
-  _wanted $tag expl $description _multi_parts $compadd_opts - / files
+  _wanted $tag expl $description _multi_parts -f $compadd_opts - / files
 }
 
 (( $+functions[__git_cached_files] )) ||

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Speed improvement patch for __git_files and __git_files_relative
  2011-05-06 13:03 Speed improvement patch for __git_files and __git_files_relative Nikolai Weibull
@ 2011-05-11 13:27 ` Frank Terbeck
  2011-05-11 13:44   ` Mikael Magnusson
  2011-05-11 14:09   ` Completion crash owing to bad allocation Peter Stephenson
  2011-05-17 12:55 ` Speed improvement patch for __git_files and __git_files_relative Nikolai Weibull
  1 sibling, 2 replies; 8+ messages in thread
From: Frank Terbeck @ 2011-05-11 13:27 UTC (permalink / raw)
  To: zsh-workers

Nikolai Weibull wrote:
> I’ve now put together a patch for __git_files and
> __git_files_relative.  __git_files is a lot faster than previous
> versions and __git_files_relative should be a lot faster too, now that
> it only uses substitutions.  (Well, there’s a for loop that iterates
> over the file names to determine the common path prefix, but I see no
> way of avoiding it.)
>
> It would be great if this could make it into the 4.3.12 release, so
> please give it a try as soon as possible.

Alright, I've been trying this.  The speed improvement in my linux
kernel clone is quite impressive.

I'm running into a segfault, though. The git repository is located in
`/tmp/linux-2.6'. I've changed a file (fs/adfs/dir.c) slightly and I'm
doing this:

  % git add f<tab>
  % git add fs/<tab>
  % git add fs/adfs/<tab>

And that's where the shell crashes. It's a build of today's HEAD.

The kernel repository was cloned from this URI:
<git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git>

I don't have the time to look into this right now, so here's a back
trace:

[...]
Core was generated by `zsh'.
Program terminated with signal 11, Segmentation fault.
#0  __strlen_sse2 () at ../sysdeps/i386/i686/multiarch/strlen.S:99
	in ../sysdeps/i386/i686/multiarch/strlen.S
(gdb) #0  __strlen_sse2 () at ../sysdeps/i386/i686/multiarch/strlen.S:99
No locals.
#1  0x080bd2bd in ztrdup (s=0xb70b63e0 <Address 0xb70b63e0 out of bounds>) at string.c:52
        t = 0x908c358 "fs/adfs/"
#2  0xb713e7ff in dupmatch (m=0xb70da0e8, nbeg=0, nend=0) at compcore.c:3232
        r = 0x9119960
#3  0xb713ed4c in permmatches (last=0) at compcore.c:3346
        g = 0xb70d9e88
        n = 0x91198e8
        opm = 0x9117ea0
        p = 0x911fc98
        q = 0xb70bac28
        ep = 0x809352e
        eq = 0x12
        e = 0x0
        o = 0x0
        mlist = 0xb70d9f18
        fi = 0
        nn = 1
        nl = 0
        ll = 0
        gn = 2
        mn = 1
        rn = 0
        ofi = 1
#4  0xb71347ae in get_nmatches (pm=0x9084fb0) at complete.c:1267
No locals.
#5  0x080a34fe in getstrvalue (v=0xbf994c9c) at params.c:1957
        s = 0xbf995534 ""
        ss = 0xbf994a78
        buf = '\000' <repeats 16 times>"\263, \347\204\065\000\000\000\000HJ\231\277\357\252\a\b\250\272\021\t\030\254\v\267\030\254\v\267", '\000' <repeats 12 times>, "\b\000\000\000\260O\b\t@7\017\b"
#6  0x080a17a4 in getarg (str=0xbf994b9c, inv=0xbf994ba0, v=0xbf994c9c, a2=0, w=0xbf994b90, prevcharlen=0xbf994b84, nextcharlen=0xbf994b80) at params.c:1286
        lastcharlen = 1
        hasbeg = 0
        word = 0
        rev = 0
        ind = 0
        down = 0
        l = 184
        i = 0
        ishash = 1
        keymatch = 0
        needtok = 0
        arglen = 180
        len = -1217985584
        s = 0xb70bac18 "nmatches"
        sep = 0x0
        t = 0xb70babef "\220\232"
        sav = -73 '\267'
        d = 0xbf994ad4 "\364\357f\267\240\003g\267\064U\231\277\357\253\v\267\275\313Y\220\001"
        ta = 0xb76703a0
        p = 0xbf995534
        tt = 0xb70babef "\220\232"
        c = -112 '\220'
        num = 1
        beg = 0
        r = 0
        quote_arg = 0
        pprog = 0x0
#7  0x080a2b4e in getindex (pptr=0xbf994bf4, v=0xbf994c9c, flags=256) at params.c:1674
        we = -1
        dummy = 580117842861050792
        startprevlen = 1
        startnextlen = 1
        start = -1080472649
        end = -1080472616
        inv = 0
        s = 0xb70babef "\220\232"
        tbrack = 0xb70babef "\220\232"
#8  0x080a31d4 in fetchvalue (v=0xbf994c9c, pptr=0xbf994cc0, bracks=1, flags=256) at params.c:1890
        pm = 0x911b858
        isvarat = 0
        s = 0xb70babe6 "[nmatches\220\232"
        t = 0xb70babdd "compstate[nmatches\220\232"
        ie = 0xb70babe6 "[nmatches\220\232"
        sav = 91 '['
        c = 99 'c'
        ppar = 0
#9  0x080c17c8 in paramsubst (l=0xb70bab98, n=0xb70babbc, str=0xbf994f1c, qt=1, ssub=0) at subst.c:2188
        ov = 0x0
        aptr = 0xb70babdc ""
        c = 99 'c'
        cc = -73 '\267'
        s = 0xb70babe6 "[nmatches\220\232"
        fstr = 0x0
        idbeg = 0xb70babdd "compstate[nmatches\220\232"
        idend = 0xb70ba5e8 "\300\245\v\267x\246\v\267\374\245\v\267\300\245\v\267\200\246\v\267\b\246\v\267\300\245\v\267\210\246\v\267\024\246\v\267\300\245\v\267\220\246\v\267 \246\v\267\300\245\v\267\230\246\v\267,\246\v\267\300\245\v\267\240\246\v\267\070\246\v\267\300\245\v\267\250\246\v\267D\246\v\267\300\245\v\267\260\246\v\267P\246\v\267\300\245\v\267\270\246\v\267\\\246\v\267\300\245\v\267\300\246\v\267"
        ostr = 0xb70babd8 "nm\213\232"
        colf = -1223973398
        isarr = 0
        plan9 = 1
        globsubst = 0
        evalchar = 0
        getlen = 0
        whichlen = 0
        chkset = 0
        vunset = 0
        wantt = 0
        spbreak = 0
        val = 0x0
        aval = 0x0
        vbuf = {isarr = 0, pm = 0x9084fb0, flags = 0, start = 0, end = -1, arr = 0x0}
        v = 0x0
        flags = 0
        flnum = 0
        sortit = 0
        indord = 0
        unique = 0
        casmod = 0
        quotemod = 0
        quotetype = 0
        quoteerr = 0
        mods = 0
        shsplit = 0
        sep = 0x0
        spsep = 0x0
        premul = 0x80df4df " "
        postmul = 0x80df4df " "
        preone = 0x0
        postone = 0x0
        replstr = 0x0
        prenum = 0
        postnum = 0
        multi_width = 0
        copied = 0
        arrasg = 0
        eval = 0
        aspar = 0
        presc = 0
        nojoin = 0
        inbrace = 0 '\000'
        hkeys = 0 '\000'
        hvals = 0 '\000'
        subexp = 0
        horrible_offset_hack = 0
#10 0x080bde78 in stringsubst (list=0xb70bab98, node=0xb70babbc, ssub=0, asssub=0) at subst.c:214
        qt = 1
        str3 = 0xb70babd8 "nm\213\232"
        str = 0xb70babdc ""
        c = 99 'c'
#11 0x080bd6ab in prefork (list=0xb70bab98, flags=1) at subst.c:77
        node = 0xb70babbc
        stop = 0x0
        keep = 0
        asssub = 0
#12 0x0806d5d7 in execcmd (state=0xbf9956e0, input=0, output=0, how=2, last1=2) at exec.c:2527
        hn = 0x80e29fc
        args = 0xb70bab98
        node = 0xbf995380
        fn = 0xbf9953b8
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = -1080470664
        dfil = 0
        is_cursh = -1218797637
        type = 6
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 1
        nullexec = 0
        assign = 16
        forked = 0
        is_shfunc = 0
        is_builtin = 1
        is_exec = 0
        use_defpath = 0
        cflags = 2074
        orig_cflags = 0
        checked = 1
        oautocont = -1
        redir = 0x0
        code = 102
        beg = 0x904ec68
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#13 0x0806b523 in execpline2 (state=0xbf9956e0, pcode=259, how=2, input=0, output=0, last1=0) at exec.c:1640
        pid = -1080470344
        pipes = {15, 1695263367}
#14 0x0806a99e in execpline (state=0xbf9956e0, slcode=5122, how=2, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 15
        newjob = 15
        old_simple_pline = 1
        slflags = 0
        code = 259
        lastwj = 0
        lpforked = 0
#15 0x0806a1e0 in execlist (state=0xbf9956e0, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x904ec78
        code = 5122
        ret = 1
        cj = 15
        csp = 0
        ltype = 2
        old_pline_level = 23
        old_list_pipe = 0
        oldlineno = 18
        oldnoerrexit = 1
#16 0x08069c7a in execode (p=0x8f6fb18, dont_change_job=1, exiting=0, context=0x80d6bd2 "shfunc") at exec.c:1028
        s = {prog = 0x8f6fb18, pc = 0x904ec78, strs = 0x904f160 "local"}
        zsh_eval_context_len = 32
        alen = 11
#17 0x080727e7 in runshfunc (prog=0x8f6fb18, wrap=0x0, name=0xb70bab48 "_setup") at exec.c:4641
        cont = -1080469721
        ouu = 12
        ou = 0x904dc30 "other-files"
#18 0xb7134de8 in comp_wrapper (prog=0x8f6fb18, w=0x0, name=0xb70bab48 "_setup") at complete.c:1455
        opre = 0x9119dd0 "fs/adfs/"
        oipre = 0x90455e0 ""
        oqipre = 0x9049a58 ""
        oqs = 0x911c460 "\001"
        m = 0
        pp = 0x90536d4
        osuf = 0x911e5f8 ""
        oisuf = 0x9117e48 ""
        oqisuf = 0x908f3f0 ""
        ocur = 1
        orest = 0x90850b0 "auto"
        owords = 0x9051ea8
        oq = 0x904fa18 ""
        oqi = 0x90538a0 ""
        oaq = 0x0
        kunset = 0
        sm = 512
        oredirs = 0x904dc50
        runset = 0
#19 0x08072750 in runshfunc (prog=0x8f6fb18, wrap=0xb714ec20, name=0xb70bab48 "_setup") at exec.c:4626
        cont = 1
        ouu = 12
        ou = 0x8fea760 "other-files"
#20 0x080724ef in doshfunc (shfunc=0x8f6bc68, doshargs=0xb70baac0, noreturnval=0) at exec.c:4535
        pptab = 0x911b518
        x = 0x9050198
        oargv0 = 0x904ffd8 "_description"
        oldzoptind = 1
        oldlastval = 0
        oldoptcind = 0
        oldnumpipestats = 1
        ret = -1223972160
        oldpipestats = 0x0
        saveopts = "\000\000\000\001\000\001\000\000\001\001\000\000\001\001\001\000\001\001\001\000\000\000\000\001\000\001\001\001\000\001\001\001\001\000\001\001\001\000\000\000\000\000\000\000\001\001\001\000\000\001\001\000\001\000\001\001\000\000\000\000\000\000\001\001\001\000\000\000\000\001\001\001\001\000\000\001\000\001\001\000\000\000\000\001\000\001\000\000\000\000\000\000\000\001\000\000\000\001\001\001\000\001\000\000\000\000\001\001\001\001\001\001\001", '\000' <repeats 17 times>, "\001\000\001\001\001\000\000\001\000\001\000\001\000\000\000\000\000\000\001\000\000\001\000\000\000\000\000\001\000\000\001\000\000\000\000\001"
        oldscriptname = 0xb70ba550 "_description"
        name = 0x8f6b140 "_setup"
        flags = 270336
        fname = 0xb70bab38 "_setup"
        obreaks = 0
        saveemulation = 48
        savesticky_emulation = 0
        restore_sticky = 0
        prog = 0x8f6fb18
        fstack = {prev = 0xbf995ff0, name = 0xb70bab48 "_setup", filename = 0xb70bab50 "/usr/local/share/zsh/4.3.11-dev-2/functions/Completion/Base/_setup", 
          caller = 0xb70ba560 "_description", flineno = 0, lineno = 18, tp = 1}
        funcdepth = 11
#21 0x08071c49 in execshfunc (shf=0x8f6bc68, args=0xb70baac0) at exec.c:4263
        last_file_list = 0x0
        ocs = 0x9115d70 "\f\fg\267P\266\021\t"
        ocsp = 0
        osfc = 6
#22 0x0806f7fc in execcmd (state=0xbf995ee0, input=0, output=0, how=2, last1=2) at exec.c:3172
        i = 13
        restorelist = 0x0
        removelist = 0x0
        hn = 0x8f6bc68
        args = 0xb70baac0
        node = 0x0
        fn = 0xbf995b88
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = 152148104
        dfil = 151279192
        is_cursh = 1
        type = 6
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 1
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 1
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 1
        oautocont = -1
        redir = 0x0
        code = 102
        beg = 0x908df24
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#23 0x0806b523 in execpline2 (state=0xbf995ee0, pcode=1219, how=2, input=0, output=0, last1=0) at exec.c:1640
        pid = -1223972208
        pipes = {15, -1223979008}
#24 0x0806a99e in execpline (state=0xbf995ee0, slcode=5122, how=2, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 15
        newjob = 15
        old_simple_pline = 1
        slflags = 0
        code = 1219
        lastwj = 0
        lpforked = 0
#25 0x0806a1e0 in execlist (state=0xbf995ee0, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x908df34
        code = 5122
        ret = 0
        cj = 15
        csp = 0
        ltype = 2
        old_pline_level = 22
        old_list_pipe = 0
        oldlineno = 28
        oldnoerrexit = 1
#26 0x08069c7a in execode (p=0x908d070, dont_change_job=1, exiting=0, context=0x80d6bd2 "shfunc") at exec.c:1028
        s = {prog = 0x908d070, pc = 0x908df34, strs = 0x908e6c4 "local"}
        zsh_eval_context_len = 32
        alen = 10
#27 0x080727e7 in runshfunc (prog=0x908d070, wrap=0x0, name=0xb70ba560 "_description") at exec.c:4641
        cont = 3
        ouu = 2
        ou = 0x8fea750 "\235"
#28 0xb7134de8 in comp_wrapper (prog=0x908d070, w=0x0, name=0xb70ba560 "_description") at complete.c:1455
        opre = 0x9085648 "fs/adfs/"
        oipre = 0x908ce98 ""
        oqipre = 0x9116c90 ""
        oqs = 0x911fb90 "\001"
        m = 0
        pp = 0x90536d4
        osuf = 0x9119798 ""
        oisuf = 0x904fc60 ""
        oqisuf = 0x9119a00 ""
        ocur = 1
        orest = 0x9086cc0 "auto"
        owords = 0x911fb00
        oq = 0x8f82b38 ""
        oqi = 0x911fab8 ""
        oaq = 0x0
        kunset = 0
        sm = 512
        oredirs = 0x911c330
        runset = 0
#29 0x08072750 in runshfunc (prog=0x908d070, wrap=0xb714ec20, name=0xb70ba560 "_description") at exec.c:4626
        cont = 0
        ouu = 2
        ou = 0x911fe00 "\235"
#30 0x080724ef in doshfunc (shfunc=0x8f69930, doshargs=0xb70ba468, noreturnval=0) at exec.c:4535
        pptab = 0x90850d0
        x = 0x911b524
        oargv0 = 0x9116908 "_alternative"
        oldzoptind = 1
        oldlastval = 0
        oldoptcind = 0
        oldnumpipestats = 1
        ret = -1223973784
        oldpipestats = 0x0
        saveopts = "\000\000\000\001\000\001\000\000\001\001\000\000\001\001\001\000\001\001\001\000\000\000\000\001\000\001\001\001\000\001\001\001\001\000\001\001\001\000\000\000\000\000\000\000\001\001\001\000\000\001\001\000\001\000\001\001\000\000\000\000\000\000\001\001\001\000\000\000\000\001\001\001\001\000\000\001\000\001\001\000\000\000\000\001\000\001\000\000\000\000\000\000\000\001\000\000\000\001\001\001\000\001\000\000\000\000\001\001\001\001\001\001\001", '\000' <repeats 17 times>, "\001\000\001\001\001\000\000\001\000\001\000\001\000\000\000\000\000\000\001\000\000\001\000\000\000\000\000\001\000\000\001\000\000\000\000\001"
        oldscriptname = 0xb70b9c00 "_alternative"
        name = 0x8f699c8 "_description"
        flags = 270336
        fname = 0xb70ba540 "_description"
        obreaks = 0
        saveemulation = 48
        savesticky_emulation = 0
        restore_sticky = 0
        prog = 0x908d070
        fstack = {prev = 0xbf997940, name = 0xb70ba560 "_description", 
          filename = 0xb70ba570 "/usr/local/share/zsh/4.3.11-dev-2/functions/Completion/Base/_description", caller = 0xb70b9c10 "_alternative", flineno = 0, 
          lineno = 28, tp = 1}
        funcdepth = 11
#31 0x08071c49 in execshfunc (shf=0x8f69930, args=0xb70ba468) at exec.c:4263
        last_file_list = 0x0
        ocs = 0x9123b58 "\001"
        ocsp = 3
        osfc = 6
#32 0x0806f7fc in execcmd (state=0xbf997830, input=0, output=0, how=2, last1=2) at exec.c:3172
        i = 13
        restorelist = 0x0
        removelist = 0x0
        hn = 0x8f69930
        args = 0xb70ba468
        node = 0x0
        fn = 0xbf996388
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = 152149544
        dfil = 151334504
        is_cursh = 1
        type = 6
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 1
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 1
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 1
        oautocont = -1
        redir = 0x0
        code = 134
        beg = 0x911af88
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#33 0x0806b523 in execpline2 (state=0xbf997830, pcode=1859, how=2, input=0, output=0, last1=0) at exec.c:1640
        pid = 0
        pipes = {15, 0}
#34 0x0806a99e in execpline (state=0xbf997830, slcode=6146, how=2, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 14
        newjob = 15
        old_simple_pline = 1
        slflags = 0
        code = 1859
        lastwj = 0
        lpforked = 0
#35 0x0806a1e0 in execlist (state=0xbf997830, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x911af9c
        code = 6146
        ret = 1
        cj = 14
        csp = 3
        ltype = 2
        old_pline_level = 21
        old_list_pipe = 0
        oldlineno = 24
        oldnoerrexit = 1
#36 0x08092cbb in execif (state=0xbf997830, do_exec=0) at loop.c:515
        end = 0x911b1e4
        next = 0x911b1e4
        code = 22064
        olderrexit = 1
        s = 0
        run = 1
#37 0x0806f5fd in execcmd (state=0xbf997830, input=0, output=0, how=18, last1=2) at exec.c:3124
        hn = 0x0
        args = 0x0
        node = 0x0
        fn = 0xb766eff4
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = -1080465024
        dfil = -1080465048
        is_cursh = 1
        type = 16
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 0
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 0
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 0
        oautocont = -1
        redir = 0x0
        code = 22160
        beg = 0x911af2c
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#38 0x0806b523 in execpline2 (state=0xbf997830, pcode=1603, how=18, input=0, output=0, last1=0) at exec.c:1640
        pid = 1
        pipes = {14, -1080464256}
#39 0x0806a99e in execpline (state=0xbf997830, slcode=179202, how=18, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 13
        newjob = 14
        old_simple_pline = 1
        slflags = 0
        code = 1603
        lastwj = 0
        lpforked = 0
#40 0x0806a1e0 in execlist (state=0xbf997830, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x911b1e4
        code = 179202
        ret = -1223974264
        cj = 13
        csp = 2
        ltype = 18
        old_pline_level = 20
        old_list_pipe = 0
        oldlineno = 23
        oldnoerrexit = 1
#41 0x08091efe in execfor (state=0xbf997830, do_exec=0) at loop.c:159
        end = 0x911b1e4
        loop = 0x911af20
        code = 22923
        iscond = 0
        ctok = 0
        atok = 0
        last = 0
        name = 0xb70ba160 "def"
        str = 0xb70ba1b0 "other-files::__git_other_files"
        cond = 0x0
        advance = 0x0
        val = 0
        vars = 0xb70ba148
        args = 0xb70ba168
#42 0x0806f5fd in execcmd (state=0xbf997830, input=0, output=0, how=2, last1=2) at exec.c:3124
        hn = 0x0
        args = 0x0
        node = 0x30
        fn = 0xbf996ef8
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = 151542488
        dfil = 0
        is_cursh = 1
        type = 11
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 0
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 0
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 0
        oautocont = -1
        redir = 0x0
        code = 22923
        beg = 0x911af14
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#43 0x0806b523 in execpline2 (state=0xbf997830, pcode=1539, how=2, input=0, output=0, last1=0) at exec.c:1640
        pid = 17
        pipes = {13, -1217990668}
#44 0x0806a99e in execpline (state=0xbf997830, slcode=185346, how=2, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 12
        newjob = 13
        old_simple_pline = 1
        slflags = 0
        code = 1539
        lastwj = 0
        lpforked = 0
#45 0x0806a1e0 in execlist (state=0xbf997830, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x911b1e4
        code = 185346
        ret = 1
        cj = 12
        csp = 1
        ltype = 2
        old_pline_level = 19
        old_list_pipe = 0
        oldlineno = 22
        oldnoerrexit = 1
#46 0x08092917 in execwhile (state=0xbf997830, do_exec=0) at loop.c:410
        end = 0x911b210
        loop = 0x911aef4
        code = 12749
        olderrexit = 1
        oldval = 0
        isuntil = 0
#47 0x0806f5fd in execcmd (state=0xbf997830, input=0, output=0, how=2, last1=2) at exec.c:3124
        hn = 0x0
        args = 0x0
        node = 0xbf9974b0
        fn = 0x17
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = 152154765
        dfil = -1080462144
        is_cursh = 1
        type = 13
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 0
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 0
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 0
        oautocont = -1
        redir = 0x0
        code = 12749
        beg = 0x911aef0
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#48 0x0806b523 in execpline2 (state=0xbf997830, pcode=1475, how=2, input=0, output=0, last1=0) at exec.c:1640
        pid = -1223975272
        pipes = {12, -1223979008}
#49 0x0806a99e in execpline (state=0xbf997830, slcode=205826, how=2, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 12
        newjob = 12
        old_simple_pline = 1
        slflags = 0
        code = 1475
        lastwj = 0
        lpforked = 0
#50 0x0806a1e0 in execlist (state=0xbf997830, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x911b210
        code = 205826
        ret = 1
        cj = 12
        csp = 0
        ltype = 2
        old_pline_level = 18
        old_list_pipe = 0
        oldlineno = 34
        oldnoerrexit = 1
#51 0x08069c7a in execode (p=0x911c400, dont_change_job=1, exiting=0, context=0x80d6bd2 "shfunc") at exec.c:1028
        s = {prog = 0x911c400, pc = 0x911af9c, strs = 0x911b26c "local"}
        zsh_eval_context_len = 32
        alen = 9
#52 0x080727e7 in runshfunc (prog=0x911c400, wrap=0x0, name=0xb70b9c10 "_alternative") at exec.c:4641
        cont = 104
        ouu = 68
        ou = 0x9053600 "ignored-other-files:ignored other files:__git_other_files --ignored"
#53 0xb7134de8 in comp_wrapper (prog=0x911c400, w=0x0, name=0xb70b9c10 "_alternative") at complete.c:1455
        opre = 0x904dc40 "fs/adfs/"
        oipre = 0x911b508 ""
        oqipre = 0x9043be8 ""
        oqs = 0x911e8e0 "\001"
        m = 0
        pp = 0x90536d4
        osuf = 0x908af70 ""
        oisuf = 0x9050180 ""
        oqisuf = 0x9086ce0 ""
        ocur = 1
        orest = 0x8f532d0 "auto"
        owords = 0x908d8f0
        oq = 0x9086cd0 ""
        oqi = 0x911e8f0 ""
        oaq = 0x0
        kunset = 0
        sm = 512
        oredirs = 0x908ee00
        runset = 0
#54 0x08072750 in runshfunc (prog=0x911c400, wrap=0xb714ec20, name=0xb70b9c10 "_alternative") at exec.c:4626
        cont = 0
        ouu = 68
        ou = 0x9119d30 "ignored-other-files:ignored other files:__git_other_files --ignored"
#55 0x080724ef in doshfunc (shfunc=0x8f66b30, doshargs=0xb70b9a88, noreturnval=0) at exec.c:4535
        pptab = 0x9123c80
        x = 0x908c378
        oargv0 = 0x9118940 "_git-add"
        oldzoptind = 1
        oldlastval = 0
        oldoptcind = 0
        oldnumpipestats = 1
        ret = 81
        oldpipestats = 0x0
        saveopts = "\000\000\000\001\000\001\000\000\001\001\000\000\001\001\001\000\001\001\001\000\000\000\000\001\000\001\001\001\000\001\001\001\001\000\001\001\001\000\000\000\000\000\000\000\001\001\001\000\000\001\001\000\001\000\001\001\000\000\000\000\000\000\001\001\001\000\000\000\000\001\001\001\001\000\000\001\000\001\001\000\000\000\000\001\000\001\000\000\000\000\000\000\000\001\000\000\000\001\001\001\000\001\000\000\000\000\001\001\001\001\001\001\001", '\000' <repeats 17 times>, "\001\000\001\001\001\000\000\001\000\001\000\001\000\000\000\000\000\000\001\000\000\001\000\000\000\000\000\001\000\000\001\000\000\000\000\001"
        oldscriptname = 0xb70c0ba0 "_git-add"
        name = 0x8f57f70 "_alternative"
        flags = 270336
        fname = 0xb70b9bf0 "_alternative"
        obreaks = 0
        saveemulation = 48
        savesticky_emulation = 0
        restore_sticky = 0
        prog = 0x911c400
        fstack = {prev = 0xbf998700, name = 0xb70b9c10 "_alternative", 
          filename = 0xb70b9c20 "/usr/local/share/zsh/4.3.11-dev-2/functions/Completion/Base/_alternative", caller = 0xb70c0bb0 "_git-add", flineno = 0, 
          lineno = 34, tp = 1}
        funcdepth = 11
#56 0x08071c49 in execshfunc (shf=0x8f66b30, args=0xb70b9a88) at exec.c:4263
        last_file_list = 0x0
        ocs = 0x908f258 "\020\006\n\267\320\004g\267\006\nontext\213\205curcontext state line\n\tdeclare -A opt_args\n\tlocal ignore_missing\213\n\tif (( words[(I)-n|--dry-run] ))\n\tthen\n\t\tignore_missing=\231--ignore-missing[check if files (even missing) are ignored "...
        ocsp = 1
        osfc = 6
#57 0x0806f7fc in execcmd (state=0xbf9985f0, input=0, output=0, how=2, last1=2) at exec.c:3172
        i = 13
        restorelist = 0x0
        removelist = 0x0
        hn = 0x8f66b30
        args = 0xb70b9a88
        node = 0x908ee00
        fn = 0xb7599516
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = 151542600
        dfil = 48
        is_cursh = 1
        type = 6
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 1
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 1
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 1
        oautocont = -1
        redir = 0x0
        code = 134
        beg = 0x9097f34
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#58 0x0806b523 in execpline2 (state=0xbf9985f0, pcode=2243, how=2, input=0, output=0, last1=0) at exec.c:1640
        pid = 17
        pipes = {12, 0}
#59 0x0806a99e in execpline (state=0xbf9985f0, slcode=6178, how=2, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 11
        newjob = 12
        old_simple_pline = 1
        slflags = 0
        code = 2243
        lastwj = 0
        lpforked = 0
#60 0x0806a229 in execlist (state=0xbf9985f0, dont_change_job=1, exiting=0) at exec.c:1216
        donedebug = 0
        donetrap = 0
        next = 0x9097f48
        code = 6178
        ret = 65536
        cj = 11
        csp = 1
        ltype = 18
        old_pline_level = 17
        old_list_pipe = 0
        oldlineno = 24
        oldnoerrexit = 1
#61 0x08093044 in execcase (state=0xbf9985f0, do_exec=0) at loop.c:593
        end = 0x9097f60
        next = 0x9097f60
        code = 9775
        word = 0xb70c0fd8 "file"
        pat = 0x0
        npat = 0
        save = 0
        spprog = 0x9097db0
        pprog = 0x911b828
#62 0x0806f5fd in execcmd (state=0xbf9985f0, input=0, output=0, how=18, last1=2) at exec.c:3124
        hn = 0x0
        args = 0x0
        node = 0xbf998290
        fn = 0xbf9982c8
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = -1080458616
        dfil = 0
        is_cursh = 1
        type = 15
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 0
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 0
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 0
        oautocont = -1
        redir = 0x0
        code = 10255
        beg = 0x9097ebc
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#63 0x0806b523 in execpline2 (state=0xbf9985f0, pcode=1603, how=18, input=0, output=0, last1=0) at exec.c:1640
        pid = -1080458296
        pipes = {11, -1080454668}
#64 0x0806a99e in execpline (state=0xbf9985f0, slcode=43010, how=18, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 11
        newjob = 11
        old_simple_pline = 1
        slflags = 0
        code = 1603
        lastwj = 0
        lpforked = 0
#65 0x0806a1e0 in execlist (state=0xbf9985f0, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x9097f60
        code = 43010
        ret = 1
        cj = 11
        csp = 0
        ltype = 18
        old_pline_level = 16
        old_list_pipe = 0
        oldlineno = 22
        oldnoerrexit = 1
#66 0x08069c7a in execode (p=0x9097cb8, dont_change_job=1, exiting=0, context=0x80d6bd2 "shfunc") at exec.c:1028
        s = {prog = 0x9097cb8, pc = 0x9097f48, strs = 0x9097f64 "local"}
        zsh_eval_context_len = 32
        alen = 8
#67 0x080727e7 in runshfunc (prog=0x9097cb8, wrap=0x0, name=0xb70c0bb0 "_git-add") at exec.c:4641
        cont = 1
        ouu = 9
        ou = 0x904dad0 "_git-add"
#68 0xb7134de8 in comp_wrapper (prog=0x9097cb8, w=0x0, name=0xb70c0bb0 "_git-add") at complete.c:1455
        opre = 0x911ebd0 "fs/adfs/"
        oipre = 0x9097b08 ""
        oqipre = 0x908fdb8 ""
        oqs = 0x911c4d0 "\001"
        m = 0
        pp = 0x90536d4
        osuf = 0x911c0c8 ""
        oisuf = 0x9097d98 ""
        oqisuf = 0x908fd90 ""
        ocur = 2
        orest = 0x9116100 "auto"
        owords = 0x9097ca0
        oq = 0x9116150 ""
        oqi = 0x9116178 ""
        oaq = 0x0
        kunset = 0
        sm = 512
        oredirs = 0x904dac0
        runset = 0
#69 0x08072750 in runshfunc (prog=0x9097cb8, wrap=0xb714ec20, name=0xb70c0bb0 "_git-add") at exec.c:4626
        cont = -1080457500
        ouu = 9
        ou = 0x911c9c8 "_git-add"
#70 0x080724ef in doshfunc (shfunc=0x9049370, doshargs=0xb70c0b60, noreturnval=0) at exec.c:4535
        pptab = 0x908d888
        x = 0x9123c80
        oargv0 = 0x9053658 "_call_function"
        oldzoptind = 1
        oldlastval = 0
        oldoptcind = 0
        oldnumpipestats = 1
        ret = -1223947424
        oldpipestats = 0x0
        saveopts = "\000\000\000\001\000\001\000\000\001\001\000\000\001\001\001\000\001\001\001\000\000\000\000\001\000\001\001\001\000\001\001\001\001\000\001\001\001\000\000\000\000\000\000\000\001\001\001\000\000\001\001\000\001\000\001\001\000\000\000\000\000\000\001\001\001\000\000\000\000\001\001\001\001\000\000\001\000\001\001\000\000\000\000\001\000\001\000\000\000\000\000\000\000\001\000\000\000\001\001\001\000\001\000\000\000\000\001\001\001\001\001\001\001", '\000' <repeats 17 times>, "\001\000\001\001\001\000\000\001\000\001\000\001\000\000\000\000\000\000\001\000\000\001\000\000\000\000\000\001\000\000\001\000\000\000\000\001"
        oldscriptname = 0xb70c0360 "_call_function"
        name = 0x9097c38 "_git-add"
        flags = 0
        fname = 0xb70c0b90 "_git-add"
        obreaks = 0
        saveemulation = 48
        savesticky_emulation = 0
        restore_sticky = 0
        prog = 0x9097cb8
        fstack = {prev = 0xbf9994b0, name = 0xb70c0bb0 "_git-add", filename = 0xb70c0bc0 "_git", caller = 0xb70c0370 "_call_function", flineno = 28, lineno = 22, 
          tp = 1}
        funcdepth = 11
#71 0x08071c49 in execshfunc (shf=0x9049370, args=0xb70c0b60) at exec.c:4263
        last_file_list = 0x0
        ocs = 0x908eb50 "\006\tg\267P;\022\t"
        ocsp = 1
        osfc = 6
#72 0x0806f7fc in execcmd (state=0xbf9993a0, input=0, output=0, how=2, last1=2) at exec.c:3172
        i = 13
        restorelist = 0x0
        removelist = 0x0
        hn = 0x9049370
        args = 0xb70c0b60
        node = 0x80f3740
        fn = 0xbf998ac8
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = -1080455964
        dfil = -1080455976
        is_cursh = 1
        type = 6
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 1
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 1
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 0
        oautocont = -1
        redir = 0x0
        code = 38
        beg = 0x9096778
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#73 0x0806b523 in execpline2 (state=0xbf9993a0, pcode=1475, how=2, input=0, output=0, last1=0) at exec.c:1640
        pid = 1
        pipes = {11, 1}
#74 0x0806a99e in execpline (state=0xbf9993a0, slcode=3074, how=2, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 10
        newjob = 11
        old_simple_pline = 1
        slflags = 0
        code = 1475
        lastwj = 0
        lpforked = 0
#75 0x0806a1e0 in execlist (state=0xbf9993a0, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x9096780
        code = 3074
        ret = 0
        cj = 10
        csp = 1
        ltype = 2
        old_pline_level = 15
        old_list_pipe = 0
        oldlineno = 21
        oldnoerrexit = 1
#76 0x08092cbb in execif (state=0xbf9993a0, do_exec=0) at loop.c:515
        end = 0x90967f0
        next = 0x90967f0
        code = 4784
        olderrexit = 1
        s = 0
        run = 1
#77 0x0806f5fd in execcmd (state=0xbf9993a0, input=0, output=0, how=2, last1=2) at exec.c:3124
        hn = 0x0
        args = 0x0
        node = 0x0
        fn = 0xbf999048
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = 152168896
        dfil = 151313072
        is_cursh = 1
        type = 16
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 0
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 0
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 0
        oautocont = -1
        redir = 0x0
        code = 4880
        beg = 0x9096754
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#78 0x0806b523 in execpline2 (state=0xbf9993a0, pcode=1411, how=2, input=0, output=0, last1=0) at exec.c:1640
        pid = -1223949288
        pipes = {10, -1223962624}
#79 0x0806a99e in execpline (state=0xbf9993a0, slcode=40962, how=2, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 10
        newjob = 10
        old_simple_pline = 1
        slflags = 0
        code = 1411
        lastwj = 0
        lpforked = 0
#80 0x0806a1e0 in execlist (state=0xbf9993a0, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x90967f0
        code = 40962
        ret = 0
        cj = 10
        csp = 0
        ltype = 2
        old_pline_level = 14
        old_list_pipe = 0
        oldlineno = 52
        oldnoerrexit = 1
#81 0x08069c7a in execode (p=0x904db70, dont_change_job=1, exiting=0, context=0x80d6bd2 "shfunc") at exec.c:1028
        s = {prog = 0x904db70, pc = 0x9096780, strs = 0x909680c "local"}
        zsh_eval_context_len = 32
        alen = 7
#82 0x080727e7 in runshfunc (prog=0x904db70, wrap=0x0, name=0xb70c0370 "_call_function") at exec.c:4641
        cont = 184
        ouu = 9
        ou = 0x9116dc0 "_git-add"
#83 0xb7134de8 in comp_wrapper (prog=0x904db70, w=0x0, name=0xb70c0370 "_call_function") at complete.c:1455
        opre = 0x9116110 "fs/adfs/"
        oipre = 0x9116130 ""
        oqipre = 0x9116168 ""
        oqs = 0x908fda8 "\001"
        m = 0
        pp = 0x90536d4
        osuf = 0x9116120 ""
        oisuf = 0x9116140 ""
        oqisuf = 0x908fd60 ""
        ocur = 2
        orest = 0x9053cb0 "auto"
        owords = 0x908fdd0
        oq = 0x908fd70 ""
        oqi = 0x908fd80 ""
        oaq = 0x0
        kunset = 0
        sm = 512
        oredirs = 0x911c9d8
        runset = 0
#84 0x08072750 in runshfunc (prog=0x904db70, wrap=0xb714ec20, name=0xb70c0370 "_call_function") at exec.c:4626
        cont = -1080453952
        ouu = 9
        ou = 0x9116668 "_git-add"
#85 0x080724ef in doshfunc (shfunc=0x8f68130, doshargs=0xb70c02c8, noreturnval=0) at exec.c:4535
        pptab = 0x911bb30
        x = 0x9097b10
        oargv0 = 0x904e378 "_git"
        oldzoptind = 1
        oldlastval = 0
        oldoptcind = 0
        oldnumpipestats = 1
        ret = -1223949624
        oldpipestats = 0x0
        saveopts = "\000\000\000\001\000\001\000\000\001\001\000\000\001\001\001\000\001\001\001\000\000\000\000\001\000\001\001\001\000\001\001\001\001\000\001\001\001\000\000\000\000\000\000\000\001\001\001\000\000\001\001\000\001\000\001\001\000\000\000\000\000\000\001\001\001\000\000\000\000\001\001\001\001\000\000\001\000\001\001\000\000\000\000\001\000\001\000\000\000\000\000\000\000\001\000\000\000\001\001\001\000\001\000\000\000\000\001\001\001\001\001\001\001", '\000' <repeats 17 times>, "\001\000\001\001\001\000\000\001\000\001\000\001\000\000\000\000\000\000\001\000\000\001\000\000\000\000\000\001\000\000\001\000\000\000\000\001"
        oldscriptname = 0xb70c2650 "_git"
        name = 0x8f689c8 "_call_function"
        flags = 270336
        fname = 0xb70c0350 "_call_function"
        obreaks = 0
        saveemulation = 48
        savesticky_emulation = 0
        restore_sticky = 0
        prog = 0x904db70
        fstack = {prev = 0xbf99a820, name = 0xb70c0370 "_call_function", 
          filename = 0xb70c0380 "/usr/local/share/zsh/4.3.11-dev-2/functions/Completion/Base/_call_function", caller = 0xb70c2658 "_git", flineno = 0, lineno = 52, 
          tp = 1}
        funcdepth = 11
#86 0x08071c49 in execshfunc (shf=0x8f68130, args=0xb70c02c8) at exec.c:4263
        last_file_list = 0x0
        ocs = 0x911c7e0 "\006\020\n\267\330\004g\267\020"
        ocsp = 2
        osfc = 6
#87 0x0806f7fc in execcmd (state=0xbf99a710, input=0, output=0, how=18, last1=2) at exec.c:3172
        i = 13
        restorelist = 0x0
        removelist = 0x0
        hn = 0x8f68130
        args = 0xb70c02c8
        node = 0x0
        fn = 0xbf999848
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = 151547696
        dfil = 151616288
        is_cursh = 1
        type = 6
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 1
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 1
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 1
        oautocont = -1
        redir = 0x0
        code = 102
        beg = 0x91157f8
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#88 0x0806b523 in execpline2 (state=0xbf99a710, pcode=3395, how=18, input=0, output=0, last1=0) at exec.c:1640
        pid = 17
        pipes = {10, 0}
#89 0x0806a99e in execpline (state=0xbf99a710, slcode=5122, how=18, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 9
        newjob = 10
        old_simple_pline = 1
        slflags = 0
        code = 3395
        lastwj = 0
        lpforked = 0
#90 0x0806a1e0 in execlist (state=0xbf99a710, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x9115808
        code = 5122
        ret = 65536
        cj = 9
        csp = 2
        ltype = 18
        old_pline_level = 13
        old_list_pipe = 0
        oldlineno = 45
        oldnoerrexit = 1
#91 0x08093044 in execcase (state=0xbf99a710, do_exec=0) at loop.c:593
        end = 0x9115808
        next = 0x9115808
        code = 3887
        word = 0xb70c4fa0 "option-or-argument"
        pat = 0x0
        npat = 2
        save = 0
        spprog = 0x91154c0
        pprog = 0x9116950
#92 0x0806f5fd in execcmd (state=0xbf99a710, input=0, output=0, how=18, last1=2) at exec.c:3124
        hn = 0x0
        args = 0x0
        node = 0x80f3740
        fn = 0x97
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = 152149400
        dfil = -1080450908
        is_cursh = 1
        type = 15
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 0
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 0
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 0
        oautocont = -1
        redir = 0x0
        code = 7951
        beg = 0x9115788
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#93 0x0806b523 in execpline2 (state=0xbf99a710, pcode=2947, how=18, input=0, output=0, last1=0) at exec.c:1640
        pid = -1223951064
        pipes = {9, -1223962624}
#94 0x0806a99e in execpline (state=0xbf99a710, slcode=33794, how=18, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 9
        newjob = 9
        old_simple_pline = 1
        slflags = 0
        code = 2947
        lastwj = 0
        lpforked = 0
#95 0x0806a1e0 in execlist (state=0xbf99a710, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x9115808
        code = 33794
        ret = 1
        cj = 8
        csp = 1
        ltype = 18
        old_pline_level = 12
        old_list_pipe = 0
        oldlineno = 25
        oldnoerrexit = 1
#96 0x08092cbb in execif (state=0xbf99a710, do_exec=0) at loop.c:515
        end = 0x9115828
        next = 0x9115808
        code = 10160
        olderrexit = 1
        s = 0
        run = 1
#97 0x0806f5fd in execcmd (state=0xbf99a710, input=0, output=0, how=2, last1=2) at exec.c:3124
        hn = 0x0
        args = 0x0
        node = 0x8ef4848
        fn = 0xbf99a448
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = -1080449652
        dfil = 4
        is_cursh = 1
        type = 16
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 0
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 0
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 0
        oautocont = -1
        redir = 0x0
        code = 11280
        beg = 0x91156c4
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#98 0x0806b523 in execpline2 (state=0xbf99a710, pcode=1667, how=2, input=0, output=0, last1=0) at exec.c:1640
        pid = -1223940444
        pipes = {8, 150297880}
#99 0x0806a99e in execpline (state=0xbf99a710, slcode=92162, how=2, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 8
        newjob = 8
        old_simple_pline = 1
        slflags = 0
        code = 1667
        lastwj = 0
        lpforked = 0
#100 0x0806a1e0 in execlist (state=0xbf99a710, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x9115828
        code = 92162
        ret = -1217985584
        cj = 8
        csp = 0
        ltype = 2
        old_pline_level = 11
        old_list_pipe = 0
        oldlineno = 1
        oldnoerrexit = 1
#101 0x08069c7a in execode (p=0x9115490, dont_change_job=1, exiting=0, context=0x80d6bd2 "shfunc") at exec.c:1028
        s = {prog = 0x9115490, pc = 0x9115808, strs = 0x9115844 " CURRENT > 2 "}
        zsh_eval_context_len = 32
        alen = 6
#102 0x080727e7 in runshfunc (prog=0x9115490, wrap=0x0, name=0xb70c2658 "_git") at exec.c:4641
        cont = 272
        ouu = 5
        ou = 0x9116c48 "_git"
#103 0xb7134de8 in comp_wrapper (prog=0x9115490, w=0x0, name=0xb70c2658 "_git") at complete.c:1455
        opre = 0x908da30 "fs/adfs/"
        oipre = 0x9096900 ""
        oqipre = 0x8f69a88 ""
        oqs = 0x90452c0 "\001"
        m = 0
        pp = 0x90536d4
        osuf = 0x8efc158 ""
        oisuf = 0x90459f0 ""
        oqisuf = 0x9044c50 ""
        ocur = 3
        orest = 0x9097bf8 "auto"
        owords = 0x9084180
        oq = 0x90443c0 ""
        oqi = 0x8f6be58 ""
        oaq = 0x0
        kunset = 0
        sm = 512
        oredirs = 0x9116c38
        runset = 0
#104 0x08072750 in runshfunc (prog=0x9115490, wrap=0xb714ec20, name=0xb70c2658 "_git") at exec.c:4626
        cont = -1080449017
        ouu = 5
        ou = 0x911c608 "_git"
#105 0x080724ef in doshfunc (shfunc=0x9115d28, doshargs=0xb70c2628, noreturnval=0) at exec.c:4535
        pptab = 0x8f68100
        x = 0x911bb30
        oargv0 = 0x9118c88 "_dispatch"
        oldzoptind = 1
        oldlastval = 0
        oldoptcind = 0
        oldnumpipestats = 1
        ret = -1223940568
        oldpipestats = 0x0
        saveopts = "\000\000\000\001\000\001\000\000\001\001\000\000\001\001\001\000\001\001\001\000\000\000\000\001\000\001\001\001\000\001\001\001\001\000\001\001\001\000\000\000\000\000\000\000\001\001\001\000\000\001\001\000\001\000\001\001\000\000\000\000\000\000\001\001\001\000\000\000\000\001\001\001\001\000\000\001\000\001\001\000\000\000\000\001\000\001\000\000\000\000\000\000\000\001\000\000\000\001\001\001\000\001\000\000\000\000\001\001\001\001\001\001\001", '\000' <repeats 17 times>, "\001\000\001\001\001\000\000\001\000\001\000\001\000\000\000\000\000\000\001\000\000\001\000\000\000\000\000\001\000\000\001\000\000\000\000\001"
        oldscriptname = 0x80d5e76 "(eval)"
        name = 0x9115d60 "_git"
        flags = 0
        fname = 0xb70c2648 "_git"
        obreaks = 0
        saveemulation = 48
        savesticky_emulation = 0
        restore_sticky = 0
        prog = 0x9115490
        fstack = {prev = 0xbf99af4c, name = 0xb70c2658 "_git", filename = 0xb70c2660 "_git", caller = 0x80d5e76 "(eval)", flineno = 5964, lineno = 1, tp = 1}
        funcdepth = 11
#106 0x08071c49 in execshfunc (shf=0x9115d28, args=0xb70c2628) at exec.c:4263
        last_file_list = 0x0
        ocs = 0x908fbc0 "\006\n"
        ocsp = 1
        osfc = 6
#107 0x0806f7fc in execcmd (state=0xbf99af10, input=0, output=0, how=18, last1=2) at exec.c:3172
        i = 12
        restorelist = 0x0
        removelist = 0x0
        hn = 0x9115d28
        args = 0xb70c2628
        node = 0xbf99ab90
        fn = 0xbf99b4c4
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = 135214912
        dfil = -1080445756
        is_cursh = 1
        type = 6
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 0
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 1
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 1
        oautocont = -1
        redir = 0x0
        code = 38
        beg = 0xb70c2604
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#108 0x0806b523 in execpline2 (state=0xbf99af10, pcode=131, how=18, input=0, output=0, last1=0) at exec.c:1640
        pid = -1080447768
        pipes = {8, -1080447024}
#109 0x0806a99e in execpline (state=0xbf99af10, slcode=3074, how=18, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 7
        newjob = 8
        old_simple_pline = 1
        slflags = 0
        code = 131
        lastwj = 0
        lpforked = 0
#110 0x0806a1e0 in execlist (state=0xbf99af10, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0xb70c260c
        code = 3074
        ret = -1217985632
        cj = 7
        csp = 1
        ltype = 18
        old_pline_level = 10
        old_list_pipe = 0
        oldlineno = 63
        oldnoerrexit = 1
#111 0x08069c7a in execode (p=0xb70c25d0, dont_change_job=1, exiting=0, context=0x80d40f6 "eval") at exec.c:1028
        s = {prog = 0xb70c25d0, pc = 0xb70c260c, strs = 0xb70c2610 "_git"}
        zsh_eval_context_len = 32
        alen = 5
#112 0x08063724 in eval (argv=0xbf99afc0) at builtin.c:4908
        prog = 0xb70c25d0
        oscriptname = 0xb70c2048 "_dispatch"
        oineval = 0
        fpushed = 1
        fstack = {prev = 0xbf99bd30, name = 0x80d5e76 "(eval)", filename = 0xb70c2068 "/usr/local/share/zsh/4.3.11-dev-2/functions/Completion/Base/_dispatch", 
          caller = 0xb70c2058 "_dispatch", flineno = 63, lineno = 63, tp = 2}
#113 0x080639e9 in bin_eval (nam=0xb70c2578 "eval", argv=0xbf99afc0, ops=0xbf99b004, func=14) at builtin.c:5017
No locals.
#114 0x08055a26 in execbuiltin (args=0xb70c2550, bn=0x80e27bc) at builtin.c:450
        argarr = 0xbf99afc0
        argv = 0xbf99afc0
        pp = 0x0
        name = 0xb70c2578 "eval"
        optstr = 0x0
        flags = 2056
        sense = 1521
        argc = 1
        execop = 149899336
        xtr = 0
        ops = {ind = '\000' <repeats 127 times>, args = 0x0, argscount = 0, argsalloc = 0}
#115 0x0806f87e in execcmd (state=0xbf99bc20, input=0, output=0, how=2, last1=2) at exec.c:3183
        restorelist = 0x0
        removelist = 0x0
        hn = 0x80e27bc
        args = 0xb70c2550
        node = 0x0
        fn = 0xbf99b318
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = 152149808
        dfil = 151616440
        is_cursh = 1
        type = 6
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 1
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 0
        is_builtin = 1
        is_exec = 0
        use_defpath = 0
        cflags = 2056
        orig_cflags = 0
        checked = 1
        oautocont = -1
        redir = 0x0
        code = 70
        beg = 0x9084b38
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#116 0x0806b523 in execpline2 (state=0xbf99bc20, pcode=4099, how=2, input=0, output=0, last1=0) at exec.c:1640
        pid = 48
        pipes = {7, -1223946240}
#117 0x0806a99e in execpline (state=0xbf99bc20, slcode=4130, how=2, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 6
        newjob = 7
        old_simple_pline = 1
        slflags = 0
        code = 4099
        lastwj = 0
        lpforked = 0
#118 0x0806a229 in execlist (state=0xbf99bc20, dont_change_job=1, exiting=0) at exec.c:1216
        donedebug = 0
        donetrap = 0
        next = 0x9084b44
        code = 4130
        ret = 1
        cj = 6
        csp = 1
        ltype = 2
        old_pline_level = 9
        old_list_pipe = 0
        oldlineno = 61
        oldnoerrexit = 1
#119 0x08092cbb in execif (state=0xbf99bc20, do_exec=0) at loop.c:515
        end = 0x9084b8c
        next = 0x9084b8c
        code = 5040
        olderrexit = 1
        s = 0
        run = 1
#120 0x0806f5fd in execcmd (state=0xbf99bc20, input=0, output=0, how=2, last1=2) at exec.c:3124
        hn = 0x0
        args = 0x0
        node = 0x0
        fn = 0xbf99b8c8
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = 152156456
        dfil = 151323328
        is_cursh = 1
        type = 16
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 0
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 0
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 0
        oautocont = -1
        redir = 0x0
        code = 5136
        beg = 0x9084ae8
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#121 0x0806b523 in execpline2 (state=0xbf99bc20, pcode=3971, how=2, input=0, output=0, last1=0) at exec.c:1640
        pid = -1223941400
        pipes = {6, -1223946240}
#122 0x0806a99e in execpline (state=0xbf99bc20, slcode=43010, how=2, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 6
        newjob = 6
        old_simple_pline = 1
        slflags = 0
        code = 3971
        lastwj = 0
        lpforked = 0
#123 0x0806a1e0 in execlist (state=0xbf99bc20, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x9084b8c
        code = 43010
        ret = 1
        cj = 6
        csp = 0
        ltype = 2
        old_pline_level = 8
        old_list_pipe = 0
        oldlineno = 40
        oldnoerrexit = 1
#124 0x08069c7a in execode (p=0x90841e8, dont_change_job=1, exiting=0, context=0x80d6bd2 "shfunc") at exec.c:1028
        s = {prog = 0x90841e8, pc = 0x9084b44, strs = 0x9084db4 "local"}
        zsh_eval_context_len = 32
        alen = 4
#125 0x080727e7 in runshfunc (prog=0x90841e8, wrap=0x0, name=0xb70c2058 "_dispatch") at exec.c:4641
        cont = 272
        ouu = 10
        ou = 0x911e688 "-default-"
#126 0xb7134de8 in comp_wrapper (prog=0x90841e8, w=0x0, name=0xb70c2058 "_dispatch") at complete.c:1455
        opre = 0x9097c08 "fs/adfs/"
        oipre = 0x9053d68 ""
        oqipre = 0x9053d88 ""
        oqs = 0x9053dc8 "\001"
        m = 0
        pp = 0x90536d4
        osuf = 0x9097c18 ""
        oisuf = 0x9053d78 ""
        oqisuf = 0x9053d98 ""
        ocur = 3
        orest = 0x9052358 "auto"
        owords = 0x9085178
        oq = 0x9053da8 ""
        oqi = 0x9053db8 ""
        oaq = 0x0
        kunset = 0
        sm = 512
        oredirs = 0x911e678
        runset = 0
#127 0x08072750 in runshfunc (prog=0x90841e8, wrap=0xb714ec20, name=0xb70c2058 "_dispatch") at exec.c:4626
        cont = 151536416
        ouu = 10
        ou = 0x9097be8 "-default-"
#128 0x080724ef in doshfunc (shfunc=0x8f69b30, doshargs=0xb70c1f20, noreturnval=0) at exec.c:4535
        pptab = 0x9044258
        x = 0x9116c4c
        oargv0 = 0x908d0d0 "_normal"
        oldzoptind = 1
        oldlastval = 0
        oldoptcind = 0
        oldnumpipestats = 1
        ret = -1223942368
        oldpipestats = 0x0
        saveopts = "\000\000\000\001\000\001\000\000\001\001\000\000\001\001\001\000\001\001\001\000\000\000\000\001\000\001\001\001\000\001\001\001\001\000\001\001\001\000\000\000\000\000\000\000\001\001\001\000\000\001\001\000\001\000\001\001\000\000\000\000\000\000\001\001\001\000\000\000\000\001\001\001\001\000\000\001\000\001\001\000\000\000\000\001\000\001\000\000\000\000\000\000\000\001\000\000\000\001\001\001\000\001\000\000\000\000\001\001\001\001\001\001\001", '\000' <repeats 17 times>, "\001\000\001\001\001\000\000\001\000\001\000\001\000\000\000\000\000\000\001\000\000\001\000\000\000\000\000\001\000\000\001\000\000\000\000\001"
        oldscriptname = 0xb70c1cc0 "_normal"
        name = 0x8f69440 "_dispatch"
        flags = 270336
        fname = 0xb70c2038 "_dispatch"
        obreaks = 0
        saveemulation = 48
        savesticky_emulation = 0
        restore_sticky = 0
        prog = 0x90841e8
        fstack = {prev = 0xbf99c530, name = 0xb70c2058 "_dispatch", filename = 0xb70c2068 "/usr/local/share/zsh/4.3.11-dev-2/functions/Completion/Base/_dispatch", 
          caller = 0xb70c1cc8 "_normal", flineno = 0, lineno = 40, tp = 1}
        funcdepth = 11
#129 0x08071c49 in execshfunc (shf=0x8f69b30, args=0xb70c1f20) at exec.c:4263
        last_file_list = 0x0
        ocs = 0x91186d8 "\005\ng\267\270n\b\tfs/adfs/"
        ocsp = 0
        osfc = 6
#130 0x0806f7fc in execcmd (state=0xbf99c420, input=0, output=0, how=18, last1=2) at exec.c:3172
        i = 12
        restorelist = 0x0
        removelist = 0x0
        hn = 0x8f69b30
        args = 0xb70c1f20
        node = 0x0
        fn = 0x0
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = -1218833753
        dfil = 135214912
        is_cursh = 1
        type = 6
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 1
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 1
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 1
        oautocont = -1
        redir = 0x0
        code = 198
        beg = 0x9083e48
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#131 0x0806b523 in execpline2 (state=0xbf99c420, pcode=2627, how=18, input=0, output=0, last1=0) at exec.c:1640
        pid = -1080441928
        pipes = {6, 6629256}
#132 0x0806a99e in execpline (state=0xbf99c420, slcode=8194, how=18, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 6
        newjob = 6
        old_simple_pline = 1
        slflags = 0
        code = 2627
        lastwj = 0
        lpforked = 0
#133 0x0806a1e0 in execlist (state=0xbf99c420, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x9083e64
        code = 8194
        ret = -1080441896
        cj = 6
        csp = 0
        ltype = 18
        old_pline_level = 7
        old_list_pipe = 0
        oldlineno = 117
        oldnoerrexit = 1
#134 0x08069c7a in execode (p=0x8fa1ee0, dont_change_job=1, exiting=0, context=0x80d6bd2 "shfunc") at exec.c:1028
        s = {prog = 0x8fa1ee0, pc = 0x9083e64, strs = 0x9083e68 "local"}
        zsh_eval_context_len = 32
        alen = 3
#135 0x080727e7 in runshfunc (prog=0x8fa1ee0, wrap=0x0, name=0xb70c1cc8 "_normal") at exec.c:4641
        cont = 8388608
        ouu = 3
        ou = 0x8f2f5d0 "-s"
#136 0xb7134de8 in comp_wrapper (prog=0x8fa1ee0, w=0x0, name=0xb70c1cc8 "_normal") at complete.c:1455
        opre = 0x9116700 "fs/adfs/"
        oipre = 0x90962e8 ""
        oqipre = 0x90443f0 ""
        oqs = 0x8f6a9c0 "\001"
        m = 0
        pp = 0x90536d4
        osuf = 0x9116710 ""
        oisuf = 0x8f8c3b8 ""
        oqisuf = 0x8f865b0 ""
        ocur = 3
        orest = 0x90962f8 "auto"
        owords = 0x9116248
        oq = 0x90962b0 ""
        oqi = 0x908ed60 ""
        oaq = 0x0
        kunset = 0
        sm = 512
        oredirs = 0x9085618
        runset = 0
#137 0x08072750 in runshfunc (prog=0x8fa1ee0, wrap=0xb714ec20, name=0xb70c1cc8 "_normal") at exec.c:4626
        cont = -1080441577
        ouu = 3
        ou = 0x9052348 "-s"
#138 0x080724ef in doshfunc (shfunc=0x8f6b350, doshargs=0xb70c1c80, noreturnval=0) at exec.c:4535
        pptab = 0x91167c8
        x = 0x904425c
        oargv0 = 0x911ac80 "_complete"
        oldzoptind = 1
        oldlastval = 0
        oldoptcind = 0
        oldnumpipestats = 1
        ret = -1223943040
        oldpipestats = 0x0
        saveopts = "\000\000\000\001\000\001\000\000\001\001\000\000\001\001\001\000\001\001\001\000\000\000\000\001\000\001\001\001\000\001\001\001\001\000\001\001\001\000\000\000\000\000\000\000\001\001\001\000\000\001\001\000\001\000\001\001\000\000\000\000\000\000\001\001\001\000\000\000\000\001\001\001\001\000\000\001\000\001\001\000\000\000\000\001\000\001\000\000\000\000\000\000\000\001\000\000\000\001\001\001\000\001\000\000\000\000\001\001\001\001\001\001\001", '\000' <repeats 17 times>, "\001\000\001\001\001\000\000\001\000\001\000\001\000\000\000\000\000\000\001\000\000\001\000\000\000\000\000\001\000\000\001\000\000\000\000\001"
        oldscriptname = 0xb70c1780 "_complete"
        name = 0x8f6ac50 "_normal"
        flags = 270336
        fname = 0xb70c1cb8 "_normal"
        obreaks = 0
        saveemulation = 48
        savesticky_emulation = 0
        restore_sticky = 0
        prog = 0x8fa1ee0
        fstack = {prev = 0xbf99d2e0, name = 0xb70c1cc8 "_normal", filename = 0xb70c1cd0 "/usr/local/share/zsh/4.3.11-dev-2/functions/Completion/Base/_normal", 
          caller = 0xb70c1790 "_complete", flineno = 0, lineno = 117, tp = 1}
        funcdepth = 11
#139 0x08071c49 in execshfunc (shf=0x8f6b350, args=0xb70c1c80) at exec.c:4263
        last_file_list = 0x0
        ocs = 0x9119510 "\006\n\n\267\070Z\004\tfs/"
        ocsp = 1
        osfc = 6
#140 0x0806f7fc in execcmd (state=0xbf99d1d0, input=0, output=0, how=2, last1=2) at exec.c:3172
        i = 12
        restorelist = 0x0
        removelist = 0x0
        hn = 0x8f6b350
        args = 0xb70c1c80
        node = 0x8ef4848
        fn = 0xbf99c8c8
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = 152150064
        dfil = 151584616
        is_cursh = 1
        type = 6
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 0
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 1
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 1
        oautocont = -1
        redir = 0x0
        code = 70
        beg = 0x908363c
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#141 0x0806b523 in execpline2 (state=0xbf99d1d0, pcode=7555, how=2, input=0, output=0, last1=0) at exec.c:1640
        pid = -1223943152
        pipes = {6, -1223946240}
#142 0x0806a99e in execpline (state=0xbf99d1d0, slcode=4130, how=2, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 5
        newjob = 6
        old_simple_pline = 1
        slflags = 0
        code = 7555
        lastwj = 0
        lpforked = 0
#143 0x0806a229 in execlist (state=0xbf99d1d0, dont_change_job=1, exiting=0) at exec.c:1216
        donedebug = 0
        donetrap = 0
        next = 0x9083648
        code = 4130
        ret = 0
        cj = 5
        csp = 1
        ltype = 18
        old_pline_level = 6
        old_list_pipe = 0
        oldlineno = 115
        oldnoerrexit = 1
#144 0x08092cbb in execif (state=0xbf99d1d0, do_exec=0) at loop.c:515
        end = 0x90837b4
        next = 0x9083660
        code = 3120
        olderrexit = 1
        s = 0
        run = 1
#145 0x0806f5fd in execcmd (state=0xbf99d1d0, input=0, output=0, how=2, last1=2) at exec.c:3124
        hn = 0x0
        args = 0x0
        node = 0x0
        fn = 0xbf99ce78
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = 151315600
        dfil = 151542936
        is_cursh = 1
        type = 16
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 0
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 0
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 0
        oautocont = -1
        redir = 0x0
        code = 14096
        beg = 0x90835f8
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#146 0x0806b523 in execpline2 (state=0xbf99d1d0, pcode=7427, how=2, input=0, output=0, last1=0) at exec.c:1640
        pid = -1223943232
        pipes = {5, -1223946240}
#147 0x0806a99e in execpline (state=0xbf99d1d0, slcode=114690, how=2, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 5
        newjob = 5
        old_simple_pline = 1
        slflags = 0
        code = 7427
        lastwj = 0
        lpforked = 0
#148 0x0806a1e0 in execlist (state=0xbf99d1d0, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x90837b4
        code = 114690
        ret = 1
        cj = 5
        csp = 0
        ltype = 2
        old_pline_level = 5
        old_list_pipe = 0
        oldlineno = 165
        oldnoerrexit = 1
#149 0x08069c7a in execode (p=0x8f69b08, dont_change_job=1, exiting=0, context=0x80d6bd2 "shfunc") at exec.c:1028
        s = {prog = 0x8f69b08, pc = 0x9083648, strs = 0x90837e8 "local"}
        zsh_eval_context_len = 32
        alen = 2
#150 0x080727e7 in runshfunc (prog=0x8f69b08, wrap=0x0, name=0xb70c1790 "_complete") at exec.c:4641
        cont = 8388608
        ouu = 10
        ou = 0x9116320 "_complete"
#151 0xb7134de8 in comp_wrapper (prog=0x8f69b08, w=0x0, name=0xb70c1790 "_complete") at complete.c:1455
        opre = 0x908f610 "fs/adfs/"
        oipre = 0x9116440 ""
        oqipre = 0x9085228 ""
        oqs = 0x9085238 "\001"
        m = 0
        pp = 0x90536d4
        osuf = 0x908f600 ""
        oisuf = 0x911ad58 ""
        oqisuf = 0x911ad48 ""
        ocur = 3
        orest = 0x904d938 "auto"
        owords = 0x90456a0
        oq = 0x908ff58 ""
        oqi = 0x9119ef0 ""
        oaq = 0x0
        kunset = 0
        sm = 512
        oredirs = 0x908f030
        runset = 0
#152 0x08072750 in runshfunc (prog=0x8f69b08, wrap=0xb714ec20, name=0xb70c1790 "_complete") at exec.c:4626
        cont = 151536416
        ouu = 10
        ou = 0x91167b8 "_complete"
#153 0x080724ef in doshfunc (shfunc=0x8f68708, doshargs=0xb70c1740, noreturnval=0) at exec.c:4535
        pptab = 0x9053488
        x = 0x91167c8
        oargv0 = 0x908fdf0 "zsh"
        oldzoptind = 1
        oldlastval = 1
        oldoptcind = 0
        oldnumpipestats = 1
        ret = -1223944384
        oldpipestats = 0x0
        saveopts = "\000\000\000\001\000\001\000\000\001\001\000\000\001\001\001\000\001\001\001\000\000\000\000\001\000\001\001\001\000\001\001\001\001\000\001\001\001\000\000\000\000\000\000\000\001\001\001\000\000\001\001\000\001\000\001\001\000\000\000\000\000\000\001\001\001\000\000\000\000\001\001\001\001\000\000\001\000\001\001\000\000\000\000\001\000\001\000\000\000\000\000\000\000\001\000\000\000\001\001\001\000\001\000\000\000\000\001\001\001\001\001\001\001", '\000' <repeats 17 times>, "\001\000\001\001\001\000\000\001\000\001\000\001\000\000\000\000\000\000\001\000\000\001\000\000\000\000\000\001\000\000\001\000\000\000\000\001"
        oldscriptname = 0xb70c5020 "_main_complete"
        name = 0x8f678f0 "_complete"
        flags = 270336
        fname = 0xb70c1770 "_complete"
        obreaks = 0
        saveemulation = 48
        savesticky_emulation = 0
        restore_sticky = 0
        prog = 0x8f69b08
        fstack = {prev = 0xbf99ec70, name = 0xb70c1790 "_complete", filename = 0xb70c17a0 "/usr/local/share/zsh/4.3.11-dev-2/functions/Completion/Base/_complete", 
          caller = 0xb70c5030 "_main_complete", flineno = 0, lineno = 165, tp = 1}
        funcdepth = 11
#154 0x08071c49 in execshfunc (shf=0x8f68708, args=0xb70c1740) at exec.c:4263
        last_file_list = 0x0
        ocs = 0x9116e38 ""
        ocsp = 3
        osfc = 6
#155 0x0806f7fc in execcmd (state=0xbf99eb60, input=0, output=0, how=18, last1=2) at exec.c:3172
        i = 12
        restorelist = 0x0
        removelist = 0x0
        hn = 0x8f68708
        args = 0xb70c1740
        node = 0xbf99d670
        fn = 0xbf99d6a8
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = -1080437132
        dfil = 0
        is_cursh = 1
        type = 6
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 1
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 1
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 0
        oautocont = -1
        redir = 0x0
        code = 38
        beg = 0x907f98c
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#156 0x0806b523 in execpline2 (state=0xbf99eb60, pcode=10627, how=18, input=0, output=0, last1=0) at exec.c:1640
        pid = -1223944408
        pipes = {5, -1223946240}
#157 0x0806a99e in execpline (state=0xbf99eb60, slcode=3074, how=18, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 4
        newjob = 5
        old_simple_pline = 1
        slflags = 0
        code = 10627
        lastwj = 0
        lpforked = 0
#158 0x0806a1e0 in execlist (state=0xbf99eb60, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x907f994
        code = 3074
        ret = 0
        cj = 4
        csp = 3
        ltype = 18
        old_pline_level = 4
        old_list_pipe = 0
        oldlineno = 160
        oldnoerrexit = 1
#159 0x08092c1c in execif (state=0xbf99eb60, do_exec=0) at loop.c:500
        end = 0x907f9c4
        next = 0x907f9c4
        code = 2256
        olderrexit = 0
        s = 1
        run = 0
#160 0x0806f5fd in execcmd (state=0xbf99eb60, input=0, output=0, how=2, last1=2) at exec.c:3124
        hn = 0x0
        args = 0x0
        node = 0x0
        fn = 0xbf99dc28
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = 151546448
        dfil = 152153232
        is_cursh = 1
        type = 16
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 0
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 0
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 0
        oautocont = -1
        redir = 0x0
        code = 5776
        beg = 0x907f90c
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#161 0x0806b523 in execpline2 (state=0xbf99eb60, pcode=10307, how=2, input=0, output=0, last1=0) at exec.c:1640
        pid = 1
        pipes = {4, 151523007}
#162 0x0806a99e in execpline (state=0xbf99eb60, slcode=48130, how=2, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 3
        newjob = 4
        old_simple_pline = 1
        slflags = 0
        code = 10307
        lastwj = 0
        lpforked = 0
#163 0x0806a1e0 in execlist (state=0xbf99eb60, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x907f9c4
        code = 48130
        ret = 0
        cj = 3
        csp = 2
        ltype = 2
        old_pline_level = 3
        old_list_pipe = 0
        oldlineno = 152
        oldnoerrexit = 0
#164 0x08091efe in execfor (state=0xbf99eb60, do_exec=0) at loop.c:159
        end = 0x907f9d4
        loop = 0x907f88c
        code = 11051
        iscond = 0
        ctok = 0
        atok = 0
        last = 0
        name = 0x9080937 "_c_matcher"
        str = 0xb70c16f0 ""
        cond = 0x0
        advance = 0x0
        val = 0
        vars = 0xb70c1698
        args = 0xb70c16b0
#165 0x0806f5fd in execcmd (state=0xbf99eb60, input=0, output=0, how=2, last1=2) at exec.c:3124
        hn = 0x0
        args = 0x0
        node = 0x0
        fn = 0xbf99e218
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = 150387912
        dfil = 152153232
        is_cursh = 1
        type = 11
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 0
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 0
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 0
        oautocont = -1
        redir = 0x0
        code = 11051
        beg = 0x907f878
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#166 0x0806b523 in execpline2 (state=0xbf99eb60, pcode=9795, how=2, input=0, output=0, last1=0) at exec.c:1640
        pid = 1
        pipes = {3, 151522853}
#167 0x0806a99e in execpline (state=0xbf99eb60, slcode=90114, how=2, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 2
        newjob = 3
        old_simple_pline = 1
        slflags = 0
        code = 9795
        lastwj = 0
        lpforked = 0
#168 0x0806a1e0 in execlist (state=0xbf99eb60, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x907f9d4
        code = 90114
        ret = 1
        cj = 2
        csp = 1
        ltype = 2
        old_pline_level = 2
        old_list_pipe = 0
        oldlineno = 129
        oldnoerrexit = 0
#169 0x08091efe in execfor (state=0xbf99eb60, do_exec=0) at loop.c:159
        end = 0x907fa08
        loop = 0x907f6c4
        code = 27307
        iscond = 0
        ctok = 0
        atok = 0
        last = 0
        name = 0xb70c8ff8 "tmp"
        str = 0xb70c12c0 "_complete"
        cond = 0x0
        advance = 0x0
        val = 0
        vars = 0xb70c1250
        args = 0xb70c1268
#170 0x0806f5fd in execcmd (state=0xbf99eb60, input=0, output=0, how=2, last1=2) at exec.c:3124
        hn = 0x0
        args = 0x0
        node = 0xbf99e7e0
        fn = 0xb5
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = 151522727
        dfil = -1080432656
        is_cursh = 1
        type = 11
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 0
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 0
        is_builtin = 0
        is_exec = 0
        use_defpath = 0
        cflags = 0
        orig_cflags = 0
        checked = 0
        oautocont = -1
        redir = 0x0
        code = 27307
        beg = 0x907f6b0
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#171 0x0806b523 in execpline2 (state=0xbf99eb60, pcode=8323, how=2, input=0, output=0, last1=0) at exec.c:1640
        pid = -1223914888
        pipes = {2, -1223929856}
#172 0x0806a99e in execpline (state=0xbf99eb60, slcode=220162, how=2, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 2
        newjob = 2
        old_simple_pline = 1
        slflags = 0
        code = 8323
        lastwj = 0
        lpforked = 0
#173 0x0806a1e0 in execlist (state=0xbf99eb60, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x907fa08
        code = 220162
        ret = 1
        cj = 1
        csp = 0
        ltype = 2
        old_pline_level = 1
        old_list_pipe = 0
        oldlineno = 33
        oldnoerrexit = 0
#174 0x08069c7a in execode (p=0x8f8a478, dont_change_job=1, exiting=0, context=0x80d6bd2 "shfunc") at exec.c:1028
        s = {prog = 0x8f8a478, pc = 0x907f994, strs = 0x9080890 "local"}
        zsh_eval_context_len = 32
        alen = 1
#175 0x080727e7 in runshfunc (prog=0x8f8a478, wrap=0x0, name=0xb70c5030 "_main_complete") at exec.c:4641
        cont = 0
        ouu = 3
        ou = 0x91165a8 "-w"
#176 0xb7134de8 in comp_wrapper (prog=0x8f8a478, w=0x0, name=0xb70c5030 "_main_complete") at complete.c:1455
        opre = 0x908efa0 "fs/adfs/"
        oipre = 0x8f02ba0 ""
        oqipre = 0x9045598 ""
        oqs = 0x9044d30 "\001"
        m = 0
        pp = 0x90536d4
        osuf = 0x9052300 ""
        oisuf = 0x9049998 ""
        oqisuf = 0x9052310 ""
        ocur = 3
        orest = 0x0
        owords = 0x8f67eb8
        oq = 0x8f5e968 ""
        oqi = 0x9116bd0 ""
        oaq = 0x0
        kunset = 0
        sm = 512
        oredirs = 0x908ffb0
        runset = 0
#177 0x08072750 in runshfunc (prog=0x8f8a478, wrap=0xb714ec20, name=0xb70c5030 "_main_complete") at exec.c:4626
        cont = -1080431432
        ouu = 3
        ou = 0x9096640 "-w"
#178 0x080724ef in doshfunc (shfunc=0x8f6a1d8, doshargs=0x0, noreturnval=0) at exec.c:4535
        pptab = 0x9049be8
        x = 0x8efad08
        oargv0 = 0x8f6fe40 "zsh"
        oldzoptind = 1
        oldlastval = 0
        oldoptcind = 0
        oldnumpipestats = 1
        ret = 150140200
        oldpipestats = 0x0
        saveopts = "\000\001\000\001\000\001\000\000\001\001\000\000\001\001\001\000\001\001\001\000\000\000\000\001\000\001\001\001\000\001\001\001\001\000\001\001\001\000\000\000\000\000\000\000\001\001\001\000\000\001\001\000\001\000\001\001\000\000\000\000\000\000\001\001\001\000\000\000\000\001\001\001\001\000\000\001\000\001\001\000\000\000\000\001\000\001\000\000\000\000\000\000\000\001\000\000\000\001\001\000\000\001\000\000\000\000\001\001\001\001\001\001\000\000\001", '\000' <repeats 15 times>, "\001\000\001\001\001\000\000\001\000\001\000\001\000\000\000\000\000\000\001\000\000\001\000\000\000\000\000\001\000\000\001\000\000\001\000\001"
        oldscriptname = 0xb70d9798 "ft-complete"
        name = 0x8f6a4d8 "_main_complete"
        flags = 270336
        fname = 0xb70c5010 "_main_complete"
        obreaks = 0
        saveemulation = 48
        savesticky_emulation = 0
        restore_sticky = 0
        prog = 0x8f8a478
        fstack = {prev = 0xbf99f9b0, name = 0xb70c5030 "_main_complete", 
          filename = 0xb70c5040 "/usr/local/share/zsh/4.3.11-dev-2/functions/Completion/Base/_main_complete", caller = 0xb70d97a8 "ft-complete", flineno = 0, 
          lineno = 33, tp = 1}
        funcdepth = 11
#179 0xb7137529 in callcompfunc (s=0xb70d9bc8 "fs/adfs/", fn=0x8fb4b80 "_main_complete") at compcore.c:828
        largs = 0x0
        olv = 0
        _switch_oldheaps = 0xb70d9000
        p = 0x8f0f6c4
        aadd = 0
        rset = 1023
        kset = 63959491
        ockpms = 0x0
        tmp = 0xb70d9be0 "fs/adfs/"
        icf = 0
        ocrpms = 0x0
        usea = 1
        osc = 4
        shfunc = 0x8f6a1d8
        lv = 0
        buf = "\350홿>\024\t\b\020\000\000\000\233\325\024\267\020\233\r\267"
#180 0xb7137d94 in makecomplist (s=0xb70d9bc8 "fs/adfs/", incmd=0, lst=0) at compcore.c:979
        os = 0x908c1b8 "fs/adfs/"
        onm = 0
        odm = 0
        osi = -1
        p = 0x0
        owb = 8
        owe = 16
        ooffs = 8
#181 0xb7135cbb in do_completion (dummy=0xb718c194, dat=0xbf99ef04) at compcore.c:349
        ret = 0
        lst = 0
        incmd = 0
        osl = 0
        s = 0x908c1b8 "fs/adfs/"
        opm = 0x904e7f0 ""
        n = 0xb70d9b68
#182 0x080995ec in runhookdef (h=0xb718c194, d=0xbf99ef04) at module.c:996
No locals.
#183 0xb717be14 in docompletion (s=0x908c1b8 "fs/adfs/", lst=0, incmd=0) at zle_tricky.c:2179
        dat = {s = 0x908c1b8 "fs/adfs/", lst = 0, incmd = 0}
#184 0xb7177d9a in docomplete (lst=0) at zle_tricky.c:859
        active = 1
        s = 0x908c1b8 "fs/adfs/"
        ol = 0x0
        olst = 0
        chl = 0
        ne = 0
        ocs = 16
        ret = 0
        dat = {-1223845254, -1223845248}
#185 0xb7176448 in completeword (args=0xb718c484) at zle_tricky.c:232
        ret = 0
#186 0xb717632e in completecall (args=0xbf99f2a8) at zle_tricky.c:208
No locals.
#187 0xb7165f7b in execzlefunc (func=0xb718a210, args=0xbf99f2a8, set_bindk=1) at zle_main.c:1311
        atcurhist = 1
        wflags = 134
        r = 0
        ret = 0
        remetafy = 0
        w = 0x8fbb330
        save_bindk = 0x8fa65a8
#188 0xb7175bf1 in bin_zle_call (name=0xb70d9a70 "zle", args=0xbf99f2a8, ops=0xbf99f2e4, func=0 '\000') at zle_thingy.c:700
        t = 0xb718a210
        modsave = {flags = 0, mult = 1, tmult = 1, vibuf = 0, base = 10}
        ret = -1223845504
        saveflag = 0
        setbindk = 1
        wname = 0xb70d9a90 "complete-word"
        keymap_restore = 0x0
        keymap_tmp = 0x3 <Address 0x3 out of bounds>
#189 0xb7174d8d in bin_zle (name=0xb70d9a70 "zle", args=0xbf99f2a0, ops=0xbf99f2e4, func=0) at zle_thingy.c:381
        opns = {{o = 108 'l', func = 0xb7174d93 <bin_zle_list>, min = 0, max = -1}, {o = 68 'D', func = 0xb7175482 <bin_zle_del>, min = 1, max = -1}, {o = 65 'A', 
            func = 0xb7175548 <bin_zle_link>, min = 2, max = 2}, {o = 78 'N', func = 0xb7175608 <bin_zle_new>, min = 1, max = 2}, {o = 67 'C', 
            func = 0xb71756c6 <bin_zle_complete>, min = 3, max = 3}, {o = 82 'R', func = 0xb7174e82 <bin_zle_refresh>, min = 0, max = -1}, {o = 77 'M', 
            func = 0xb7175029 <bin_zle_mesg>, min = 1, max = 1}, {o = 85 'U', func = 0xb7175093 <bin_zle_unget>, min = 1, max = 1}, {o = 75 'K', 
            func = 0xb7175114 <bin_zle_keymap>, min = 1, max = 1}, {o = 73 'I', func = 0xb7175c4a <bin_zle_invalidate>, min = 0, max = 0}, {o = 70 'F', 
            func = 0xb7175cbf <bin_zle_fd>, min = 0, max = 2}, {o = 0 '\000', func = 0xb71758b1 <bin_zle_call>, min = 0, max = -1}}
        op = 0xb7188210
        opp = 0xbf99f3c8
        n = 2
#190 0x08055a26 in execbuiltin (args=0xb70d9a40, bn=0xb718c148) at builtin.c:450
        argarr = 0xbf99f2a0
        argv = 0xbf99f2a0
        pp = 0x0
        name = 0xb70d9a70 "zle"
        optstr = 0xb718736f "aAcCDFgGIKlLmMNRU"
        flags = 8
        sense = 0
        argc = 2
        execop = 149899336
        xtr = 0
        ops = {ind = '\000' <repeats 127 times>, args = 0x0, argscount = 0, argsalloc = 0}
#191 0x0806f87e in execcmd (state=0xbf99f950, input=0, output=0, how=2, last1=2) at exec.c:3183
        restorelist = 0x0
        removelist = 0x0
        hn = 0xb718c148
        args = 0xb70d9a40
        node = 0x0
        fn = 0xbf99f5f8
        mfds = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
        text = 0x0
        save = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2}
        fil = 151298136
        dfil = 152160560
        is_cursh = 1
        type = 6
        do_exec = 0
        redir_err = 0
        i = 10
        htok = 1
        nullexec = 0
        assign = 0
        forked = 0
        is_shfunc = 0
        is_builtin = 1
        is_exec = 0
        use_defpath = 0
        cflags = 8
        orig_cflags = 0
        checked = 1
        oautocont = -1
        redir = 0x0
        code = 102
        beg = 0x8f5e52c
        varspc = 0x0
        oxtrerr = 0xb766f560
        newxtrerr = 0x0
#192 0x0806b523 in execpline2 (state=0xbf99f950, pcode=2179, how=2, input=0, output=0, last1=0) at exec.c:1640
        pid = -1080428760
        pipes = {1, -1218861410}
#193 0x0806a99e in execpline (state=0xbf99f950, slcode=5122, how=2, last1=0) at exec.c:1424
        ipipe = {0, 0}
        opipe = {0, 0}
        pj = 0
        newjob = 1
        old_simple_pline = 0
        slflags = 0
        code = 2179
        lastwj = 0
        lpforked = 0
#194 0x0806a1e0 in execlist (state=0xbf99f950, dont_change_job=1, exiting=0) at exec.c:1207
        donedebug = 0
        donetrap = 0
        next = 0x8f5e53c
        code = 5122
        ret = 1
        cj = 0
        csp = 0
        ltype = 2
        old_pline_level = 0
        old_list_pipe = 0
        oldlineno = 2
        oldnoerrexit = 0
#195 0x08069c7a in execode (p=0x8f0c578, dont_change_job=1, exiting=0, context=0x80d6bd2 "shfunc") at exec.c:1028
        s = {prog = 0x8f0c578, pc = 0x8f5e53c, strs = 0x8f5e558 "setopt"}
        zsh_eval_context_len = 32
        alen = 0
#196 0x080727e7 in runshfunc (prog=0x8f0c578, wrap=0x0, name=0xb70d97a8 "ft-complete") at exec.c:4641
        cont = 1
        ouu = 5
        ou = 0x904e650 "core"
#197 0x080724ef in doshfunc (shfunc=0x8fa6af8, doshargs=0x0, noreturnval=1) at exec.c:4535
        pptab = 0x8ef5198
        x = 0x8efad08
        oargv0 = 0x8ef5188 "zsh"
        oldzoptind = 1
        oldlastval = 0
        oldoptcind = 0
        oldnumpipestats = 1
        ret = 0
        oldpipestats = 0xb70d9790
        saveopts = "\000\001\000\001\000\001\000\000\001\001\000\000\001\001\001\000\001\001\001\000\000\000\000\001\000\001\001\001\000\001\001\001\001\000\001\001\001\000\000\000\000\000\000\000\001\001\001\000\000\001\001\000\001\000\001\001\000\000\000\000\000\000\001\001\001\000\000\000\000\001\001\001\001\000\000\001\000\001\001\000\000\000\000\001\000\001\000\000\000\000\000\000\000\001\000\000\000\001\001\000\000\001\000\000\000\000\001\001\001\001\001\001\000\000\001", '\000' <repeats 15 times>, "\001\000\001\001\001\000\000\001\000\001\000\001\000\000\000\000\000\000\001\000\000\001\000\000\000\000\000\001\000\000\001\000\000\001\000\001"
        oldscriptname = 0x0
        name = 0x8fbd3a8 "ft-complete"
        flags = 0
        fname = 0xb70d9780 "ft-complete"
        obreaks = 0
        saveemulation = 48
        savesticky_emulation = 0
        restore_sticky = 0
        prog = 0x8f0c578
        fstack = {prev = 0x0, name = 0xb70d97a8 "ft-complete", filename = 0xb70d97c0 "/home/hawk/.zshrc.d/905-zle_widgets.z", caller = 0xb70d97b8 "zsh", 
          flineno = 114, lineno = 2, tp = 1}
        funcdepth = 11
#198 0xb716628d in execzlefunc (func=0x8fa65a8, args=0xb718c484, set_bindk=0) at zle_main.c:1352
        osc = 0
        osi = 11
        oxt = 0
        largs = 0x0
        shf = 0x8fa6af8
        r = 0
        ret = 0
        remetafy = 0
        w = 0x8fa6590
        save_bindk = 0x8fa65a8
#199 0xb716549d in zlecore () at zle_main.c:1058
No locals.
#200 0xb7165b5d in zleread (lp=0x80f3ed8, rp=0x80f3e6c, flags=7, context=0) at zle_main.c:1219
        s = 0x0
        old_errno = 3
        tmout = 0
#201 0xb7167b55 in zle_main_entry (cmd=1, ap=0xbf99fe24 "") at zle_main.c:1874
        lp = 0x80f3ed8
        rp = 0x80f3e6c
        flags = 7
        context = 0
#202 0x080865bb in zleentry (cmd=1) at init.c:1374
        ret = 0x0
        ap = 0xbf99fe14 "\330>\017\bl>\017\b\a"
#203 0x08086e91 in inputline () at input.c:281
        flags = 7
        ingetcline = 0x0
        ingetcpmptl = 0x80f3ed8
        ingetcpmptr = 0x80f3e6c
        context = 0
#204 0x08086d0c in ingetc () at input.c:217
        lastc = 134982438
#205 0x0807cc24 in ihgetc () at hist.c:279
        c = 0
#206 0x0808e837 in gettok () at lex.c:717
        c = 0
        d = 0
        peekfd = -1
        peek = 0
#207 0x0808e0b5 in zshlex () at lex.c:395
No locals.
#208 0x080a98a9 in parse_event () at parse.c:451
No locals.
#209 0x0808395c in loop (toplevel=1, justonce=0) at init.c:132
        prog = 0xb70dd838
        err = 50
        non_empty = 1
#210 0x08086947 in zsh_main (argc=1, argv=0xbf9a0094) at init.c:1528
        t = 0xbf9a0098
        runscript = 0x0
        t0 = 158
#211 0x0805503f in main (argc=1, argv=0xbf9a0094) at ./main.c:93
No locals.
Current language:  auto
The current source language is "auto; currently asm".


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Speed improvement patch for __git_files and __git_files_relative
  2011-05-11 13:27 ` Frank Terbeck
@ 2011-05-11 13:44   ` Mikael Magnusson
  2011-05-11 14:09   ` Completion crash owing to bad allocation Peter Stephenson
  1 sibling, 0 replies; 8+ messages in thread
From: Mikael Magnusson @ 2011-05-11 13:44 UTC (permalink / raw)
  To: Frank Terbeck; +Cc: zsh-workers

On 11 May 2011 15:27, Frank Terbeck <ft@bewatermyfriend.org> wrote:
> Nikolai Weibull wrote:
>> I’ve now put together a patch for __git_files and
>> __git_files_relative.  __git_files is a lot faster than previous
>> versions and __git_files_relative should be a lot faster too, now that
>> it only uses substitutions.  (Well, there’s a for loop that iterates
>> over the file names to determine the common path prefix, but I see no
>> way of avoiding it.)
>>
>> It would be great if this could make it into the 4.3.12 release, so
>> please give it a try as soon as possible.
>
> Alright, I've been trying this.  The speed improvement in my linux
> kernel clone is quite impressive.
>
> I'm running into a segfault, though. The git repository is located in
> `/tmp/linux-2.6'. I've changed a file (fs/adfs/dir.c) slightly and I'm
> doing this:
>
>  % git add f<tab>
>  % git add fs/<tab>
>  % git add fs/adfs/<tab>
>
> And that's where the shell crashes. It's a build of today's HEAD.
>
> The kernel repository was cloned from this URI:
> <git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git>
>
> I don't have the time to look into this right now, so here's a back
> trace:

This crash seems to be getting pretty common now...
http://www.zsh.org/mla/workers/2011/msg00391.html
http://www.zsh.org/mla/workers/2011/msg00513.html

-- 
Mikael Magnusson


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Completion crash owing to bad allocation
  2011-05-11 13:27 ` Frank Terbeck
  2011-05-11 13:44   ` Mikael Magnusson
@ 2011-05-11 14:09   ` Peter Stephenson
  2011-05-13 23:26     ` Peter Stephenson
  1 sibling, 1 reply; 8+ messages in thread
From: Peter Stephenson @ 2011-05-11 14:09 UTC (permalink / raw)
  To: zsh-workers

On Wed, 11 May 2011 15:27:35 +0200
Frank Terbeck <ft@bewatermyfriend.org> wrote:
> I'm running into a segfault, though. The git repository is located in
> `/tmp/linux-2.6'. I've changed a file (fs/adfs/dir.c) slightly and I'm
> doing this:
> 
>   % git add f<tab>
>   % git add fs/<tab>
>   % git add fs/adfs/<tab>
> 
> And that's where the shell crashes. It's a build of today's HEAD.

This seems to be another variant of the "amatches" problem.

amatches is a global in the completion code that holds one version of
the list of matches during completion.  This is on the heap, and because
it's not scoped it's virtually impossible to keep track of the point at
which it becomes invalid.  For extra ease of maintainance, at some point
in the procedure it is deliberately set to point to a permanently
allocated copy.  When the crash happens we are scanning through
some (possibly subtly disguised) part of amatches and examining some
no longer valid memory.

One way to tackle this would be to add a stack corresponding to the
current heap stack, with each level having a unique (up to 32-bit
integer wrap) ID that tells you if that heap variant is valid.  Then
when memory is allocated for use by a Cmgroup it stores the ID
corresponding to the currently pushed heap at the top of the stack
(with a special ID to be used if it was permanently allocated).  Every
time amatches is examined the code could report an error if a heap ID
stored somewhere along the list doesn't correspond to one somewhere on
the current heap debug stack.  (Unfortunately examining amatches at the
point of a popheap() won't work --- the code is lax about marking
amatches as invalid, it just expects you not to access it in that case,
which is part of the problem.)

I won't be doing the completion code debugging, I'm fed up with days of
my life disappearing into code I never seem to get any closer to
understanding and have quite enough else to manage, but if someone
thinks they might get round to that (understanding is optional for now,
we just need to be able to track what's going on with amatches) I'd be
happy to have a go at writing the tools for heap debugging.

-- 
Peter Stephenson <pws@csr.com>            Software Engineer
Tel: +44 (0)1223 692070                   Cambridge Silicon Radio Limited
Churchill House, Cambridge Business Park, Cowley Road, Cambridge, CB4 0WZ, UK


Member of the CSR plc group of companies. CSR plc registered in England and Wales, registered number 4187346, registered office Churchill House, Cambridge Business Park, Cowley Road, Cambridge, CB4 0WZ, United Kingdom


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Completion crash owing to bad allocation
  2011-05-11 14:09   ` Completion crash owing to bad allocation Peter Stephenson
@ 2011-05-13 23:26     ` Peter Stephenson
  2011-05-14  2:56       ` Bart Schaefer
  0 siblings, 1 reply; 8+ messages in thread
From: Peter Stephenson @ 2011-05-13 23:26 UTC (permalink / raw)
  To: zsh-workers

On Wed, 11 May 2011 15:09:09 +0100
Peter Stephenson <Peter.Stephenson@csr.com> wrote:
> One way to tackle this would be to add a stack corresponding to the
> current heap stack, with each level having a unique (up to 32-bit
> integer wrap) ID that tells you if that heap variant is valid.  Then
> when memory is allocated for use by a Cmgroup it stores the ID
> corresponding to the currently pushed heap at the top of the stack
> (with a special ID to be used if it was permanently allocated).  Every
> time amatches is examined the code could report an error if a heap ID
> stored somewhere along the list doesn't correspond to one somewhere on
> the current heap debug stack.  (Unfortunately examining amatches at the
> point of a popheap() won't work --- the code is lax about marking
> amatches as invalid, it just expects you not to access it in that case,
> which is part of the problem.)

Hmm...

So I added the following code, which seems to working in that it's
performing the checks and not usually reporting errors, and turned it
on, and ... dénouement in the next episode.

Index: configure.ac
===================================================================
RCS file: /cvsroot/zsh/zsh/configure.ac,v
retrieving revision 1.135
diff -p -u -r1.135 configure.ac
--- configure.ac	18 Apr 2011 20:36:31 -0000	1.135
+++ configure.ac	13 May 2011 23:18:30 -0000
@@ -105,6 +105,18 @@ AC_HELP_STRING([--enable-zsh-secure-free
   AC_DEFINE(ZSH_SECURE_FREE)
 fi])
 
+dnl Do you want to debug zsh heap allocation?
+dnl Does not depend on zsh-mem.
+ifdef([zsh-heap-debug],[undefine([zsh-heap-debug])])dnl
+AH_TEMPLATE([ZSH_HEAP_DEBUG],
+[Define to 1 if you want to turn on error checking for heap allocation.])
+AC_ARG_ENABLE(zsh-heap-debug,
+AC_HELP_STRING([--enable-zsh-heap-debug],
+[turn on error checking for heap allocation]),
+[if test x$enableval = xyes; then
+  AC_DEFINE(ZSH_HEAP_DEBUG)
+fi])
+
 dnl Do you want debugging information on internal hash tables.
 dnl This turns on the `hashinfo' builtin command.
 ifdef([zsh-hash-debug],[undefine([zsh-hash-debug])])dnl
Index: Src/mem.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/mem.c,v
retrieving revision 1.18
diff -p -u -r1.18 mem.c
--- Src/mem.c	7 May 2011 19:32:57 -0000	1.18
+++ Src/mem.c	13 May 2011 23:18:31 -0000
@@ -123,6 +123,57 @@ static Heap heaps;
 
 static Heap fheap;
 
+#ifdef ZSH_HEAP_DEBUG
+/*
+ * The heap ID we'll allocate next.
+ *
+ * We'll avoid using 0 as that means zero-initialised memory
+ * containing a heap ID is (correctly) marked as invalid.
+ */
+static Heapid next_heap_id = (Heapid)1;
+
+/*
+ * The ID of the heap from which we last allocated heap memory.
+ * In theory, since we carefully avoid allocating heap memory during
+ * interrupts, after any call to zhalloc() or wrappers this should
+ * be the ID of the heap containing the memory just returned.
+ */
+/**/
+mod_export Heapid last_heap_id;
+
+/*
+ * Stack of heaps saved by new_heaps().
+ * Assumes old_heaps() will come along and restore it later
+ * (outputs an error if old_heaps() is called out of sequence).
+ */
+LinkList heaps_saved;
+
+/*
+ * Debugging verbosity.  This must be set from a debugger.
+ * An 'or' of bits from the enum heap_debug_verbosity.
+ */
+volatile int heap_debug_verbosity;
+
+/*
+ * Generate a heap identifier that's unique up to unsigned integer wrap.
+ *
+ * For the purposes of debugging we won't bother trying to make a
+ * heap_id globally unique, which would require checking all existing
+ * heaps every time we create an ID and still wouldn't do what we
+ * ideally want, which is to make sure the IDs of valid heaps are
+ * different from the IDs of no-longer-valid heaps.  Given that,
+ * we'll just assume that if we haven't tracked the problem when the
+ * ID wraps we're out of luck.  We could change the type to a long long
+ * if we wanted more room
+ */
+
+static Heapid
+new_heap_id(void)
+{
+    return next_heap_id++;
+}
+#endif
+
 /* Use new heaps from now on. This returns the old heap-list. */
 
 /**/
@@ -137,6 +188,15 @@ new_heaps(void)
     fheap = heaps = NULL;
     unqueue_signals();
 
+#ifdef ZSH_HEAP_DEBUG
+    if (heap_debug_verbosity & HDV_NEW) {
+	fprintf(stderr, "HEAP DEBUG: heap " HEAPID_FMT
+		" saved, new heaps created.\n", h->heap_id);
+    }
+    if (!heaps_saved)
+	heaps_saved = znewlinklist();
+    zpushnode(heaps_saved, h);
+#endif
     return h;
 }
 
@@ -152,6 +212,12 @@ old_heaps(Heap old)
     for (h = heaps; h; h = n) {
 	n = h->next;
 	DPUTS(h->sp, "BUG: old_heaps() with pushed heaps");
+#ifdef ZSH_HEAP_DEBUG
+	if (heap_debug_verbosity & HDV_FREE) {
+	    fprintf(stderr, "HEAP DEBUG: heap " HEAPID_FMT
+		    "freed in old_heaps().\n", h->heap_id);
+	}
+#endif
 #ifdef USE_MMAP
 	munmap((void *) h, h->size);
 #else
@@ -159,6 +225,21 @@ old_heaps(Heap old)
 #endif
     }
     heaps = old;
+#ifdef ZSH_HEAP_DEBUG
+    if (heap_debug_verbosity & HDV_OLD) {
+	fprintf(stderr, "HEAP DEBUG: heap " HEAPID_FMT
+		"restored.\n", heaps->heap_id);
+    }
+    {
+	Heap myold = heaps_saved ? getlinknode(heaps_saved) : NULL;
+	if (old != myold)
+	{
+	    fprintf(stderr, "HEAP DEBUG: invalid old heap " HEAPID_FMT
+		    ", expecting " HEAPID_FMT ".\n", old->heap_id,
+		    myold->heap_id);
+	}
+    }
+#endif
     fheap = NULL;
     unqueue_signals();
 }
@@ -174,6 +255,12 @@ switch_heaps(Heap new)
     queue_signals();
     h = heaps;
 
+#ifdef ZSH_HEAP_DEBUG
+    if (heap_debug_verbosity & HDV_SWITCH) {
+	fprintf(stderr, "HEAP DEBUG: heap temporarily switched from "
+		HEAPID_FMT " to " HEAPID_FMT ".\n", h->heap_id, new->heap_id);
+    }
+#endif
     heaps = new;
     fheap = NULL;
     unqueue_signals();
@@ -202,6 +289,15 @@ pushheap(void)
 	hs->next = h->sp;
 	h->sp = hs;
 	hs->used = h->used;
+#ifdef ZSH_HEAP_DEBUG
+	hs->heap_id = h->heap_id;
+	h->heap_id = new_heap_id();
+	if (heap_debug_verbosity & HDV_PUSH) {
+	    fprintf(stderr, "HEAP DEBUG: heap " HEAPID_FMT " pushed, new id is "
+		    HEAPID_FMT ".\n",
+		    hs->heap_id, h->heap_id);
+	}
+#endif
     }
     unqueue_signals();
 }
@@ -251,6 +347,22 @@ freeheap(void)
 	    if (!fheap && h->used < ARENA_SIZEOF(h))
 		fheap = h;
 	    hl = h;
+#ifdef ZSH_HEAP_DEBUG
+	    /*
+	     * As the free makes the heap invalid, give it a new
+	     * identifier.  We're not popping it, so don't use
+	     * the one in the heap stack.
+	     */
+	    {
+		Heapid new_id = new_heap_id();
+		if (heap_debug_verbosity & HDV_FREE) {
+		    fprintf(stderr, "HEAP DEBUG: heap " HEAPID_FMT
+			    " freed, new id is " HEAPID_FMT ".\n",
+			    h->heap_id, new_id);
+		}
+		h->heap_id = new_id;
+	    }
+#endif
 	} else {
 #ifdef USE_MMAP
 	    munmap((void *) h, h->size);
@@ -291,6 +403,14 @@ popheap(void)
 	    memset(arena(h) + hs->used, 0xff, h->used - hs->used);
 #endif
 	    h->used = hs->used;
+#ifdef ZSH_HEAP_DEBUG
+	    if (heap_debug_verbosity & HDV_POP) {
+		fprintf(stderr, "HEAP DEBUG: heap " HEAPID_FMT
+			" popped, old heap was " HEAPID_FMT ".\n",
+			h->heap_id, hs->heap_id);
+	    }
+	    h->heap_id = hs->heap_id;
+#endif
 	    if (!fheap && h->used < ARENA_SIZEOF(h))
 		fheap = h;
 	    zfree(hs, sizeof(*hs));
@@ -393,6 +513,13 @@ zhalloc(size_t size)
 	    h->used = n;
 	    ret = arena(h) + n - size;
 	    unqueue_signals();
+#ifdef ZSH_HEAP_DEBUG
+	    last_heap_id = h->heap_id;
+	    if (heap_debug_verbosity & HDV_ALLOC) {
+		fprintf(stderr, "HEAP DEBUG: allocated memory from heap "
+			HEAPID_FMT ".\n", h->heap_id);
+	    }
+#endif
 	    return ret;
 	}
     }
@@ -424,6 +551,13 @@ zhalloc(size_t size)
 	h->used = size;
 	h->next = NULL;
 	h->sp = NULL;
+#ifdef ZSH_HEAP_DEBUG
+	h->heap_id = new_heap_id();
+	if (heap_debug_verbosity & HDV_CREATE) {
+	    fprintf(stderr, "HEAP DEBUG: create new heap " HEAPID_FMT ".\n",
+		    h->heap_id);
+	}
+#endif
 
 	if (hp)
 	    hp->next = h;
@@ -432,6 +566,13 @@ zhalloc(size_t size)
 	fheap = h;
 
 	unqueue_signals();
+#ifdef ZSH_HEAP_DEBUG
+	last_heap_id = h->heap_id;
+	if (heap_debug_verbosity & HDV_ALLOC) {
+	    fprintf(stderr, "HEAP DEBUG: allocated memory from heap "
+		    HEAPID_FMT ".\n", h->heap_id);
+	}
+#endif
 	return arena(h);
     }
 }
@@ -495,6 +636,9 @@ hrealloc(char *p, size_t old, size_t new
      * don't use the heap for anything else.)
      */
     if (p == arena(h)) {
+#ifdef ZSH_HEAP_DEBUG
+	Heapid heap_id = h->heap_id;
+#endif
 	/*
 	 * Zero new seems to be a special case saying we've finished
 	 * with the specially reallocated memory, see scanner() in glob.c.
@@ -554,6 +698,9 @@ hrealloc(char *p, size_t old, size_t new
 		heaps = h;
 	}
 	h->used = new;
+#ifdef ZSH_HEAP_DEBUG
+	h->heap_id = heap_id;
+#endif
 	unqueue_signals();
 	return arena(h);
     }
@@ -576,6 +723,53 @@ hrealloc(char *p, size_t old, size_t new
     }
 }
 
+#ifdef ZSH_HEAP_DEBUG
+/*
+ * Check if heap_id is the identifier of a currently valid heap,
+ * including any heap buried on the stack, or of permanent memory.
+ * Return 0 if so, else 1.
+ *
+ * This gets confused by use of switch_heaps().  That's because so do I.
+ */
+
+/**/
+mod_export int
+memory_validate(Heapid heap_id)
+{
+    Heap h;
+    Heapstack hs;
+    LinkNode node;
+
+    if (heap_id == HEAPID_PERMANENT)
+	return 0;
+
+    queue_signals();
+    for (h = heaps; h; h = h->next) {
+	if (h->heap_id == heap_id)
+	    return 0;
+	for (hs = heaps->sp; hs; hs = hs->next) {
+	    if (hs->heap_id == heap_id)
+		return 0;
+	}
+    }
+
+    if (heaps_saved) {
+	for (node = firstnode(heaps_saved); node; incnode(node)) {
+	    for (h = (Heap)getdata(node); h; h = h->next) {
+		if (h->heap_id == heap_id)
+		    return 0;
+		for (hs = heaps->sp; hs; hs = hs->next) {
+		    if (hs->heap_id == heap_id)
+			return 0;
+		}
+	    }
+	}
+    }
+
+    return 1;
+}
+#endif
+
 /* allocate memory from the current memory pool and clear it */
 
 /**/
Index: Src/zsh.h
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/zsh.h,v
retrieving revision 1.174
diff -p -u -r1.174 zsh.h
--- Src/zsh.h	19 Jan 2011 12:42:53 -0000	1.174
+++ Src/zsh.h	13 May 2011 23:18:31 -0000
@@ -2327,11 +2327,67 @@ enum {
  * Memory management *
  *********************/
 
+#ifdef ZSH_HEAP_DEBUG
+/*
+ * A Heapid is a type for identifying, uniquely up to the point where
+ * the count of new identifiers wraps. all heaps that are or
+ * (importantly) have been valid.  Each valid heap is given an
+ * identifier, and every time we push a heap we save the old identifier
+ * and give the heap a new identifier so that when the heap is popped
+ * or freed we can spot anything using invalid memory from the popped
+ * heap.
+ *
+ * We could make this unsigned long long if we wanted a big range.
+ */
+typedef unsigned int Heapid;
+
+/* printf format specifier corresponding to Heapid */
+#define HEAPID_FMT	"%x"
+
+/* Marker that memory is permanently allocated */
+#define HEAPID_PERMANENT (UINT_MAX)
+
+/*
+ * Heap debug verbosity.
+ * Bits to be 'or'ed into the variable also called heap_debug_verbosity.
+ */
+enum heap_debug_verbosity {
+    /* Report when we push a heap */
+    HDV_PUSH = 0x01,
+    /* Report when we pop a heap */
+    HDV_POP = 0x02,
+    /* Report when we create a new heap from which to allocate */
+    HDV_CREATE = 0x04,
+    /* Report every time we free a complete heap */
+    HDV_FREE = 0x08,
+    /* Report when we temporarily install a new set of heaps */
+    HDV_NEW = 0x10,
+    /* Report when we restore an old set of heaps */
+    HDV_OLD = 0x20,
+    /* Report when we temporarily switch heaps */
+    HDV_SWITCH = 0x40,
+    /*
+     * Report every time we allocate memory from the heap.
+     * This is very verbose, and arguably not very useful: we
+     * would expect to allocate memory from a heap we create.
+     * For much debugging heap_debug_verbosity = 0x7f should be sufficient.
+     */
+    HDV_ALLOC = 0x80
+};
+
+#define HEAP_ERROR(heap_id)			\
+    fprintf(stderr, "%s:%d: HEAP DEBUG: invalid heap: " HEAPID_FMT ".\n", \
+	    __FILE__, __LINE__, heap_id)
+#endif
+
 /* heappush saves the current heap state using this structure */
 
 struct heapstack {
     struct heapstack *next;	/* next one in list for this heap */
     size_t used;
+#ifdef ZSH_HEAP_DEBUG
+    Heapid heap_id;
+#endif
 };
 
 /* A zsh heap. */
@@ -2342,6 +2398,10 @@ struct heap {
     size_t used;		/* bytes used from the heap                  */
     struct heapstack *sp;	/* used by pushheap() to save the value used */
 
+#ifdef ZSH_HEAP_DEBUG
+    unsigned int heap_id;
+#endif
+
 /* Uncomment the following if the struct needs padding to 64-bit size. */
 /* Make sure sizeof(heap) is a multiple of 8 
 #if defined(PAD_64_BIT) && !defined(__GNUC__)
Index: Src/Zle/comp.h
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/comp.h,v
retrieving revision 1.20
diff -p -u -r1.20 comp.h
--- Src/Zle/comp.h	9 May 2011 09:49:09 -0000	1.20
+++ Src/Zle/comp.h	13 May 2011 23:18:31 -0000
@@ -76,6 +76,9 @@ struct cmgroup {
     int totl;			/* total length */
     int shortest;		/* length of shortest match */
     Cmgroup perm;		/* perm. alloced version of this group */
+#ifdef ZSH_HEAP_DEBUG
+    Heapid heap_id;
+#endif
 };
 
 
Index: Src/Zle/compcore.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/compcore.c,v
retrieving revision 1.105
diff -p -u -r1.105 compcore.c
--- Src/Zle/compcore.c	18 Feb 2011 22:08:46 -0000	1.105
+++ Src/Zle/compcore.c	13 May 2011 23:18:31 -0000
@@ -405,6 +405,11 @@ do_completion(UNUSED(Hookdef dummy), Com
 	} else if (nmatches == 1 || (nmatches > 1 && !diffmatches)) {
 	    /* Only one match. */
 	    Cmgroup m = amatches;
+#ifdef ZSH_HEAP_DEBUG
+	    if (memory_validate(m->heap_id)) {
+		HEAP_ERROR(m->heap_id);
+	    }
+#endif
 
 	    while (!m->mcount)
 		m = m->next;
@@ -509,6 +514,11 @@ after_complete(UNUSED(Hookdef dummy), in
 	int ret;
 
 	cdat.matches = amatches;
+#ifdef ZSH_HEAP_DEBUG
+	if (memory_validate(cdat.matches->heap_id)) {
+	    HEAP_ERROR(cdat.matches->heap_id);
+	}
+#endif
 	cdat.num = nmatches;
 	cdat.nmesg = nmessages;
 	cdat.cur = NULL;
@@ -987,6 +997,11 @@ makecomplist(char *s, int incmd, int lst
 	    diffmatches = odm;
 	    validlist = 1;
 	    amatches = lastmatches;
+#ifdef ZSH_HEAP_DEBUG
+	    if (memory_validate(amatches->heap_id)) {
+		HEAP_ERROR(amatches->heap_id);
+	    }
+#endif
 	    lmatches = lastlmatches;
 	    if (pmatches) {
 		freematches(pmatches, 1);
@@ -2959,6 +2974,11 @@ begcmgroup(char *n, int flags)
 	Cmgroup p = amatches;
 
 	while (p) {
+#ifdef ZSH_HEAP_DEBUG
+	    if (memory_validate(p->heap_id)) {
+		HEAP_ERROR(p->heap_id);
+	    }
+#endif
 	    if (p->name &&
 		flags == (p->flags & (CGF_NOSORT|CGF_UNIQALL|CGF_UNIQCON)) &&
 		!strcmp(n, p->name)) {
@@ -2975,6 +2995,9 @@ begcmgroup(char *n, int flags)
 	}
     }
     mgroup = (Cmgroup) zhalloc(sizeof(struct cmgroup));
+#ifdef ZSH_HEAP_DEBUG
+    mgroup->heap_id = last_heap_id;
+#endif
     mgroup->name = dupstring(n);
     mgroup->lcount = mgroup->llcount = mgroup->mcount = mgroup->ecount = 
 	mgroup->ccount = 0;
@@ -3295,6 +3318,11 @@ permmatches(int last)
 	fi = 1;
     }
     while (g) {
+#ifdef ZSH_HEAP_DEBUG
+	if (memory_validate(g->heap_id)) {
+	    HEAP_ERROR(g->heap_id);
+	}
+#endif
 	if (fi != ofi || !g->perm || g->new) {
 	    if (fi)
 		/* We have no matches, try ignoring fignore. */
@@ -3323,6 +3351,9 @@ permmatches(int last)
 		diffmatches = 1;
 
 	    n = (Cmgroup) zshcalloc(sizeof(struct cmgroup));
+#ifdef ZSH_HEAP_DEBUG
+	    n->heap_id = HEAPID_PERMANENT;
+#endif
 
 	    if (g->perm) {
 		g->perm->next = NULL;
Index: Src/Zle/compctl.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/compctl.c,v
retrieving revision 1.40
diff -p -u -r1.40 compctl.c
--- Src/Zle/compctl.c	14 Dec 2010 10:35:39 -0000	1.40
+++ Src/Zle/compctl.c	13 May 2011 23:18:31 -0000
@@ -1838,6 +1838,11 @@ ccmakehookfn(UNUSED(Hookdef dummy), stru
 	    diffmatches = odm;
 	    validlist = 1;
 	    amatches = lastmatches;
+#ifdef ZSH_HEAP_DEBUG
+	    if (memory_validate(amatches->heap_id)) {
+		HEAP_ERROR(amatches->heap_id);
+	    }
+#endif
 	    lmatches = lastlmatches;
 	    if (pmatches) {
 		freematches(pmatches, 1);
Index: Src/Zle/complist.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/complist.c,v
retrieving revision 1.125
diff -p -u -r1.125 complist.c
--- Src/Zle/complist.c	9 May 2011 09:49:09 -0000	1.125
+++ Src/Zle/complist.c	13 May 2011 23:18:32 -0000
@@ -1363,6 +1363,11 @@ compprintlist(int showall)
     while (g) {
 	char **pp = g->ylist;
 
+#ifdef ZSH_HEAP_DEBUG
+	if (memory_validate(g->heap_id)) {
+	    HEAP_ERROR(g->heap_id);
+	}
+#endif
 	if ((e = g->expls)) {
 	    int l;
 
@@ -1952,6 +1957,11 @@ complistmatches(UNUSED(Hookdef dummy), C
     Cmgroup oamatches = amatches;
 
     amatches = dat->matches;
+#ifdef ZSH_HEAP_DEBUG
+    if (memory_validate(amatches->heap_id)) {
+	HEAP_ERROR(amatches->heap_id);
+    }
+#endif
 
     noselect = 0;
 
@@ -2640,6 +2650,11 @@ domenuselect(Hookdef dummy, Chdata dat)
 	    s->mlbeg = mlbeg;
 	    memcpy(&(s->info), &minfo, sizeof(struct menuinfo));
 	    s->amatches = amatches;
+#ifdef ZSH_HEAP_DEBUG
+	    if (memory_validate(amatches->heap_id)) {
+		HEAP_ERROR(amatches->heap_id);
+	    }
+#endif
 	    s->pmatches = pmatches;
 	    s->lastmatches = lastmatches;
 	    s->lastlmatches = lastlmatches;
@@ -2835,6 +2850,11 @@ domenuselect(Hookdef dummy, Chdata dat)
 		if (lastmatches)
 		    freematches(lastmatches, 0);
 		amatches = u->amatches;
+#ifdef ZSH_HEAP_DEBUG
+		if (memory_validate(amatches->heap_id)) {
+		    HEAP_ERROR(amatches->heap_id);
+		}
+#endif
 		pmatches = u->pmatches;
 		lastmatches = u->lastmatches;
 		lastlmatches = u->lastlmatches;
Index: Src/Zle/compresult.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/compresult.c,v
retrieving revision 1.81
diff -p -u -r1.81 compresult.c
--- Src/Zle/compresult.c	9 May 2011 09:49:09 -0000	1.81
+++ Src/Zle/compresult.c	13 May 2011 23:18:32 -0000
@@ -906,7 +906,14 @@ do_allmatches(UNUSED(int end))
 
     for (minfo.group = amatches;
 	 minfo.group && !(minfo.group)->mcount;
-	 minfo.group = (minfo.group)->next);
+	 minfo.group = (minfo.group)->next) {
+#ifdef ZSH_HEAP_DEBUG
+	if (memory_validate(minfo.group->heap_id)) {
+	    HEAP_ERROR(minfo.group->heap_id);
+	}
+#endif
+    }
+
 
     mc = (minfo.group)->matches;
 
@@ -1172,6 +1179,11 @@ do_single(Cmatch m)
 	struct chdata dat;
 
 	dat.matches = amatches;
+#ifdef ZSH_HEAP_DEBUG
+	if (memory_validate(dat.matches->heap_id)) {
+	    HEAP_ERROR(dat.matches->heap_id);
+	}
+#endif
 	dat.num = nmatches;
 	dat.cur = m;
 
@@ -1210,8 +1222,14 @@ do_menucmp(int lst)
     do {
 	if (!*++(minfo.cur)) {
 	    do {
-		if (!(minfo.group = (minfo.group)->next))
+		if (!(minfo.group = (minfo.group)->next)) {
 		    minfo.group = amatches;
+#ifdef ZSH_HEAP_DEBUG
+		    if (memory_validate(minfo.group->heap_id)) {
+			HEAP_ERROR(minfo.group->heap_id);
+		    }
+#endif
+		}
 	    } while (!(minfo.group)->mcount);
 	    minfo.cur = minfo.group->matches;
 	}
@@ -1291,12 +1309,18 @@ accept_last(void)
 	    Cmgroup g;
 	    Cmatch *m;
 
-	    for (g = amatches, m = NULL; g && (!m || !*m); g = g->next)
+	    for (g = amatches, m = NULL; g && (!m || !*m); g = g->next) {
+#ifdef ZSH_HEAP_DEBUG
+		if (memory_validate(g->heap_id)) {
+		    HEAP_ERROR(g->heap_id);
+		}
+#endif
 		for (m = g->matches; *m; m++)
 		    if (!hasbrpsfx(*m, minfo.prebr, minfo.postbr)) {
 			showinglist = -2;
 			break;
 		    }
+	    }
 	}
     }
     menuacc++;
@@ -1381,7 +1405,13 @@ do_ambig_menu(void)
 	insgnum = comp_mod(insgnum, lastpermgnum);
 	for (minfo.group = amatches;
 	     minfo.group && (minfo.group)->num != insgnum + 1;
-	     minfo.group = (minfo.group)->next);
+	     minfo.group = (minfo.group)->next) {
+#ifdef ZSH_HEAP_DEBUG
+	    if (memory_validate(minfo.group->heap_id)) {
+		HEAP_ERROR(minfo.group->heap_id);
+	    }
+#endif
+	}
 	if (!minfo.group || !(minfo.group)->mcount) {
 	    minfo.cur = NULL;
 	    minfo.asked = 0;
@@ -1393,8 +1423,14 @@ do_ambig_menu(void)
 	insmnum = comp_mod(insmnum, lastpermmnum);
 	for (minfo.group = amatches;
 	     minfo.group && (minfo.group)->mcount <= insmnum;
-	     minfo.group = (minfo.group)->next)
+	     minfo.group = (minfo.group)->next) {
 	    insmnum -= (minfo.group)->mcount;
+#ifdef ZSH_HEAP_DEBUG
+	    if (memory_validate(minfo.group->heap_id)) {
+		HEAP_ERROR(minfo.group->heap_id);
+	    }
+#endif
+	}
 	if (!minfo.group) {
 	    minfo.cur = NULL;
 	    minfo.asked = 0;
@@ -1483,6 +1519,11 @@ calclist(int showall)
 	int nl = 0, l, glong = 1, gshort = zterm_columns, ndisp = 0, totl = 0;
         int hasf = 0;
 
+#ifdef ZSH_HEAP_DEBUG
+	if (memory_validate(g->heap_id)) {
+	    HEAP_ERROR(g->heap_id);
+	}
+#endif
 	g->flags |= CGF_PACKED | CGF_ROWS;
 
 	if (!onlyexpl && pp) {
@@ -1624,6 +1665,11 @@ calclist(int showall)
 	for (g = amatches; g; g = g->next) {
 	    glines = 0;
 
+#ifdef ZSH_HEAP_DEBUG
+	    if (memory_validate(g->heap_id)) {
+		HEAP_ERROR(g->heap_id);
+	    }
+#endif
 	    zfree(g->widths, 0);
 	    g->widths = NULL;
 
@@ -1858,6 +1904,11 @@ calclist(int showall)
     else
 	for (g = amatches; g; g = g->next)
 	{
+#ifdef ZSH_HEAP_DEBUG
+	    if (memory_validate(g->heap_id)) {
+		HEAP_ERROR(g->heap_id);
+	    }
+#endif
 	    zfree(g->widths, 0);
 	    g->widths = NULL;
 	}
@@ -1945,6 +1996,11 @@ printlist(int over, CLPrintFunc printm, 
     for (g = amatches; g; g = g->next) {
 	char **pp = g->ylist;
 
+#ifdef ZSH_HEAP_DEBUG
+	if (memory_validate(g->heap_id)) {
+	    HEAP_ERROR(g->heap_id);
+	}
+#endif
 	if ((e = g->expls)) {
 	    int l;
 
@@ -2144,7 +2200,13 @@ bld_all_str(Cmatch all)
 
     buf[0] = '\0';
 
-    for (g = amatches; g && !g->mcount; g = g->next);
+    for (g = amatches; g && !g->mcount; g = g->next) {
+#ifdef ZSH_HEAP_DEBUG
+	if (memory_validate(g->heap_id)) {
+	    HEAP_ERROR(g->heap_id);
+	}
+#endif
+    }
 
     mp = g->matches;
     while (1) {
@@ -2262,6 +2324,11 @@ list_matches(UNUSED(Hookdef dummy), UNUS
 #endif
 
     dat.matches = amatches;
+#ifdef ZSH_HEAP_DEBUG
+    if (memory_validate(dat.matches->heap_id)) {
+	HEAP_ERROR(dat.matches->heap_id);
+    }
+#endif
     dat.num = nmatches;
     dat.cur = NULL;
     ret = runhookdef(COMPLISTMATCHESHOOK, (void *) &dat);

-- 
Peter Stephenson <p.w.stephenson@ntlworld.com>
Web page now at http://homepage.ntlworld.com/p.w.stephenson/


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Completion crash owing to bad allocation
  2011-05-13 23:26     ` Peter Stephenson
@ 2011-05-14  2:56       ` Bart Schaefer
  0 siblings, 0 replies; 8+ messages in thread
From: Bart Schaefer @ 2011-05-14  2:56 UTC (permalink / raw)
  To: zsh-workers

On May 14, 12:26am, Peter Stephenson wrote:
}
} So I added the following code

Phileas Fogg appeared, followed by an excited crowd who had forced
their way through the club doors, and in his calm voice, said,
"Here I am, gentlemen!"


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Speed improvement patch for __git_files and __git_files_relative
  2011-05-06 13:03 Speed improvement patch for __git_files and __git_files_relative Nikolai Weibull
  2011-05-11 13:27 ` Frank Terbeck
@ 2011-05-17 12:55 ` Nikolai Weibull
  2011-05-17 13:01   ` Frank Terbeck
  1 sibling, 1 reply; 8+ messages in thread
From: Nikolai Weibull @ 2011-05-17 12:55 UTC (permalink / raw)
  To: Zsh Workers

On Fri, May 6, 2011 at 15:03, Nikolai Weibull <now@bitwi.se> wrote:
> Hi!
>
> I’ve now put together a patch for __git_files and
> __git_files_relative.  __git_files is a lot faster than previous
> versions and __git_files_relative should be a lot faster too, now that
> it only uses substitutions.  (Well, there’s a for loop that iterates
> over the file names to determine the common path prefix, but I see no
> way of avoiding it.)
>
> It would be great if this could make it into the 4.3.12 release, so
> please give it a try as soon as possible.

It seems that no one is having any problems with this patch, so could
someone please apply it?


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Speed improvement patch for __git_files and __git_files_relative
  2011-05-17 12:55 ` Speed improvement patch for __git_files and __git_files_relative Nikolai Weibull
@ 2011-05-17 13:01   ` Frank Terbeck
  0 siblings, 0 replies; 8+ messages in thread
From: Frank Terbeck @ 2011-05-17 13:01 UTC (permalink / raw)
  To: Nikolai Weibull; +Cc: Zsh Workers

Nikolai Weibull wrote:
[...]
> It seems that no one is having any problems with this patch, so could
> someone please apply it?

I was planing to do that in the evening (MEST). ...unless somebody beats
me to it now.

Regards, Frank


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2011-05-17 13:19 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-05-06 13:03 Speed improvement patch for __git_files and __git_files_relative Nikolai Weibull
2011-05-11 13:27 ` Frank Terbeck
2011-05-11 13:44   ` Mikael Magnusson
2011-05-11 14:09   ` Completion crash owing to bad allocation Peter Stephenson
2011-05-13 23:26     ` Peter Stephenson
2011-05-14  2:56       ` Bart Schaefer
2011-05-17 12:55 ` Speed improvement patch for __git_files and __git_files_relative Nikolai Weibull
2011-05-17 13:01   ` Frank Terbeck

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).