Patch 9.0.1390
Problem:    FOR_ALL_ macros are defined in an unexpected file.
Solution:   Move FOR_ALL_ macros to macros.h.  Add FOR_ALL_HASHTAB_ITEMS.
            (Yegappan Lakshmanan, closes #12109)
Files:      src/dict.c, src/diff.c, src/eval.c, src/evalfunc.c,
            src/evalvars.c, src/globals.h, src/hashtab.c, src/if_mzsch.c,
            src/if_ruby.c, src/job.c, src/macros.h, src/mbyte.c,
            src/os_unix.c, src/os_win32.c, src/popupwin.c, src/profiler.c,
            src/scriptfile.c, src/session.c, src/sign.c, src/spellfile.c,
            src/spellsuggest.c, src/syntax.c, src/testing.c, src/textprop.c,
            src/userfunc.c, src/vim9execute.c, src/vim9script.c,
            src/vim9type.c, src/viminfo.c, src/window.c


*** ../vim-9.0.1389/src/dict.c  2023-01-09 19:04:19.300528373 +0000
--- src/dict.c  2023-03-07 17:10:22.925201387 +0000
***************
*** 128,134 ****
      // Lock the hashtab, we don't want it to resize while freeing items.
      hash_lock(ht);
      todo = (int)ht->ht_used;
!     for (hi = ht->ht_array; todo > 0; ++hi)
      {
        if (!HASHITEM_EMPTY(hi))
        {
--- 128,134 ----
      // Lock the hashtab, we don't want it to resize while freeing items.
      hash_lock(ht);
      todo = (int)ht->ht_used;
!     FOR_ALL_HASHTAB_ITEMS(ht, hi, todo)
      {
        if (!HASHITEM_EMPTY(hi))
        {
***************
*** 781,787 ****
      ga_append(&ga, '{');
  
      todo = (int)d->dv_hashtab.ht_used;
!     for (hi = d->dv_hashtab.ht_array; todo > 0 && !got_int; ++hi)
      {
        if (!HASHITEM_EMPTY(hi))
        {
--- 781,787 ----
      ga_append(&ga, '{');
  
      todo = (int)d->dv_hashtab.ht_used;
!     FOR_ALL_HASHTAB_ITEMS(&d->dv_hashtab, hi, todo)
      {
        if (!HASHITEM_EMPTY(hi))
        {
***************
*** 1114,1120 ****
        type = NULL;
  
      todo = (int)d2->dv_hashtab.ht_used;
!     for (hashitem_T *hi2 = d2->dv_hashtab.ht_array; todo > 0; ++hi2)
      {
        if (!HASHITEM_EMPTY(hi2))
        {
--- 1114,1121 ----
        type = NULL;
  
      todo = (int)d2->dv_hashtab.ht_used;
!     hashitem_T *hi2;
!     FOR_ALL_HASHTAB_ITEMS(&d2->dv_hashtab, hi2, todo)
      {
        if (!HASHITEM_EMPTY(hi2))
        {
***************
*** 1203,1209 ****
        return FALSE;
  
      todo = (int)d1->dv_hashtab.ht_used;
!     for (hi = d1->dv_hashtab.ht_array; todo > 0; ++hi)
      {
        if (!HASHITEM_EMPTY(hi))
        {
--- 1204,1210 ----
        return FALSE;
  
      todo = (int)d1->dv_hashtab.ht_used;
!     FOR_ALL_HASHTAB_ITEMS(&d1->dv_hashtab, hi, todo)
      {
        if (!HASHITEM_EMPTY(hi))
        {
***************
*** 1233,1239 ****
        return 0;
  
      todo = (int)d->dv_hashtab.ht_used;
!     for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi)
      {
        if (!HASHITEM_EMPTY(hi))
        {
--- 1234,1240 ----
        return 0;
  
      todo = (int)d->dv_hashtab.ht_used;
!     FOR_ALL_HASHTAB_ITEMS(&d->dv_hashtab, hi, todo)
      {
        if (!HASHITEM_EMPTY(hi))
        {
***************
*** 1369,1375 ****
      ht = &d->dv_hashtab;
      hash_lock(ht);
      todo = (int)ht->ht_used;
!     for (hi = ht->ht_array; todo > 0; ++hi)
      {
        if (!HASHITEM_EMPTY(hi))
        {
--- 1370,1376 ----
      ht = &d->dv_hashtab;
      hash_lock(ht);
      todo = (int)ht->ht_used;
!     FOR_ALL_HASHTAB_ITEMS(ht, hi, todo)
      {
        if (!HASHITEM_EMPTY(hi))
        {
***************
*** 1502,1508 ****
        return;
  
      todo = (int)d->dv_hashtab.ht_used;
!     for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi)
      {
        if (!HASHITEM_EMPTY(hi))
        {
--- 1503,1509 ----
        return;
  
      todo = (int)d->dv_hashtab.ht_used;
!     FOR_ALL_HASHTAB_ITEMS(&d->dv_hashtab, hi, todo)
      {
        if (!HASHITEM_EMPTY(hi))
        {
***************
*** 1587,1593 ****
      hashitem_T        *hi;
  
      // Set readonly
!     for (hi = di->dv_hashtab.ht_array; todo > 0 ; ++hi)
      {
        if (HASHITEM_EMPTY(hi))
            continue;
--- 1588,1594 ----
      hashitem_T        *hi;
  
      // Set readonly
!     FOR_ALL_HASHTAB_ITEMS(&di->dv_hashtab, hi, todo)
      {
        if (HASHITEM_EMPTY(hi))
            continue;
*** ../vim-9.0.1389/src/diff.c  2023-01-22 21:14:32.613863616 +0000
--- src/diff.c  2023-03-07 17:10:22.925201387 +0000
***************
*** 2650,2656 ****
  {
      diff_T    *dp;
  
!     for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next)
        if (dp == diff)
            return TRUE;
      return FALSE;
--- 2650,2656 ----
  {
      diff_T    *dp;
  
!     FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
        if (dp == diff)
            return TRUE;
      return FALSE;
*** ../vim-9.0.1389/src/eval.c  2023-03-05 13:12:28.492767233 +0000
--- src/eval.c  2023-03-07 17:10:22.925201387 +0000
***************
*** 5415,5421 ****
            // it is added to ht_stack, if it contains a list it is added to
            // list_stack.
            todo = (int)cur_ht->ht_used;
!           for (hi = cur_ht->ht_array; todo > 0; ++hi)
                if (!HASHITEM_EMPTY(hi))
                {
                    --todo;
--- 5415,5421 ----
            // it is added to ht_stack, if it contains a list it is added to
            // list_stack.
            todo = (int)cur_ht->ht_used;
!           FOR_ALL_HASHTAB_ITEMS(cur_ht, hi, todo)
                if (!HASHITEM_EMPTY(hi))
                {
                    --todo;
*** ../vim-9.0.1389/src/evalfunc.c      2023-02-21 12:38:46.827436713 +0000
--- src/evalfunc.c      2023-03-07 17:10:22.925201387 +0000
***************
*** 7825,7831 ****
        if (d != NULL)
        {
            todo = (int)d->dv_hashtab.ht_used;
!           for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi)
            {
                if (!HASHITEM_EMPTY(hi))
                {
--- 7825,7831 ----
        if (d != NULL)
        {
            todo = (int)d->dv_hashtab.ht_used;
!           FOR_ALL_HASHTAB_ITEMS(&d->dv_hashtab, hi, todo)
            {
                if (!HASHITEM_EMPTY(hi))
                {
*** ../vim-9.0.1389/src/evalvars.c      2023-02-01 13:11:11.710991162 +0000
--- src/evalvars.c      2023-03-07 17:10:22.929201385 +0000
***************
*** 2317,2323 ****
                {
                    // recursive: lock/unlock the items the List contains
                    todo = (int)d->dv_hashtab.ht_used;
!                   for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi)
                    {
                        if (!HASHITEM_EMPTY(hi))
                        {
--- 2317,2323 ----
                {
                    // recursive: lock/unlock the items the List contains
                    todo = (int)d->dv_hashtab.ht_used;
!                   FOR_ALL_HASHTAB_ITEMS(&d->dv_hashtab, hi, todo)
                    {
                        if (!HASHITEM_EMPTY(hi))
                        {
***************
*** 3571,3577 ****
  
      hash_lock(ht);
      todo = (int)ht->ht_used;
!     for (hi = ht->ht_array; todo > 0; ++hi)
      {
        if (!HASHITEM_EMPTY(hi))
        {
--- 3571,3577 ----
  
      hash_lock(ht);
      todo = (int)ht->ht_used;
!     FOR_ALL_HASHTAB_ITEMS(ht, hi, todo)
      {
        if (!HASHITEM_EMPTY(hi))
        {
*** ../vim-9.0.1389/src/globals.h       2023-02-21 12:38:46.823436717 +0000
--- src/globals.h       2023-03-07 17:10:22.929201385 +0000
***************
*** 873,882 ****
   * overruling of menus that the user already defined.
   */
  EXTERN int    sys_menu INIT(= FALSE);
- 
- #define FOR_ALL_MENUS(m) for ((m) = root_menu; (m) != NULL; (m) = (m)->next)
- #define FOR_ALL_CHILD_MENUS(p, c) \
-     for ((c) = (p)->children; (c) != NULL; (c) = (c)->next)
  #endif
  
  #ifdef FEAT_GUI
--- 873,878 ----
***************
*** 968,994 ****
  EXTERN win_T  *prevwin INIT(= NULL);  // previous window
  #define ONE_WINDOW (firstwin == lastwin)
  #define W_NEXT(wp) ((wp)->w_next)
- #define FOR_ALL_WINDOWS(wp) for ((wp) = firstwin; (wp) != NULL; (wp) = 
(wp)->w_next)
- #define FOR_ALL_FRAMES(frp, first_frame) \
-     for ((frp) = first_frame; (frp) != NULL; (frp) = (frp)->fr_next)
- #define FOR_ALL_TABPAGES(tp) for ((tp) = first_tabpage; (tp) != NULL; (tp) = 
(tp)->tp_next)
- #define FOR_ALL_WINDOWS_IN_TAB(tp, wp) \
-     for ((wp) = ((tp) == NULL || (tp) == curtab) \
-           ? firstwin : (tp)->tp_firstwin; (wp); (wp) = (wp)->w_next)
- /*
-  * When using this macro "break" only breaks out of the inner loop. Use "goto"
-  * to break out of the tabpage loop.
-  */
- #define FOR_ALL_TAB_WINDOWS(tp, wp) \
-     for ((tp) = first_tabpage; (tp) != NULL; (tp) = (tp)->tp_next) \
-       for ((wp) = ((tp) == curtab) \
-               ? firstwin : (tp)->tp_firstwin; (wp); (wp) = (wp)->w_next)
- 
- #define FOR_ALL_POPUPWINS(wp) \
-     for ((wp) = first_popupwin; (wp) != NULL; (wp) = (wp)->w_next)
- #define FOR_ALL_POPUPWINS_IN_TAB(tp, wp) \
-     for ((wp) = (tp)->tp_first_popupwin; (wp) != NULL; (wp) = (wp)->w_next)
- 
  
  EXTERN win_T  *curwin;        // currently active window
  
--- 964,969 ----
***************
*** 1050,1065 ****
  EXTERN buf_T  *lastbuf INIT(= NULL);  // last buffer
  EXTERN buf_T  *curbuf INIT(= NULL);   // currently active buffer
  
- #define FOR_ALL_BUFFERS(buf) \
-     for ((buf) = firstbuf; (buf) != NULL; (buf) = (buf)->b_next)
- 
- #define FOR_ALL_BUF_WININFO(buf, wip) \
-     for ((wip) = (buf)->b_wininfo; (wip) != NULL; (wip) = (wip)->wi_next)
- 
- // Iterate through all the signs placed in a buffer
- #define FOR_ALL_SIGNS_IN_BUF(buf, sign) \
-       for ((sign) = (buf)->b_signlist; (sign) != NULL; (sign) = 
(sign)->se_next)
- 
  // Flag that is set when switching off 'swapfile'.  It means that all blocks
  // are to be loaded into memory.  Shouldn't be global...
  EXTERN int    mf_dont_release INIT(= FALSE);  // don't release blocks
--- 1025,1030 ----
***************
*** 1874,1882 ****
  // Line in which spell checking wasn't highlighted because it touched the
  // cursor position in Insert mode.
  EXTERN linenr_T               spell_redraw_lnum INIT(= 0);
- 
- #define FOR_ALL_SPELL_LANGS(slang) \
-     for ((slang) = first_lang; (slang) != NULL; (slang) = (slang)->sl_next)
  #endif
  
  #ifdef FEAT_CONCEAL
--- 1839,1844 ----
***************
*** 2015,2025 ****
  
  // Whether a redraw is needed for appending a line to a buffer.
  EXTERN int channel_need_redraw INIT(= FALSE);
- 
- # define FOR_ALL_CHANNELS(ch) \
-     for ((ch) = first_channel; (ch) != NULL; (ch) = (ch)->ch_next)
- # define FOR_ALL_JOBS(job) \
-     for ((job) = first_job; (job) != NULL; (job) = (job)->jv_next)
  #endif
  
  #ifdef FEAT_EVAL
--- 1977,1982 ----
***************
*** 2032,2045 ****
  # define REPEATED_MSG_SAFESTATE           2
  #endif
  
- #if defined(FEAT_DIFF)
- #define FOR_ALL_DIFFBLOCKS_IN_TAB(tp, dp) \
-     for ((dp) = (tp)->tp_first_diff; (dp) != NULL; (dp) = (dp)->df_next)
- #endif
- 
- #define FOR_ALL_LIST_ITEMS(l, li) \
-     for ((li) = (l) == NULL ? NULL : (l)->lv_first; (li) != NULL; (li) = 
(li)->li_next)
- 
  // While executing a regexp and set to OPTION_MAGIC_ON or OPTION_MAGIC_OFF 
this
  // overrules p_magic.  Otherwise set to OPTION_MAGIC_NOT_SET.
  EXTERN optmagic_T magic_overruled INIT(= OPTION_MAGIC_NOT_SET);
--- 1989,1994 ----
*** ../vim-9.0.1389/src/hashtab.c       2022-12-26 13:51:22.169286655 +0000
--- src/hashtab.c       2023-03-07 17:10:22.929201385 +0000
***************
*** 108,114 ****
      hashitem_T        *hi;
  
      todo = (long)ht->ht_used;
!     for (hi = ht->ht_array; todo > 0; ++hi)
      {
        if (!HASHITEM_EMPTY(hi))
        {
--- 108,114 ----
      hashitem_T        *hi;
  
      todo = (long)ht->ht_used;
!     FOR_ALL_HASHTAB_ITEMS(ht, hi, todo)
      {
        if (!HASHITEM_EMPTY(hi))
        {
*** ../vim-9.0.1389/src/if_mzsch.c      2023-02-22 13:14:33.514931016 +0000
--- src/if_mzsch.c      2023-03-07 17:10:22.929201385 +0000
***************
*** 3067,3073 ****
            hashitem_T  *hi;
            dictitem_T  *di;
  
!           for (hi = ht->ht_array; todo > 0; ++hi)
            {
                if (!HASHITEM_EMPTY(hi))
                {
--- 3067,3073 ----
            hashitem_T  *hi;
            dictitem_T  *di;
  
!           FOR_ALL_HASHTAB_ITEMS(ht, hi, todo)
            {
                if (!HASHITEM_EMPTY(hi))
                {
*** ../vim-9.0.1389/src/if_ruby.c       2023-01-12 12:33:25.424525189 +0000
--- src/if_ruby.c       2023-03-07 17:10:22.929201385 +0000
***************
*** 1147,1153 ****
            hashitem_T  *hi;
            dictitem_T  *di;
  
!           for (hi = ht->ht_array; todo > 0; ++hi)
            {
                if (!HASHITEM_EMPTY(hi))
                {
--- 1147,1153 ----
            hashitem_T  *hi;
            dictitem_T  *di;
  
!           FOR_ALL_HASHTAB_ITEMS(ht, hi, todo)
            {
                if (!HASHITEM_EMPTY(hi))
                {
*** ../vim-9.0.1389/src/job.c   2023-02-21 14:27:34.520360383 +0000
--- src/job.c   2023-03-07 17:10:22.929201385 +0000
***************
*** 140,146 ****
        return OK;
  
      todo = (int)dict->dv_hashtab.ht_used;
!     for (hi = dict->dv_hashtab.ht_array; todo > 0; ++hi)
        if (!HASHITEM_EMPTY(hi))
        {
            item = &dict_lookup(hi)->di_tv;
--- 140,146 ----
        return OK;
  
      todo = (int)dict->dv_hashtab.ht_used;
!     FOR_ALL_HASHTAB_ITEMS(&dict->dv_hashtab, hi, todo)
        if (!HASHITEM_EMPTY(hi))
        {
            item = &dict_lookup(hi)->di_tv;
*** ../vim-9.0.1389/src/macros.h        2023-01-22 21:14:32.621863614 +0000
--- src/macros.h        2023-03-07 17:10:22.929201385 +0000
***************
*** 396,398 ****
--- 396,451 ----
  
  // Length of the array.
  #define ARRAY_LENGTH(a) (sizeof(a) / sizeof((a)[0]))
+ 
+ #ifdef FEAT_MENU
+ #define FOR_ALL_MENUS(m) \
+     for ((m) = root_menu; (m) != NULL; (m) = (m)->next)
+ #define FOR_ALL_CHILD_MENUS(p, c) \
+     for ((c) = (p)->children; (c) != NULL; (c) = (c)->next)
+ #endif
+ 
+ #define FOR_ALL_WINDOWS(wp) \
+     for ((wp) = firstwin; (wp) != NULL; (wp) = (wp)->w_next)
+ #define FOR_ALL_FRAMES(frp, first_frame) \
+     for ((frp) = first_frame; (frp) != NULL; (frp) = (frp)->fr_next)
+ #define FOR_ALL_TABPAGES(tp) \
+     for ((tp) = first_tabpage; (tp) != NULL; (tp) = (tp)->tp_next)
+ #define FOR_ALL_WINDOWS_IN_TAB(tp, wp) \
+     for ((wp) = ((tp) == NULL || (tp) == curtab) \
+           ? firstwin : (tp)->tp_firstwin; (wp); (wp) = (wp)->w_next)
+ /*
+  * When using this macro "break" only breaks out of the inner loop. Use "goto"
+  * to break out of the tabpage loop.
+  */
+ #define FOR_ALL_TAB_WINDOWS(tp, wp) \
+     for ((tp) = first_tabpage; (tp) != NULL; (tp) = (tp)->tp_next) \
+       for ((wp) = ((tp) == curtab) \
+               ? firstwin : (tp)->tp_firstwin; (wp); (wp) = (wp)->w_next)
+ 
+ #define FOR_ALL_POPUPWINS(wp) \
+     for ((wp) = first_popupwin; (wp) != NULL; (wp) = (wp)->w_next)
+ #define FOR_ALL_POPUPWINS_IN_TAB(tp, wp) \
+     for ((wp) = (tp)->tp_first_popupwin; (wp) != NULL; (wp) = (wp)->w_next)
+ 
+ #define FOR_ALL_BUFFERS(buf) \
+     for ((buf) = firstbuf; (buf) != NULL; (buf) = (buf)->b_next)
+ 
+ #define FOR_ALL_BUF_WININFO(buf, wip) \
+     for ((wip) = (buf)->b_wininfo; (wip) != NULL; (wip) = (wip)->wi_next)
+ 
+ // Iterate through all the signs placed in a buffer
+ #define FOR_ALL_SIGNS_IN_BUF(buf, sign) \
+     for ((sign) = (buf)->b_signlist; (sign) != NULL; (sign) = (sign)->se_next)
+ 
+ #ifdef FEAT_SPELL
+ #define FOR_ALL_SPELL_LANGS(slang) \
+     for ((slang) = first_lang; (slang) != NULL; (slang) = (slang)->sl_next)
+ #endif
+ 
+ // Iterate over all the items in a List
+ #define FOR_ALL_LIST_ITEMS(l, li) \
+     for ((li) = (l) == NULL ? NULL : (l)->lv_first; (li) != NULL; (li) = 
(li)->li_next)
+ 
+ // Iterate over all the items in a hash table
+ #define FOR_ALL_HASHTAB_ITEMS(ht, hi, todo) \
+     for ((hi) = (ht)->ht_array; (todo) > 0; ++(hi))
*** ../vim-9.0.1389/src/mbyte.c 2023-01-20 16:00:49.542341277 +0000
--- src/mbyte.c 2023-03-07 17:10:22.929201385 +0000
***************
*** 1579,1585 ****
        // values of them.
        //
        // Note that these symbols are of varying widths, as they are symbols
!       // representing differents things ranging from a simple gear icon to an
        // airplane. Some of them are in fact wider than double-width, but Vim
        // doesn't support non-fixed-width font, and tagging them as
        // double-width is the best way to handle them.
--- 1579,1585 ----
        // values of them.
        //
        // Note that these symbols are of varying widths, as they are symbols
!       // representing different things ranging from a simple gear icon to an
        // airplane. Some of them are in fact wider than double-width, but Vim
        // doesn't support non-fixed-width font, and tagging them as
        // double-width is the best way to handle them.
***************
*** 5647,5653 ****
      // Check that all entries are a list with three numbers, the range is
      // valid and the cell width is valid.
      item = 0;
!     for (li = l->lv_first; li != NULL; li = li->li_next)
      {
        listitem_T *lili;
        varnumber_T n1;
--- 5647,5653 ----
      // Check that all entries are a list with three numbers, the range is
      // valid and the cell width is valid.
      item = 0;
!     FOR_ALL_LIST_ITEMS(l, li)
      {
        listitem_T *lili;
        varnumber_T n1;
*** ../vim-9.0.1389/src/os_unix.c       2023-03-04 13:23:22.969812280 +0000
--- src/os_unix.c       2023-03-07 17:10:22.929201385 +0000
***************
*** 2335,2344 ****
  {
      int       do_push_pop = unix_did_set_title || did_set_icon;
  
!     // only restore the title or icon when it has been set
!     mch_settitle(((which & SAVE_RESTORE_TITLE) && unix_did_set_title) ?
!                       (oldtitle ? oldtitle : p_titleold) : NULL,
               ((which & SAVE_RESTORE_ICON) && did_set_icon) ? oldicon : NULL);
  
      if (do_push_pop)
      {
--- 2335,2354 ----
  {
      int       do_push_pop = unix_did_set_title || did_set_icon;
  
!     // Only restore the title or icon when it has been set.
!     // When using "oldtitle" make a copy, it might be freed halfway.
!     char_u *title = ((which & SAVE_RESTORE_TITLE) && unix_did_set_title)
!                       ? (oldtitle ? oldtitle : p_titleold) : NULL;
!     char_u *tofree = NULL;
!     if (title == oldtitle && oldtitle != NULL)
!     {
!       tofree = vim_strsave(title);
!       if (tofree != NULL)
!           title = tofree;
!     }
!     mch_settitle(title,
               ((which & SAVE_RESTORE_ICON) && did_set_icon) ? oldicon : NULL);
+     vim_free(tofree);
  
      if (do_push_pop)
      {
***************
*** 5654,5660 ****
            hashitem_T  *hi;
            int         todo = (int)dict->dv_hashtab.ht_used;
  
!           for (hi = dict->dv_hashtab.ht_array; todo > 0; ++hi)
                if (!HASHITEM_EMPTY(hi))
                {
                    typval_T *item = &dict_lookup(hi)->di_tv;
--- 5664,5670 ----
            hashitem_T  *hi;
            int         todo = (int)dict->dv_hashtab.ht_used;
  
!           FOR_ALL_HASHTAB_ITEMS(&dict->dv_hashtab, hi, todo)
                if (!HASHITEM_EMPTY(hi))
                {
                    typval_T *item = &dict_lookup(hi)->di_tv;
*** ../vim-9.0.1389/src/os_win32.c      2023-02-15 19:13:39.363474050 +0000
--- src/os_win32.c      2023-03-07 17:10:22.933201383 +0000
***************
*** 1308,1316 ****
        if (mods)
        {
            // If "modifiers" is explicitly set in the args, then we reset any
!           // remembered modifer key state that may have been set from earlier
!           // mod-key-down events, even if they are not yet unset by earlier
!           // mod-key-up events.
            s_dwMods = 0;
            if (mods & MOD_MASK_SHIFT)
                ker.dwControlKeyState |= SHIFT_PRESSED;
--- 1308,1316 ----
        if (mods)
        {
            // If "modifiers" is explicitly set in the args, then we reset any
!           // remembered modifier key state that may have been set from
!           // earlier mod-key-down events, even if they are not yet unset by
!           // earlier mod-key-up events.
            s_dwMods = 0;
            if (mods & MOD_MASK_SHIFT)
                ker.dwControlKeyState |= SHIFT_PRESSED;
***************
*** 2017,2023 ****
      }
  
      // Ideally, WriteConsoleInput would be used to inject these low-level
!     // events.  But, this doesnt work well in the CI test environment.  So
      // implementing an input_record_buffer instead.
      if (input_encoded)
        lpEventsWritten = write_input_record_buffer(&ir, 1);
--- 2017,2023 ----
      }
  
      // Ideally, WriteConsoleInput would be used to inject these low-level
!     // events.  But, this doesn't work well in the CI test environment.  So
      // implementing an input_record_buffer instead.
      if (input_encoded)
        lpEventsWritten = write_input_record_buffer(&ir, 1);
***************
*** 5737,5743 ****
  
      if (env != NULL)
      {
!       for (hi = env->dv_hashtab.ht_array; todo > 0; ++hi)
        {
            if (!HASHITEM_EMPTY(hi))
            {
--- 5737,5743 ----
  
      if (env != NULL)
      {
!       FOR_ALL_HASHTAB_ITEMS(&env->dv_hashtab, hi, todo)
        {
            if (!HASHITEM_EMPTY(hi))
            {
*** ../vim-9.0.1389/src/popupwin.c      2023-02-21 14:27:34.520360383 +0000
--- src/popupwin.c      2023-03-07 17:10:22.933201383 +0000
***************
*** 2413,2420 ****
            win_enter(owp, FALSE);
        else
        {
!           for (owp = curtab->tp_first_popupwin; owp != NULL;
!                                                            owp = owp->w_next)
                if (owp != curwin && owp->w_buffer->b_term != NULL)
                    break;
            if (owp != NULL)
--- 2413,2419 ----
            win_enter(owp, FALSE);
        else
        {
!           FOR_ALL_POPUPWINS_IN_TAB(curtab, owp)
                if (owp != curwin && owp->w_buffer->b_term != NULL)
                    break;
            if (owp != NULL)
*** ../vim-9.0.1389/src/profiler.c      2023-01-18 18:17:43.865053454 +0000
--- src/profiler.c      2023-03-07 17:10:22.933201383 +0000
***************
*** 335,341 ****
      functbl = func_tbl_get();
      todo = (int)functbl->ht_used;
  
!     for (hi = functbl->ht_array; todo > 0; ++hi)
      {
        ufunc_T *fp;
        int     i;
--- 335,341 ----
      functbl = func_tbl_get();
      todo = (int)functbl->ht_used;
  
!     FOR_ALL_HASHTAB_ITEMS(functbl, hi, todo)
      {
        ufunc_T *fp;
        int     i;
***************
*** 825,831 ****
  
      sorttab = ALLOC_MULT(ufunc_T *, todo);
  
!     for (hi = functbl->ht_array; todo > 0; ++hi)
      {
        if (!HASHITEM_EMPTY(hi))
        {
--- 825,831 ----
  
      sorttab = ALLOC_MULT(ufunc_T *, todo);
  
!     FOR_ALL_HASHTAB_ITEMS(functbl, hi, todo)
      {
        if (!HASHITEM_EMPTY(hi))
        {
*** ../vim-9.0.1389/src/scriptfile.c    2023-01-27 21:03:08.899101847 +0000
--- src/scriptfile.c    2023-03-07 17:10:22.933201383 +0000
***************
*** 1672,1678 ****
                // is encountered without the "noclear" argument.
                ht = &SCRIPT_VARS(sid);
                todo = (int)ht->ht_used;
!               for (hi = ht->ht_array; todo > 0; ++hi)
                    if (!HASHITEM_EMPTY(hi))
                    {
                        --todo;
--- 1672,1678 ----
                // is encountered without the "noclear" argument.
                ht = &SCRIPT_VARS(sid);
                todo = (int)ht->ht_used;
!               FOR_ALL_HASHTAB_ITEMS(ht, hi, todo)
                    if (!HASHITEM_EMPTY(hi))
                    {
                        --todo;
***************
*** 2063,2069 ****
      // looking for functions with script ID 'sid'.
      functbl = func_tbl_get();
      todo = functbl->ht_used;
!     for (hi = functbl->ht_array; todo > 0; ++hi)
      {
        ufunc_T *fp;
  
--- 2063,2069 ----
      // looking for functions with script ID 'sid'.
      functbl = func_tbl_get();
      todo = functbl->ht_used;
!     FOR_ALL_HASHTAB_ITEMS(functbl, hi, todo)
      {
        ufunc_T *fp;
  
*** ../vim-9.0.1389/src/session.c       2023-01-23 20:46:16.162493149 +0000
--- src/session.c       2023-03-07 17:10:22.933201383 +0000
***************
*** 543,549 ****
      char_u    *p, *t;
  
      todo = (int)gvht->ht_used;
!     for (hi = gvht->ht_array; todo > 0; ++hi)
      {
        if (!HASHITEM_EMPTY(hi))
        {
--- 543,549 ----
      char_u    *p, *t;
  
      todo = (int)gvht->ht_used;
!     FOR_ALL_HASHTAB_ITEMS(gvht, hi, todo)
      {
        if (!HASHITEM_EMPTY(hi))
        {
*** ../vim-9.0.1389/src/sign.c  2023-01-23 20:46:16.166493150 +0000
--- src/sign.c  2023-03-07 17:10:22.933201383 +0000
***************
*** 2058,2064 ****
      // Complete with name of sign groups already defined
      current_idx = 0;
      todo = (int)sg_table.ht_used;
!     for (hi = sg_table.ht_array; todo > 0; ++hi)
      {
        if (!HASHITEM_EMPTY(hi))
        {
--- 2058,2064 ----
      // Complete with name of sign groups already defined
      current_idx = 0;
      todo = (int)sg_table.ht_used;
!     FOR_ALL_HASHTAB_ITEMS(&sg_table, hi, todo)
      {
        if (!HASHITEM_EMPTY(hi))
        {
*** ../vim-9.0.1389/src/spellfile.c     2023-02-20 12:16:33.340269410 +0000
--- src/spellfile.c     2023-03-07 17:10:22.933201383 +0000
***************
*** 3466,3472 ****
      for (ht = &aff->af_pref; ; ht = &aff->af_suff)
      {
        todo = (int)ht->ht_used;
!       for (hi = ht->ht_array; todo > 0; ++hi)
        {
            if (!HASHITEM_EMPTY(hi))
            {
--- 3466,3472 ----
      for (ht = &aff->af_pref; ; ht = &aff->af_suff)
      {
        todo = (int)ht->ht_used;
!       FOR_ALL_HASHTAB_ITEMS(ht, hi, todo)
        {
            if (!HASHITEM_EMPTY(hi))
            {
***************
*** 5117,5123 ****
            hashitem_T  *hi;
  
            todo = (int)spin->si_commonwords.ht_used;
!           for (hi = spin->si_commonwords.ht_array; todo > 0; ++hi)
                if (!HASHITEM_EMPTY(hi))
                {
                    l = (int)STRLEN(hi->hi_key) + 1;
--- 5117,5123 ----
            hashitem_T  *hi;
  
            todo = (int)spin->si_commonwords.ht_used;
!           FOR_ALL_HASHTAB_ITEMS(&spin->si_commonwords, hi, todo)
                if (!HASHITEM_EMPTY(hi))
                {
                    l = (int)STRLEN(hi->hi_key) + 1;
*** ../vim-9.0.1389/src/spellsuggest.c  2023-02-20 12:16:33.340269410 +0000
--- src/spellsuggest.c  2023-03-07 17:10:22.933201383 +0000
***************
*** 3176,3182 ****
        {
            // Free the info about handled words.
            todo = (int)slang->sl_sounddone.ht_used;
!           for (hi = slang->sl_sounddone.ht_array; todo > 0; ++hi)
                if (!HASHITEM_EMPTY(hi))
                {
                    vim_free(HI2SFT(hi));
--- 3176,3182 ----
        {
            // Free the info about handled words.
            todo = (int)slang->sl_sounddone.ht_used;
!           FOR_ALL_HASHTAB_ITEMS(&slang->sl_sounddone, hi, todo)
                if (!HASHITEM_EMPTY(hi))
                {
                    vim_free(HI2SFT(hi));
*** ../vim-9.0.1389/src/syntax.c        2023-01-27 21:03:08.899101847 +0000
--- src/syntax.c        2023-03-07 17:10:22.933201383 +0000
***************
*** 4323,4329 ****
  
      hash_lock(ht);
      todo = (int)ht->ht_used;
!     for (hi = ht->ht_array; todo > 0; ++hi)
      {
        if (!HASHITEM_EMPTY(hi))
        {
--- 4323,4329 ----
  
      hash_lock(ht);
      todo = (int)ht->ht_used;
!     FOR_ALL_HASHTAB_ITEMS(ht, hi, todo)
      {
        if (!HASHITEM_EMPTY(hi))
        {
***************
*** 4371,4377 ****
      keyentry_T        *kp_next;
  
      todo = (int)ht->ht_used;
!     for (hi = ht->ht_array; todo > 0; ++hi)
      {
        if (!HASHITEM_EMPTY(hi))
        {
--- 4371,4377 ----
      keyentry_T        *kp_next;
  
      todo = (int)ht->ht_used;
!     FOR_ALL_HASHTAB_ITEMS(ht, hi, todo)
      {
        if (!HASHITEM_EMPTY(hi))
        {
*** ../vim-9.0.1389/src/testing.c       2023-01-25 21:05:35.131042802 +0000
--- src/testing.c       2023-03-07 17:10:22.933201383 +0000
***************
*** 181,187 ****
                return;
  
            todo = (int)exp_d->dv_hashtab.ht_used;
!           for (hi = exp_d->dv_hashtab.ht_array; todo > 0; ++hi)
            {
                if (!HASHITEM_EMPTY(hi))
                {
--- 181,187 ----
                return;
  
            todo = (int)exp_d->dv_hashtab.ht_used;
!           FOR_ALL_HASHTAB_ITEMS(&exp_d->dv_hashtab, hi, todo)
            {
                if (!HASHITEM_EMPTY(hi))
                {
***************
*** 204,210 ****
  
            // Add items only present in got_d.
            todo = (int)got_d->dv_hashtab.ht_used;
!           for (hi = got_d->dv_hashtab.ht_array; todo > 0; ++hi)
            {
                if (!HASHITEM_EMPTY(hi))
                {
--- 204,210 ----
  
            // Add items only present in got_d.
            todo = (int)got_d->dv_hashtab.ht_used;
!           FOR_ALL_HASHTAB_ITEMS(&got_d->dv_hashtab, hi, todo)
            {
                if (!HASHITEM_EMPTY(hi))
                {
*** ../vim-9.0.1389/src/textprop.c      2023-01-25 21:05:35.131042802 +0000
--- src/textprop.c      2023-03-07 17:10:22.933201383 +0000
***************
*** 723,729 ****
  static textprop_T     *text_prop_compare_props;
  static buf_T          *text_prop_compare_buf;
  
! /* Score for sorting on position of the text property: 0: above,
   * 1: after (default), 2: right, 3: below (comes last)
   */
      static int
--- 723,730 ----
  static textprop_T     *text_prop_compare_props;
  static buf_T          *text_prop_compare_buf;
  
! /*
!  * Score for sorting on position of the text property: 0: above,
   * 1: after (default), 2: right, 3: below (comes last)
   */
      static int
***************
*** 933,939 ****
        if (*array == NULL)
            return NULL;
        todo = (long)ht->ht_used;
!       for (hi = ht->ht_array; todo > 0; ++hi)
        {
            if (!HASHITEM_EMPTY(hi))
            {
--- 934,940 ----
        if (*array == NULL)
            return NULL;
        todo = (long)ht->ht_used;
!       FOR_ALL_HASHTAB_ITEMS(ht, hi, todo)
        {
            if (!HASHITEM_EMPTY(hi))
            {
***************
*** 1958,1964 ****
      hash_remove(ht, hi, "prop type delete");
      vim_free(prop);
  
!     // currently visibile text properties will disappear
      redraw_all_later(UPD_CLEAR);
      changed_window_setting_buf(buf == NULL ? curbuf : buf);
  }
--- 1959,1965 ----
      hash_remove(ht, hi, "prop type delete");
      vim_free(prop);
  
!     // currently visible text properties will disappear
      redraw_all_later(UPD_CLEAR);
      changed_window_setting_buf(buf == NULL ? curbuf : buf);
  }
***************
*** 2021,2027 ****
      hashitem_T        *hi;
  
      todo = (long)ht->ht_used;
!     for (hi = ht->ht_array; todo > 0; ++hi)
      {
        if (!HASHITEM_EMPTY(hi))
        {
--- 2022,2028 ----
      hashitem_T        *hi;
  
      todo = (long)ht->ht_used;
!     FOR_ALL_HASHTAB_ITEMS(ht, hi, todo)
      {
        if (!HASHITEM_EMPTY(hi))
        {
***************
*** 2074,2080 ****
        return;
  
      todo = (long)ht->ht_used;
!     for (hi = ht->ht_array; todo > 0; ++hi)
      {
        if (!HASHITEM_EMPTY(hi))
        {
--- 2075,2081 ----
        return;
  
      todo = (long)ht->ht_used;
!     FOR_ALL_HASHTAB_ITEMS(ht, hi, todo)
      {
        if (!HASHITEM_EMPTY(hi))
        {
*** ../vim-9.0.1389/src/userfunc.c      2023-02-21 19:55:02.795958051 +0000
--- src/userfunc.c      2023-03-07 17:10:22.937201381 +0000
***************
*** 2313,2319 ****
  
        // Make a copy of the a: variables, since we didn't do that above.
        todo = (int)fc->fc_l_avars.dv_hashtab.ht_used;
!       for (hi = fc->fc_l_avars.dv_hashtab.ht_array; todo > 0; ++hi)
        {
            if (!HASHITEM_EMPTY(hi))
            {
--- 2313,2319 ----
  
        // Make a copy of the a: variables, since we didn't do that above.
        todo = (int)fc->fc_l_avars.dv_hashtab.ht_used;
!       FOR_ALL_HASHTAB_ITEMS(&fc->fc_l_avars.dv_hashtab, hi, todo)
        {
            if (!HASHITEM_EMPTY(hi))
            {
***************
*** 3296,3302 ****
      while (todo > 0)
      {
        todo = func_hashtab.ht_used;
!       for (hi = func_hashtab.ht_array; todo > 0; ++hi)
            if (!HASHITEM_EMPTY(hi))
            {
                fp = HI2UF(hi);
--- 3296,3302 ----
      while (todo > 0)
      {
        todo = func_hashtab.ht_used;
!       FOR_ALL_HASHTAB_ITEMS(&func_hashtab, hi, todo)
            if (!HASHITEM_EMPTY(hi))
            {
                fp = HI2UF(hi);
***************
*** 3353,3359 ****
      while (todo > 0)
      {
        todo = func_hashtab.ht_used;
!       for (hi = func_hashtab.ht_array; todo > 0; ++hi)
            if (!HASHITEM_EMPTY(hi))
            {
                // clear the def function index now
--- 3353,3359 ----
      while (todo > 0)
      {
        todo = func_hashtab.ht_used;
!       FOR_ALL_HASHTAB_ITEMS(&func_hashtab, hi, todo)
            if (!HASHITEM_EMPTY(hi))
            {
                // clear the def function index now
***************
*** 3385,3391 ****
      while (func_hashtab.ht_used > skipped)
      {
        todo = func_hashtab.ht_used;
!       for (hi = func_hashtab.ht_array; todo > 0; ++hi)
            if (!HASHITEM_EMPTY(hi))
            {
                --todo;
--- 3385,3391 ----
      while (func_hashtab.ht_used > skipped)
      {
        todo = func_hashtab.ht_used;
!       FOR_ALL_HASHTAB_ITEMS(&func_hashtab, hi, todo)
            if (!HASHITEM_EMPTY(hi))
            {
                --todo;
*** ../vim-9.0.1389/src/vim9execute.c   2023-03-02 17:38:30.019743929 +0000
--- src/vim9execute.c   2023-03-07 17:10:22.937201381 +0000
***************
*** 1052,1058 ****
  
      if (defer_tv->v_type != VAR_LIST)
        return;  // no function added
!     for (li = defer_tv->vval.v_list->lv_first; li != NULL; li = li->li_next)
      {
        list_T      *l = li->li_tv.vval.v_list;
        typval_T    rettv;
--- 1052,1058 ----
  
      if (defer_tv->v_type != VAR_LIST)
        return;  // no function added
!     FOR_ALL_LIST_ITEMS(defer_tv->vval.v_list, li)
      {
        list_T      *l = li->li_tv.vval.v_list;
        typval_T    rettv;
*** ../vim-9.0.1389/src/vim9script.c    2023-02-01 13:11:11.714991151 +0000
--- src/vim9script.c    2023-03-07 17:10:22.937201381 +0000
***************
*** 281,287 ****
  
      hash_lock(ht);
      todo = (int)ht->ht_used;
!     for (hi = ht->ht_array; todo > 0; ++hi)
      {
        if (!HASHITEM_EMPTY(hi))
        {
--- 281,287 ----
  
      hash_lock(ht);
      todo = (int)ht->ht_used;
!     FOR_ALL_HASHTAB_ITEMS(ht, hi, todo)
      {
        if (!HASHITEM_EMPTY(hi))
        {
*** ../vim-9.0.1389/src/vim9type.c      2023-02-21 12:38:46.827436713 +0000
--- src/vim9type.c      2023-03-07 17:10:22.937201381 +0000
***************
*** 213,219 ****
                hashitem_T      *hi;
                dictitem_T      *di;
  
!               for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi)
                {
                    if (!HASHITEM_EMPTY(hi))
                    {
--- 213,219 ----
                hashitem_T      *hi;
                dictitem_T      *di;
  
!               FOR_ALL_HASHTAB_ITEMS(&d->dv_hashtab, hi, todo)
                {
                    if (!HASHITEM_EMPTY(hi))
                    {
*** ../vim-9.0.1389/src/viminfo.c       2023-01-26 11:58:39.610071592 +0000
--- src/viminfo.c       2023-03-07 17:10:22.937201381 +0000
***************
*** 1319,1325 ****
      fputs(_("\n# global variables:\n"), fp);
  
      todo = (int)gvht->ht_used;
!     for (hi = gvht->ht_array; todo > 0; ++hi)
      {
        if (!HASHITEM_EMPTY(hi))
        {
--- 1319,1325 ----
      fputs(_("\n# global variables:\n"), fp);
  
      todo = (int)gvht->ht_used;
!     FOR_ALL_HASHTAB_ITEMS(gvht, hi, todo)
      {
        if (!HASHITEM_EMPTY(hi))
        {
*** ../vim-9.0.1389/src/window.c        2023-02-27 17:17:57.750253721 +0000
--- src/window.c        2023-03-07 17:10:22.937201381 +0000
***************
*** 5622,5628 ****
                // If there already is an entry with "wi_win" set to NULL it
                // must be removed, it would never be used.
                // Skip "wip" itself, otherwise Coverity complains.
!               for (wip2 = buf->b_wininfo; wip2 != NULL; wip2 = wip2->wi_next)
                    if (wip2 != wip && wip2->wi_win == NULL)
                    {
                        if (wip2->wi_next != NULL)
--- 5622,5628 ----
                // If there already is an entry with "wi_win" set to NULL it
                // must be removed, it would never be used.
                // Skip "wip" itself, otherwise Coverity complains.
!               FOR_ALL_BUF_WININFO(buf, wip2)
                    if (wip2 != wip && wip2->wi_win == NULL)
                    {
                        if (wip2->wi_next != NULL)
***************
*** 7378,7384 ****
  
  /*
   * A snapshot of the window sizes, to restore them after closing the help
!  * window.
   * Only these fields are used:
   * fr_layout
   * fr_width
--- 7378,7384 ----
  
  /*
   * A snapshot of the window sizes, to restore them after closing the help
!  * or other window.
   * Only these fields are used:
   * fr_layout
   * fr_width
***************
*** 7390,7395 ****
--- 7390,7396 ----
  
  /*
   * Create a snapshot of the current frame sizes.
+  * "idx" is SNAP_HELP_IDX or SNAP_AUCMD_IDX.
   */
      void
  make_snapshot(int idx)
***************
*** 7473,7478 ****
--- 7474,7480 ----
   * Restore a previously created snapshot, if there is any.
   * This is only done if the screen size didn't change and the window layout is
   * still the same.
+  * "idx" is SNAP_HELP_IDX or SNAP_AUCMD_IDX.
   */
      void
  restore_snapshot(
*** ../vim-9.0.1389/src/version.c       2023-03-07 15:30:46.129459752 +0000
--- src/version.c       2023-03-07 17:12:18.109148616 +0000
***************
*** 697,698 ****
--- 697,700 ----
  {   /* Add new patch number below this line */
+ /**/
+     1390,
  /**/

-- 
"Women marry men hoping they will change. Men marry women hoping
they will not. So each is inevitably disappointed."
 - Einstein

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20230307171417.5BDDB1C1280%40moolenaar.net.

Raspunde prin e-mail lui