components/zsh/patches/fixes.patch
changeset 7589 7eccd056eff6
parent 7586 3db1c2ef2aa9
child 7590 5461fab14904
equal deleted inserted replaced
7586:3db1c2ef2aa9 7589:7eccd056eff6
     1 Pick up a couple of post-5.2 patches from the list (so no need to push
       
     2 these upstream).
       
     3 
       
     4 Fix a segfault in zsh (workers/37337).
       
     5 
       
     6 diff --git a/Src/Zle/zle.h b/Src/Zle/zle.h
       
     7 index 2d672de..e9b1428 100644
       
     8 --- a/Src/Zle/zle.h
       
     9 +++ b/Src/Zle/zle.h
       
    10 @@ -213,6 +213,8 @@ struct widget {
       
    11  #define ZLE_KEEPSUFFIX	(1<<9)	/* DON'T remove added suffix */
       
    12  #define ZLE_NOTCOMMAND  (1<<10)	/* widget should not alter lastcmd */
       
    13  #define ZLE_ISCOMP      (1<<11)	/* usable for new style completion */
       
    14 +#define WIDGET_INUSE    (1<<12) /* widget is in use */
       
    15 +#define WIDGET_FREE     (1<<13) /* request to free when no longer in use */
       
    16  
       
    17  /* thingies */
       
    18  
       
    19 diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
       
    20 index 38427e8..1f0c07d 100644
       
    21 --- a/Src/Zle/zle_main.c
       
    22 +++ b/Src/Zle/zle_main.c
       
    23 @@ -1344,6 +1344,8 @@ execzlefunc(Thingy func, char **args, int set_bindk)
       
    24  	    eofsent = 1;
       
    25  	    ret = 1;
       
    26  	} else {
       
    27 +	    int inuse = wflags & WIDGET_INUSE;
       
    28 +	    w->flags |= WIDGET_INUSE;
       
    29  	    if(!(wflags & ZLE_KEEPSUFFIX))
       
    30  		removesuffix();
       
    31  	    if(!(wflags & ZLE_MENUCMP)) {
       
    32 @@ -1367,6 +1369,12 @@ execzlefunc(Thingy func, char **args, int set_bindk)
       
    33  		ret = w->u.fn(args);
       
    34  		unqueue_signals();
       
    35  	    }
       
    36 +	    if (!inuse) {
       
    37 +		if (w->flags & WIDGET_FREE)
       
    38 +		    freewidget(w);
       
    39 +		else
       
    40 +		    w->flags &= ~WIDGET_INUSE;
       
    41 +	    }
       
    42  	    if (!(wflags & ZLE_NOTCOMMAND))
       
    43  		lastcmd = wflags;
       
    44  	}
       
    45 @@ -1387,6 +1395,8 @@ execzlefunc(Thingy func, char **args, int set_bindk)
       
    46  	    int osc = sfcontext, osi = movefd(0);
       
    47  	    int oxt = isset(XTRACE);
       
    48  	    LinkList largs = NULL;
       
    49 +	    int inuse = w->flags & WIDGET_INUSE;
       
    50 +	    w->flags |= WIDGET_INUSE;
       
    51  
       
    52  	    if (*args) {
       
    53  		largs = newlinklist();
       
    54 @@ -1402,8 +1412,15 @@ execzlefunc(Thingy func, char **args, int set_bindk)
       
    55  	    opts[XTRACE] = oxt;
       
    56  	    sfcontext = osc;
       
    57  	    endparamscope();
       
    58 -	    lastcmd = w->flags;
       
    59 -	    w->flags = 0;
       
    60 +	    lastcmd = w->flags & ~(WIDGET_INUSE|WIDGET_FREE);
       
    61 +	    if (inuse) {
       
    62 +		w->flags &= WIDGET_INUSE|WIDGET_FREE;
       
    63 +	    } else {
       
    64 +		if (w->flags & WIDGET_FREE)
       
    65 +		    freewidget(w);
       
    66 +		else
       
    67 +		    w->flags = 0;
       
    68 +	    }
       
    69  	    r = 1;
       
    70  	    redup(osi, 0);
       
    71  	}
       
    72 diff --git a/Src/Zle/zle_thingy.c b/Src/Zle/zle_thingy.c
       
    73 index 271fd8e..21495b6 100644
       
    74 --- a/Src/Zle/zle_thingy.c
       
    75 +++ b/Src/Zle/zle_thingy.c
       
    76 @@ -253,9 +253,14 @@ unbindwidget(Thingy t, int override)
       
    77  /* Free a widget. */
       
    78  
       
    79  /**/
       
    80 -static void
       
    81 +void
       
    82  freewidget(Widget w)
       
    83  {
       
    84 +    if (w->flags & WIDGET_INUSE) {
       
    85 +	w->flags |= WIDGET_FREE;
       
    86 +	return;
       
    87 +    }
       
    88 +
       
    89      if (w->flags & WIDGET_NCOMP) {
       
    90  	zsfree(w->u.comp.wid);
       
    91  	zsfree(w->u.comp.func);
       
    92 
       
    93 
       
    94 Fix a bug with bindkey and unicode characters (users/21071).
       
    95 
       
    96 diff --git a/Src/Zle/zle_keymap.c b/Src/Zle/zle_keymap.c
       
    97 index 069580f..d6d116b 100644
       
    98 --- a/Src/Zle/zle_keymap.c
       
    99 +++ b/Src/Zle/zle_keymap.c
       
   100 @@ -1503,7 +1503,7 @@ getkeymapcmd(Keymap km, Thingy *funcp, char **strp)
       
   101  		    f->widget->flags & ZLE_VIOPER);
       
   102  #ifdef MULTIBYTE_SUPPORT
       
   103  	    if ((f == Th(z_selfinsert) || f == Th(z_selfinsertunmeta)) &&
       
   104 -		!lastchar_wide_valid) {
       
   105 +		!lastchar_wide_valid && !ispfx) {
       
   106  		int len;
       
   107  		VARARR(char, mbc, MB_CUR_MAX);
       
   108  		ZLE_INT_T inchar = getrestchar(lastchar, mbc, &len);
       
   109 
       
   110 
       
   111 _subscript - fix completion of associative array keys (workers/37788)
       
   112 
       
   113 diff --git a/Completion/Zsh/Context/_subscript b/Completion/Zsh/Context/_subscript
       
   114 index 0ccc0c4..679f129 100644
       
   115 --- a/Completion/Zsh/Context/_subscript
       
   116 +++ b/Completion/Zsh/Context/_subscript
       
   117 @@ -81,8 +81,8 @@ elif compset -P '\('; then
       
   118  elif [[ ${(Pt)${compstate[parameter]}} = assoc* ]]; then
       
   119    local suf MATCH MBEGIN MEND
       
   120    local -a keys
       
   121 -  keys=(${${(kP)compstate[parameter]}//(#m)[\$\\\[\]\(\)\[\{\}]/\\$MATCH})
       
   122 -  keys=(${keys//#%(#m)[*@]/(e)$MATCH})
       
   123 +  keys=("${(@)${(@k)${(P)compstate[parameter]}}//(#m)[\$\\\[\]\(\)\[\{\}]/\\$MATCH}")
       
   124 +  keys=("${(@)keys//#%(#m)[*@]/(e)$MATCH}")
       
   125    [[ "$RBUFFER" != (|\\)\]* ]] && suf="$osuf"
       
   126  
       
   127    _wanted association-keys expl 'association key' \