]> granicus.if.org Git - vim/commitdiff
updated for version 7.4.446 v7.4.446
authorBram Moolenaar <Bram@vim.org>
Fri, 19 Sep 2014 12:26:36 +0000 (14:26 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 19 Sep 2014 12:26:36 +0000 (14:26 +0200)
Problem:    In some situations, when setting up an environment to trigger an
            autocommand, the environment is not properly restored.
Solution:   Check the return value of switch_win() and call restore_win()
            always.  (Daniel Hahler)

src/eval.c
src/misc2.c
src/version.c
src/window.c

index dfcb586b101d8e8fae35991738f669c1b30d35e5..780d8834b032255327a3197c824097116f3e9082 100644 (file)
@@ -12086,15 +12086,17 @@ f_gettabvar(argvars, rettv)
     {
        /* Set tp to be our tabpage, temporarily.  Also set the window to the
         * first window in the tabpage, otherwise the window is not valid. */
-       switch_win(&oldcurwin, &oldtabpage, tp->tp_firstwin, tp, TRUE);
-
-       /* look up the variable */
-       /* Let gettabvar({nr}, "") return the "t:" dictionary. */
-       v = find_var_in_ht(&tp->tp_vars->dv_hashtab, 't', varname, FALSE);
-       if (v != NULL)
+       if (switch_win(&oldcurwin, &oldtabpage, tp->tp_firstwin, tp, TRUE)
+                                                                       == OK)
        {
-           copy_tv(&v->di_tv, rettv);
-           done = TRUE;
+           /* look up the variable */
+           /* Let gettabvar({nr}, "") return the "t:" dictionary. */
+           v = find_var_in_ht(&tp->tp_vars->dv_hashtab, 't', varname, FALSE);
+           if (v != NULL)
+           {
+               copy_tv(&v->di_tv, rettv);
+               done = TRUE;
+           }
        }
 
        /* restore previous notion of curwin */
@@ -12233,22 +12235,24 @@ getwinvar(argvars, rettv, off)
     {
        /* Set curwin to be our win, temporarily.  Also set the tabpage,
         * otherwise the window is not valid. */
-       switch_win(&oldcurwin, &oldtabpage, win, tp, TRUE);
-
-       if (*varname == '&')    /* window-local-option */
-       {
-           if (get_option_tv(&varname, rettv, 1) == OK)
-               done = TRUE;
-       }
-       else
+       if (switch_win(&oldcurwin, &oldtabpage, win, tp, TRUE) == OK)
        {
-           /* Look up the variable. */
-           /* Let getwinvar({nr}, "") return the "w:" dictionary. */
-           v = find_var_in_ht(&win->w_vars->dv_hashtab, 'w', varname, FALSE);
-           if (v != NULL)
+           if (*varname == '&')        /* window-local-option */
            {
-               copy_tv(&v->di_tv, rettv);
-               done = TRUE;
+               if (get_option_tv(&varname, rettv, 1) == OK)
+                   done = TRUE;
+           }
+           else
+           {
+               /* Look up the variable. */
+               /* Let getwinvar({nr}, "") return the "w:" dictionary. */
+               v = find_var_in_ht(&win->w_vars->dv_hashtab, 'w',
+                                                             varname, FALSE);
+               if (v != NULL)
+               {
+                   copy_tv(&v->di_tv, rettv);
+                   done = TRUE;
+               }
            }
        }
 
@@ -17252,34 +17256,33 @@ setwinvar(argvars, rettv, off)
     if (win != NULL && varname != NULL && varp != NULL)
     {
 #ifdef FEAT_WINDOWS
-       if (switch_win(&save_curwin, &save_curtab, win, tp, TRUE) == FAIL)
-           return;
+       if (switch_win(&save_curwin, &save_curtab, win, tp, TRUE) == OK)
 #endif
-
-       if (*varname == '&')
        {
-           long        numval;
-           char_u      *strval;
-           int         error = FALSE;
-
-           ++varname;
-           numval = get_tv_number_chk(varp, &error);
-           strval = get_tv_string_buf_chk(varp, nbuf);
-           if (!error && strval != NULL)
-               set_option_value(varname, numval, strval, OPT_LOCAL);
-       }
-       else
-       {
-           winvarname = alloc((unsigned)STRLEN(varname) + 3);
-           if (winvarname != NULL)
+           if (*varname == '&')
+           {
+               long    numval;
+               char_u  *strval;
+               int             error = FALSE;
+
+               ++varname;
+               numval = get_tv_number_chk(varp, &error);
+               strval = get_tv_string_buf_chk(varp, nbuf);
+               if (!error && strval != NULL)
+                   set_option_value(varname, numval, strval, OPT_LOCAL);
+           }
+           else
            {
-               STRCPY(winvarname, "w:");
-               STRCPY(winvarname + 2, varname);
-               set_var(winvarname, varp, TRUE);
-               vim_free(winvarname);
+               winvarname = alloc((unsigned)STRLEN(varname) + 3);
+               if (winvarname != NULL)
+               {
+                   STRCPY(winvarname, "w:");
+                   STRCPY(winvarname + 2, varname);
+                   set_var(winvarname, varp, TRUE);
+                   vim_free(winvarname);
+               }
            }
        }
-
 #ifdef FEAT_WINDOWS
        restore_win(save_curwin, save_curtab, TRUE);
 #endif
index 1f8878f674e7d74d2b5c519b74099e04deefe78d..1fe0e87cf1c37c15d39582b5ddcc7ea83b71e425 100644 (file)
@@ -1040,7 +1040,8 @@ free_all_mem()
     entered = TRUE;
 
 # ifdef FEAT_AUTOCMD
-    block_autocmds();      /* don't want to trigger autocommands here */
+    /* Don't want to trigger autocommands from here on. */
+    block_autocmds();
 # endif
 
 # ifdef FEAT_WINDOWS
index adff6dbd01367d5a715f34a9c4db7ec6ffa5f439..53fcc8f0df92db6291f621ce90694506294905cc 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    446,
 /**/
     445,
 /**/
index 5012427fae37255016e267b889c4b3bcfba056e1..0088e32648489cab14d2c618b49ae7f3ad38d438 100644 (file)
@@ -1271,7 +1271,7 @@ win_init(newp, oldp, flags)
 }
 
 /*
- * Initialize window "newp" from window"old".
+ * Initialize window "newp" from window "old".
  * Only the essential things are copied.
  */
     static void
@@ -6662,8 +6662,8 @@ restore_snapshot_rec(sn, fr)
        || defined(PROTO)
 /*
  * Set "win" to be the curwin and "tp" to be the current tab page.
- * restore_win() MUST be called to undo.
- * No autocommands will be executed.
+ * restore_win() MUST be called to undo, also when FAIL is returned.
+ * No autocommands will be executed until restore_win() is called.
  * When "no_display" is TRUE the display won't be affected, no redraw is
  * triggered, another tabpage access is limited.
  * Returns FAIL if switching to "win" failed.
@@ -6696,12 +6696,7 @@ switch_win(save_curwin, save_curtab, win, tp, no_display)
            goto_tabpage_tp(tp, FALSE, FALSE);
     }
     if (!win_valid(win))
-    {
-# ifdef FEAT_AUTOCMD
-       unblock_autocmds();
-# endif
        return FAIL;
-    }
     curwin = win;
     curbuf = curwin->w_buffer;
 # endif