| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.895 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| 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 |
| |
| |
| |
| |
| |
| *** 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; |
| |
| |
| |
| *** 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 /// |