]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
updated for version 7.3.898 v7.3.898
authorBram Moolenaar <Bram@vim.org>
Mon, 15 Apr 2013 13:15:35 +0000 (15:15 +0200)
committerBram Moolenaar <Bram@vim.org>
Mon, 15 Apr 2013 13:15:35 +0000 (15:15 +0200)
Problem:    Memory leak reported by valgrind in test 91.
Solution:   Only use default argument when needed.

src/eval.c
src/testdir/test91.in
src/testdir/test91.ok
src/version.c

index 2ad5d36945112d8c97adf59a86f414481415bcae..866b40cf6ea73dd4cbaf17e0d2dc0170d49885fa 100644 (file)
@@ -11120,20 +11120,15 @@ f_getbufvar(argvars, rettv)
     buf_T      *save_curbuf;
     char_u     *varname;
     dictitem_T *v;
+    int                done = FALSE;
 
     (void)get_tv_number(&argvars[0]);      /* issue errmsg if type error */
     varname = get_tv_string_chk(&argvars[1]);
     ++emsg_off;
     buf = get_buf_tv(&argvars[0], FALSE);
 
-    if (argvars[2].v_type != VAR_UNKNOWN)
-       /* set the default value */
-       copy_tv(&argvars[2], rettv);
-    else
-    {
-       rettv->v_type = VAR_STRING;
-       rettv->vval.v_string = NULL;
-    }
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
 
     if (buf != NULL && varname != NULL)
     {
@@ -11142,11 +11137,15 @@ f_getbufvar(argvars, rettv)
        curbuf = buf;
 
        if (*varname == '&')    /* buffer-local-option */
-           get_option_tv(&varname, rettv, TRUE);
+       {
+           if (get_option_tv(&varname, rettv, TRUE) == OK)
+               done = TRUE;
+       }
        else if (STRCMP(varname, "changedtick") == 0)
        {
            rettv->v_type = VAR_NUMBER;
            rettv->vval.v_number = curbuf->b_changedtick;
+           done = TRUE;
        }
        else
        {
@@ -11155,13 +11154,20 @@ f_getbufvar(argvars, rettv)
            v = find_var_in_ht(&curbuf->b_vars->dv_hashtab,
                                                         'b', varname, FALSE);
            if (v != NULL)
+           {
                copy_tv(&v->di_tv, rettv);
+               done = TRUE;
+           }
        }
 
        /* restore previous notion of curbuf */
        curbuf = save_curbuf;
     }
 
+    if (!done && argvars[2].v_type != VAR_UNKNOWN)
+       /* use the default value */
+       copy_tv(&argvars[2], rettv);
+
     --emsg_off;
 }
 
@@ -11767,6 +11773,7 @@ f_gettabvar(argvars, rettv)
     tabpage_T  *tp;
     dictitem_T *v;
     char_u     *varname;
+    int                done = FALSE;
 
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = NULL;
@@ -11778,11 +11785,13 @@ f_gettabvar(argvars, rettv)
        /* look up the variable */
        v = find_var_in_ht(&tp->tp_vars->dv_hashtab, 0, varname, FALSE);
        if (v != NULL)
+       {
            copy_tv(&v->di_tv, rettv);
-       else if (argvars[2].v_type != VAR_UNKNOWN)
-           copy_tv(&argvars[2], rettv);
+           done = TRUE;
+       }
     }
-    else if (argvars[2].v_type != VAR_UNKNOWN)
+
+    if (!done && argvars[2].v_type != VAR_UNKNOWN)
        copy_tv(&argvars[2], rettv);
 }
 
@@ -11894,6 +11903,7 @@ getwinvar(argvars, rettv, off)
     char_u     *varname;
     dictitem_T *v;
     tabpage_T  *tp;
+    int                done = FALSE;
 
 #ifdef FEAT_WINDOWS
     if (off == 1)
@@ -11905,14 +11915,8 @@ getwinvar(argvars, rettv, off)
     varname = get_tv_string_chk(&argvars[off + 1]);
     ++emsg_off;
 
-    if (argvars[off + 2].v_type != VAR_UNKNOWN)
-       /* set the default return value */
-       copy_tv(&argvars[off + 2], rettv);
-    else
-    {
-       rettv->v_type = VAR_STRING;
-       rettv->vval.v_string = NULL;
-    }
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
 
     if (win != NULL && varname != NULL)
     {
@@ -11923,14 +11927,20 @@ getwinvar(argvars, rettv, off)
        curbuf = win->w_buffer;
 
        if (*varname == '&')    /* window-local-option */
-           get_option_tv(&varname, rettv, 1);
+       {
+           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;
+           }
        }
 
        /* restore previous notion of curwin */
@@ -11938,6 +11948,10 @@ getwinvar(argvars, rettv, off)
        curbuf = curwin->w_buffer;
     }
 
+    if (!done && argvars[off + 2].v_type != VAR_UNKNOWN)
+       /* use the default return value */
+       copy_tv(&argvars[off + 2], rettv);
+
     --emsg_off;
 }
 
index 1c8189d6e5d61fdadbf5044478efd8a8a1f3855a..0143c1880ebe322121ccf27ee839d8e077ff95c0 100644 (file)
@@ -4,9 +4,10 @@ vim: set ft=vim :
 STARTTEST
 :so small.vim
 :"
-:" test for getbufvar()
-:let b:var_num = 1234
-:let def_num = 5678
+:" Test for getbufvar()
+:" Use strings to test for memory leaks.
+:let b:var_num = '1234'
+:let def_num = '5678'
 :$put =string(getbufvar(1, 'var_num'))
 :$put =string(getbufvar(1, 'var_num', def_num))
 :$put =string(getbufvar(1, ''))
index 8777af802a880e0753f3a859b4fb70d84ef5291e..6227ec7d32e9ffa7be990e0fad9173a81e61096a 100644 (file)
@@ -1,13 +1,13 @@
 start:
-1234
-1234
-{'var_num': 1234}
-{'var_num': 1234}
-5678
+'1234'
+'1234'
+{'var_num': '1234'}
+{'var_num': '1234'}
+'5678'
 {}
 {}
 ''
-5678
+'5678'
 0
 0
 'Dance'
index fcc6e5eb68282fa90a42c012cf5c2a52774c2457..06a1ffc6bfb76f5fbc36c305b77a6e66bed13905 100644 (file)
@@ -728,6 +728,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    898,
 /**/
     897,
 /**/