To: vim_dev@googlegroups.com Subject: Patch 7.3.895 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.3.895 Problem: Valgrind error in test 91. (Issue 128) Solution: Pass scope name to find_var_in_ht(). Files: src/eval.c *** ../vim-7.3.894/src/eval.c 2013-04-15 12:27:30.000000000 +0200 --- src/eval.c 2013-04-15 13:00:44.000000000 +0200 *************** *** 788,794 **** 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 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)); --- 788,794 ---- 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, 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,11162 **** } 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); if (v != NULL) copy_tv(&v->di_tv, rettv); } --- 11150,11159 ---- } else { ! /* 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,11785 **** if (tp != NULL && varname != NULL) { /* look up the variable */ ! v = find_var_in_ht(&tp->tp_vars->dv_hashtab, varname, FALSE); if (v != NULL) copy_tv(&v->di_tv, rettv); else if (argvars[2].v_type != VAR_UNKNOWN) --- 11776,11782 ---- if (tp != NULL && varname != NULL) { /* 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) *************** *** 11929,11941 **** 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); if (v != NULL) copy_tv(&v->di_tv, rettv); } --- 11926,11934 ---- get_option_tv(&varname, rettv, 1); 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); } *************** *** 20041,20056 **** *htp = ht; if (ht == NULL) return NULL; ! return find_var_in_ht(ht, varname, htp != NULL); } /* ! * Find variable "varname" in hashtab "ht". * Returns NULL if not found. */ static dictitem_T * ! find_var_in_ht(ht, varname, writing) hashtab_T *ht; char_u *varname; int writing; { --- 20034,20050 ---- *htp = ht; if (ht == NULL) return NULL; ! 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, htname, varname, writing) hashtab_T *ht; + int htname; char_u *varname; int writing; { *************** *** 20059,20065 **** if (*varname == NUL) { /* Must be something like "s:", otherwise "ht" would be NULL. */ ! switch (varname[-2]) { case 's': return &SCRIPT_SV(current_SID)->sv_var; case 'g': return &globvars_var; --- 20053,20059 ---- if (*varname == NUL) { /* Must be something like "s:", otherwise "ht" would be NULL. */ ! switch (htname) { case 's': return &SCRIPT_SV(current_SID)->sv_var; case 'g': return &globvars_var; *************** *** 20389,20395 **** EMSG2(_(e_illvar), name); return; } ! v = find_var_in_ht(ht, varname, TRUE); if (tv->v_type == VAR_FUNC && var_check_func_name(name, v == NULL)) return; --- 20383,20389 ---- EMSG2(_(e_illvar), name); return; } ! v = find_var_in_ht(ht, 0, varname, TRUE); if (tv->v_type == VAR_FUNC && var_check_func_name(name, v == NULL)) return; *** ../vim-7.3.894/src/version.c 2013-04-15 12:36:14.000000000 +0200 --- src/version.c 2013-04-15 13:04:54.000000000 +0200 *************** *** 730,731 **** --- 730,733 ---- { /* Add new patch number below this line */ + /**/ + 895, /**/ -- Very funny, Scotty. Now beam down my clothes. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///