# HG changeset patch # User Bram Moolenaar # Date 1366023981 -7200 # Node ID 11007e80829ca9d72813a9c60a2eded80a0c1855 # Parent 5b2005ff11a307118bdd3ee43d007b5b0aeffb43 updated for version 7.3.895 Problem: Valgrind error in test 91. (Issue 128) Solution: Pass scope name to find_var_in_ht(). diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -788,7 +788,7 @@ static char_u *get_tv_string __ARGS((typ static char_u *get_tv_string_buf __ARGS((typval_T *varp, char_u *buf)); static char_u *get_tv_string_buf_chk __ARGS((typval_T *varp, char_u *buf)); static dictitem_T *find_var __ARGS((char_u *name, hashtab_T **htp)); -static dictitem_T *find_var_in_ht __ARGS((hashtab_T *ht, char_u *varname, int writing)); +static dictitem_T *find_var_in_ht __ARGS((hashtab_T *ht, int htname, char_u *varname, int writing)); static hashtab_T *find_var_ht __ARGS((char_u *name, char_u **varname)); static void vars_clear_ext __ARGS((hashtab_T *ht, int free_val)); static void delete_var __ARGS((hashtab_T *ht, hashitem_T *hi)); @@ -11150,13 +11150,10 @@ f_getbufvar(argvars, rettv) } else { - if (*varname == NUL) - /* let getbufvar({nr}, "") return the "b:" dictionary. The - * scope prefix before the NUL byte is required by - * find_var_in_ht(). */ - varname = (char_u *)"b:" + 2; - /* look up the variable */ - v = find_var_in_ht(&curbuf->b_vars->dv_hashtab, varname, FALSE); + /* Look up the variable. */ + /* Let getbufvar({nr}, "") return the "b:" dictionary. */ + v = find_var_in_ht(&curbuf->b_vars->dv_hashtab, + 'b', varname, FALSE); if (v != NULL) copy_tv(&v->di_tv, rettv); } @@ -11779,7 +11776,7 @@ f_gettabvar(argvars, rettv) if (tp != NULL && varname != NULL) { /* look up the variable */ - v = find_var_in_ht(&tp->tp_vars->dv_hashtab, varname, FALSE); + 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) @@ -11929,13 +11926,9 @@ getwinvar(argvars, rettv, off) get_option_tv(&varname, rettv, 1); else { - if (*varname == NUL) - /* let getwinvar({nr}, "") return the "w:" dictionary. The - * scope prefix before the NUL byte is required by - * find_var_in_ht(). */ - varname = (char_u *)"w:" + 2; - /* look up the variable */ - v = find_var_in_ht(&win->w_vars->dv_hashtab, varname, FALSE); + /* 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); } @@ -20041,16 +20034,17 @@ find_var(name, htp) *htp = ht; if (ht == NULL) return NULL; - return find_var_in_ht(ht, varname, htp != NULL); -} - -/* - * Find variable "varname" in hashtab "ht". + return find_var_in_ht(ht, *name, varname, htp != NULL); +} + +/* + * Find variable "varname" in hashtab "ht" with name "htname". * Returns NULL if not found. */ static dictitem_T * -find_var_in_ht(ht, varname, writing) +find_var_in_ht(ht, htname, varname, writing) hashtab_T *ht; + int htname; char_u *varname; int writing; { @@ -20059,7 +20053,7 @@ find_var_in_ht(ht, varname, writing) if (*varname == NUL) { /* Must be something like "s:", otherwise "ht" would be NULL. */ - switch (varname[-2]) + switch (htname) { case 's': return &SCRIPT_SV(current_SID)->sv_var; case 'g': return &globvars_var; @@ -20389,7 +20383,7 @@ set_var(name, tv, copy) EMSG2(_(e_illvar), name); return; } - v = find_var_in_ht(ht, varname, TRUE); + v = find_var_in_ht(ht, 0, varname, TRUE); if (tv->v_type == VAR_FUNC && var_check_func_name(name, v == NULL)) return; diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 895, +/**/ 894, /**/ 893,