Patch 9.0.1221
Problem:    Code is indented more than necessary.
Solution:   Use an early return where it makes sense. (Yegappan Lakshmanan,
            closes #11833)
Files:      src/popupmenu.c, src/popupwin.c, src/profiler.c, src/quickfix.c,
            src/regexp.c, src/regexp_bt.c, src/regexp_nfa.c, src/register.c


*** ../vim-9.0.1220/src/popupmenu.c     2022-08-26 16:58:46.139489368 +0100
--- src/popupmenu.c     2023-01-18 18:14:09.152963086 +0000
***************
*** 1367,1379 ****
      void
  ui_remove_balloon(void)
  {
!     if (balloon_array != NULL)
!     {
!       pum_undisplay();
!       while (balloon_arraysize > 0)
!           vim_free(balloon_array[--balloon_arraysize].pum_text);
!       VIM_CLEAR(balloon_array);
!     }
  }
  
  /*
--- 1367,1379 ----
      void
  ui_remove_balloon(void)
  {
!     if (balloon_array == NULL)
!       return;
! 
!     pum_undisplay();
!     while (balloon_arraysize > 0)
!       vim_free(balloon_array[--balloon_arraysize].pum_text);
!     VIM_CLEAR(balloon_array);
  }
  
  /*
***************
*** 1410,1428 ****
      else
        balloon_arraysize = split_message(mesg, &balloon_array);
  
!     if (balloon_arraysize > 0)
!     {
!       pum_array = balloon_array;
!       pum_size = balloon_arraysize;
!       pum_compute_size();
!       pum_scrollbar = 0;
!       pum_height = balloon_arraysize;
! 
!       pum_position_at_mouse(BALLOON_MIN_WIDTH);
!       pum_selected = -1;
!       pum_first = 0;
!       pum_redraw();
!     }
  }
  
  /*
--- 1410,1428 ----
      else
        balloon_arraysize = split_message(mesg, &balloon_array);
  
!     if (balloon_arraysize <= 0)
!       return;
! 
!     pum_array = balloon_array;
!     pum_size = balloon_arraysize;
!     pum_compute_size();
!     pum_scrollbar = 0;
!     pum_height = balloon_arraysize;
! 
!     pum_position_at_mouse(BALLOON_MIN_WIDTH);
!     pum_selected = -1;
!     pum_first = 0;
!     pum_redraw();
  }
  
  /*
*** ../vim-9.0.1220/src/popupwin.c      2022-12-02 15:58:34.606705475 +0000
--- src/popupwin.c      2023-01-18 18:14:09.152963086 +0000
***************
*** 98,128 ****
      dictitem_T        *di;
  
      di = dict_find(dict, (char_u *)name, -1);
!     if (di != NULL)
      {
!       if (di->di_tv.v_type != VAR_LIST)
!           emsg(_(e_list_required));
!       else
!       {
!           list_T      *list = di->di_tv.vval.v_list;
!           listitem_T  *li;
!           int         i;
!           int         nr;
  
!           for (i = 0; i < 4; ++i)
!               array[i] = 1;
!           if (list != NULL)
!           {
!               CHECK_LIST_MATERIALIZE(list);
!               for (i = 0, li = list->lv_first; i < 4 && i < list->lv_len;
!                                                        ++i, li = li->li_next)
!               {
!                   nr = (int)tv_get_number(&li->li_tv);
!                   if (nr >= 0)
!                       array[i] = nr > max_val ? max_val : nr;
!               }
!           }
!       }
      }
  }
  
--- 98,129 ----
      dictitem_T        *di;
  
      di = dict_find(dict, (char_u *)name, -1);
!     if (di == NULL)
!       return;
! 
!     if (di->di_tv.v_type != VAR_LIST)
      {
!       emsg(_(e_list_required));
!       return;
!     }
  
!     list_T    *list = di->di_tv.vval.v_list;
!     listitem_T        *li;
!     int               i;
!     int               nr;
! 
!     for (i = 0; i < 4; ++i)
!       array[i] = 1;
!     if (list == NULL)
!       return;
! 
!     CHECK_LIST_MATERIALIZE(list);
!     for (i = 0, li = list->lv_first; i < 4 && i < list->lv_len;
!           ++i, li = li->li_next)
!     {
!       nr = (int)tv_get_number(&li->li_tv);
!       if (nr >= 0)
!           array[i] = nr > max_val ? max_val : nr;
      }
  }
  
***************
*** 147,157 ****
      char_u    *ptr;
      int               len = find_ident_under_cursor(&ptr, flags | 
FIND_NOERROR);
  
!     if (len > 0)
!     {
!       wp->w_popup_mincol = (int)(ptr - ml_get_curline());
!       wp->w_popup_maxcol = wp->w_popup_mincol + len - 1;
!     }
  }
  
  /*
--- 148,158 ----
      char_u    *ptr;
      int               len = find_ident_under_cursor(&ptr, flags | 
FIND_NOERROR);
  
!     if (len <= 0)
!       return;
! 
!     wp->w_popup_mincol = (int)(ptr - ml_get_curline());
!     wp->w_popup_maxcol = wp->w_popup_mincol + len - 1;
  }
  
  /*
***************
*** 169,191 ****
  update_popup_uses_mouse_move(void)
  {
      popup_uses_mouse_move = FALSE;
!     if (popup_visible)
!     {
!       win_T *wp;
  
!       FOR_ALL_POPUPWINS(wp)
!           if (wp->w_popup_mouse_row != 0)
!           {
!               popup_uses_mouse_move = TRUE;
!               return;
!           }
!       FOR_ALL_POPUPWINS_IN_TAB(curtab, wp)
!           if (wp->w_popup_mouse_row != 0)
!           {
!               popup_uses_mouse_move = TRUE;
!               return;
!           }
!     }
  }
  
  /*
--- 170,192 ----
  update_popup_uses_mouse_move(void)
  {
      popup_uses_mouse_move = FALSE;
!     if (!popup_visible)
!       return;
  
!     win_T *wp;
! 
!     FOR_ALL_POPUPWINS(wp)
!       if (wp->w_popup_mouse_row != 0)
!       {
!           popup_uses_mouse_move = TRUE;
!           return;
!       }
!     FOR_ALL_POPUPWINS_IN_TAB(curtab, wp)
!       if (wp->w_popup_mouse_row != 0)
!       {
!           popup_uses_mouse_move = TRUE;
!           return;
!       }
  }
  
  /*
***************
*** 201,219 ****
      colnr_T   mcol;
  
      if (find_word_under_cursor(mouse_row, mouse_col, TRUE, flags,
!                                 &textwp, &pos.lnum, &text, NULL, &col) == OK)
!     {
!       // convert text column to mouse column
!       pos.col = col;
!       pos.coladd = 0;
!       getvcol(textwp, &pos, &mcol, NULL, NULL);
!       wp->w_popup_mouse_mincol = mcol;
! 
!       pos.col = col + (colnr_T)STRLEN(text) - 1;
!       getvcol(textwp, &pos, NULL, NULL, &mcol);
!       wp->w_popup_mouse_maxcol = mcol;
!       vim_free(text);
!     }
  }
  
  /*
--- 202,220 ----
      colnr_T   mcol;
  
      if (find_word_under_cursor(mouse_row, mouse_col, TRUE, flags,
!                                 &textwp, &pos.lnum, &text, NULL, &col) != OK)
!       return;
! 
!     // convert text column to mouse column
!     pos.col = col;
!     pos.coladd = 0;
!     getvcol(textwp, &pos, &mcol, NULL, NULL);
!     wp->w_popup_mouse_mincol = mcol;
! 
!     pos.col = col + (colnr_T)STRLEN(text) - 1;
!     getvcol(textwp, &pos, NULL, NULL, &mcol);
!     wp->w_popup_mouse_maxcol = mcol;
!     vim_free(text);
  }
  
  /*
***************
*** 390,429 ****
      void
  popup_handle_scrollbar_click(win_T *wp, int row, int col)
  {
!     if (popup_is_in_scrollbar(wp, row, col))
      {
!       int         height = popup_height(wp);
!       int         new_topline = wp->w_topline;
  
!       if (row >= height / 2)
        {
!           // Click in lower half, scroll down.
!           if (wp->w_topline < wp->w_buffer->b_ml.ml_line_count)
!               ++new_topline;
        }
!       else if (wp->w_topline > 1)
!           // click on upper half, scroll up.
!           --new_topline;
!       if (new_topline != wp->w_topline)
        {
!           set_topline(wp, new_topline);
!           if (wp == curwin)
!           {
!               if (wp->w_cursor.lnum < wp->w_topline)
!               {
!                   wp->w_cursor.lnum = wp->w_topline;
!                   check_cursor();
!               }
!               else if (wp->w_cursor.lnum >= wp->w_botline)
!               {
!                   wp->w_cursor.lnum = wp->w_botline - 1;
!                   check_cursor();
!               }
!           }
!           popup_set_firstline(wp);
!           redraw_win_later(wp, UPD_NOT_VALID);
        }
      }
  }
  
  #if defined(FEAT_TIMERS)
--- 391,431 ----
      void
  popup_handle_scrollbar_click(win_T *wp, int row, int col)
  {
!     if (!popup_is_in_scrollbar(wp, row, col))
!       return;
! 
!     int           height = popup_height(wp);
!     int           new_topline = wp->w_topline;
! 
!     if (row >= height / 2)
      {
!       // Click in lower half, scroll down.
!       if (wp->w_topline < wp->w_buffer->b_ml.ml_line_count)
!           ++new_topline;
!     }
!     else if (wp->w_topline > 1)
!       // click on upper half, scroll up.
!       --new_topline;
! 
!     if (new_topline == wp->w_topline)
!       return;
  
!     set_topline(wp, new_topline);
!     if (wp == curwin)
!     {
!       if (wp->w_cursor.lnum < wp->w_topline)
        {
!           wp->w_cursor.lnum = wp->w_topline;
!           check_cursor();
        }
!       else if (wp->w_cursor.lnum >= wp->w_botline)
        {
!           wp->w_cursor.lnum = wp->w_botline - 1;
!           check_cursor();
        }
      }
+     popup_set_firstline(wp);
+     redraw_win_later(wp, UPD_NOT_VALID);
  }
  
  #if defined(FEAT_TIMERS)
***************
*** 441,458 ****
      vim_snprintf((char *)cbbuf, sizeof(cbbuf),
                close ? "(_) => popup_close(%d)" : "(_) => popup_hide(%d)",
                wp->w_id);
!     if (get_lambda_tv_and_compile(&ptr, &tv, FALSE, &EVALARG_EVALUATE) == OK)
      {
!       wp->w_popup_timer = create_timer(time, 0);
!       callback_T cb = get_callback(&tv);
!       if (cb.cb_name != NULL && !cb.cb_free_name)
!       {
!           cb.cb_name = vim_strsave(cb.cb_name);
!           cb.cb_free_name = TRUE;
!       }
!       wp->w_popup_timer->tr_callback = cb;
!       clear_tv(&tv);
      }
  }
  #endif
  
--- 443,460 ----
      vim_snprintf((char *)cbbuf, sizeof(cbbuf),
                close ? "(_) => popup_close(%d)" : "(_) => popup_hide(%d)",
                wp->w_id);
!     if (get_lambda_tv_and_compile(&ptr, &tv, FALSE, &EVALARG_EVALUATE) != OK)
!       return;
! 
!     wp->w_popup_timer = create_timer(time, 0);
!     callback_T cb = get_callback(&tv);
!     if (cb.cb_name != NULL && !cb.cb_free_name)
      {
!       cb.cb_name = vim_strsave(cb.cb_name);
!       cb.cb_free_name = TRUE;
      }
+     wp->w_popup_timer->tr_callback = cb;
+     clear_tv(&tv);
  }
  #endif
  
***************
*** 619,634 ****
      char_u    *str;
  
      di = dict_find(dict, (char_u *)name, -1);
!     if (di != NULL)
      {
!       if (di->di_tv.v_type != VAR_STRING)
!           semsg(_(e_invalid_value_for_argument_str), name);
!       else
!       {
!           str = tv_get_string(&di->di_tv);
!           if (*str != NUL)
!               *pval = vim_strsave(str);
!       }
      }
  }
  
--- 621,636 ----
      char_u    *str;
  
      di = dict_find(dict, (char_u *)name, -1);
!     if (di == NULL)
!       return;
! 
!     if (di->di_tv.v_type != VAR_STRING)
!       semsg(_(e_invalid_value_for_argument_str), name);
!     else
      {
!       str = tv_get_string(&di->di_tv);
!       if (*str != NUL)
!           *pval = vim_strsave(str);
      }
  }
  
***************
*** 990,1007 ****
      }
  
      di = dict_find(dict, (char_u *)"callback", -1);
!     if (di != NULL)
!     {
!       callback_T      callback = get_callback(&di->di_tv);
  
!       if (callback.cb_name != NULL)
!       {
!           free_callback(&wp->w_close_cb);
!           set_callback(&wp->w_close_cb, &callback);
!           if (callback.cb_free_name)
!               vim_free(callback.cb_name);
!       }
!     }
  }
  
  /*
--- 992,1008 ----
      }
  
      di = dict_find(dict, (char_u *)"callback", -1);
!     if (di == NULL)
!       return;
  
!     callback_T        callback = get_callback(&di->di_tv);
!     if (callback.cb_name == NULL)
!       return;
! 
!     free_callback(&wp->w_close_cb);
!     set_callback(&wp->w_close_cb, &callback);
!     if (callback.cb_free_name)
!       vim_free(callback.cb_name);
  }
  
  /*
***************
*** 2715,2727 ****
      if (error_if_term_popup_window())
        return;
  #endif
!     if ((wp->w_popup_flags & POPF_HIDDEN) == 0)
!     {
!       wp->w_popup_flags |= POPF_HIDDEN;
!       // Do not decrement b_nwindows, we still reference the buffer.
!       redraw_all_later(UPD_NOT_VALID);
!       popup_mask_refresh = TRUE;
!     }
  }
  
  /*
--- 2716,2728 ----
      if (error_if_term_popup_window())
        return;
  #endif
!     if ((wp->w_popup_flags & POPF_HIDDEN) != 0)
!       return;
! 
!     wp->w_popup_flags |= POPF_HIDDEN;
!     // Do not decrement b_nwindows, we still reference the buffer.
!     redraw_all_later(UPD_NOT_VALID);
!     popup_mask_refresh = TRUE;
  }
  
  /*
***************
*** 2738,2759 ****
  
      id = (int)tv_get_number(argvars);
      wp = find_popup_win(id);
!     if (wp != NULL)
!     {
!       popup_hide(wp);
!       wp->w_popup_flags |= POPF_HIDDEN_FORCE;
!     }
  }
  
      void
  popup_show(win_T *wp)
  {
!     if ((wp->w_popup_flags & POPF_HIDDEN) != 0)
!     {
!       wp->w_popup_flags &= ~POPF_HIDDEN;
!       redraw_all_later(UPD_NOT_VALID);
!       popup_mask_refresh = TRUE;
!     }
  }
  
  /*
--- 2739,2760 ----
  
      id = (int)tv_get_number(argvars);
      wp = find_popup_win(id);
!     if (wp == NULL)
!       return;
! 
!     popup_hide(wp);
!     wp->w_popup_flags |= POPF_HIDDEN_FORCE;
  }
  
      void
  popup_show(win_T *wp)
  {
!     if ((wp->w_popup_flags & POPF_HIDDEN) == 0)
!       return;
! 
!     wp->w_popup_flags &= ~POPF_HIDDEN;
!     redraw_all_later(UPD_NOT_VALID);
!     popup_mask_refresh = TRUE;
  }
  
  /*
***************
*** 2770,2784 ****
  
      id = (int)tv_get_number(argvars);
      wp = find_popup_win(id);
!     if (wp != NULL)
!     {
!       wp->w_popup_flags &= ~POPF_HIDDEN_FORCE;
!       popup_show(wp);
  #ifdef FEAT_QUICKFIX
!       if (wp->w_popup_flags & POPF_INFO)
!           pum_position_info_popup(wp);
  #endif
-     }
  }
  
  /*
--- 2771,2785 ----
  
      id = (int)tv_get_number(argvars);
      wp = find_popup_win(id);
!     if (wp == NULL)
!       return;
! 
!     wp->w_popup_flags &= ~POPF_HIDDEN_FORCE;
!     popup_show(wp);
  #ifdef FEAT_QUICKFIX
!     if (wp->w_popup_flags & POPF_INFO)
!       pum_position_info_popup(wp);
  #endif
  }
  
  /*
***************
*** 2797,2811 ****
  
      id = (int)tv_get_number(&argvars[0]);
      wp = find_popup_win(id);
!     if (wp != NULL)
!     {
!       if (check_for_string_or_list_arg(argvars, 1) != FAIL)
!       {
!           popup_set_buffer_text(wp->w_buffer, argvars[1]);
!           redraw_win_later(wp, UPD_NOT_VALID);
!           popup_adjust_position(wp);
!       }
!     }
  }
  
      static void
--- 2798,2812 ----
  
      id = (int)tv_get_number(&argvars[0]);
      wp = find_popup_win(id);
!     if (wp == NULL)
!       return;
! 
!     if (check_for_string_or_list_arg(argvars, 1) == FAIL)
!       return;
! 
!     popup_set_buffer_text(wp->w_buffer, argvars[1]);
!     redraw_win_later(wp, UPD_NOT_VALID);
!     popup_adjust_position(wp);
  }
  
      static void
***************
*** 3011,3052 ****
      int               top_extra;
      int               left_extra;
  
!     if (rettv_dict_alloc(rettv) == OK)
!     {
!       if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL)
!           return;
  
!       id = (int)tv_get_number(argvars);
!       wp = find_popup_win(id);
!       if (wp == NULL)
!           return;  // invalid {id}
!       top_extra = popup_top_extra(wp);
!       left_extra = wp->w_popup_border[3] + wp->w_popup_padding[3];
! 
!       // we know how much space we need, avoid resizing halfway
!       dict = rettv->vval.v_dict;
!       hash_lock_size(&dict->dv_hashtab, 11);
! 
!       dict_add_number(dict, "line", wp->w_winrow + 1);
!       dict_add_number(dict, "col", wp->w_wincol + 1);
!       dict_add_number(dict, "width", wp->w_width + left_extra
!                            + wp->w_popup_border[1] + wp->w_popup_padding[1]);
!       dict_add_number(dict, "height", wp->w_height + top_extra
!                            + wp->w_popup_border[2] + wp->w_popup_padding[2]);
! 
!       dict_add_number(dict, "core_line", wp->w_winrow + 1 + top_extra);
!       dict_add_number(dict, "core_col", wp->w_wincol + 1 + left_extra);
!       dict_add_number(dict, "core_width", wp->w_width);
!       dict_add_number(dict, "core_height", wp->w_height);
! 
!       dict_add_number(dict, "scrollbar", wp->w_has_scrollbar);
!       dict_add_number(dict, "firstline", wp->w_topline);
!       dict_add_number(dict, "lastline", wp->w_botline - 1);
!       dict_add_number(dict, "visible",
!                     win_valid(wp) && (wp->w_popup_flags & POPF_HIDDEN) == 0);
  
!       hash_unlock(&dict->dv_hashtab);
!     }
  }
  
  /*
--- 3012,3053 ----
      int               top_extra;
      int               left_extra;
  
!     if (rettv_dict_alloc(rettv) == FAIL)
!       return;
  
!     if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL)
!       return;
  
!     id = (int)tv_get_number(argvars);
!     wp = find_popup_win(id);
!     if (wp == NULL)
!       return;  // invalid {id}
!     top_extra = popup_top_extra(wp);
!     left_extra = wp->w_popup_border[3] + wp->w_popup_padding[3];
! 
!     // we know how much space we need, avoid resizing halfway
!     dict = rettv->vval.v_dict;
!     hash_lock_size(&dict->dv_hashtab, 11);
! 
!     dict_add_number(dict, "line", wp->w_winrow + 1);
!     dict_add_number(dict, "col", wp->w_wincol + 1);
!     dict_add_number(dict, "width", wp->w_width + left_extra
!           + wp->w_popup_border[1] + wp->w_popup_padding[1]);
!     dict_add_number(dict, "height", wp->w_height + top_extra
!           + wp->w_popup_border[2] + wp->w_popup_padding[2]);
! 
!     dict_add_number(dict, "core_line", wp->w_winrow + 1 + top_extra);
!     dict_add_number(dict, "core_col", wp->w_wincol + 1 + left_extra);
!     dict_add_number(dict, "core_width", wp->w_width);
!     dict_add_number(dict, "core_height", wp->w_height);
! 
!     dict_add_number(dict, "scrollbar", wp->w_has_scrollbar);
!     dict_add_number(dict, "firstline", wp->w_topline);
!     dict_add_number(dict, "lastline", wp->w_botline - 1);
!     dict_add_number(dict, "visible",
!           win_valid(wp) && (wp->w_popup_flags & POPF_HIDDEN) == 0);
! 
!     hash_unlock(&dict->dv_hashtab);
  }
  
  /*
***************
*** 3102,3114 ****
        return;
  
      list = list_alloc();
!     if (list != NULL)
!     {
!       dict_add_list(dict, name, list);
!       if (array[0] != 1 || array[1] != 1 || array[2] != 1 || array[3] != 1)
!           for (i = 0; i < 4; ++i)
!               list_append_number(list, array[i]);
!     }
  }
  
  /*
--- 3103,3115 ----
        return;
  
      list = list_alloc();
!     if (list == NULL)
!       return;
! 
!     dict_add_list(dict, name, list);
!     if (array[0] != 1 || array[1] != 1 || array[2] != 1 || array[3] != 1)
!       for (i = 0; i < 4; ++i)
!           list_append_number(list, array[i]);
  }
  
  /*
***************
*** 3127,3138 ****
        return;
  
      list = list_alloc();
!     if (list != NULL)
!     {
!       dict_add_list(dict, "borderhighlight", list);
!       for (i = 0; i < 4; ++i)
!           list_append_string(list, wp->w_border_highlight[i], -1);
!     }
  }
  
  /*
--- 3128,3139 ----
        return;
  
      list = list_alloc();
!     if (list == NULL)
!       return;
! 
!     dict_add_list(dict, "borderhighlight", list);
!     for (i = 0; i < 4; ++i)
!       list_append_string(list, wp->w_border_highlight[i], -1);
  }
  
  /*
***************
*** 3153,3166 ****
        return;
  
      list = list_alloc();
!     if (list != NULL)
      {
!       dict_add_list(dict, "borderchars", list);
!       for (i = 0; i < 8; ++i)
!       {
!           len = mb_char2bytes(wp->w_border_char[i], buf);
!           list_append_string(list, buf, len);
!       }
      }
  }
  
--- 3154,3167 ----
        return;
  
      list = list_alloc();
!     if (list == NULL)
!       return;
! 
!     dict_add_list(dict, "borderchars", list);
!     for (i = 0; i < 8; ++i)
      {
!       len = mb_char2bytes(wp->w_border_char[i], buf);
!       list_append_string(list, buf, len);
      }
  }
  
***************
*** 3181,3193 ****
        list_append_number(list, wp->w_popup_maxcol);
      }
      list = list_alloc();
!     if (list != NULL)
!     {
!       dict_add_list(dict, "mousemoved", list);
!       list_append_number(list, wp->w_popup_mouse_row);
!       list_append_number(list, wp->w_popup_mouse_mincol);
!       list_append_number(list, wp->w_popup_mouse_maxcol);
!     }
  }
  
  /*
--- 3182,3194 ----
        list_append_number(list, wp->w_popup_maxcol);
      }
      list = list_alloc();
!     if (list == NULL)
!       return;
! 
!     dict_add_list(dict, "mousemoved", list);
!     list_append_number(list, wp->w_popup_mouse_row);
!     list_append_number(list, wp->w_popup_mouse_mincol);
!     list_append_number(list, wp->w_popup_mouse_maxcol);
  }
  
  /*
***************
*** 3202,3305 ****
      tabpage_T *tp;
      int               i;
  
!     if (rettv_dict_alloc(rettv) == OK)
!     {
!       if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL)
!           return;
  
!       id = (int)tv_get_number(argvars);
!       wp = find_popup_win(id);
!       if (wp == NULL)
!           return;
  
!       dict = rettv->vval.v_dict;
!       dict_add_number(dict, "line", wp->w_wantline);
!       dict_add_number(dict, "col", wp->w_wantcol);
!       dict_add_number(dict, "minwidth", wp->w_minwidth);
!       dict_add_number(dict, "minheight", wp->w_minheight);
!       dict_add_number(dict, "maxheight", wp->w_maxheight);
!       dict_add_number(dict, "maxwidth", wp->w_maxwidth);
!       dict_add_number(dict, "firstline", wp->w_firstline);
!       dict_add_number(dict, "scrollbar", wp->w_want_scrollbar);
!       dict_add_number(dict, "zindex", wp->w_zindex);
!       dict_add_number(dict, "fixed", wp->w_popup_fixed);
!       if (wp->w_popup_prop_type && win_valid_any_tab(wp->w_popup_prop_win))
!       {
!           proptype_T *pt = text_prop_type_by_id(
!                                wp->w_popup_prop_win->w_buffer,
!                                wp->w_popup_prop_type);
! 
!           if (pt != NULL)
!               dict_add_string(dict, "textprop", pt->pt_name);
!           dict_add_number(dict, "textpropwin", wp->w_popup_prop_win->w_id);
!           dict_add_number(dict, "textpropid", wp->w_popup_prop_id);
!       }
!       dict_add_string(dict, "title", wp->w_popup_title);
!       dict_add_number(dict, "wrap", wp->w_p_wrap);
!       dict_add_number(dict, "drag", (wp->w_popup_flags & POPF_DRAG) != 0);
!       dict_add_number(dict, "dragall",
!                                     (wp->w_popup_flags & POPF_DRAGALL) != 0);
!       dict_add_number(dict, "mapping",
!                                     (wp->w_popup_flags & POPF_MAPPING) != 0);
!       dict_add_number(dict, "resize", (wp->w_popup_flags & POPF_RESIZE) != 0);
!       dict_add_number(dict, "posinvert",
!                                   (wp->w_popup_flags & POPF_POSINVERT) != 0);
!       dict_add_number(dict, "cursorline",
!                                  (wp->w_popup_flags & POPF_CURSORLINE) != 0);
!       dict_add_string(dict, "highlight", wp->w_p_wcr);
!       if (wp->w_scrollbar_highlight != NULL)
!           dict_add_string(dict, "scrollbarhighlight",
!                                                   wp->w_scrollbar_highlight);
!       if (wp->w_thumb_highlight != NULL)
!           dict_add_string(dict, "thumbhighlight", wp->w_thumb_highlight);
! 
!       // find the tabpage that holds this popup
!       i = 1;
!       FOR_ALL_TABPAGES(tp)
!       {
!           win_T *twp;
  
!           FOR_ALL_POPUPWINS_IN_TAB(tp, twp)
!               if (twp->w_id == id)
!                   break;
!           if (twp != NULL)
!               break;
!           ++i;
!       }
!       if (tp == NULL)
!           i = -1;  // must be global
!       else if (tp == curtab)
!           i = 0;
!       dict_add_number(dict, "tabpage", i);
! 
!       get_padding_border(dict, wp->w_popup_padding, "padding");
!       get_padding_border(dict, wp->w_popup_border, "border");
!       get_borderhighlight(dict, wp);
!       get_borderchars(dict, wp);
!       get_moved_list(dict, wp);
! 
!       if (wp->w_filter_cb.cb_name != NULL)
!           dict_add_callback(dict, "filter", &wp->w_filter_cb);
!       if (wp->w_close_cb.cb_name != NULL)
!           dict_add_callback(dict, "callback", &wp->w_close_cb);
  
!       for (i = 0; i < (int)ARRAY_LENGTH(poppos_entries); ++i)
!           if (wp->w_popup_pos == poppos_entries[i].pp_val)
!           {
!               dict_add_string(dict, "pos",
!                                         (char_u *)poppos_entries[i].pp_name);
                break;
!           }
  
!       dict_add_string(dict, "close", (char_u *)(
!                   wp->w_popup_close == POPCLOSE_BUTTON ? "button"
!                   : wp->w_popup_close == POPCLOSE_CLICK ? "click" : "none"));
  
  # if defined(FEAT_TIMERS)
!       dict_add_number(dict, "time", wp->w_popup_timer != NULL
!                                ?  (long)wp->w_popup_timer->tr_interval : 0L);
  # endif
-     }
  }
  
  # if defined(FEAT_TERMINAL) || defined(PROTO)
--- 3203,3306 ----
      tabpage_T *tp;
      int               i;
  
!     if (rettv_dict_alloc(rettv) == FAIL)
!       return;
  
!     if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL)
!       return;
  
!     id = (int)tv_get_number(argvars);
!     wp = find_popup_win(id);
!     if (wp == NULL)
!       return;
  
!     dict = rettv->vval.v_dict;
!     dict_add_number(dict, "line", wp->w_wantline);
!     dict_add_number(dict, "col", wp->w_wantcol);
!     dict_add_number(dict, "minwidth", wp->w_minwidth);
!     dict_add_number(dict, "minheight", wp->w_minheight);
!     dict_add_number(dict, "maxheight", wp->w_maxheight);
!     dict_add_number(dict, "maxwidth", wp->w_maxwidth);
!     dict_add_number(dict, "firstline", wp->w_firstline);
!     dict_add_number(dict, "scrollbar", wp->w_want_scrollbar);
!     dict_add_number(dict, "zindex", wp->w_zindex);
!     dict_add_number(dict, "fixed", wp->w_popup_fixed);
!     if (wp->w_popup_prop_type && win_valid_any_tab(wp->w_popup_prop_win))
!     {
!       proptype_T *pt = text_prop_type_by_id(
!               wp->w_popup_prop_win->w_buffer,
!               wp->w_popup_prop_type);
! 
!       if (pt != NULL)
!           dict_add_string(dict, "textprop", pt->pt_name);
!       dict_add_number(dict, "textpropwin", wp->w_popup_prop_win->w_id);
!       dict_add_number(dict, "textpropid", wp->w_popup_prop_id);
!     }
!     dict_add_string(dict, "title", wp->w_popup_title);
!     dict_add_number(dict, "wrap", wp->w_p_wrap);
!     dict_add_number(dict, "drag", (wp->w_popup_flags & POPF_DRAG) != 0);
!     dict_add_number(dict, "dragall",
!           (wp->w_popup_flags & POPF_DRAGALL) != 0);
!     dict_add_number(dict, "mapping",
!           (wp->w_popup_flags & POPF_MAPPING) != 0);
!     dict_add_number(dict, "resize", (wp->w_popup_flags & POPF_RESIZE) != 0);
!     dict_add_number(dict, "posinvert",
!           (wp->w_popup_flags & POPF_POSINVERT) != 0);
!     dict_add_number(dict, "cursorline",
!           (wp->w_popup_flags & POPF_CURSORLINE) != 0);
!     dict_add_string(dict, "highlight", wp->w_p_wcr);
!     if (wp->w_scrollbar_highlight != NULL)
!       dict_add_string(dict, "scrollbarhighlight",
!               wp->w_scrollbar_highlight);
!     if (wp->w_thumb_highlight != NULL)
!       dict_add_string(dict, "thumbhighlight", wp->w_thumb_highlight);
  
!     // find the tabpage that holds this popup
!     i = 1;
!     FOR_ALL_TABPAGES(tp)
!     {
!       win_T *twp;
! 
!       FOR_ALL_POPUPWINS_IN_TAB(tp, twp)
!           if (twp->w_id == id)
                break;
!       if (twp != NULL)
!           break;
!       ++i;
!     }
!     if (tp == NULL)
!       i = -1;  // must be global
!     else if (tp == curtab)
!       i = 0;
!     dict_add_number(dict, "tabpage", i);
! 
!     get_padding_border(dict, wp->w_popup_padding, "padding");
!     get_padding_border(dict, wp->w_popup_border, "border");
!     get_borderhighlight(dict, wp);
!     get_borderchars(dict, wp);
!     get_moved_list(dict, wp);
! 
!     if (wp->w_filter_cb.cb_name != NULL)
!       dict_add_callback(dict, "filter", &wp->w_filter_cb);
!     if (wp->w_close_cb.cb_name != NULL)
!       dict_add_callback(dict, "callback", &wp->w_close_cb);
! 
!     for (i = 0; i < (int)ARRAY_LENGTH(poppos_entries); ++i)
!       if (wp->w_popup_pos == poppos_entries[i].pp_val)
!       {
!           dict_add_string(dict, "pos",
!                   (char_u *)poppos_entries[i].pp_name);
!           break;
!       }
  
!     dict_add_string(dict, "close", (char_u *)(
!               wp->w_popup_close == POPCLOSE_BUTTON ? "button"
!               : wp->w_popup_close == POPCLOSE_CLICK ? "click" : "none"));
  
  # if defined(FEAT_TIMERS)
!     dict_add_number(dict, "time", wp->w_popup_timer != NULL
!           ?  (long)wp->w_popup_timer->tr_interval : 0L);
  # endif
  }
  
  # if defined(FEAT_TERMINAL) || defined(PROTO)
***************
*** 3640,3688 ****
      static void
  update_popup_transparent(win_T *wp, int val)
  {
!     if (wp->w_popup_mask != NULL)
      {
!       int             width = popup_width(wp);
!       int             height = popup_height(wp);
!       listitem_T      *lio, *li;
!       int             cols, cole;
!       int             lines, linee;
!       int             col, line;
! 
!       FOR_ALL_LIST_ITEMS(wp->w_popup_mask, lio)
!       {
!           li = lio->li_tv.vval.v_list->lv_first;
!           cols = tv_get_number(&li->li_tv);
!           if (cols < 0)
!               cols = width + cols + 1;
!           li = li->li_next;
!           cole = tv_get_number(&li->li_tv);
!           if (cole < 0)
!               cole = width + cole + 1;
!           li = li->li_next;
!           lines = tv_get_number(&li->li_tv);
!           if (lines < 0)
!               lines = height + lines + 1;
!           li = li->li_next;
!           linee = tv_get_number(&li->li_tv);
!           if (linee < 0)
!               linee = height + linee + 1;
! 
!           --cols;
!           cols -= wp->w_popup_leftoff;
!           if (cols < 0)
!               cols = 0;
!           cole -= wp->w_popup_leftoff;
!           --lines;
!           if (lines < 0)
!               lines = 0;
!           for (line = lines; line < linee
!                                 && line + wp->w_winrow < screen_Rows; ++line)
!               for (col = cols; col < cole
!                               && col + wp->w_wincol < screen_Columns; ++col)
!                   popup_transparent[(line + wp->w_winrow) * screen_Columns
!                                                  + col + wp->w_wincol] = val;
!       }
      }
  }
  
--- 3641,3689 ----
      static void
  update_popup_transparent(win_T *wp, int val)
  {
!     if (wp->w_popup_mask == NULL)
!       return;
! 
!     int               width = popup_width(wp);
!     int               height = popup_height(wp);
!     listitem_T        *lio, *li;
!     int               cols, cole;
!     int               lines, linee;
!     int               col, line;
! 
!     FOR_ALL_LIST_ITEMS(wp->w_popup_mask, lio)
      {
!       li = lio->li_tv.vval.v_list->lv_first;
!       cols = tv_get_number(&li->li_tv);
!       if (cols < 0)
!           cols = width + cols + 1;
!       li = li->li_next;
!       cole = tv_get_number(&li->li_tv);
!       if (cole < 0)
!           cole = width + cole + 1;
!       li = li->li_next;
!       lines = tv_get_number(&li->li_tv);
!       if (lines < 0)
!           lines = height + lines + 1;
!       li = li->li_next;
!       linee = tv_get_number(&li->li_tv);
!       if (linee < 0)
!           linee = height + linee + 1;
! 
!       --cols;
!       cols -= wp->w_popup_leftoff;
!       if (cols < 0)
!           cols = 0;
!       cole -= wp->w_popup_leftoff;
!       --lines;
!       if (lines < 0)
!           lines = 0;
!       for (line = lines; line < linee
!               && line + wp->w_winrow < screen_Rows; ++line)
!           for (col = cols; col < cole
!                   && col + wp->w_wincol < screen_Columns; ++col)
!               popup_transparent[(line + wp->w_winrow) * screen_Columns
!                   + col + wp->w_wincol] = val;
      }
  }
  
***************
*** 4508,4540 ****
      win_T *
  popup_get_message_win(void)
  {
!     if (message_win == NULL)
!     {
!       int i;
  
!       message_win = popup_create(NULL, NULL, TYPE_MESSAGE_WIN);
  
!       if (message_win == NULL)
!           return NULL;
  
!       // use the full screen width
!       message_win->w_width = Columns;
  
!       // position at bottom of screen
!       message_win->w_popup_pos = POPPOS_BOTTOM;
!       message_win->w_wantcol = 1;
!       message_win->w_minwidth = 9999;
!       message_win->w_firstline = -1;
  
!       // no padding, border at the top
!       for (i = 0; i < 4; ++i)
!           message_win->w_popup_padding[i] = 0;
!       for (i = 1; i < 4; ++i)
!           message_win->w_popup_border[i] = 0;
  
!       if (message_win->w_popup_timer != NULL)
!           message_win->w_popup_timer->tr_keep = TRUE;
!     }
      return message_win;
  }
  
--- 4509,4541 ----
      win_T *
  popup_get_message_win(void)
  {
!     if (message_win != NULL)
!       return message_win;
  
!     int i;
  
!     message_win = popup_create(NULL, NULL, TYPE_MESSAGE_WIN);
  
!     if (message_win == NULL)
!       return NULL;
  
!     // use the full screen width
!     message_win->w_width = Columns;
  
!     // position at bottom of screen
!     message_win->w_popup_pos = POPPOS_BOTTOM;
!     message_win->w_wantcol = 1;
!     message_win->w_minwidth = 9999;
!     message_win->w_firstline = -1;
  
!     // no padding, border at the top
!     for (i = 0; i < 4; ++i)
!       message_win->w_popup_padding[i] = 0;
!     for (i = 1; i < 4; ++i)
!       message_win->w_popup_border[i] = 0;
! 
!     if (message_win->w_popup_timer != NULL)
!       message_win->w_popup_timer->tr_keep = TRUE;
      return message_win;
  }
  
***************
*** 4545,4560 ****
      void
  popup_show_message_win(void)
  {
!     if (message_win != NULL)
      {
!       if ((message_win->w_popup_flags & POPF_HIDDEN) != 0)
!       {
!           // the highlight may have changed.
!           popup_update_color(message_win, TYPE_MESSAGE_WIN);
!           popup_show(message_win);
!       }
!       start_message_win_timer = TRUE;
      }
  }
  
      static void
--- 4546,4561 ----
      void
  popup_show_message_win(void)
  {
!     if (message_win == NULL)
!       return;
! 
!     if ((message_win->w_popup_flags & POPF_HIDDEN) != 0)
      {
!       // the highlight may have changed.
!       popup_update_color(message_win, TYPE_MESSAGE_WIN);
!       popup_show(message_win);
      }
+     start_message_win_timer = TRUE;
  }
  
      static void
***************
*** 4664,4685 ****
      void
  popup_set_title(win_T *wp)
  {
!     if (wp->w_buffer->b_fname != NULL)
!     {
!       char_u  dirname[MAXPATHL];
!       size_t  len;
  
!       mch_dirname(dirname, MAXPATHL);
!       shorten_buf_fname(wp->w_buffer, dirname, FALSE);
  
!       vim_free(wp->w_popup_title);
!       len = STRLEN(wp->w_buffer->b_fname) + 3;
!       wp->w_popup_title = alloc((int)len);
!       if (wp->w_popup_title != NULL)
!           vim_snprintf((char *)wp->w_popup_title, len, " %s ",
!                                                       wp->w_buffer->b_fname);
!       redraw_win_later(wp, UPD_VALID);
!     }
  }
  
  # if defined(FEAT_QUICKFIX) || defined(PROTO)
--- 4665,4686 ----
      void
  popup_set_title(win_T *wp)
  {
!     if (wp->w_buffer->b_fname == NULL)
!       return;
  
!     char_u    dirname[MAXPATHL];
!     size_t    len;
  
!     mch_dirname(dirname, MAXPATHL);
!     shorten_buf_fname(wp->w_buffer, dirname, FALSE);
! 
!     vim_free(wp->w_popup_title);
!     len = STRLEN(wp->w_buffer->b_fname) + 3;
!     wp->w_popup_title = alloc((int)len);
!     if (wp->w_popup_title != NULL)
!       vim_snprintf((char *)wp->w_popup_title, len, " %s ",
!               wp->w_buffer->b_fname);
!     redraw_win_later(wp, UPD_VALID);
  }
  
  # if defined(FEAT_QUICKFIX) || defined(PROTO)
*** ../vim-9.0.1220/src/profiler.c      2022-09-17 21:07:52.099993159 +0100
--- src/profiler.c      2023-01-18 18:14:09.152963086 +0000
***************
*** 910,925 ****
  {
      scriptitem_T    *si;
  
!     if (SCRIPT_ID_VALID(current_sctx.sc_sid))
      {
!       si = SCRIPT_ITEM(current_sctx.sc_sid);
!       if (si->sn_prof_on && --si->sn_pr_nest == 0)
!       {
!           profile_end(&si->sn_pr_child);
!           profile_sub_wait(tm, &si->sn_pr_child); // don't count wait time
!           profile_add(&si->sn_pr_children, &si->sn_pr_child);
!           profile_add(&si->sn_prl_children, &si->sn_pr_child);
!       }
      }
  }
  
--- 910,925 ----
  {
      scriptitem_T    *si;
  
!     if (!SCRIPT_ID_VALID(current_sctx.sc_sid))
!       return;
! 
!     si = SCRIPT_ITEM(current_sctx.sc_sid);
!     if (si->sn_prof_on && --si->sn_pr_nest == 0)
      {
!       profile_end(&si->sn_pr_child);
!       profile_sub_wait(tm, &si->sn_pr_child); // don't count wait time
!       profile_add(&si->sn_pr_children, &si->sn_pr_child);
!       profile_add(&si->sn_prl_children, &si->sn_pr_child);
      }
  }
  
***************
*** 1009,1025 ****
  {
      FILE      *fd;
  
!     if (profile_fname != NULL)
      {
!       fd = mch_fopen((char *)profile_fname, "w");
!       if (fd == NULL)
!           semsg(_(e_cant_open_file_str), profile_fname);
!       else
!       {
!           script_dump_profile(fd);
!           func_dump_profile(fd);
!           fclose(fd);
!       }
      }
  }
  
--- 1009,1025 ----
  {
      FILE      *fd;
  
!     if (profile_fname == NULL)
!       return;
! 
!     fd = mch_fopen((char *)profile_fname, "w");
!     if (fd == NULL)
!       semsg(_(e_cant_open_file_str), profile_fname);
!     else
      {
!       script_dump_profile(fd);
!       func_dump_profile(fd);
!       fclose(fd);
      }
  }
  
*** ../vim-9.0.1220/src/quickfix.c      2022-12-02 15:58:34.610705474 +0000
--- src/quickfix.c      2023-01-18 18:14:09.152963086 +0000
***************
*** 1898,1911 ****
  {
      VIM_CLEAR(qfl->qf_title);
  
!     if (title != NULL)
!     {
!       char_u *p = alloc_id(STRLEN(title) + 2, aid_qf_title);
  
!       qfl->qf_title = p;
!       if (p != NULL)
!           STRCPY(p, title);
!     }
  }
  
  /*
--- 1898,1911 ----
  {
      VIM_CLEAR(qfl->qf_title);
  
!     if (title == NULL)
!       return;
  
!     char_u *p = alloc_id(STRLEN(title) + 2, aid_qf_title);
! 
!     qfl->qf_title = p;
!     if (p != NULL)
!       STRCPY(p, title);
  }
  
  /*
***************
*** 1976,1987 ****
      qf_delq_T *q;
  
      q = ALLOC_ONE(qf_delq_T);
!     if (q != NULL)
!     {
!       q->qi = qi;
!       q->next = qf_delq_head;
!       qf_delq_head = q;
!     }
  }
  
  /*
--- 1976,1987 ----
      qf_delq_T *q;
  
      q = ALLOC_ONE(qf_delq_T);
!     if (q == NULL)
!       return;
! 
!     q->qi = qi;
!     q->next = qf_delq_head;
!     qf_delq_head = q;
  }
  
  /*
***************
*** 2002,2017 ****
  {
      buf_T     *qfbuf;
  
!     if (qi->qf_bufnr != INVALID_QFBUFNR)
      {
!       qfbuf = buflist_findnr(qi->qf_bufnr);
!       if (qfbuf != NULL && qfbuf->b_nwindows == 0)
!       {
!           // If the quickfix buffer is not loaded in any window, then
!           // wipe the buffer.
!           close_buffer(NULL, qfbuf, DOBUF_WIPE, FALSE, FALSE);
!           qi->qf_bufnr = INVALID_QFBUFNR;
!       }
      }
  }
  
--- 2002,2017 ----
  {
      buf_T     *qfbuf;
  
!     if (qi->qf_bufnr == INVALID_QFBUFNR)
!       return;
! 
!     qfbuf = buflist_findnr(qi->qf_bufnr);
!     if (qfbuf != NULL && qfbuf->b_nwindows == 0)
      {
!       // If the quickfix buffer is not loaded in any window, then
!       // wipe the buffer.
!       close_buffer(NULL, qfbuf, DOBUF_WIPE, FALSE, FALSE);
!       qi->qf_bufnr = INVALID_QFBUFNR;
      }
  }
  
***************
*** 2231,2242 ****
      qf_info_T *qi;
  
      qi = ALLOC_CLEAR_ONE_ID(qf_info_T, aid_qf_qfinfo);
!     if (qi != NULL)
!     {
!       qi->qf_refcount++;
!       qi->qfl_type = qfltype;
!       qi->qf_bufnr = INVALID_QFBUFNR;
!     }
      return qi;
  }
  
--- 2231,2242 ----
      qf_info_T *qi;
  
      qi = ALLOC_CLEAR_ONE_ID(qf_info_T, aid_qf_qfinfo);
!     if (qi == NULL)
!       return NULL;
! 
!     qi->qf_refcount++;
!     qi->qfl_type = qfltype;
!     qi->qf_bufnr = INVALID_QFBUFNR;
      return qi;
  }
  
***************
*** 4573,4636 ****
  
      // Check if a buffer for the quickfix list exists.  Update it.
      buf = qf_find_buf(qi);
!     if (buf != NULL)
!     {
!       linenr_T        old_line_count = buf->b_ml.ml_line_count;
!       int             qf_winid = 0;
  
!       if (IS_LL_STACK(qi))
        {
!           if (curwin->w_llist == qi)
!               win = curwin;
!           else
!           {
!               // Find the file window (non-quickfix) with this location list
!               win = qf_find_win_with_loclist(qi);
!               if (win == NULL)
!                   // File window is not found. Find the location list window.
!                   win = qf_find_win(qi);
!               if (win == NULL)
!                   return;
!           }
!           qf_winid = win->w_id;
        }
  
!       // autocommands may cause trouble
!       incr_quickfix_busy();
  
!       int do_fill = TRUE;
!       if (old_last == NULL)
!       {
!           // set curwin/curbuf to buf and save a few things
!           aucmd_prepbuf(&aco, buf);
!           if (curbuf != buf)
!               do_fill = FALSE;  // failed to find a window for "buf"
!       }
  
!       if (do_fill)
!       {
!           qf_update_win_titlevar(qi);
  
!           qf_fill_buffer(qf_get_curlist(qi), buf, old_last, qf_winid);
!           ++CHANGEDTICK(buf);
  
!           if (old_last == NULL)
!           {
!               (void)qf_win_pos_update(qi, 0);
  
!               // restore curwin/curbuf and a few other things
!               aucmd_restbuf(&aco);
!           }
        }
  
!       // Only redraw when added lines are visible.  This avoids flickering
!       // when the added lines are not visible.
!       if ((win = qf_find_win(qi)) != NULL && old_line_count < win->w_botline)
!           redraw_buf_later(buf, UPD_NOT_VALID);
  
!       // always called after incr_quickfix_busy()
!       decr_quickfix_busy();
!     }
  }
  
  /*
--- 4573,4636 ----
  
      // Check if a buffer for the quickfix list exists.  Update it.
      buf = qf_find_buf(qi);
!     if (buf == NULL)
!       return;
  
!     linenr_T  old_line_count = buf->b_ml.ml_line_count;
!     int               qf_winid = 0;
! 
!     if (IS_LL_STACK(qi))
!     {
!       if (curwin->w_llist == qi)
!           win = curwin;
!       else
        {
!           // Find the file window (non-quickfix) with this location list
!           win = qf_find_win_with_loclist(qi);
!           if (win == NULL)
!               // File window is not found. Find the location list window.
!               win = qf_find_win(qi);
!           if (win == NULL)
!               return;
        }
+       qf_winid = win->w_id;
+     }
  
!     // autocommands may cause trouble
!     incr_quickfix_busy();
  
!     int do_fill = TRUE;
!     if (old_last == NULL)
!     {
!       // set curwin/curbuf to buf and save a few things
!       aucmd_prepbuf(&aco, buf);
!       if (curbuf != buf)
!           do_fill = FALSE;  // failed to find a window for "buf"
!     }
  
!     if (do_fill)
!     {
!       qf_update_win_titlevar(qi);
  
!       qf_fill_buffer(qf_get_curlist(qi), buf, old_last, qf_winid);
!       ++CHANGEDTICK(buf);
  
!       if (old_last == NULL)
!       {
!           (void)qf_win_pos_update(qi, 0);
  
!           // restore curwin/curbuf and a few other things
!           aucmd_restbuf(&aco);
        }
+     }
  
!     // Only redraw when added lines are visible.  This avoids flickering
!     // when the added lines are not visible.
!     if ((win = qf_find_win(qi)) != NULL && old_line_count < win->w_botline)
!       redraw_buf_later(buf, UPD_NOT_VALID);
  
!     // always called after incr_quickfix_busy()
!     decr_quickfix_busy();
  }
  
  /*
***************
*** 4924,4937 ****
  {
      int curlist;
  
!     if (qf_get_curlist(qi)->qf_id != save_qfid)
!     {
!       curlist = qf_id2nr(qi, save_qfid);
!       if (curlist < 0)
!           // list is not present
!           return FAIL;
!       qi->qf_curlist = curlist;
!     }
      return OK;
  }
  
--- 4924,4937 ----
  {
      int curlist;
  
!     if (qf_get_curlist(qi)->qf_id == save_qfid)
!       return OK;
! 
!     curlist = qf_id2nr(qi, save_qfid);
!     if (curlist < 0)
!       // list is not present
!       return FAIL;
!     qi->qf_curlist = curlist;
      return OK;
  }
  
***************
*** 6544,6565 ****
  {
      char_u *dirname_now = alloc(MAXPATHL);
  
!     if (NULL != dirname_now)
      {
!       mch_dirname(dirname_now, MAXPATHL);
!       if (STRCMP(dirname_start, dirname_now) != 0)
!       {
!           // If the directory has changed, change it back by building up an
!           // appropriate ex command and executing it.
!           exarg_T ea;
  
!           CLEAR_FIELD(ea);
!           ea.arg = dirname_start;
!           ea.cmdidx = (curwin->w_localdir == NULL) ? CMD_cd : CMD_lcd;
!           ex_cd(&ea);
!       }
!       vim_free(dirname_now);
      }
  }
  
  /*
--- 6544,6565 ----
  {
      char_u *dirname_now = alloc(MAXPATHL);
  
!     if (dirname_now == NULL)
!       return;
! 
!     mch_dirname(dirname_now, MAXPATHL);
!     if (STRCMP(dirname_start, dirname_now) != 0)
      {
!       // If the directory has changed, change it back by building up an
!       // appropriate ex command and executing it.
!       exarg_T ea;
  
!       CLEAR_FIELD(ea);
!       ea.arg = dirname_start;
!       ea.cmdidx = (curwin->w_localdir == NULL) ? CMD_cd : CMD_lcd;
!       ex_cd(&ea);
      }
+     vim_free(dirname_now);
  }
  
  /*
***************
*** 6723,6735 ****
      static void
  unload_dummy_buffer(buf_T *buf, char_u *dirname_start)
  {
!     if (curbuf != buf)                // safety check
!     {
!       close_buffer(NULL, buf, DOBUF_UNLOAD, FALSE, TRUE);
  
!       // When autocommands/'autochdir' option changed directory: go back.
!       restore_start_dir(dirname_start);
!     }
  }
  
  #if defined(FEAT_EVAL) || defined(PROTO)
--- 6723,6735 ----
      static void
  unload_dummy_buffer(buf_T *buf, char_u *dirname_start)
  {
!     if (curbuf == buf)                // safety check
!       return;
  
!     close_buffer(NULL, buf, DOBUF_UNLOAD, FALSE, TRUE);
! 
!     // When autocommands/'autochdir' option changed directory: go back.
!     restore_start_dir(dirname_start);
  }
  
  #if defined(FEAT_EVAL) || defined(PROTO)
***************
*** 6862,6897 ****
      list_T    *l;
  
      // Only a List value is supported
!     if (di->di_tv.v_type == VAR_LIST && di->di_tv.vval.v_list != NULL)
!     {
!       // If errorformat is supplied then use it, otherwise use the 'efm'
!       // option setting
!       if ((efm_di = dict_find(what, (char_u *)"efm", -1)) != NULL)
!       {
!           if (efm_di->di_tv.v_type != VAR_STRING ||
!                   efm_di->di_tv.vval.v_string == NULL)
!               return FAIL;
!           errorformat = efm_di->di_tv.vval.v_string;
!       }
  
!       l = list_alloc();
!       if (l == NULL)
            return FAIL;
  
!       qi = qf_alloc_stack(QFLT_INTERNAL);
!       if (qi != NULL)
        {
!           if (qf_init_ext(qi, 0, NULL, NULL, &di->di_tv, errorformat,
!                       TRUE, (linenr_T)0, (linenr_T)0, NULL, NULL) > 0)
!           {
!               (void)get_errorlist(qi, NULL, 0, 0, l);
!               qf_free(&qi->qf_lists[0]);
!           }
!           free(qi);
        }
!       dict_add_list(retdict, "items", l);
!       status = OK;
      }
  
      return status;
  }
--- 6862,6897 ----
      list_T    *l;
  
      // Only a List value is supported
!     if (di->di_tv.v_type != VAR_LIST || di->di_tv.vval.v_list == NULL)
!       return FAIL;
  
!     // If errorformat is supplied then use it, otherwise use the 'efm'
!     // option setting
!     if ((efm_di = dict_find(what, (char_u *)"efm", -1)) != NULL)
!     {
!       if (efm_di->di_tv.v_type != VAR_STRING ||
!               efm_di->di_tv.vval.v_string == NULL)
            return FAIL;
+       errorformat = efm_di->di_tv.vval.v_string;
+     }
  
!     l = list_alloc();
!     if (l == NULL)
!       return FAIL;
! 
!     qi = qf_alloc_stack(QFLT_INTERNAL);
!     if (qi != NULL)
!     {
!       if (qf_init_ext(qi, 0, NULL, NULL, &di->di_tv, errorformat,
!                   TRUE, (linenr_T)0, (linenr_T)0, NULL, NULL) > 0)
        {
!           (void)get_errorlist(qi, NULL, 0, 0, l);
!           qf_free(&qi->qf_lists[0]);
        }
!       free(qi);
      }
+     dict_add_list(retdict, "items", l);
+     status = OK;
  
      return status;
  }
***************
*** 7632,7643 ****
  
      free_callback(&qfl->qf_qftf_cb);
      cb = get_callback(&di->di_tv);
!     if (cb.cb_name != NULL && *cb.cb_name != NUL)
!     {
!       set_callback(&qfl->qf_qftf_cb, &cb);
!       if (cb.cb_free_name)
!           vim_free(cb.cb_name);
!     }
  
      return OK;
  }
--- 7632,7643 ----
  
      free_callback(&qfl->qf_qftf_cb);
      cb = get_callback(&di->di_tv);
!     if (cb.cb_name == NULL || *cb.cb_name == NUL)
!       return OK;
! 
!     set_callback(&qfl->qf_qftf_cb, &cb);
!     if (cb.cb_free_name)
!       vim_free(cb.cb_name);
  
      return OK;
  }
***************
*** 8126,8136 ****
      // Evaluate the expression.  When the result is a string or a list we can
      // use it to fill the errorlist.
      tv = eval_expr(eap->arg, eap);
!     if (tv != NULL)
!     {
!       (void)cexpr_core(eap, tv);
!       free_tv(tv);
!     }
  }
  #endif
  
--- 8126,8136 ----
      // Evaluate the expression.  When the result is a string or a list we can
      // use it to fill the errorlist.
      tv = eval_expr(eap->arg, eap);
!     if (tv == NULL)
!       return;
! 
!     (void)cexpr_core(eap, tv);
!     free_tv(tv);
  }
  #endif
  
*** ../vim-9.0.1220/src/regexp.c        2022-11-26 11:47:07.175323334 +0000
--- src/regexp.c        2023-01-18 18:14:09.152963086 +0000
***************
*** 710,719 ****
  {
      static int        after_slash = FALSE;
  
!     if (curchr == -1)
      {
-       switch (curchr = regparse[0])
-       {
        case '.':
        case '[':
        case '~':
--- 710,720 ----
  {
      static int        after_slash = FALSE;
  
!     if (curchr != -1)
!       return curchr;
! 
!     switch (curchr = regparse[0])
      {
        case '.':
        case '[':
        case '~':
***************
*** 743,749 ****
        case ';':       // future ext.
        case '`':       // future ext.
        case '/':       // Can't be used in / command
!           // magic only after "\v"
            if (reg_magic == MAGIC_ALL)
                curchr = Magic(curchr);
            break;
--- 744,750 ----
        case ';':       // future ext.
        case '`':       // future ext.
        case '/':       // Can't be used in / command
!                       // magic only after "\v"
            if (reg_magic == MAGIC_ALL)
                curchr = Magic(curchr);
            break;
***************
*** 788,795 ****
  
                // ignore \c \C \m \M \v \V and \Z after '$'
                while (p[0] == '\\' && (p[1] == 'c' || p[1] == 'C'
!                               || p[1] == 'm' || p[1] == 'M'
!                               || p[1] == 'v' || p[1] == 'V' || p[1] == 'Z'))
                {
                    if (p[1] == 'v')
                        is_magic_all = TRUE;
--- 789,796 ----
  
                // ignore \c \C \m \M \v \V and \Z after '$'
                while (p[0] == '\\' && (p[1] == 'c' || p[1] == 'C'
!                           || p[1] == 'm' || p[1] == 'M'
!                           || p[1] == 'v' || p[1] == 'V' || p[1] == 'Z'))
                {
                    if (p[1] == 'v')
                        is_magic_all = TRUE;
***************
*** 802,808 ****
                            && (p[1] == '|' || p[1] == '&' || p[1] == ')'
                                || p[1] == 'n'))
                        || (is_magic_all
!                              && (p[0] == '|' || p[0] == '&' || p[0] == ')'))
                        || reg_magic == MAGIC_ALL)
                    curchr = Magic('$');
            }
--- 803,809 ----
                            && (p[1] == '|' || p[1] == '&' || p[1] == ')'
                                || p[1] == 'n'))
                        || (is_magic_all
!                           && (p[0] == '|' || p[0] == '&' || p[0] == ')'))
                        || reg_magic == MAGIC_ALL)
                    curchr = Magic('$');
            }
***************
*** 858,864 ****
        default:
            if (has_mbyte)
                curchr = (*mb_ptr2char)(regparse);
-       }
      }
  
      return curchr;
--- 859,864 ----
***************
*** 1384,1425 ****
      static void
  cleanup_subexpr(void)
  {
!     if (rex.need_clear_subexpr)
      {
!       if (REG_MULTI)
!       {
!           // Use 0xff to set lnum to -1
!           vim_memset(rex.reg_startpos, 0xff, sizeof(lpos_T) * NSUBEXP);
!           vim_memset(rex.reg_endpos, 0xff, sizeof(lpos_T) * NSUBEXP);
!       }
!       else
!       {
!           vim_memset(rex.reg_startp, 0, sizeof(char_u *) * NSUBEXP);
!           vim_memset(rex.reg_endp, 0, sizeof(char_u *) * NSUBEXP);
!       }
!       rex.need_clear_subexpr = FALSE;
      }
  }
  
  #ifdef FEAT_SYN_HL
      static void
  cleanup_zsubexpr(void)
  {
!     if (rex.need_clear_zsubexpr)
      {
!       if (REG_MULTI)
!       {
!           // Use 0xff to set lnum to -1
!           vim_memset(reg_startzpos, 0xff, sizeof(lpos_T) * NSUBEXP);
!           vim_memset(reg_endzpos, 0xff, sizeof(lpos_T) * NSUBEXP);
!       }
!       else
!       {
!           vim_memset(reg_startzp, 0, sizeof(char_u *) * NSUBEXP);
!           vim_memset(reg_endzp, 0, sizeof(char_u *) * NSUBEXP);
!       }
!       rex.need_clear_zsubexpr = FALSE;
      }
  }
  #endif
  
--- 1384,1425 ----
      static void
  cleanup_subexpr(void)
  {
!     if (!rex.need_clear_subexpr)
!       return;
! 
!     if (REG_MULTI)
      {
!       // Use 0xff to set lnum to -1
!       vim_memset(rex.reg_startpos, 0xff, sizeof(lpos_T) * NSUBEXP);
!       vim_memset(rex.reg_endpos, 0xff, sizeof(lpos_T) * NSUBEXP);
      }
+     else
+     {
+       vim_memset(rex.reg_startp, 0, sizeof(char_u *) * NSUBEXP);
+       vim_memset(rex.reg_endp, 0, sizeof(char_u *) * NSUBEXP);
+     }
+     rex.need_clear_subexpr = FALSE;
  }
  
  #ifdef FEAT_SYN_HL
      static void
  cleanup_zsubexpr(void)
  {
!     if (!rex.need_clear_zsubexpr)
!       return;
! 
!     if (REG_MULTI)
      {
!       // Use 0xff to set lnum to -1
!       vim_memset(reg_startzpos, 0xff, sizeof(lpos_T) * NSUBEXP);
!       vim_memset(reg_endzpos, 0xff, sizeof(lpos_T) * NSUBEXP);
!     }
!     else
!     {
!       vim_memset(reg_startzp, 0, sizeof(char_u *) * NSUBEXP);
!       vim_memset(reg_endzp, 0, sizeof(char_u *) * NSUBEXP);
      }
+     rex.need_clear_zsubexpr = FALSE;
  }
  #endif
  
*** ../vim-9.0.1220/src/regexp_bt.c     2022-11-30 18:11:52.690904297 +0000
--- src/regexp_bt.c     2023-01-18 18:14:09.156963088 +0000
***************
*** 3187,3206 ****
      // When "rex.need_clear_subexpr" is set we don't need to save the values,
      // only remember that this flag needs to be set again when restoring.
      bp->save_need_clear_subexpr = rex.need_clear_subexpr;
!     if (!rex.need_clear_subexpr)
      {
!       for (i = 0; i < NSUBEXP; ++i)
        {
!           if (REG_MULTI)
!           {
!               bp->save_start[i].se_u.pos = rex.reg_startpos[i];
!               bp->save_end[i].se_u.pos = rex.reg_endpos[i];
!           }
!           else
!           {
!               bp->save_start[i].se_u.ptr = rex.reg_startp[i];
!               bp->save_end[i].se_u.ptr = rex.reg_endp[i];
!           }
        }
      }
  }
--- 3187,3206 ----
      // When "rex.need_clear_subexpr" is set we don't need to save the values,
      // only remember that this flag needs to be set again when restoring.
      bp->save_need_clear_subexpr = rex.need_clear_subexpr;
!     if (rex.need_clear_subexpr)
!       return;
! 
!     for (i = 0; i < NSUBEXP; ++i)
      {
!       if (REG_MULTI)
!       {
!           bp->save_start[i].se_u.pos = rex.reg_startpos[i];
!           bp->save_end[i].se_u.pos = rex.reg_endpos[i];
!       }
!       else
        {
!           bp->save_start[i].se_u.ptr = rex.reg_startp[i];
!           bp->save_end[i].se_u.ptr = rex.reg_endp[i];
        }
      }
  }
***************
*** 3215,3234 ****
  
      // Only need to restore saved values when they are not to be cleared.
      rex.need_clear_subexpr = bp->save_need_clear_subexpr;
!     if (!rex.need_clear_subexpr)
      {
!       for (i = 0; i < NSUBEXP; ++i)
        {
!           if (REG_MULTI)
!           {
!               rex.reg_startpos[i] = bp->save_start[i].se_u.pos;
!               rex.reg_endpos[i] = bp->save_end[i].se_u.pos;
!           }
!           else
!           {
!               rex.reg_startp[i] = bp->save_start[i].se_u.ptr;
!               rex.reg_endp[i] = bp->save_end[i].se_u.ptr;
!           }
        }
      }
  }
--- 3215,3234 ----
  
      // Only need to restore saved values when they are not to be cleared.
      rex.need_clear_subexpr = bp->save_need_clear_subexpr;
!     if (rex.need_clear_subexpr)
!       return;
! 
!     for (i = 0; i < NSUBEXP; ++i)
      {
!       if (REG_MULTI)
!       {
!           rex.reg_startpos[i] = bp->save_start[i].se_u.pos;
!           rex.reg_endpos[i] = bp->save_end[i].se_u.pos;
!       }
!       else
        {
!           rex.reg_startp[i] = bp->save_start[i].se_u.ptr;
!           rex.reg_endp[i] = bp->save_end[i].se_u.ptr;
        }
      }
  }
*** ../vim-9.0.1220/src/regexp_nfa.c    2022-12-11 14:18:25.954350156 +0000
--- src/regexp_nfa.c    2023-01-18 18:14:09.156963088 +0000
***************
*** 487,506 ****
        return NULL;
  
      ret = alloc(len);
!     if (ret != NULL)
      {
!       p = start->out->out; // skip first char, it goes into regstart
!       s = ret;
!       while (p->c > 0)
!       {
!           if (has_mbyte)
!               s += (*mb_char2bytes)(p->c, s);
!           else
!               *s++ = p->c;
!           p = p->out;
!       }
!       *s = NUL;
      }
      return ret;
  }
  
--- 487,506 ----
        return NULL;
  
      ret = alloc(len);
!     if (ret == NULL)
!       return NULL;
! 
!     p = start->out->out; // skip first char, it goes into regstart
!     s = ret;
!     while (p->c > 0)
      {
!       if (has_mbyte)
!           s += (*mb_char2bytes)(p->c, s);
!       else
!           *s++ = p->c;
!       p = p->out;
      }
+     *s = NUL;
      return ret;
  }
  
***************
*** 2782,2806 ****
      FILE *f;
  
      f = fopen(NFA_REGEXP_DUMP_LOG, "a");
!     if (f != NULL)
      {
!       fprintf(f, "\n-------------------------\n");
!       if (retval == FAIL)
!           fprintf(f, ">>> NFA engine failed... \n");
!       else if (retval == OK)
!           fprintf(f, ">>> NFA engine succeeded !\n");
!       fprintf(f, "Regexp: \"%s\"\nPostfix notation (char): \"", expr);
!       for (p = post_start; *p && p < post_ptr; p++)
!       {
!           nfa_set_code(*p);
!           fprintf(f, "%s, ", code);
!       }
!       fprintf(f, "\"\nPostfix notation (int): ");
!       for (p = post_start; *p && p < post_ptr; p++)
!               fprintf(f, "%d ", *p);
!       fprintf(f, "\n\n");
!       fclose(f);
      }
  }
  
  /*
--- 2782,2806 ----
      FILE *f;
  
      f = fopen(NFA_REGEXP_DUMP_LOG, "a");
!     if (f == NULL)
!       return;
! 
!     fprintf(f, "\n-------------------------\n");
!     if (retval == FAIL)
!       fprintf(f, ">>> NFA engine failed... \n");
!     else if (retval == OK)
!       fprintf(f, ">>> NFA engine succeeded !\n");
!     fprintf(f, "Regexp: \"%s\"\nPostfix notation (char): \"", expr);
!     for (p = post_start; *p && p < post_ptr; p++)
      {
!       nfa_set_code(*p);
!       fprintf(f, "%s, ", code);
      }
+     fprintf(f, "\"\nPostfix notation (int): ");
+     for (p = post_start; *p && p < post_ptr; p++)
+       fprintf(f, "%d ", *p);
+     fprintf(f, "\n\n");
+     fclose(f);
  }
  
  /*
***************
*** 2883,2902 ****
  {
      FILE *debugf = fopen(NFA_REGEXP_DUMP_LOG, "a");
  
!     if (debugf != NULL)
!     {
!       nfa_print_state(debugf, prog->start);
  
!       if (prog->reganch)
!           fprintf(debugf, "reganch: %d\n", prog->reganch);
!       if (prog->regstart != NUL)
!           fprintf(debugf, "regstart: %c (decimal: %d)\n",
!                                             prog->regstart, prog->regstart);
!       if (prog->match_text != NULL)
!           fprintf(debugf, "match_text: \"%s\"\n", prog->match_text);
  
!       fclose(debugf);
!     }
  }
  #endif            // ENABLE_LOG
  #endif            // DEBUG
--- 2883,2902 ----
  {
      FILE *debugf = fopen(NFA_REGEXP_DUMP_LOG, "a");
  
!     if (debugf == NULL)
!       return;
  
!     nfa_print_state(debugf, prog->start);
  
!     if (prog->reganch)
!       fprintf(debugf, "reganch: %d\n", prog->reganch);
!     if (prog->regstart != NUL)
!       fprintf(debugf, "regstart: %c (decimal: %d)\n",
!               prog->regstart, prog->regstart);
!     if (prog->match_text != NULL)
!       fprintf(debugf, "match_text: \"%s\"\n", prog->match_text);
! 
!     fclose(debugf);
  }
  #endif            // ENABLE_LOG
  #endif            // DEBUG
***************
*** 4096,4116 ****
  copy_sub(regsub_T *to, regsub_T *from)
  {
      to->in_use = from->in_use;
!     if (from->in_use > 0)
      {
!       // Copy the match start and end positions.
!       if (REG_MULTI)
!       {
!           mch_memmove(&to->list.multi[0],
!                       &from->list.multi[0],
!                       sizeof(struct multipos) * from->in_use);
!           to->orig_start_col = from->orig_start_col;
!       }
!       else
!           mch_memmove(&to->list.line[0],
!                       &from->list.line[0],
!                       sizeof(struct linepos) * from->in_use);
      }
  }
  
  /*
--- 4096,4116 ----
  copy_sub(regsub_T *to, regsub_T *from)
  {
      to->in_use = from->in_use;
!     if (from->in_use <= 0)
!       return;
! 
!     // Copy the match start and end positions.
!     if (REG_MULTI)
      {
!       mch_memmove(&to->list.multi[0],
!               &from->list.multi[0],
!               sizeof(struct multipos) * from->in_use);
!       to->orig_start_col = from->orig_start_col;
      }
+     else
+       mch_memmove(&to->list.line[0],
+               &from->list.line[0],
+               sizeof(struct linepos) * from->in_use);
  }
  
  /*
***************
*** 4121,4138 ****
  {
      if (to->in_use < from->in_use)
        to->in_use = from->in_use;
!     if (from->in_use > 1)
!     {
!       // Copy the match start and end positions.
!       if (REG_MULTI)
!           mch_memmove(&to->list.multi[1],
!                       &from->list.multi[1],
!                       sizeof(struct multipos) * (from->in_use - 1));
!       else
!           mch_memmove(&to->list.line[1],
!                       &from->list.line[1],
!                       sizeof(struct linepos) * (from->in_use - 1));
!     }
  }
  
  /*
--- 4121,4138 ----
  {
      if (to->in_use < from->in_use)
        to->in_use = from->in_use;
!     if (from->in_use <= 1)
!       return;
! 
!     // Copy the match start and end positions.
!     if (REG_MULTI)
!       mch_memmove(&to->list.multi[1],
!               &from->list.multi[1],
!               sizeof(struct multipos) * (from->in_use - 1));
!     else
!       mch_memmove(&to->list.line[1],
!               &from->list.line[1],
!               sizeof(struct linepos) * (from->in_use - 1));
  }
  
  /*
***************
*** 4141,4162 ****
      static void
  copy_ze_off(regsub_T *to, regsub_T *from)
  {
!     if (rex.nfa_has_zend)
      {
!       if (REG_MULTI)
        {
!           if (from->list.multi[0].end_lnum >= 0)
!           {
!               to->list.multi[0].end_lnum = from->list.multi[0].end_lnum;
!               to->list.multi[0].end_col = from->list.multi[0].end_col;
!           }
!       }
!       else
!       {
!           if (from->list.line[0].end != NULL)
!               to->list.line[0].end = from->list.line[0].end;
        }
      }
  }
  
  /*
--- 4141,4162 ----
      static void
  copy_ze_off(regsub_T *to, regsub_T *from)
  {
!     if (!rex.nfa_has_zend)
!       return;
! 
!     if (REG_MULTI)
      {
!       if (from->list.multi[0].end_lnum >= 0)
        {
!           to->list.multi[0].end_lnum = from->list.multi[0].end_lnum;
!           to->list.multi[0].end_col = from->list.multi[0].end_col;
        }
      }
+     else
+     {
+       if (from->list.line[0].end != NULL)
+           to->list.line[0].end = from->list.line[0].end;
+     }
  }
  
  /*
***************
*** 7568,7579 ****
      static void
  nfa_regfree(regprog_T *prog)
  {
!     if (prog != NULL)
!     {
!       vim_free(((nfa_regprog_T *)prog)->match_text);
!       vim_free(((nfa_regprog_T *)prog)->pattern);
!       vim_free(prog);
!     }
  }
  
  /*
--- 7568,7579 ----
      static void
  nfa_regfree(regprog_T *prog)
  {
!     if (prog == NULL)
!       return;
! 
!     vim_free(((nfa_regprog_T *)prog)->match_text);
!     vim_free(((nfa_regprog_T *)prog)->pattern);
!     vim_free(prog);
  }
  
  /*
*** ../vim-9.0.1220/src/register.c      2023-01-17 19:48:02.759310921 +0000
--- src/register.c      2023-01-18 18:14:09.156963088 +0000
***************
*** 294,318 ****
  
      get_yank_register(name, 0);
      reg = ALLOC_ONE(yankreg_T);
!     if (reg != NULL)
      {
!       *reg = *y_current;
!       if (copy)
        {
!           // If we run out of memory some or all of the lines are empty.
!           if (reg->y_size == 0)
!               reg->y_array = NULL;
!           else
!               reg->y_array = ALLOC_MULT(char_u *, reg->y_size);
!           if (reg->y_array != NULL)
!           {
!               for (i = 0; i < reg->y_size; ++i)
!                   reg->y_array[i] = vim_strsave(y_current->y_array[i]);
!           }
        }
-       else
-           y_current->y_array = NULL;
      }
      return (void *)reg;
  }
  
--- 294,318 ----
  
      get_yank_register(name, 0);
      reg = ALLOC_ONE(yankreg_T);
!     if (reg == NULL)
!       return (void *)NULL;
! 
!     *reg = *y_current;
!     if (copy)
      {
!       // If we run out of memory some or all of the lines are empty.
!       if (reg->y_size == 0)
!           reg->y_array = NULL;
!       else
!           reg->y_array = ALLOC_MULT(char_u *, reg->y_size);
!       if (reg->y_array != NULL)
        {
!           for (i = 0; i < reg->y_size; ++i)
!               reg->y_array[i] = vim_strsave(y_current->y_array[i]);
        }
      }
+     else
+       y_current->y_array = NULL;
      return (void *)reg;
  }
  
***************
*** 716,737 ****
  {
      char_u    buf[3];
  
!     if (restart_edit != NUL)
      {
!       if (restart_edit == 'V')
!       {
!           buf[0] = 'g';
!           buf[1] = 'R';
!           buf[2] = NUL;
!       }
!       else
!       {
!           buf[0] = restart_edit == 'I' ? 'i' : restart_edit;
!           buf[1] = NUL;
!       }
!       if (ins_typebuf(buf, REMAP_NONE, 0, TRUE, silent) == OK)
!           restart_edit = NUL;
      }
  }
  
  /*
--- 716,737 ----
  {
      char_u    buf[3];
  
!     if (restart_edit == NUL)
!       return;
! 
!     if (restart_edit == 'V')
      {
!       buf[0] = 'g';
!       buf[1] = 'R';
!       buf[2] = NUL;
!     }
!     else
!     {
!       buf[0] = restart_edit == 'I' ? 'i' : restart_edit;
!       buf[1] = NUL;
      }
+     if (ins_typebuf(buf, REMAP_NONE, 0, TRUE, silent) == OK)
+       restart_edit = NUL;
  }
  
  /*
***************
*** 1097,1110 ****
      static void
  free_yank(long n)
  {
!     if (y_current->y_array != NULL)
!     {
!       long        i;
  
!       for (i = n; --i >= 0; )
!           vim_free(y_current->y_array[i]);
!       VIM_CLEAR(y_current->y_array);
!     }
  }
  
      void
--- 1097,1110 ----
      static void
  free_yank(long n)
  {
!     if (y_current->y_array == NULL)
!       return;
  
!     long          i;
! 
!     for (i = n; --i >= 0; )
!       vim_free(y_current->y_array[i]);
!     VIM_CLEAR(y_current->y_array);
  }
  
      void
***************
*** 2695,2717 ****
      }
  
      retval = alloc(len + 1);
  
      // Copy the lines of the yank register into the string.
!     if (retval != NULL)
      {
!       len = 0;
!       for (i = 0; i < y_current->y_size; ++i)
!       {
!           STRCPY(retval + len, y_current->y_array[i]);
!           len += (long)STRLEN(retval + len);
  
!           // Insert a NL between lines and after the last line if y_type is
!           // MLINE.
!           if (y_current->y_type == MLINE || i < y_current->y_size - 1)
!               retval[len++] = '\n';
!       }
!       retval[len] = NUL;
      }
  
      return retval;
  }
--- 2695,2716 ----
      }
  
      retval = alloc(len + 1);
+     if (retval == NULL)
+       return NULL;
  
      // Copy the lines of the yank register into the string.
!     len = 0;
!     for (i = 0; i < y_current->y_size; ++i)
      {
!       STRCPY(retval + len, y_current->y_array[i]);
!       len += (long)STRLEN(retval + len);
  
!       // Insert a NL between lines and after the last line if y_type is
!       // MLINE.
!       if (y_current->y_type == MLINE || i < y_current->y_size - 1)
!           retval[len++] = '\n';
      }
+     retval[len] = NUL;
  
      return retval;
  }
*** ../vim-9.0.1220/src/version.c       2023-01-18 17:20:20.863136716 +0000
--- src/version.c       2023-01-18 18:15:07.984986670 +0000
***************
*** 697,698 ****
--- 697,700 ----
  {   /* Add new patch number below this line */
+ /**/
+     1221,
  /**/

-- 
In many of the more relaxed civilizations on the Outer Eastern Rim of the
Galaxy, "The Hitchhiker's Guide to the Galaxy" has already supplanted the
great "Encyclopedia Galactica" as the standard repository of all knowledge
and wisdom, for though it has many omissions and contains much that is
apocryphal, or at least wildly inaccurate, it scores over the older, more
pedestrian work in two important respects.
First, it is slightly cheaper; and second, it has the words "DON'T PANIC"
inscribed in large friendly letters on its cover.
                -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy"

 /// 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/20230118181819.3F69F1C125F%40moolenaar.net.

Raspunde prin e-mail lui