Patch 8.2.3259
Problem:    When 'indentexpr' causes an error the did_throw flag may remain
            set.
Solution:   Reset did_throw and show the error. (closes #8677)
Files:      src/indent.c, src/ex_docmd.c, src/proto/ex_docmd.pro


*** ../vim-8.2.3258/src/indent.c        2021-07-27 22:00:39.745712396 +0200
--- src/indent.c        2021-07-31 21:18:02.203913451 +0200
***************
*** 1822,1827 ****
--- 1822,1834 ----
      check_cursor();
      State = save_State;
  
+     // Reset did_throw, unless 'debug' has "throw" and inside a try/catch.
+     if (did_throw && (vim_strchr(p_debug, 't') == NULL || trylevel == 0))
+     {
+       handle_did_throw();
+       did_throw = FALSE;
+     }
+ 
      // If there is an error, just keep the current indent.
      if (indent < 0)
        indent = get_indent();
*** ../vim-8.2.3258/src/ex_docmd.c      2021-07-27 22:00:39.741712405 +0200
--- src/ex_docmd.c      2021-07-31 21:17:05.208066194 +0200
***************
*** 1268,1334 ****
         * commands are executed.
         */
        if (did_throw)
!       {
!           char        *p = NULL;
!           msglist_T   *messages = NULL;
! 
!           /*
!            * If the uncaught exception is a user exception, report it as an
!            * error.  If it is an error exception, display the saved error
!            * message now.  For an interrupt exception, do nothing; the
!            * interrupt message is given elsewhere.
!            */
!           switch (current_exception->type)
!           {
!               case ET_USER:
!                   vim_snprintf((char *)IObuff, IOSIZE,
!                           _("E605: Exception not caught: %s"),
!                           current_exception->value);
!                   p = (char *)vim_strsave(IObuff);
!                   break;
!               case ET_ERROR:
!                   messages = current_exception->messages;
!                   current_exception->messages = NULL;
!                   break;
!               case ET_INTERRUPT:
!                   break;
!           }
! 
!           estack_push(ETYPE_EXCEPT, current_exception->throw_name,
!                                               current_exception->throw_lnum);
!           ESTACK_CHECK_SETUP
!           current_exception->throw_name = NULL;
! 
!           discard_current_exception();        // uses IObuff if 'verbose'
!           suppress_errthrow = TRUE;
!           force_abort = TRUE;
! 
!           if (messages != NULL)
!           {
!               do
!               {
!                   msglist_T   *next = messages->next;
!                   int         save_compiling = estack_compiling;
! 
!                   estack_compiling = messages->msg_compiling;
!                   emsg(messages->msg);
!                   vim_free(messages->msg);
!                   vim_free(messages->sfile);
!                   vim_free(messages);
!                   messages = next;
!                   estack_compiling = save_compiling;
!               }
!               while (messages != NULL);
!           }
!           else if (p != NULL)
!           {
!               emsg(p);
!               vim_free(p);
!           }
!           vim_free(SOURCING_NAME);
!           ESTACK_CHECK_NOW
!           estack_pop();
!       }
  
        /*
         * On an interrupt or an aborting error not converted to an exception,
--- 1268,1274 ----
         * commands are executed.
         */
        if (did_throw)
!           handle_did_throw();
  
        /*
         * On an interrupt or an aborting error not converted to an exception,
***************
*** 1448,1453 ****
--- 1388,1460 ----
      return retval;
  }
  
+ /*
+  * Handle when "did_throw" is set after executing commands.
+  */
+     void
+ handle_did_throw()
+ {
+     char      *p = NULL;
+     msglist_T *messages = NULL;
+ 
+     /*
+      * If the uncaught exception is a user exception, report it as an
+      * error.  If it is an error exception, display the saved error
+      * message now.  For an interrupt exception, do nothing; the
+      * interrupt message is given elsewhere.
+      */
+     switch (current_exception->type)
+     {
+       case ET_USER:
+           vim_snprintf((char *)IObuff, IOSIZE,
+                   _("E605: Exception not caught: %s"),
+                   current_exception->value);
+           p = (char *)vim_strsave(IObuff);
+           break;
+       case ET_ERROR:
+           messages = current_exception->messages;
+           current_exception->messages = NULL;
+           break;
+       case ET_INTERRUPT:
+           break;
+     }
+ 
+     estack_push(ETYPE_EXCEPT, current_exception->throw_name,
+                                       current_exception->throw_lnum);
+     ESTACK_CHECK_SETUP
+     current_exception->throw_name = NULL;
+ 
+     discard_current_exception();      // uses IObuff if 'verbose'
+     suppress_errthrow = TRUE;
+     force_abort = TRUE;
+ 
+     if (messages != NULL)
+     {
+       do
+       {
+           msglist_T   *next = messages->next;
+           int         save_compiling = estack_compiling;
+ 
+           estack_compiling = messages->msg_compiling;
+           emsg(messages->msg);
+           vim_free(messages->msg);
+           vim_free(messages->sfile);
+           vim_free(messages);
+           messages = next;
+           estack_compiling = save_compiling;
+       }
+       while (messages != NULL);
+     }
+     else if (p != NULL)
+     {
+       emsg(p);
+       vim_free(p);
+     }
+     vim_free(SOURCING_NAME);
+     ESTACK_CHECK_NOW
+     estack_pop();
+ }
+ 
  #ifdef FEAT_EVAL
  /*
   * Obtain a line when inside a ":while" or ":for" loop.
*** ../vim-8.2.3258/src/proto/ex_docmd.pro      2021-05-29 12:21:54.948859803 
+0200
--- src/proto/ex_docmd.pro      2021-07-31 21:17:40.923970364 +0200
***************
*** 3,8 ****
--- 3,9 ----
  int do_cmdline_cmd(char_u *cmd);
  int do_cmd_argument(char_u *cmd);
  int do_cmdline(char_u *cmdline, char_u *(*fgetline)(int, void *, int, 
getline_opt_T), void *cookie, int flags);
+ void handle_did_throw(void);
  int getline_equal(char_u *(*fgetline)(int, void *, int, getline_opt_T), void 
*cookie, char_u *(*func)(int, void *, int, getline_opt_T));
  void *getline_cookie(char_u *(*fgetline)(int, void *, int, getline_opt_T), 
void *cookie);
  char_u *getline_peek(char_u *(*fgetline)(int, void *, int, getline_opt_T), 
void *cookie);
*** ../vim-8.2.3258/src/version.c       2021-07-31 19:12:54.100411000 +0200
--- src/version.c       2021-07-31 21:21:39.699338202 +0200
***************
*** 757,758 ****
--- 757,760 ----
  {   /* Add new patch number below this line */
+ /**/
+     3259,
  /**/

-- 
DINGO: Wicked wicked Zoot ... she is a bad person and she must pay the
       penalty.  And here in Castle Anthrax, we have but one punishment
       ... you must tie her down on a bed ... and spank her.  Come!
GIRLS: A spanking!  A spanking!
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// 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/202107311933.16VJXNIL065388%40masaka.moolenaar.net.

Raspunde prin e-mail lui