diff src/eval.c @ 71:7557b6ea0fb1 v7.0030

updated for version 7.0030
author vimboss
date Tue, 04 Jan 2005 21:52:38 +0000
parents dbf53ece2e23
children 0ef9cebc4f5d
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -94,7 +94,11 @@ struct listvar_S
 typedef struct listvar_S listvar;
 
 #define VAR_LIST_MAXNEST 100	/* maximum nesting of lists */
-static char_u *e_listidx = (char_u *)N_("E999: list index out of range: %ld");
+static char *e_letunexp	= N_("E18: Unexpected characters in :let");
+static char *e_listidx = N_("E999: list index out of range: %ld");
+static char *e_undefvar = N_("E121: Undefined variable: %s");
+static char *e_missbrac = N_("E111: Missing ']'");
+static char *e_intern2 = N_("E999: Internal error: %s");
 
 /*
  * All user-defined global variables are stored in "variables".
@@ -159,7 +163,7 @@ struct funccall
     var		firstline;	/* "a:firstline" variable */
     var		lastline;	/* "a:lastline" variable */
     garray_T	l_vars;		/* local function variables */
-    typeval	*retvar;	/* return value variable */
+    typeval	*rettv;		/* return value */
     linenr_T	breakpoint;	/* next line with breakpoint or zero */
     int		dbg_tick;	/* debug_tick when breakpoint was set */
     int		level;		/* top nesting level of executed function */
@@ -275,19 +279,19 @@ struct vimvar
     {"insertmode", sizeof("insertmode") - 1, NULL, VAR_STRING, VV_RO},
 };
 
-static int eval0 __ARGS((char_u *arg,  VAR retvar, char_u **nextcmd, int evaluate));
-static int eval1 __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int eval2 __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int eval3 __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int eval4 __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int eval5 __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int eval6 __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int eval7 __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int eval_index __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int get_option_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int get_string_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int get_lit_string_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int get_list_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate));
+static int eval0 __ARGS((char_u *arg,  typeval *rettv, char_u **nextcmd, int evaluate));
+static int eval1 __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int eval2 __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int eval3 __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int eval4 __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int eval5 __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int eval6 __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int eval7 __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int eval_index __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int get_option_tv __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int get_string_tv __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int get_lit_string_tv __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int get_list_tv __ARGS((char_u **arg, typeval *rettv, int evaluate));
 static listvar *list_alloc __ARGS((void));
 static void list_unref __ARGS((listvar *l));
 static void list_free __ARGS((listvar *l));
@@ -301,180 +305,180 @@ static listvar *list_copy __ARGS((listva
 static listitem *list_getrem __ARGS((listvar *l, long n));
 static char_u *list2string __ARGS((typeval *tv));
 static char_u *tv2string __ARGS((typeval *tv, char_u **tofree));
-static int get_env_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate));
+static int get_env_tv __ARGS((char_u **arg, typeval *rettv, int evaluate));
 static int find_internal_func __ARGS((char_u *name));
 static char_u *deref_func_name __ARGS((char_u *name, int *lenp));
-static int get_func_vartv __ARGS((char_u *name, int len, typeval *retvar, char_u **arg, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate));
-static int call_func __ARGS((char_u *name, int len, typeval *retvar, int argcount, typeval *argvars, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate));
-static void f_append __ARGS((typeval *argvars, typeval *retvar));
-static void f_argc __ARGS((typeval *argvars, typeval *retvar));
-static void f_argidx __ARGS((typeval *argvars, typeval *retvar));
-static void f_argv __ARGS((typeval *argvars, typeval *retvar));
-static void f_browse __ARGS((typeval *argvars, typeval *retvar));
-static void f_browsedir __ARGS((typeval *argvars, typeval *retvar));
+static int get_func_tv __ARGS((char_u *name, int len, typeval *rettv, char_u **arg, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate));
+static int call_func __ARGS((char_u *name, int len, typeval *rettv, int argcount, typeval *argvars, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate));
+static void f_append __ARGS((typeval *argvars, typeval *rettv));
+static void f_argc __ARGS((typeval *argvars, typeval *rettv));
+static void f_argidx __ARGS((typeval *argvars, typeval *rettv));
+static void f_argv __ARGS((typeval *argvars, typeval *rettv));
+static void f_browse __ARGS((typeval *argvars, typeval *rettv));
+static void f_browsedir __ARGS((typeval *argvars, typeval *rettv));
 static buf_T *find_buffer __ARGS((typeval *avar));
-static void f_bufexists __ARGS((typeval *argvars, typeval *retvar));
-static void f_buflisted __ARGS((typeval *argvars, typeval *retvar));
-static void f_bufloaded __ARGS((typeval *argvars, typeval *retvar));
-static buf_T *get_buf_vartv __ARGS((typeval *avar));
-static void f_bufname __ARGS((typeval *argvars, typeval *retvar));
-static void f_bufnr __ARGS((typeval *argvars, typeval *retvar));
-static void f_bufwinnr __ARGS((typeval *argvars, typeval *retvar));
-static void f_byte2line __ARGS((typeval *argvars, typeval *retvar));
-static void f_byteidx __ARGS((typeval *argvars, typeval *retvar));
-static void f_char2nr __ARGS((typeval *argvars, typeval *retvar));
-static void f_cindent __ARGS((typeval *argvars, typeval *retvar));
-static void f_col __ARGS((typeval *argvars, typeval *retvar));
-static void f_confirm __ARGS((typeval *argvars, typeval *retvar));
-static void f_copy __ARGS((typeval *argvars, typeval *retvar));
-static void f_cscope_connection __ARGS((typeval *argvars, typeval *retvar));
-static void f_cursor __ARGS((typeval *argsvars, typeval *retvar));
-static void f_deepcopy __ARGS((typeval *argvars, typeval *retvar));
-static void f_delete __ARGS((typeval *argvars, typeval *retvar));
-static void f_did_filetype __ARGS((typeval *argvars, typeval *retvar));
-static void f_diff_filler __ARGS((typeval *argvars, typeval *retvar));
-static void f_diff_hlID __ARGS((typeval *argvars, typeval *retvar));
-static void f_escape __ARGS((typeval *argvars, typeval *retvar));
-static void f_eventhandler __ARGS((typeval *argvars, typeval *retvar));
-static void f_executable __ARGS((typeval *argvars, typeval *retvar));
-static void f_exists __ARGS((typeval *argvars, typeval *retvar));
-static void f_expand __ARGS((typeval *argvars, typeval *retvar));
-static void f_filereadable __ARGS((typeval *argvars, typeval *retvar));
-static void f_filewritable __ARGS((typeval *argvars, typeval *retvar));
-static void f_finddir __ARGS((typeval *argvars, typeval *retvar));
-static void f_findfile __ARGS((typeval *argvars, typeval *retvar));
-static void f_findfilendir __ARGS((typeval *argvars, typeval *retvar, int dir));
-static void f_fnamemodify __ARGS((typeval *argvars, typeval *retvar));
-static void f_foldclosed __ARGS((typeval *argvars, typeval *retvar));
-static void f_foldclosedend __ARGS((typeval *argvars, typeval *retvar));
-static void foldclosed_both __ARGS((typeval *argvars, typeval *retvar, int end));
-static void f_foldlevel __ARGS((typeval *argvars, typeval *retvar));
-static void f_foldtext __ARGS((typeval *argvars, typeval *retvar));
-static void f_foldtextresult __ARGS((typeval *argvars, typeval *retvar));
-static void f_foreground __ARGS((typeval *argvars, typeval *retvar));
-static void f_function __ARGS((typeval *argvars, typeval *retvar));
-static void f_getbufvar __ARGS((typeval *argvars, typeval *retvar));
-static void f_getchar __ARGS((typeval *argvars, typeval *retvar));
-static void f_getcharmod __ARGS((typeval *argvars, typeval *retvar));
-static void f_getcmdline __ARGS((typeval *argvars, typeval *retvar));
-static void f_getcmdpos __ARGS((typeval *argvars, typeval *retvar));
-static void f_getcwd __ARGS((typeval *argvars, typeval *retvar));
-static void f_getfontname __ARGS((typeval *argvars, typeval *retvar));
-static void f_getfperm __ARGS((typeval *argvars, typeval *retvar));
-static void f_getfsize __ARGS((typeval *argvars, typeval *retvar));
-static void f_getftime __ARGS((typeval *argvars, typeval *retvar));
-static void f_getftype __ARGS((typeval *argvars, typeval *retvar));
-static void f_getline __ARGS((typeval *argvars, typeval *retvar));
-static void f_getreg __ARGS((typeval *argvars, typeval *retvar));
-static void f_getregtype __ARGS((typeval *argvars, typeval *retvar));
-static void f_getwinposx __ARGS((typeval *argvars, typeval *retvar));
-static void f_getwinposy __ARGS((typeval *argvars, typeval *retvar));
-static void f_getwinvar __ARGS((typeval *argvars, typeval *retvar));
-static void f_glob __ARGS((typeval *argvars, typeval *retvar));
-static void f_globpath __ARGS((typeval *argvars, typeval *retvar));
-static void f_has __ARGS((typeval *argvars, typeval *retvar));
-static void f_hasmapto __ARGS((typeval *argvars, typeval *retvar));
-static void f_histadd __ARGS((typeval *argvars, typeval *retvar));
-static void f_histdel __ARGS((typeval *argvars, typeval *retvar));
-static void f_histget __ARGS((typeval *argvars, typeval *retvar));
-static void f_histnr __ARGS((typeval *argvars, typeval *retvar));
-static void f_hlexists __ARGS((typeval *argvars, typeval *retvar));
-static void f_hlID __ARGS((typeval *argvars, typeval *retvar));
-static void f_hostname __ARGS((typeval *argvars, typeval *retvar));
-static void f_iconv __ARGS((typeval *argvars, typeval *retvar));
-static void f_indent __ARGS((typeval *argvars, typeval *retvar));
-static void f_insert __ARGS((typeval *argvars, typeval *retvar));
-static void f_isdirectory __ARGS((typeval *argvars, typeval *retvar));
-static void f_input __ARGS((typeval *argvars, typeval *retvar));
-static void f_inputdialog __ARGS((typeval *argvars, typeval *retvar));
-static void f_inputrestore __ARGS((typeval *argvars, typeval *retvar));
-static void f_inputsave __ARGS((typeval *argvars, typeval *retvar));
-static void f_inputsecret __ARGS((typeval *argvars, typeval *retvar));
-static void f_last_buffer_nr __ARGS((typeval *argvars, typeval *retvar));
-static void f_len __ARGS((typeval *argvars, typeval *retvar));
-static void f_libcall __ARGS((typeval *argvars, typeval *retvar));
-static void f_libcallnr __ARGS((typeval *argvars, typeval *retvar));
-static void libcall_common __ARGS((typeval *argvars, typeval *retvar, int type));
-static void f_line __ARGS((typeval *argvars, typeval *retvar));
-static void f_line2byte __ARGS((typeval *argvars, typeval *retvar));
-static void f_lispindent __ARGS((typeval *argvars, typeval *retvar));
-static void f_localtime __ARGS((typeval *argvars, typeval *retvar));
-static void f_maparg __ARGS((typeval *argvars, typeval *retvar));
-static void f_mapcheck __ARGS((typeval *argvars, typeval *retvar));
-static void get_maparg __ARGS((typeval *argvars, typeval *retvar, int exact));
-static void f_match __ARGS((typeval *argvars, typeval *retvar));
-static void f_matchend __ARGS((typeval *argvars, typeval *retvar));
-static void f_matchstr __ARGS((typeval *argvars, typeval *retvar));
-static void f_mode __ARGS((typeval *argvars, typeval *retvar));
-static void f_nextnonblank __ARGS((typeval *argvars, typeval *retvar));
-static void f_nr2char __ARGS((typeval *argvars, typeval *retvar));
-static void f_prevnonblank __ARGS((typeval *argvars, typeval *retvar));
-static void f_setbufvar __ARGS((typeval *argvars, typeval *retvar));
-static void f_setcmdpos __ARGS((typeval *argvars, typeval *retvar));
-static void f_setwinvar __ARGS((typeval *argvars, typeval *retvar));
-static void f_remove __ARGS((typeval *argvars, typeval *retvar));
-static void f_rename __ARGS((typeval *argvars, typeval *retvar));
-static void f_resolve __ARGS((typeval *argvars, typeval *retvar));
-static void f_search __ARGS((typeval *argvars, typeval *retvar));
-static void f_searchpair __ARGS((typeval *argvars, typeval *retvar));
+static void f_bufexists __ARGS((typeval *argvars, typeval *rettv));
+static void f_buflisted __ARGS((typeval *argvars, typeval *rettv));
+static void f_bufloaded __ARGS((typeval *argvars, typeval *rettv));
+static buf_T *get_buf_tv __ARGS((typeval *tv));
+static void f_bufname __ARGS((typeval *argvars, typeval *rettv));
+static void f_bufnr __ARGS((typeval *argvars, typeval *rettv));
+static void f_bufwinnr __ARGS((typeval *argvars, typeval *rettv));
+static void f_byte2line __ARGS((typeval *argvars, typeval *rettv));
+static void f_byteidx __ARGS((typeval *argvars, typeval *rettv));
+static void f_char2nr __ARGS((typeval *argvars, typeval *rettv));
+static void f_cindent __ARGS((typeval *argvars, typeval *rettv));
+static void f_col __ARGS((typeval *argvars, typeval *rettv));
+static void f_confirm __ARGS((typeval *argvars, typeval *rettv));
+static void f_copy __ARGS((typeval *argvars, typeval *rettv));
+static void f_cscope_connection __ARGS((typeval *argvars, typeval *rettv));
+static void f_cursor __ARGS((typeval *argsvars, typeval *rettv));
+static void f_deepcopy __ARGS((typeval *argvars, typeval *rettv));
+static void f_delete __ARGS((typeval *argvars, typeval *rettv));
+static void f_did_filetype __ARGS((typeval *argvars, typeval *rettv));
+static void f_diff_filler __ARGS((typeval *argvars, typeval *rettv));
+static void f_diff_hlID __ARGS((typeval *argvars, typeval *rettv));
+static void f_escape __ARGS((typeval *argvars, typeval *rettv));
+static void f_eventhandler __ARGS((typeval *argvars, typeval *rettv));
+static void f_executable __ARGS((typeval *argvars, typeval *rettv));
+static void f_exists __ARGS((typeval *argvars, typeval *rettv));
+static void f_expand __ARGS((typeval *argvars, typeval *rettv));
+static void f_filereadable __ARGS((typeval *argvars, typeval *rettv));
+static void f_filewritable __ARGS((typeval *argvars, typeval *rettv));
+static void f_finddir __ARGS((typeval *argvars, typeval *rettv));
+static void f_findfile __ARGS((typeval *argvars, typeval *rettv));
+static void f_findfilendir __ARGS((typeval *argvars, typeval *rettv, int dir));
+static void f_fnamemodify __ARGS((typeval *argvars, typeval *rettv));
+static void f_foldclosed __ARGS((typeval *argvars, typeval *rettv));
+static void f_foldclosedend __ARGS((typeval *argvars, typeval *rettv));
+static void foldclosed_both __ARGS((typeval *argvars, typeval *rettv, int end));
+static void f_foldlevel __ARGS((typeval *argvars, typeval *rettv));
+static void f_foldtext __ARGS((typeval *argvars, typeval *rettv));
+static void f_foldtextresult __ARGS((typeval *argvars, typeval *rettv));
+static void f_foreground __ARGS((typeval *argvars, typeval *rettv));
+static void f_function __ARGS((typeval *argvars, typeval *rettv));
+static void f_getbufvar __ARGS((typeval *argvars, typeval *rettv));
+static void f_getchar __ARGS((typeval *argvars, typeval *rettv));
+static void f_getcharmod __ARGS((typeval *argvars, typeval *rettv));
+static void f_getcmdline __ARGS((typeval *argvars, typeval *rettv));
+static void f_getcmdpos __ARGS((typeval *argvars, typeval *rettv));
+static void f_getcwd __ARGS((typeval *argvars, typeval *rettv));
+static void f_getfontname __ARGS((typeval *argvars, typeval *rettv));
+static void f_getfperm __ARGS((typeval *argvars, typeval *rettv));
+static void f_getfsize __ARGS((typeval *argvars, typeval *rettv));
+static void f_getftime __ARGS((typeval *argvars, typeval *rettv));
+static void f_getftype __ARGS((typeval *argvars, typeval *rettv));
+static void f_getline __ARGS((typeval *argvars, typeval *rettv));
+static void f_getreg __ARGS((typeval *argvars, typeval *rettv));
+static void f_getregtype __ARGS((typeval *argvars, typeval *rettv));
+static void f_getwinposx __ARGS((typeval *argvars, typeval *rettv));
+static void f_getwinposy __ARGS((typeval *argvars, typeval *rettv));
+static void f_getwinvar __ARGS((typeval *argvars, typeval *rettv));
+static void f_glob __ARGS((typeval *argvars, typeval *rettv));
+static void f_globpath __ARGS((typeval *argvars, typeval *rettv));
+static void f_has __ARGS((typeval *argvars, typeval *rettv));
+static void f_hasmapto __ARGS((typeval *argvars, typeval *rettv));
+static void f_histadd __ARGS((typeval *argvars, typeval *rettv));
+static void f_histdel __ARGS((typeval *argvars, typeval *rettv));
+static void f_histget __ARGS((typeval *argvars, typeval *rettv));
+static void f_histnr __ARGS((typeval *argvars, typeval *rettv));
+static void f_hlexists __ARGS((typeval *argvars, typeval *rettv));
+static void f_hlID __ARGS((typeval *argvars, typeval *rettv));
+static void f_hostname __ARGS((typeval *argvars, typeval *rettv));
+static void f_iconv __ARGS((typeval *argvars, typeval *rettv));
+static void f_indent __ARGS((typeval *argvars, typeval *rettv));
+static void f_insert __ARGS((typeval *argvars, typeval *rettv));
+static void f_isdirectory __ARGS((typeval *argvars, typeval *rettv));
+static void f_input __ARGS((typeval *argvars, typeval *rettv));
+static void f_inputdialog __ARGS((typeval *argvars, typeval *rettv));
+static void f_inputrestore __ARGS((typeval *argvars, typeval *rettv));
+static void f_inputsave __ARGS((typeval *argvars, typeval *rettv));
+static void f_inputsecret __ARGS((typeval *argvars, typeval *rettv));
+static void f_last_buffer_nr __ARGS((typeval *argvars, typeval *rettv));
+static void f_len __ARGS((typeval *argvars, typeval *rettv));
+static void f_libcall __ARGS((typeval *argvars, typeval *rettv));
+static void f_libcallnr __ARGS((typeval *argvars, typeval *rettv));
+static void libcall_common __ARGS((typeval *argvars, typeval *rettv, int type));
+static void f_line __ARGS((typeval *argvars, typeval *rettv));
+static void f_line2byte __ARGS((typeval *argvars, typeval *rettv));
+static void f_lispindent __ARGS((typeval *argvars, typeval *rettv));
+static void f_localtime __ARGS((typeval *argvars, typeval *rettv));
+static void f_maparg __ARGS((typeval *argvars, typeval *rettv));
+static void f_mapcheck __ARGS((typeval *argvars, typeval *rettv));
+static void get_maparg __ARGS((typeval *argvars, typeval *rettv, int exact));
+static void f_match __ARGS((typeval *argvars, typeval *rettv));
+static void f_matchend __ARGS((typeval *argvars, typeval *rettv));
+static void f_matchstr __ARGS((typeval *argvars, typeval *rettv));
+static void f_mode __ARGS((typeval *argvars, typeval *rettv));
+static void f_nextnonblank __ARGS((typeval *argvars, typeval *rettv));
+static void f_nr2char __ARGS((typeval *argvars, typeval *rettv));
+static void f_prevnonblank __ARGS((typeval *argvars, typeval *rettv));
+static void f_setbufvar __ARGS((typeval *argvars, typeval *rettv));
+static void f_setcmdpos __ARGS((typeval *argvars, typeval *rettv));
+static void f_setwinvar __ARGS((typeval *argvars, typeval *rettv));
+static void f_remove __ARGS((typeval *argvars, typeval *rettv));
+static void f_rename __ARGS((typeval *argvars, typeval *rettv));
+static void f_resolve __ARGS((typeval *argvars, typeval *rettv));
+static void f_search __ARGS((typeval *argvars, typeval *rettv));
+static void f_searchpair __ARGS((typeval *argvars, typeval *rettv));
 static int get_search_arg __ARGS((typeval *varp, int *flagsp));
-static void f_remote_expr __ARGS((typeval *argvars, typeval *retvar));
-static void f_remote_foreground __ARGS((typeval *argvars, typeval *retvar));
-static void f_remote_peek __ARGS((typeval *argvars, typeval *retvar));
-static void f_remote_read __ARGS((typeval *argvars, typeval *retvar));
-static void f_remote_send __ARGS((typeval *argvars, typeval *retvar));
-static void f_repeat __ARGS((typeval *argvars, typeval *retvar));
-static void f_server2client __ARGS((typeval *argvars, typeval *retvar));
-static void f_serverlist __ARGS((typeval *argvars, typeval *retvar));
-static void f_setline __ARGS((typeval *argvars, typeval *retvar));
-static void f_setreg __ARGS((typeval *argvars, typeval *retvar));
-static void f_simplify __ARGS((typeval *argvars, typeval *retvar));
-static void find_some_match __ARGS((typeval *argvars, typeval *retvar, int start));
-static void f_strftime __ARGS((typeval *argvars, typeval *retvar));
-static void f_stridx __ARGS((typeval *argvars, typeval *retvar));
-static void f_string __ARGS((typeval *argvars, typeval *retvar));
-static void f_strlen __ARGS((typeval *argvars, typeval *retvar));
-static void f_strpart __ARGS((typeval *argvars, typeval *retvar));
-static void f_strridx __ARGS((typeval *argvars, typeval *retvar));
-static void f_strtrans __ARGS((typeval *argvars, typeval *retvar));
-static void f_synID __ARGS((typeval *argvars, typeval *retvar));
-static void f_synIDattr __ARGS((typeval *argvars, typeval *retvar));
-static void f_synIDtrans __ARGS((typeval *argvars, typeval *retvar));
-static void f_system __ARGS((typeval *argvars, typeval *retvar));
-static void f_submatch __ARGS((typeval *argvars, typeval *retvar));
-static void f_substitute __ARGS((typeval *argvars, typeval *retvar));
-static void f_tempname __ARGS((typeval *argvars, typeval *retvar));
-static void f_tolower __ARGS((typeval *argvars, typeval *retvar));
-static void f_toupper __ARGS((typeval *argvars, typeval *retvar));
-static void f_tr __ARGS((typeval *argvars, typeval *retvar));
-static void f_type __ARGS((typeval *argvars, typeval *retvar));
-static void f_virtcol __ARGS((typeval *argvars, typeval *retvar));
-static void f_visualmode __ARGS((typeval *argvars, typeval *retvar));
-static void f_winbufnr __ARGS((typeval *argvars, typeval *retvar));
-static void f_wincol __ARGS((typeval *argvars, typeval *retvar));
-static void f_winheight __ARGS((typeval *argvars, typeval *retvar));
-static void f_winline __ARGS((typeval *argvars, typeval *retvar));
-static void f_winnr __ARGS((typeval *argvars, typeval *retvar));
-static void f_winrestcmd __ARGS((typeval *argvars, typeval *retvar));
-static void f_winwidth __ARGS((typeval *argvars, typeval *retvar));
+static void f_remote_expr __ARGS((typeval *argvars, typeval *rettv));
+static void f_remote_foreground __ARGS((typeval *argvars, typeval *rettv));
+static void f_remote_peek __ARGS((typeval *argvars, typeval *rettv));
+static void f_remote_read __ARGS((typeval *argvars, typeval *rettv));
+static void f_remote_send __ARGS((typeval *argvars, typeval *rettv));
+static void f_repeat __ARGS((typeval *argvars, typeval *rettv));
+static void f_server2client __ARGS((typeval *argvars, typeval *rettv));
+static void f_serverlist __ARGS((typeval *argvars, typeval *rettv));
+static void f_setline __ARGS((typeval *argvars, typeval *rettv));
+static void f_setreg __ARGS((typeval *argvars, typeval *rettv));
+static void f_simplify __ARGS((typeval *argvars, typeval *rettv));
+static void find_some_match __ARGS((typeval *argvars, typeval *rettv, int start));
+static void f_strftime __ARGS((typeval *argvars, typeval *rettv));
+static void f_stridx __ARGS((typeval *argvars, typeval *rettv));
+static void f_string __ARGS((typeval *argvars, typeval *rettv));
+static void f_strlen __ARGS((typeval *argvars, typeval *rettv));
+static void f_strpart __ARGS((typeval *argvars, typeval *rettv));
+static void f_strridx __ARGS((typeval *argvars, typeval *rettv));
+static void f_strtrans __ARGS((typeval *argvars, typeval *rettv));
+static void f_synID __ARGS((typeval *argvars, typeval *rettv));
+static void f_synIDattr __ARGS((typeval *argvars, typeval *rettv));
+static void f_synIDtrans __ARGS((typeval *argvars, typeval *rettv));
+static void f_system __ARGS((typeval *argvars, typeval *rettv));
+static void f_submatch __ARGS((typeval *argvars, typeval *rettv));
+static void f_substitute __ARGS((typeval *argvars, typeval *rettv));
+static void f_tempname __ARGS((typeval *argvars, typeval *rettv));
+static void f_tolower __ARGS((typeval *argvars, typeval *rettv));
+static void f_toupper __ARGS((typeval *argvars, typeval *rettv));
+static void f_tr __ARGS((typeval *argvars, typeval *rettv));
+static void f_type __ARGS((typeval *argvars, typeval *rettv));
+static void f_virtcol __ARGS((typeval *argvars, typeval *rettv));
+static void f_visualmode __ARGS((typeval *argvars, typeval *rettv));
+static void f_winbufnr __ARGS((typeval *argvars, typeval *rettv));
+static void f_wincol __ARGS((typeval *argvars, typeval *rettv));
+static void f_winheight __ARGS((typeval *argvars, typeval *rettv));
+static void f_winline __ARGS((typeval *argvars, typeval *rettv));
+static void f_winnr __ARGS((typeval *argvars, typeval *rettv));
+static void f_winrestcmd __ARGS((typeval *argvars, typeval *rettv));
+static void f_winwidth __ARGS((typeval *argvars, typeval *rettv));
 static win_T *find_win_by_nr __ARGS((typeval *vp));
 static pos_T *var2fpos __ARGS((typeval *varp, int lnum));
 static int get_env_len __ARGS((char_u **arg));
 static int get_id_len __ARGS((char_u **arg));
 static int get_func_len __ARGS((char_u **arg, char_u **alias, int evaluate));
-static char_u *find_name_end __ARGS((char_u *arg, char_u **expr_start, char_u **expr_end));
+static char_u *find_name_end __ARGS((char_u *arg, char_u **expr_start, char_u **expr_end, int incl_br));
 static int eval_isnamec __ARGS((int c));
 static int find_vim_var __ARGS((char_u *name, int len));
-static int get_var_vartv __ARGS((char_u *name, int len, typeval *retvar));
-static VAR alloc_var __ARGS((void));
-static typeval *alloc_vartv __ARGS((void));
-static typeval *alloc_string_vartv __ARGS((char_u *string));
-static void free_vartv __ARGS((typeval *varp));
-static void clear_vartv __ARGS((typeval *varp));
-static long get_vartv_number __ARGS((typeval *varp));
-static linenr_T get_vartv_lnum __ARGS((typeval *argvars));
-static char_u *get_vartv_string __ARGS((typeval *varp));
-static char_u *get_vartv_string_buf __ARGS((typeval *varp, char_u *buf));
+static int get_var_tv __ARGS((char_u *name, int len, typeval *rettv));
+static typeval *alloc_tv __ARGS((void));
+static typeval *alloc_string_tv __ARGS((char_u *string));
+static void free_tv __ARGS((typeval *varp));
+static void clear_tv __ARGS((typeval *varp));
+static void init_tv __ARGS((typeval *varp));
+static long get_tv_number __ARGS((typeval *varp));
+static linenr_T get_tv_lnum __ARGS((typeval *argvars));
+static char_u *get_tv_string __ARGS((typeval *varp));
+static char_u *get_tv_string_buf __ARGS((typeval *varp, char_u *buf));
 static VAR find_var __ARGS((char_u *name, int writing));
 static VAR find_var_in_ga __ARGS((garray_T *gap, char_u *varname));
 static garray_T *find_var_ga __ARGS((char_u *name, char_u **varname));
@@ -483,7 +487,7 @@ static void list_one_var __ARGS((VAR v, 
 static void list_vim_var __ARGS((int i));
 static void list_one_var_a __ARGS((char_u *prefix, char_u *name, int type, char_u *string));
 static void set_var __ARGS((char_u *name, typeval *varp, int copy));
-static void copy_vartv __ARGS((typeval *from, typeval *to));
+static void copy_tv __ARGS((typeval *from, typeval *to));
 static char_u *find_option_end __ARGS((char_u **arg, int *opt_flags));
 static char_u *trans_function_name __ARGS((char_u **pp, int skip, int internal));
 static int eval_fname_script __ARGS((char_u *p));
@@ -492,19 +496,18 @@ static void list_func_head __ARGS((ufunc
 static void cat_func_name __ARGS((char_u *buf, ufunc_T *fp));
 static ufunc_T *find_func __ARGS((char_u *name));
 static int function_exists __ARGS((char_u *name));
-static void call_user_func __ARGS((ufunc_T *fp, int argcount, typeval *argvars, typeval *retvar, linenr_T firstline, linenr_T lastline));
-
-#define get_var_string(p)	 get_vartv_string(&(p)->tv)
-#define get_var_string_buf(p, b) get_vartv_string_buf(&(p)->tv, (b))
-#define get_var_number(p)	 get_vartv_number(&((p)->tv))
-
-/* Magic braces are always enabled, otherwise Vim scripts would not be
- * portable. */
-#define FEAT_MAGIC_BRACES
-
-#ifdef FEAT_MAGIC_BRACES
+static void call_user_func __ARGS((ufunc_T *fp, int argcount, typeval *argvars, typeval *rettv, linenr_T firstline, linenr_T lastline));
+
+#define get_var_string(p)	 get_tv_string(&(p)->tv)
+#define get_var_string_buf(p, b) get_tv_string_buf(&(p)->tv, (b))
+#define get_var_number(p)	 get_tv_number(&((p)->tv))
+
 static char_u * make_expanded_name __ARGS((char_u *in_start,  char_u *expr_start,  char_u *expr_end,  char_u *in_end));
-#endif
+
+static void list_all_vars __ARGS((void));
+static char_u *list_arg_vars __ARGS((exarg_T *eap, char_u *arg));
+static char_u *ex_let_one __ARGS((char_u *arg, typeval *tv, int copy, char_u *endchars));
+static char_u *set_var_idx __ARGS((char_u *name, char_u *ip, typeval *rettv, int copy, char_u *endchars));
 
 /*
  * Set an internal variable to a string value. Creates the variable if it does
@@ -521,11 +524,11 @@ set_internal_string_var(name, value)
     val = vim_strsave(value);
     if (val != NULL)
     {
-	tvp = alloc_string_vartv(val);
+	tvp = alloc_string_tv(val);
 	if (tvp != NULL)
 	{
 	    set_var(name, tvp, FALSE);
-	    free_vartv(tvp);
+	    free_tv(tvp);
 	}
     }
 }
@@ -629,22 +632,20 @@ eval_to_bool(arg, error, nextcmd, skip)
     char_u	**nextcmd;
     int		skip;	    /* only parse, don't execute */
 {
-    var		retvar;
+    typeval	tv;
     int		retval = FALSE;
 
     if (skip)
 	++emsg_skip;
-    if (eval0(arg, &retvar, nextcmd, !skip) == FAIL)
-    {
+    if (eval0(arg, &tv, nextcmd, !skip) == FAIL)
 	*error = TRUE;
-    }
     else
     {
 	*error = FALSE;
 	if (!skip)
 	{
-	    retval = (get_var_number(&retvar) != 0);
-	    clear_vartv(&retvar.tv);
+	    retval = (get_tv_number(&tv) != 0);
+	    clear_tv(&tv);
 	}
     }
     if (skip)
@@ -664,17 +665,17 @@ eval_to_string_skip(arg, nextcmd, skip)
     char_u	**nextcmd;
     int		skip;	    /* only parse, don't execute */
 {
-    var		retvar;
+    typeval	tv;
     char_u	*retval;
 
     if (skip)
 	++emsg_skip;
-    if (eval0(arg, &retvar, nextcmd, !skip) == FAIL || skip)
+    if (eval0(arg, &tv, nextcmd, !skip) == FAIL || skip)
 	retval = NULL;
     else
     {
-	retval = vim_strsave(get_var_string(&retvar));
-	clear_vartv(&retvar.tv);
+	retval = vim_strsave(get_tv_string(&tv));
+	clear_tv(&tv);
     }
     if (skip)
 	--emsg_skip;
@@ -690,10 +691,10 @@ eval_to_string_skip(arg, nextcmd, skip)
 skip_expr(pp)
     char_u	**pp;
 {
-    typeval	retvar;
+    typeval	rettv;
 
     *pp = skipwhite(*pp);
-    return eval1(pp, &retvar, FALSE);
+    return eval1(pp, &rettv, FALSE);
 }
 
 /*
@@ -705,15 +706,15 @@ eval_to_string(arg, nextcmd)
     char_u	*arg;
     char_u	**nextcmd;
 {
-    var		retvar;
+    typeval	tv;
     char_u	*retval;
 
-    if (eval0(arg, &retvar, nextcmd, TRUE) == FAIL)
+    if (eval0(arg, &tv, nextcmd, TRUE) == FAIL)
 	retval = NULL;
     else
     {
-	retval = vim_strsave(get_var_string(&retvar));
-	clear_vartv(&retvar.tv);
+	retval = vim_strsave(get_tv_string(&tv));
+	clear_tv(&tv);
     }
 
     return retval;
@@ -749,19 +750,19 @@ eval_to_string_safe(arg, nextcmd)
 eval_arg_to_string(arg)
     char_u	**arg;
 {
-    typeval	retvar;
+    typeval	rettv;
     char_u	*retval;
     int		ret;
 
     ++emsg_off;
 
-    ret = eval1(arg, &retvar, TRUE);
+    ret = eval1(arg, &rettv, TRUE);
     if (ret == FAIL)
 	retval = NULL;
     else
     {
-	retval = vim_strsave(get_vartv_string(&retvar));
-	clear_vartv(&retvar);
+	retval = vim_strsave(get_tv_string(&rettv));
+	clear_tv(&rettv);
     }
 
     --emsg_off;
@@ -779,18 +780,18 @@ eval_arg_to_string(arg)
 eval_to_number(expr)
     char_u	*expr;
 {
-    typeval	retvar;
+    typeval	rettv;
     int		retval;
     char_u	*p = expr;
 
     ++emsg_off;
 
-    if (eval1(&p, &retvar, TRUE) == FAIL)
+    if (eval1(&p, &rettv, TRUE) == FAIL)
 	retval = -1;
     else
     {
-	retval = get_vartv_number(&retvar);
-	clear_vartv(&retvar);
+	retval = get_tv_number(&rettv);
+	clear_tv(&rettv);
     }
     --emsg_off;
 
@@ -810,7 +811,7 @@ call_vim_function(func, argc, argv, safe
     int		safe;		/* use the sandbox */
 {
     char_u	*retval = NULL;
-    var		retvar;
+    typeval	rettv;
     typeval	*argvars;
     long	n;
     int		len;
@@ -852,13 +853,13 @@ call_vim_function(func, argc, argv, safe
 	++sandbox;
     }
 
-    retvar.tv.v_type = VAR_UNKNOWN;	/* clear_vartv() uses this */
-    if (call_func(func, (int)STRLEN(func), &retvar.tv, argc, argvars,
+    rettv.v_type = VAR_UNKNOWN;		/* clear_tv() uses this */
+    if (call_func(func, (int)STRLEN(func), &rettv, argc, argvars,
 		    curwin->w_cursor.lnum, curwin->w_cursor.lnum,
 		    &doesrange, TRUE) == OK)
-	retval = vim_strsave(get_var_string(&retvar));
-
-    clear_vartv(&retvar.tv);
+	retval = vim_strsave(get_tv_string(&rettv));
+
+    clear_tv(&rettv);
     vim_free(argvars);
 
     if (safe)
@@ -901,33 +902,33 @@ eval_foldexpr(arg, cp)
     char_u	*arg;
     int		*cp;
 {
-    var		retvar;
+    typeval	tv;
     int		retval;
     char_u	*s;
 
     ++emsg_off;
     ++sandbox;
     *cp = NUL;
-    if (eval0(arg, &retvar, NULL, TRUE) == FAIL)
+    if (eval0(arg, &tv, NULL, TRUE) == FAIL)
 	retval = 0;
     else
     {
 	/* If the result is a number, just return the number. */
-	if (retvar.tv.v_type == VAR_NUMBER)
-	    retval = retvar.tv.vval.v_number;
-	else if (retvar.tv.v_type == VAR_UNKNOWN
-		|| retvar.tv.vval.v_string == NULL)
+	if (tv.v_type == VAR_NUMBER)
+	    retval = tv.vval.v_number;
+	else if (tv.v_type == VAR_UNKNOWN
+		|| tv.vval.v_string == NULL)
 	    retval = 0;
 	else
 	{
 	    /* If the result is a string, check if there is a non-digit before
 	     * the number. */
-	    s = retvar.tv.vval.v_string;
+	    s = tv.vval.v_string;
 	    if (!VIM_ISDIGIT(*s) && *s != '-')
 		*cp = *s++;
 	    retval = atol((char *)s);
 	}
-	clear_vartv(&retvar.tv);
+	clear_tv(&tv);
     }
     --emsg_off;
     --sandbox;
@@ -936,7 +937,6 @@ eval_foldexpr(arg, cp)
 }
 #endif
 
-#ifdef FEAT_MAGIC_BRACES
 /*
  * Expands out the 'magic' {}'s in a variable/function name.
  * Note that this can call itself recursively, to deal with
@@ -990,7 +990,7 @@ make_expanded_name(in_start, expr_start,
 
     if (retval != NULL)
     {
-	temp_result = find_name_end(retval, &expr_start, &expr_end);
+	temp_result = find_name_end(retval, &expr_start, &expr_end, FALSE);
 	if (expr_start != NULL)
 	{
 	    /* Further expansion! */
@@ -1004,307 +1004,525 @@ make_expanded_name(in_start, expr_start,
     return retval;
 
 }
-#endif /* FEAT_MAGIC_BRACES */
-
-/*
- * ":let var = expr"	assignment command.
- * ":let var"		list one variable value
- * ":let"		list all variable values
+
+/*
+ * ":let"			list all variable values
+ * ":let var1 var2"		list variable values
+ * ":let var = expr"		assignment command.
+ * ":let [var1, var2] = expr"	unpack list.
  */
     void
 ex_let(eap)
     exarg_T	*eap;
 {
     char_u	*arg = eap->arg;
-    char_u	*expr;
-    char_u	*name;
-    VAR		varp;
-    var		retvar;
-    char_u	*p;
-    int		c1 = 0, c2;
+    char_u	*expr = NULL;
+    typeval	rettv;
     int		i;
+    int		var_count = 0;
+    int		semicolon = 0;
+    listvar	*l;
+    listitem	*item;
+
+    if (*arg != '[')
+	expr = vim_strchr(find_name_end(arg, NULL, NULL, TRUE), '=');
+    if (*arg != '[' && expr == NULL)
+    {
+	if (!ends_excmd(*arg))
+	    /* ":let var1 var2" */
+	    arg = list_arg_vars(eap, arg);
+	else if (!eap->skip)
+	    /* ":let" */
+	    list_all_vars();
+	eap->nextcmd = check_nextcmd(arg);
+    }
+    else
+    {
+	if (*arg == '[')
+	{
+	    /* ":let [a, b] = expr": find the matching ']' to get to the
+	     * expression. */
+	    while (1)
+	    {
+		arg = skipwhite(arg + 1);
+		if (vim_strchr((char_u *)"$@&", *arg) != NULL)
+		    ++arg;
+		expr = find_name_end(arg, NULL, NULL, TRUE);
+		if (expr == arg)
+		{
+		    EMSG2(_(e_invarg2), arg);
+		    return;
+		}
+		++var_count;
+
+		arg = skipwhite(expr);
+		if (*arg == ']')
+		    break;
+		else if (*arg == ';')
+		{
+		    if (semicolon == 1)
+		    {
+			EMSG(_("Double ; in :let"));
+			return;
+		    }
+		    semicolon = 1;
+		}
+		else if (*arg != ',')
+		{
+		    EMSG2(_(e_invarg2), arg);
+		    return;
+		}
+	    }
+
+	    /* check for '=' after the ']' */
+	    expr = skipwhite(arg + 1);
+	    if (*expr != '=')
+	    {
+		EMSG(_(e_letunexp));
+		return;
+	    }
+	}
+
+	if (eap->skip)
+	    ++emsg_skip;
+	i = eval0(expr + 1, &rettv, &eap->nextcmd, !eap->skip);
+	if (eap->skip)
+	{
+	    if (i != FAIL)
+		clear_tv(&rettv);
+	    --emsg_skip;
+	}
+	else if (i != FAIL)
+	{
+	    /* Move "arg" back to the variable name(s). */
+	    arg = eap->arg;
+	    if (*arg != '[')
+	    {
+		/* ":let var = expr" */
+		(void)ex_let_one(arg, &rettv, FALSE, (char_u *)"=");
+	    }
+	    else
+	    {
+		/* ":let [v1, v2] = list" */
+		l = rettv.vval.v_list;
+		if (rettv.v_type != VAR_LIST || l == NULL)
+		    EMSG(_("E999: List required"));
+		else
+		{
+		    i = list_len(l);
+		    if (semicolon == 0 && var_count < i)
+			EMSG(_("E999: Less targets than List items"));
+		    else if (var_count - semicolon > i)
+			EMSG(_("E999: More targets than List items"));
+		    else
+		    {
+			item = l->lv_first;
+			while (*arg != ']')
+			{
+			    arg = skipwhite(arg + 1);
+			    arg = ex_let_one(arg, &item->li_tv,
+						       TRUE, (char_u *)",;]");
+			    item = item->li_next;
+			    if (arg == NULL)
+				break;
+
+			    arg = skipwhite(arg);
+			    if (*arg == ';')
+			    {
+				/* Put the rest of the list (may be empty) in
+				 * the var after ';'. */
+				l = list_alloc();
+				if (l == NULL)
+				    break;
+				while (item != NULL)
+				{
+				    list_append_tv(l, &item->li_tv);
+				    item = item->li_next;
+				}
+				list_unref(rettv.vval.v_list);
+				rettv.vval.v_list = l;
+				l->lv_refcount = 1;
+				(void)ex_let_one(skipwhite(arg + 1), &rettv,
+							 FALSE, (char_u *)"]");
+				break;
+			    }
+			    else if (*arg != ',' && *arg != ']')
+			    {
+				EMSG2(_(e_intern2), "ex_let()");
+				break;
+			    }
+			}
+		    }
+		}
+	    }
+	    clear_tv(&rettv);
+	}
+    }
+}
+
+    static void
+list_all_vars()
+{
+    int	i;
+
+    /*
+     * List all variables.
+     */
+    for (i = 0; i < variables.ga_len && !got_int; ++i)
+	if (VAR_ENTRY(i).v_name != NULL)
+	    list_one_var(&VAR_ENTRY(i), (char_u *)"");
+    for (i = 0; i < curbuf->b_vars.ga_len && !got_int; ++i)
+	if (BVAR_ENTRY(i).v_name != NULL)
+	    list_one_var(&BVAR_ENTRY(i), (char_u *)"b:");
+    for (i = 0; i < curwin->w_vars.ga_len && !got_int; ++i)
+	if (WVAR_ENTRY(i).v_name != NULL)
+	    list_one_var(&WVAR_ENTRY(i), (char_u *)"w:");
+    for (i = 0; i < VV_LEN && !got_int; ++i)
+	if (vimvars[i].type == VAR_NUMBER || vimvars[i].val != NULL)
+	    list_vim_var(i);
+}
+
+/*
+ * List variables in "arg".
+ */
+    static char_u *
+list_arg_vars(eap, arg)
+    exarg_T	*eap;
+    char_u	*arg;
+{
+    int		error = FALSE;
+    char_u	*temp_string = NULL;
+    int		arg_len;
     char_u	*expr_start;
     char_u	*expr_end;
     char_u	*name_end;
-
-    name_end = find_name_end(arg, &expr_start, &expr_end);
-    expr = vim_strchr(name_end, '=');
-    if (expr == NULL)
-    {
-	if (ends_excmd(*arg))
-	{
-	    if (!eap->skip)
-	    {
-		/*
-		 * List all variables.
-		 */
-		for (i = 0; i < variables.ga_len && !got_int; ++i)
-		    if (VAR_ENTRY(i).v_name != NULL)
-			list_one_var(&VAR_ENTRY(i), (char_u *)"");
-		for (i = 0; i < curbuf->b_vars.ga_len && !got_int; ++i)
-		    if (BVAR_ENTRY(i).v_name != NULL)
-			list_one_var(&BVAR_ENTRY(i), (char_u *)"b:");
-		for (i = 0; i < curwin->w_vars.ga_len && !got_int; ++i)
-		    if (WVAR_ENTRY(i).v_name != NULL)
-			list_one_var(&WVAR_ENTRY(i), (char_u *)"w:");
-		for (i = 0; i < VV_LEN && !got_int; ++i)
-		    if (vimvars[i].type == VAR_NUMBER || vimvars[i].val != NULL)
-			list_vim_var(i);
-	    }
-	}
-	else
-	{
-	    int		error = FALSE;
-
-	    /*
-	     * List variables.
-	     */
-	    while (!ends_excmd(*arg) && !got_int)
-	    {
-		char_u	*temp_string = NULL;
-		int	arg_len;
-
-		/* Find the end of the name. */
-		name_end = find_name_end(arg, &expr_start, &expr_end);
-
-		if (!vim_iswhite(*name_end) && !ends_excmd(*name_end))
+    int		c1 = 0, c2;
+    int		i;
+    VAR		varp;
+    char_u	*name;
+
+    while (!ends_excmd(*arg) && !got_int)
+    {
+	/* Find the end of the name. */
+	name_end = find_name_end(arg, &expr_start, &expr_end, FALSE);
+
+	if (!vim_iswhite(*name_end) && !ends_excmd(*name_end))
+	{
+	    emsg_severe = TRUE;
+	    EMSG(_(e_trailing));
+	    break;
+	}
+	if (!error && !eap->skip)
+	{
+	    if (expr_start != NULL)
+	    {
+		temp_string = make_expanded_name(arg, expr_start,
+							  expr_end, name_end);
+		if (temp_string == NULL)
 		{
-		    emsg_severe = TRUE;
-		    EMSG(_(e_trailing));
-		    break;
-		}
-		if (!error && !eap->skip)
-		{
-#ifdef FEAT_MAGIC_BRACES
-		    if (expr_start != NULL)
+		    /*
+		     * Report an invalid expression in braces, unless
+		     * the expression evaluation has been cancelled due
+		     * to an aborting error, an interrupt, or an
+		     * exception.
+		     */
+		    if (!aborting())
 		    {
-			temp_string = make_expanded_name(arg, expr_start,
-							 expr_end, name_end);
-			if (temp_string == NULL)
-			{
-			    /*
-			     * Report an invalid expression in braces, unless
-			     * the expression evaluation has been cancelled due
-			     * to an aborting error, an interrupt, or an
-			     * exception.
-			     */
-			    if (!aborting())
-			    {
-				emsg_severe = TRUE;
-				EMSG2(_(e_invarg2), arg);
-				break;
-			    }
-			    error = TRUE;
-			    arg = skipwhite(name_end);
-			    continue;
-			}
-			arg = temp_string;
-			arg_len = STRLEN(temp_string);
+			emsg_severe = TRUE;
+			EMSG2(_(e_invarg2), arg);
+			break;
 		    }
-		    else
-#endif
+		    error = TRUE;
+		    arg = skipwhite(name_end);
+		    continue;
+		}
+		arg = temp_string;
+		arg_len = STRLEN(temp_string);
+	    }
+	    else
+	    {
+		c1 = *name_end;
+		*name_end = NUL;
+		arg_len = (int)(name_end - arg);
+	    }
+	    i = find_vim_var(arg, arg_len);
+	    if (i >= 0)
+		list_vim_var(i);
+	    else if (STRCMP("b:changedtick", arg) == 0)
+	    {
+		char_u	numbuf[NUMBUFLEN];
+
+		sprintf((char *)numbuf, "%ld",
+					 (long)curbuf->b_changedtick);
+		list_one_var_a((char_u *)"b:", (char_u *)"changedtick",
+						  VAR_NUMBER, numbuf);
+	    }
+	    else
+	    {
+		varp = find_var(arg, FALSE);
+		if (varp == NULL)
+		{
+		    /* Skip further arguments but do continue to
+		     * search for a trailing command. */
+		    EMSG2(_("E106: Unknown variable: \"%s\""), arg);
+		    error = TRUE;
+		}
+		else
+		{
+		    name = vim_strchr(arg, ':');
+		    if (name != NULL)
 		    {
-			c1 = *name_end;
-			*name_end = NUL;
-			arg_len = (int)(name_end - arg);
-		    }
-		    i = find_vim_var(arg, arg_len);
-		    if (i >= 0)
-			list_vim_var(i);
-		    else if (STRCMP("b:changedtick", arg) == 0)
-		    {
-			char_u	numbuf[NUMBUFLEN];
-
-			sprintf((char *)numbuf, "%ld",
-						 (long)curbuf->b_changedtick);
-			list_one_var_a((char_u *)"b:", (char_u *)"changedtick",
-							  VAR_NUMBER, numbuf);
-		    }
-		    else
-		    {
-			varp = find_var(arg, FALSE);
-			if (varp == NULL)
-			{
-			    /* Skip further arguments but do continue to
-			     * search for a trailing command. */
-			    EMSG2(_("E106: Unknown variable: \"%s\""), arg);
-			    error = TRUE;
-			}
+			/* "a:" vars have no name stored, use whole arg */
+			if (arg[0] == 'a' && arg[1] == ':')
+			    c2 = NUL;
 			else
 			{
-			    name = vim_strchr(arg, ':');
-			    if (name != NULL)
-			    {
-				/* "a:" vars have no name stored, use whole
-				 * arg */
-				if (arg[0] == 'a' && arg[1] == ':')
-				    c2 = NUL;
-				else
-				{
-				    c2 = *++name;
-				    *name = NUL;
-				}
-				list_one_var(varp, arg);
-				if (c2 != NUL)
-				    *name = c2;
-			    }
-			    else
-				list_one_var(varp, (char_u *)"");
+			    c2 = *++name;
+			    *name = NUL;
 			}
-		    }
-#ifdef FEAT_MAGIC_BRACES
-		    if (expr_start != NULL)
-			vim_free(temp_string);
-		    else
-#endif
-			*name_end = c1;
-		}
-		arg = skipwhite(name_end);
-	    }
-	}
-	eap->nextcmd = check_nextcmd(arg);
-    }
-    else
-    {
-	if (eap->skip)
-	    ++emsg_skip;
-	i = eval0(expr + 1, &retvar, &eap->nextcmd, !eap->skip);
-	if (eap->skip)
-	{
-	    if (i != FAIL)
-		clear_vartv(&retvar.tv);
-	    --emsg_skip;
-	}
-	else if (i != FAIL)
-	{
-	    /*
-	     * ":let $VAR = expr": Set environment variable.
-	     */
-	    if (*arg == '$')
-	    {
-		int	len;
-		int	cc;
-
-		/* Find the end of the name. */
-		++arg;
-		name = arg;
-		len = get_env_len(&arg);
-		if (len == 0)
-		    EMSG2(_(e_invarg2), name - 1);
-		else
-		{
-		    if (*skipwhite(arg) != '=')
-			EMSG(_(e_letunexp));
-		    else
-		    {
-			cc = name[len];
-			name[len] = NUL;
-			p = get_var_string(&retvar);
-			vim_setenv(name, p);
-			if (STRICMP(name, "HOME") == 0)
-			    init_homedir();
-			else if (didset_vim && STRICMP(name, "VIM") == 0)
-			    didset_vim = FALSE;
-			else if (didset_vimruntime
-					  && STRICMP(name, "VIMRUNTIME") == 0)
-			    didset_vimruntime = FALSE;
-			name[len] = cc;
-		    }
-		}
-	    }
-
-	    /*
-	     * ":let &option = expr": Set option value.
-	     * ":let &l:option = expr": Set local option value.
-	     * ":let &g:option = expr": Set global option value.
-	     */
-	    else if (*arg == '&')
-	    {
-		int opt_flags;
-
-		/*
-		 * Find the end of the name;
-		 */
-		p = find_option_end(&arg, &opt_flags);
-		if (p == NULL || *skipwhite(p) != '=')
-		    EMSG(_(e_letunexp));
-		else
-		{
-		    c1 = *p;
-		    *p = NUL;
-		    set_option_value(arg, get_var_number(&retvar),
-					  get_var_string(&retvar), opt_flags);
-		    *p = c1;		    /* put back for error messages */
-		}
-	    }
-
-	    /*
-	     * ":let @r = expr": Set register contents.
-	     */
-	    else if (*arg == '@')
-	    {
-		++arg;
-		if (*skipwhite(arg + 1) != '=')
-		    EMSG(_(e_letunexp));
-		else
-		    write_reg_contents(*arg == '@' ? '"' : *arg,
-					  get_var_string(&retvar), -1, FALSE);
-	    }
-
-	    /*
-	     * ":let var = expr": Set internal variable.
-	     */
-	    else if (eval_isnamec(*arg) && !VIM_ISDIGIT(*arg))
-	    {
-		/* Find the end of the name. */
-		p = find_name_end(arg, &expr_start, &expr_end);
-
-		if (*skipwhite(p) != '=')
-		    EMSG(_(e_letunexp));
-		else if (p - arg == 13
-				    && STRNCMP(arg, "b:changedtick", 13) == 0)
-		    EMSG2(_(e_readonlyvar), arg);
-#ifdef FEAT_MAGIC_BRACES
-		else if (expr_start != NULL)
-		{
-		    char_u  *temp_string;
-
-		    temp_string = make_expanded_name(arg, expr_start,
-								 expr_end, p);
-		    if (temp_string == NULL)
-		    {
-			/*
-			 * Report an invalid expression in braces, unless the
-			 * expression evaluation has been cancelled due to an
-			 * aborting error, an interrupt, or an exception.
-			 */
-			if (!aborting())
-			    EMSG2(_(e_invarg2), arg);
+			list_one_var(varp, arg);
+			if (c2 != NUL)
+			    *name = c2;
 		    }
 		    else
-		    {
-			set_var(temp_string, &retvar.tv, TRUE);
-			vim_free(temp_string);
-		    }
+			list_one_var(varp, (char_u *)"");
 		}
-#endif
-		else
-		{
-		    c1 = *p;
-		    *p = NUL;
-		    set_var(arg, &retvar.tv, TRUE);
-		    *p = c1;		/* put char back for error messages */
-		}
-	    }
-
+	    }
+	    if (expr_start != NULL)
+		vim_free(temp_string);
+	    else
+		*name_end = c1;
+	}
+	arg = skipwhite(name_end);
+    }
+
+    return arg;
+}
+
+/*
+ * Set one item of ":let var = expr" or ":let [v1, v2] = list" to its value.
+ * Returns a pointer to the char just after the var name.
+ * Returns NULL if there is an error.
+ */
+    static char_u *
+ex_let_one(arg, tv, copy, endchars)
+    char_u	*arg;		/* points to variable name */
+    typeval	*tv;		/* value to assign to variable */
+    int		copy;		/* copy value from "tv" */
+    char_u	*endchars;	/* valid chars after variable name */
+{
+    int		c1;
+    char_u	*name;
+    char_u	*p;
+    char_u	*arg_end = NULL;
+    int		len;
+    int		opt_flags;
+
+    /*
+     * ":let $VAR = expr": Set environment variable.
+     */
+    if (*arg == '$')
+    {
+	/* Find the end of the name. */
+	++arg;
+	name = arg;
+	len = get_env_len(&arg);
+	if (len == 0)
+	    EMSG2(_(e_invarg2), name - 1);
+	else
+	{
+	    if (vim_strchr(endchars, *skipwhite(arg)) == NULL)
+		EMSG(_(e_letunexp));
 	    else
 	    {
+		c1 = name[len];
+		name[len] = NUL;
+		p = get_tv_string(tv);
+		vim_setenv(name, p);
+		if (STRICMP(name, "HOME") == 0)
+		    init_homedir();
+		else if (didset_vim && STRICMP(name, "VIM") == 0)
+		    didset_vim = FALSE;
+		else if (didset_vimruntime && STRICMP(name, "VIMRUNTIME") == 0)
+		    didset_vimruntime = FALSE;
+		name[len] = c1;
+		arg_end = arg;
+	    }
+	}
+    }
+
+    /*
+     * ":let &option = expr": Set option value.
+     * ":let &l:option = expr": Set local option value.
+     * ":let &g:option = expr": Set global option value.
+     */
+    else if (*arg == '&')
+    {
+	/* Find the end of the name. */
+	p = find_option_end(&arg, &opt_flags);
+	if (p == NULL || vim_strchr(endchars, *skipwhite(p)) == NULL)
+	    EMSG(_(e_letunexp));
+	else
+	{
+	    c1 = *p;
+	    *p = NUL;
+	    set_option_value(arg, get_tv_number(tv),
+				  get_tv_string(tv), opt_flags);
+	    *p = c1;
+	    arg_end = p;
+	}
+    }
+
+    /*
+     * ":let @r = expr": Set register contents.
+     */
+    else if (*arg == '@')
+    {
+	++arg;
+	if (vim_strchr(endchars, *skipwhite(arg + 1)) == NULL)
+	    EMSG(_(e_letunexp));
+	else
+	{
+	    write_reg_contents(*arg == '@' ? '"' : *arg,
+					     get_tv_string(tv), -1, FALSE);
+	    arg_end = arg + 1;
+	}
+    }
+
+    /*
+     * ":let var = expr": Set internal variable.
+     */
+    else if (eval_isnamec(*arg) && !VIM_ISDIGIT(*arg))
+    {
+	char_u  *exp_name = NULL;
+	char_u	*expr_start, *expr_end;
+
+	/* Find the end of the name. */
+	p = find_name_end(arg, &expr_start, &expr_end, FALSE);
+	if (expr_start != NULL)
+	{
+	    exp_name = make_expanded_name(arg, expr_start, expr_end, p);
+	    arg = exp_name;
+	}
+
+	if (arg == NULL)
+	{
+	    /* Report an invalid expression in braces, unless the
+	     * expression evaluation has been cancelled due to an
+	     * aborting error, an interrupt, or an exception. */
+	    if (!aborting())
 		EMSG2(_(e_invarg2), arg);
-	    }
-
-	    clear_vartv(&retvar.tv);
-	}
-    }
+	}
+	else if (*p == '[')
+	    arg_end = set_var_idx(arg, p, tv, copy, endchars);
+	else if (vim_strchr(endchars, *skipwhite(p)) == NULL)
+	    EMSG(_(e_letunexp));
+	else if (STRNCMP(arg, "b:changedtick", 13) == 0
+					    && !eval_isnamec(arg[13]))
+	    EMSG2(_(e_readonlyvar), arg);
+	else
+	{
+	    c1 = *p;
+	    *p = NUL;
+	    set_var(arg, tv, copy);
+	    *p = c1;
+	    arg_end = p;
+	}
+
+	vim_free(exp_name);
+    }
+
+    else
+	EMSG2(_(e_invarg2), arg);
+
+    return arg_end;
+}
+
+/*
+ * Set a variable with an index: "name[expr]", "name[expr][expr]", etc.
+ * Only works if "name" is an existing List.
+ * "ip" points to the first '['.
+ * Returns a pointer to just after the last used ']'; NULL for error.
+ */
+    static char_u *
+set_var_idx(name, ip, rettv, copy, endchars)
+    char_u	*name;
+    char_u	*ip;
+    typeval	*rettv;
+    int		copy;
+    char_u	*endchars;
+{
+    VAR		v;
+    int		c1;
+    char_u	*p;
+    typeval	var1;
+    typeval	*tv;
+    long	n;
+    listitem	*item;
+
+    c1 = *ip;
+    *ip = NUL;
+    v = find_var(name, TRUE);
+    if (v == NULL)
+	EMSG2(_(e_undefvar), name);
+    *ip = c1;
+    if (v == NULL)
+	return NULL;
+
+    tv = &v->tv;
+    for (p = ip; *p == '['; p = skipwhite(p + 1))
+    {
+	if (tv->v_type != VAR_LIST || tv->vval.v_list == NULL)
+	{
+	    EMSG(_("E999: Can only index a List"));
+	    p = NULL;
+	    break;
+	}
+	p = skipwhite(p + 1);
+	if (eval1(&p, &var1, TRUE) == FAIL)	/* recursive! */
+	{
+	    p = NULL;
+	    break;
+	}
+	if (*p != ']')
+	{
+	    EMSG(_(e_missbrac));
+	    clear_tv(&var1);
+	    p = NULL;
+	    break;
+	}
+	n = get_tv_number(&var1);
+	clear_tv(&var1);
+	item = list_find(tv->vval.v_list, n);
+	if (item == NULL)
+	{
+	    EMSGN(_(e_listidx), n);
+	    p = NULL;
+	    break;
+	}
+	tv = &item->li_tv;
+    }
+
+    if (p != NULL)
+    {
+	if (vim_strchr(endchars, *p) == NULL)
+	{
+	    EMSG(_(e_letunexp));
+	    p = NULL;
+	}
+	else
+	{
+	    clear_tv(tv);
+	    if (copy)
+		copy_tv(tv, rettv);
+	    else
+	    {
+		*tv = *rettv;
+		init_tv(rettv);
+	    }
+	}
+    }
+    return p;
 }
 
 #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
@@ -1405,7 +1623,7 @@ ex_call(eap)
     char_u	*startarg;
     char_u	*alias;
     char_u	*name;
-    var		retvar;
+    typeval	rettv;
     int		len;
     linenr_T	lnum;
     int		doesrange;
@@ -1419,7 +1637,7 @@ ex_call(eap)
 	name = alias;
 
     startarg = arg;
-    retvar.tv.v_type = VAR_UNKNOWN;	/* clear_vartv() uses this */
+    rettv.v_type = VAR_UNKNOWN;	/* clear_tv() uses this */
 
     if (*startarg != '(')
     {
@@ -1448,18 +1666,18 @@ ex_call(eap)
 	    curwin->w_cursor.col = 0;
 	}
 	arg = startarg;
-	if (get_func_vartv(name, len, &retvar.tv, &arg,
+	if (get_func_tv(name, len, &rettv, &arg,
 		      eap->line1, eap->line2, &doesrange, !eap->skip) == FAIL)
 	{
 	    failed = TRUE;
 	    break;
 	}
-	clear_vartv(&retvar.tv);
+	clear_tv(&rettv);
 	if (doesrange || eap->skip)
 	    break;
 	/* Stop when immediately aborting on error, or when an interrupt
 	 * occurred or an exception was thrown but not caught.
-	 * get_func_vartv() returned OK, so that the check for trailing
+	 * get_func_tv() returned OK, so that the check for trailing
 	 * characters below is executed. */
 	if (aborting())
 	    break;
@@ -1501,7 +1719,7 @@ ex_unlet(eap)
     do
     {
 	/* Find the end of the name. */
-	name_end = find_name_end(arg, &expr_start, &expr_end);
+	name_end = find_name_end(arg, &expr_start, &expr_end, FALSE);
 
 	if (!vim_iswhite(*name_end) && !ends_excmd(*name_end))
 	{
@@ -1512,7 +1730,6 @@ ex_unlet(eap)
 
 	if (!error && !eap->skip)
 	{
-#ifdef FEAT_MAGIC_BRACES
 	    if (expr_start != NULL)
 	    {
 		char_u  *temp_string;
@@ -1545,7 +1762,6 @@ ex_unlet(eap)
 		}
 	    }
 	    else
-#endif
 	    {
 		cc = *name_end;
 		*name_end = NUL;
@@ -1722,19 +1938,20 @@ typedef enum
 
 /*
  * The "evaluate" argument: When FALSE, the argument is only parsed but not
- * executed.  The function may return OK, but the retvar will be of type
+ * executed.  The function may return OK, but the rettv will be of type
  * VAR_UNKNOWN.  The function still returns FAIL for a syntax error.
  */
 
 /*
  * Handle zero level expression.
  * This calls eval1() and handles error message and nextcmd.
+ * Put the result in "rettv" when returning OK and "evaluate" is TRUE.
  * Return OK or FAIL.
  */
     static int
-eval0(arg, retvar, nextcmd, evaluate)
+eval0(arg, rettv, nextcmd, evaluate)
     char_u	*arg;
-    VAR		retvar;
+    typeval	*rettv;
     char_u	**nextcmd;
     int		evaluate;
 {
@@ -1742,11 +1959,11 @@ eval0(arg, retvar, nextcmd, evaluate)
     char_u	*p;
 
     p = skipwhite(arg);
-    ret = eval1(&p, &retvar->tv, evaluate);
+    ret = eval1(&p, rettv, evaluate);
     if (ret == FAIL || !ends_excmd(*p))
     {
 	if (ret != FAIL)
-	    clear_vartv(&retvar->tv);
+	    clear_tv(rettv);
 	/*
 	 * Report the invalid expression unless the expression evaluation has
 	 * been cancelled due to an aborting error, an interrupt, or an
@@ -1772,9 +1989,9 @@ eval0(arg, retvar, nextcmd, evaluate)
  * Return OK or FAIL.
  */
     static int
-eval1(arg, retvar, evaluate)
+eval1(arg, rettv, evaluate)
     char_u	**arg;
-    typeval	*retvar;
+    typeval	*rettv;
     int		evaluate;
 {
     int		result;
@@ -1783,7 +2000,7 @@ eval1(arg, retvar, evaluate)
     /*
      * Get the first variable.
      */
-    if (eval2(arg, retvar, evaluate) == FAIL)
+    if (eval2(arg, rettv, evaluate) == FAIL)
 	return FAIL;
 
     if ((*arg)[0] == '?')
@@ -1791,16 +2008,16 @@ eval1(arg, retvar, evaluate)
 	result = FALSE;
 	if (evaluate)
 	{
-	    if (get_vartv_number(retvar) != 0)
+	    if (get_tv_number(rettv) != 0)
 		result = TRUE;
-	    clear_vartv(retvar);
+	    clear_tv(rettv);
 	}
 
 	/*
 	 * Get the second variable.
 	 */
 	*arg = skipwhite(*arg + 1);
-	if (eval1(arg, retvar, evaluate && result) == FAIL) /* recursive! */
+	if (eval1(arg, rettv, evaluate && result) == FAIL) /* recursive! */
 	    return FAIL;
 
 	/*
@@ -1810,7 +2027,7 @@ eval1(arg, retvar, evaluate)
 	{
 	    EMSG(_("E109: Missing ':' after '?'"));
 	    if (evaluate && result)
-		clear_vartv(retvar);
+		clear_tv(rettv);
 	    return FAIL;
 	}
 
@@ -1821,11 +2038,11 @@ eval1(arg, retvar, evaluate)
 	if (eval1(arg, &var2, evaluate && !result) == FAIL) /* recursive! */
 	{
 	    if (evaluate && result)
-		clear_vartv(retvar);
+		clear_tv(rettv);
 	    return FAIL;
 	}
 	if (evaluate && !result)
-	    *retvar = var2;
+	    *rettv = var2;
     }
 
     return OK;
@@ -1841,9 +2058,9 @@ eval1(arg, retvar, evaluate)
  * Return OK or FAIL.
  */
     static int
-eval2(arg, retvar, evaluate)
+eval2(arg, rettv, evaluate)
     char_u	**arg;
-    typeval	*retvar;
+    typeval	*rettv;
     int		evaluate;
 {
     typeval	var2;
@@ -1853,7 +2070,7 @@ eval2(arg, retvar, evaluate)
     /*
      * Get the first variable.
      */
-    if (eval3(arg, retvar, evaluate) == FAIL)
+    if (eval3(arg, rettv, evaluate) == FAIL)
 	return FAIL;
 
     /*
@@ -1865,9 +2082,9 @@ eval2(arg, retvar, evaluate)
     {
 	if (evaluate && first)
 	{
-	    if (get_vartv_number(retvar) != 0)
+	    if (get_tv_number(rettv) != 0)
 		result = TRUE;
-	    clear_vartv(retvar);
+	    clear_tv(rettv);
 	    first = FALSE;
 	}
 
@@ -1883,14 +2100,14 @@ eval2(arg, retvar, evaluate)
 	 */
 	if (evaluate && !result)
 	{
-	    if (get_vartv_number(&var2) != 0)
+	    if (get_tv_number(&var2) != 0)
 		result = TRUE;
-	    clear_vartv(&var2);
+	    clear_tv(&var2);
 	}
 	if (evaluate)
 	{
-	    retvar->v_type = VAR_NUMBER;
-	    retvar->vval.v_number = result;
+	    rettv->v_type = VAR_NUMBER;
+	    rettv->vval.v_number = result;
 	}
     }
 
@@ -1907,9 +2124,9 @@ eval2(arg, retvar, evaluate)
  * Return OK or FAIL.
  */
     static int
-eval3(arg, retvar, evaluate)
+eval3(arg, rettv, evaluate)
     char_u	**arg;
-    typeval	*retvar;
+    typeval	*rettv;
     int		evaluate;
 {
     typeval	var2;
@@ -1919,7 +2136,7 @@ eval3(arg, retvar, evaluate)
     /*
      * Get the first variable.
      */
-    if (eval4(arg, retvar, evaluate) == FAIL)
+    if (eval4(arg, rettv, evaluate) == FAIL)
 	return FAIL;
 
     /*
@@ -1931,9 +2148,9 @@ eval3(arg, retvar, evaluate)
     {
 	if (evaluate && first)
 	{
-	    if (get_vartv_number(retvar) == 0)
+	    if (get_tv_number(rettv) == 0)
 		result = FALSE;
-	    clear_vartv(retvar);
+	    clear_tv(rettv);
 	    first = FALSE;
 	}
 
@@ -1949,14 +2166,14 @@ eval3(arg, retvar, evaluate)
 	 */
 	if (evaluate && result)
 	{
-	    if (get_vartv_number(&var2) == 0)
+	    if (get_tv_number(&var2) == 0)
 		result = FALSE;
-	    clear_vartv(&var2);
+	    clear_tv(&var2);
 	}
 	if (evaluate)
 	{
-	    retvar->v_type = VAR_NUMBER;
-	    retvar->vval.v_number = result;
+	    rettv->v_type = VAR_NUMBER;
+	    rettv->vval.v_number = result;
 	}
     }
 
@@ -1980,9 +2197,9 @@ eval3(arg, retvar, evaluate)
  * Return OK or FAIL.
  */
     static int
-eval4(arg, retvar, evaluate)
+eval4(arg, rettv, evaluate)
     char_u	**arg;
-    typeval	*retvar;
+    typeval	*rettv;
     int		evaluate;
 {
     typeval	var2;
@@ -2000,7 +2217,7 @@ eval4(arg, retvar, evaluate)
     /*
      * Get the first variable.
      */
-    if (eval5(arg, retvar, evaluate) == FAIL)
+    if (eval5(arg, rettv, evaluate) == FAIL)
 	return FAIL;
 
     p = *arg;
@@ -2061,7 +2278,7 @@ eval4(arg, retvar, evaluate)
 	*arg = skipwhite(p + len);
 	if (eval5(arg, &var2, evaluate) == FAIL)
 	{
-	    clear_vartv(retvar);
+	    clear_tv(rettv);
 	    return FAIL;
 	}
 
@@ -2071,11 +2288,11 @@ eval4(arg, retvar, evaluate)
 	     * If one of the two variables is a number, compare as a number.
 	     * When using "=~" or "!~", always compare as string.
 	     */
-	    if ((retvar->v_type == VAR_NUMBER || var2.v_type == VAR_NUMBER)
+	    if ((rettv->v_type == VAR_NUMBER || var2.v_type == VAR_NUMBER)
 		    && type != TYPE_MATCH && type != TYPE_NOMATCH)
 	    {
-		n1 = get_vartv_number(retvar);
-		n2 = get_vartv_number(&var2);
+		n1 = get_tv_number(rettv);
+		n2 = get_tv_number(&var2);
 		switch (type)
 		{
 		    case TYPE_EQUAL:    n1 = (n1 == n2); break;
@@ -2091,8 +2308,8 @@ eval4(arg, retvar, evaluate)
 	    }
 	    else
 	    {
-		s1 = get_vartv_string_buf(retvar, buf1);
-		s2 = get_vartv_string_buf(&var2, buf2);
+		s1 = get_tv_string_buf(rettv, buf1);
+		s2 = get_tv_string_buf(&var2, buf2);
 		if (type != TYPE_MATCH && type != TYPE_NOMATCH)
 		    i = ic ? MB_STRICMP(s1, s2) : STRCMP(s1, s2);
 		else
@@ -2128,10 +2345,10 @@ eval4(arg, retvar, evaluate)
 		    case TYPE_UNKNOWN:  break;  /* avoid gcc warning */
 		}
 	    }
-	    clear_vartv(retvar);
-	    clear_vartv(&var2);
-	    retvar->v_type = VAR_NUMBER;
-	    retvar->vval.v_number = n1;
+	    clear_tv(rettv);
+	    clear_tv(&var2);
+	    rettv->v_type = VAR_NUMBER;
+	    rettv->vval.v_number = n1;
 	}
     }
 
@@ -2150,9 +2367,9 @@ eval4(arg, retvar, evaluate)
  * Return OK or FAIL.
  */
     static int
-eval5(arg, retvar, evaluate)
+eval5(arg, rettv, evaluate)
     char_u	**arg;
-    typeval	*retvar;
+    typeval	*rettv;
     int		evaluate;
 {
     typeval	var2;
@@ -2165,7 +2382,7 @@ eval5(arg, retvar, evaluate)
     /*
      * Get the first variable.
      */
-    if (eval6(arg, retvar, evaluate) == FAIL)
+    if (eval6(arg, rettv, evaluate) == FAIL)
 	return FAIL;
 
     /*
@@ -2183,7 +2400,7 @@ eval5(arg, retvar, evaluate)
 	*arg = skipwhite(*arg + 1);
 	if (eval6(arg, &var2, evaluate) == FAIL)
 	{
-	    clear_vartv(retvar);
+	    clear_tv(rettv);
 	    return FAIL;
 	}
 
@@ -2194,8 +2411,8 @@ eval5(arg, retvar, evaluate)
 	     */
 	    if (op == '.')
 	    {
-		s1 = get_vartv_string_buf(retvar, buf1);
-		s2 = get_vartv_string_buf(&var2, buf2);
+		s1 = get_tv_string_buf(rettv, buf1);
+		s2 = get_tv_string_buf(&var2, buf2);
 		op = (int)STRLEN(s1);
 		p = alloc((unsigned)(op + STRLEN(s2) + 1));
 		if (p != NULL)
@@ -2203,23 +2420,23 @@ eval5(arg, retvar, evaluate)
 		    STRCPY(p, s1);
 		    STRCPY(p + op, s2);
 		}
-		clear_vartv(retvar);
-		retvar->v_type = VAR_STRING;
-		retvar->vval.v_string = p;
+		clear_tv(rettv);
+		rettv->v_type = VAR_STRING;
+		rettv->vval.v_string = p;
 	    }
 	    else
 	    {
-		n1 = get_vartv_number(retvar);
-		n2 = get_vartv_number(&var2);
-		clear_vartv(retvar);
+		n1 = get_tv_number(rettv);
+		n2 = get_tv_number(&var2);
+		clear_tv(rettv);
 		if (op == '+')
 		    n1 = n1 + n2;
 		else
 		    n1 = n1 - n2;
-		retvar->v_type = VAR_NUMBER;
-		retvar->vval.v_number = n1;
-	    }
-	    clear_vartv(&var2);
+		rettv->v_type = VAR_NUMBER;
+		rettv->vval.v_number = n1;
+	    }
+	    clear_tv(&var2);
 	}
     }
     return OK;
@@ -2237,9 +2454,9 @@ eval5(arg, retvar, evaluate)
  * Return OK or FAIL.
  */
     static int
-eval6(arg, retvar, evaluate)
+eval6(arg, rettv, evaluate)
     char_u	**arg;
-    typeval	*retvar;
+    typeval	*rettv;
     int		evaluate;
 {
     typeval	var2;
@@ -2249,7 +2466,7 @@ eval6(arg, retvar, evaluate)
     /*
      * Get the first variable.
      */
-    if (eval7(arg, retvar, evaluate) == FAIL)
+    if (eval7(arg, rettv, evaluate) == FAIL)
 	return FAIL;
 
     /*
@@ -2263,8 +2480,8 @@ eval6(arg, retvar, evaluate)
 
 	if (evaluate)
 	{
-	    n1 = get_vartv_number(retvar);
-	    clear_vartv(retvar);
+	    n1 = get_tv_number(rettv);
+	    clear_tv(rettv);
 	}
 	else
 	    n1 = 0;
@@ -2278,8 +2495,8 @@ eval6(arg, retvar, evaluate)
 
 	if (evaluate)
 	{
-	    n2 = get_vartv_number(&var2);
-	    clear_vartv(&var2);
+	    n2 = get_tv_number(&var2);
+	    clear_tv(&var2);
 
 	    /*
 	     * Compute the result.
@@ -2300,8 +2517,8 @@ eval6(arg, retvar, evaluate)
 		else
 		    n1 = n1 % n2;
 	    }
-	    retvar->v_type = VAR_NUMBER;
-	    retvar->vval.v_number = n1;
+	    rettv->v_type = VAR_NUMBER;
+	    rettv->vval.v_number = n1;
 	}
     }
 
@@ -2332,9 +2549,9 @@ eval6(arg, retvar, evaluate)
  * Return OK or FAIL.
  */
     static int
-eval7(arg, retvar, evaluate)
+eval7(arg, rettv, evaluate)
     char_u	**arg;
-    typeval	*retvar;
+    typeval	*rettv;
     int		evaluate;
 {
     long	n;
@@ -2346,10 +2563,10 @@ eval7(arg, retvar, evaluate)
     char_u	*alias;
 
     /*
-     * Initialise variable so that clear_vartv() can't mistake this for a
+     * Initialise variable so that clear_tv() can't mistake this for a
      * string and free a string that isn't there.
      */
-    retvar->v_type = VAR_UNKNOWN;
+    rettv->v_type = VAR_UNKNOWN;
 
     /*
      * Skip '!' and '-' characters.  They are handled later.
@@ -2378,39 +2595,39 @@ eval7(arg, retvar, evaluate)
 		*arg += len;
 		if (evaluate)
 		{
-		    retvar->v_type = VAR_NUMBER;
-		    retvar->vval.v_number = n;
+		    rettv->v_type = VAR_NUMBER;
+		    rettv->vval.v_number = n;
 		}
 		break;
 
     /*
      * String constant: "string".
      */
-    case '"':	ret = get_string_vartv(arg, retvar, evaluate);
+    case '"':	ret = get_string_tv(arg, rettv, evaluate);
 		break;
 
     /*
      * Literal string constant: 'string'.
      */
-    case '\'':	ret = get_lit_string_vartv(arg, retvar, evaluate);
+    case '\'':	ret = get_lit_string_tv(arg, rettv, evaluate);
 		break;
 
     /*
      * List: [expr, expr]
      */
-    case '[':	ret = get_list_vartv(arg, retvar, evaluate);
+    case '[':	ret = get_list_tv(arg, rettv, evaluate);
 		break;
 
     /*
      * Option value: &name
      */
-    case '&':	ret = get_option_vartv(arg, retvar, evaluate);
+    case '&':	ret = get_option_tv(arg, rettv, evaluate);
 		break;
 
     /*
      * Environment variable: $VAR.
      */
-    case '$':	ret = get_env_vartv(arg, retvar, evaluate);
+    case '$':	ret = get_env_tv(arg, rettv, evaluate);
 		break;
 
     /*
@@ -2419,8 +2636,8 @@ eval7(arg, retvar, evaluate)
     case '@':	++*arg;
 		if (evaluate)
 		{
-		    retvar->v_type = VAR_STRING;
-		    retvar->vval.v_string = get_reg_contents(**arg, FALSE);
+		    rettv->v_type = VAR_STRING;
+		    rettv->vval.v_string = get_reg_contents(**arg, FALSE);
 		}
 		if (**arg != NUL)
 		    ++*arg;
@@ -2430,13 +2647,13 @@ eval7(arg, retvar, evaluate)
      * nested expression: (expression).
      */
     case '(':	*arg = skipwhite(*arg + 1);
-		ret = eval1(arg, retvar, evaluate);	/* recursive! */
+		ret = eval1(arg, rettv, evaluate);	/* recursive! */
 		if (**arg == ')')
 		    ++*arg;
 		else if (ret == OK)
 		{
 		    EMSG(_("E110: Missing ')'"));
-		    clear_vartv(retvar);
+		    clear_tv(rettv);
 		    ret = FAIL;
 		}
 		break;
@@ -2460,7 +2677,7 @@ eval7(arg, retvar, evaluate)
 			s = deref_func_name(s, &len);
 
 			/* Invoke the function. */
-			ret = get_func_vartv(s, len, retvar, arg,
+			ret = get_func_tv(s, len, rettv, arg,
 				  curwin->w_cursor.lnum, curwin->w_cursor.lnum,
 				  &len, evaluate);
 			/* Stop the expression evaluation when immediately
@@ -2469,12 +2686,12 @@ eval7(arg, retvar, evaluate)
 			if (aborting())
 			{
 			    if (ret == OK)
-				clear_vartv(retvar);
+				clear_tv(rettv);
 			    ret = FAIL;
 			}
 		    }
 		    else if (evaluate)
-			ret = get_var_vartv(s, len, retvar);
+			ret = get_var_tv(s, len, rettv);
 		}
 
 		if (alias != NULL)
@@ -2489,9 +2706,9 @@ eval7(arg, retvar, evaluate)
      */
     while (**arg == '[' && ret == OK)
     {
-	if (eval_index(arg, retvar, evaluate) == FAIL)
-	{
-	    clear_vartv(retvar);
+	if (eval_index(arg, rettv, evaluate) == FAIL)
+	{
+	    clear_tv(rettv);
 	    return FAIL;
 	}
     }
@@ -2501,7 +2718,7 @@ eval7(arg, retvar, evaluate)
      */
     if (ret == OK && evaluate && end_leader > start_leader)
     {
-	val = get_vartv_number(retvar);
+	val = get_tv_number(rettv);
 	while (end_leader > start_leader)
 	{
 	    --end_leader;
@@ -2510,9 +2727,9 @@ eval7(arg, retvar, evaluate)
 	    else if (*end_leader == '-')
 		val = -val;
 	}
-	clear_vartv(retvar);
-	retvar->v_type = VAR_NUMBER;
-	retvar->vval.v_number = val;
+	clear_tv(rettv);
+	rettv->v_type = VAR_NUMBER;
+	rettv->vval.v_number = val;
     }
 
     return ret;
@@ -2524,9 +2741,9 @@ eval7(arg, retvar, evaluate)
  * Returns FAIL or OK. "*arg" is advanced to after the ']'.
  */
     static int
-eval_index(arg, retvar, evaluate)
+eval_index(arg, rettv, evaluate)
     char_u	**arg;
-    typeval	*retvar;
+    typeval	*rettv;
     int		evaluate;
 {
     int		empty1 = FALSE, empty2 = FALSE;
@@ -2536,7 +2753,7 @@ eval_index(arg, retvar, evaluate)
     int		range;
     char_u	*s;
 
-    if (retvar->v_type == VAR_FUNC)
+    if (rettv->v_type == VAR_FUNC)
     {
 	EMSG(_("E999: Cannot index a Funcref"));
 	return FAIL;
@@ -2562,7 +2779,7 @@ eval_index(arg, retvar, evaluate)
 	    empty2 = TRUE;
 	else if (eval1(arg, &var2, evaluate) == FAIL)	/* recursive! */
 	{
-	    clear_vartv(&var1);
+	    clear_tv(&var1);
 	    return FAIL;
 	}
     }
@@ -2572,10 +2789,10 @@ eval_index(arg, retvar, evaluate)
     /* Check for the ']'. */
     if (**arg != ']')
     {
-	EMSG(_("E111: Missing ']'"));
-	clear_vartv(&var1);
+	EMSG(_(e_missbrac));
+	clear_tv(&var1);
 	if (range)
-	    clear_vartv(&var2);
+	    clear_tv(&var2);
 	return FAIL;
     }
 
@@ -2585,8 +2802,8 @@ eval_index(arg, retvar, evaluate)
 	    n1 = 0;
 	else
 	{
-	    n1 = get_vartv_number(&var1);
-	    clear_vartv(&var1);
+	    n1 = get_tv_number(&var1);
+	    clear_tv(&var1);
 	}
 	if (range)
 	{
@@ -2594,16 +2811,16 @@ eval_index(arg, retvar, evaluate)
 		n2 = -1;
 	    else
 	    {
-		n2 = get_vartv_number(&var2);
-		clear_vartv(&var2);
-	    }
-	}
-
-	switch (retvar->v_type)
+		n2 = get_tv_number(&var2);
+		clear_tv(&var2);
+	    }
+	}
+
+	switch (rettv->v_type)
 	{
 	    case VAR_NUMBER:
 	    case VAR_STRING:
-		s = get_vartv_string(retvar);
+		s = get_tv_string(rettv);
 		len = (long)STRLEN(s);
 		if (range)
 		{
@@ -2634,13 +2851,13 @@ eval_index(arg, retvar, evaluate)
 		    else
 			s = vim_strnsave(s + n1, 1);
 		}
-		clear_vartv(retvar);
-		retvar->v_type = VAR_STRING;
-		retvar->vval.v_string = s;
+		clear_tv(rettv);
+		rettv->v_type = VAR_STRING;
+		rettv->vval.v_string = s;
 		break;
 
 	    case VAR_LIST:
-		len = list_len(retvar->vval.v_list);
+		len = list_len(rettv->vval.v_list);
 		if (n1 < 0)
 		    n1 = len + n1;
 		if (!empty1 && (n1 < 0 || n1 >= len))
@@ -2663,7 +2880,7 @@ eval_index(arg, retvar, evaluate)
 		    l = list_alloc();
 		    if (l == NULL)
 			return FAIL;
-		    for (item = list_find(retvar->vval.v_list, n1);
+		    for (item = list_find(rettv->vval.v_list, n1);
 							       n1 <= n2; ++n1)
 		    {
 			if (list_append_tv(l, &item->li_tv) == FAIL)
@@ -2673,16 +2890,16 @@ eval_index(arg, retvar, evaluate)
 			}
 			item = item->li_next;
 		    }
-		    clear_vartv(retvar);
-		    retvar->v_type = VAR_LIST;
-		    retvar->vval.v_list = l;
+		    clear_tv(rettv);
+		    rettv->v_type = VAR_LIST;
+		    rettv->vval.v_list = l;
 		}
 		else
 		{
-		    copy_vartv(&list_find(retvar->vval.v_list, n1)->li_tv,
+		    copy_tv(&list_find(rettv->vval.v_list, n1)->li_tv,
 								       &var1);
-		    clear_vartv(retvar);
-		    *retvar = var1;
+		    clear_tv(rettv);
+		    *rettv = var1;
 		}
 		break;
 	}
@@ -2699,9 +2916,9 @@ eval_index(arg, retvar, evaluate)
  * Return OK or FAIL.
  */
     static int
-get_option_vartv(arg, retvar, evaluate)
+get_option_tv(arg, rettv, evaluate)
     char_u	**arg;
-    typeval	*retvar;	/* when NULL, only check if option exists */
+    typeval	*rettv;	/* when NULL, only check if option exists */
     int		evaluate;
 {
     char_u	*option_end;
@@ -2719,7 +2936,7 @@ get_option_vartv(arg, retvar, evaluate)
     option_end = find_option_end(arg, &opt_flags);
     if (option_end == NULL)
     {
-	if (retvar != NULL)
+	if (rettv != NULL)
 	    EMSG2(_("E112: Option name missing: %s"), *arg);
 	return FAIL;
     }
@@ -2733,35 +2950,35 @@ get_option_vartv(arg, retvar, evaluate)
     c = *option_end;
     *option_end = NUL;
     opt_type = get_option_value(*arg, &numval,
-			       retvar == NULL ? NULL : &stringval, opt_flags);
+			       rettv == NULL ? NULL : &stringval, opt_flags);
 
     if (opt_type == -3)			/* invalid name */
     {
-	if (retvar != NULL)
+	if (rettv != NULL)
 	    EMSG2(_("E113: Unknown option: %s"), *arg);
 	ret = FAIL;
     }
-    else if (retvar != NULL)
+    else if (rettv != NULL)
     {
 	if (opt_type == -2)		/* hidden string option */
 	{
-	    retvar->v_type = VAR_STRING;
-	    retvar->vval.v_string = NULL;
+	    rettv->v_type = VAR_STRING;
+	    rettv->vval.v_string = NULL;
 	}
 	else if (opt_type == -1)	/* hidden number option */
 	{
-	    retvar->v_type = VAR_NUMBER;
-	    retvar->vval.v_number = 0;
+	    rettv->v_type = VAR_NUMBER;
+	    rettv->vval.v_number = 0;
 	}
 	else if (opt_type == 1)		/* number option */
 	{
-	    retvar->v_type = VAR_NUMBER;
-	    retvar->vval.v_number = numval;
+	    rettv->v_type = VAR_NUMBER;
+	    rettv->vval.v_number = numval;
 	}
 	else				/* string option */
 	{
-	    retvar->v_type = VAR_STRING;
-	    retvar->vval.v_string = stringval;
+	    rettv->v_type = VAR_STRING;
+	    rettv->vval.v_string = stringval;
 	}
     }
     else if (working && (opt_type == -2 || opt_type == -1))
@@ -2778,9 +2995,9 @@ get_option_vartv(arg, retvar, evaluate)
  * Return OK or FAIL.
  */
     static int
-get_string_vartv(arg, retvar, evaluate)
+get_string_tv(arg, rettv, evaluate)
     char_u	**arg;
-    typeval	*retvar;
+    typeval	*rettv;
     int		evaluate;
 {
     char_u	*p;
@@ -2923,8 +3140,8 @@ get_string_vartv(arg, retvar, evaluate)
     name[i] = NUL;
     *arg = p + 1;
 
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = name;
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = name;
 
     return OK;
 }
@@ -2934,9 +3151,9 @@ get_string_vartv(arg, retvar, evaluate)
  * Return OK or FAIL.
  */
     static int
-get_lit_string_vartv(arg, retvar, evaluate)
+get_lit_string_tv(arg, rettv, evaluate)
     char_u	**arg;
-    typeval	*retvar;
+    typeval	*rettv;
     int		evaluate;
 {
     char_u	*p;
@@ -2961,8 +3178,8 @@ get_lit_string_vartv(arg, retvar, evalua
 	if (name == NULL)
 	    return FAIL;
 
-	retvar->v_type = VAR_STRING;
-	retvar->vval.v_string = name;
+	rettv->v_type = VAR_STRING;
+	rettv->vval.v_string = name;
     }
 
     *arg = p + 1;
@@ -2975,9 +3192,9 @@ get_lit_string_vartv(arg, retvar, evalua
  * Return OK or FAIL.
  */
     static int
-get_list_vartv(arg, retvar, evaluate)
+get_list_tv(arg, rettv, evaluate)
     char_u	**arg;
-    typeval	*retvar;
+    typeval	*rettv;
     int		evaluate;
 {
     listvar	*l = NULL;
@@ -3028,8 +3245,8 @@ failret:
     *arg = skipwhite(*arg + 1);
     if (evaluate)
     {
-	retvar->v_type = VAR_LIST;
-	retvar->vval.v_list = l;
+	rettv->v_type = VAR_LIST;
+	rettv->vval.v_list = l;
 	++l->lv_refcount;
     }
 
@@ -3092,7 +3309,7 @@ listitem_alloc()
 listitem_free(item)
     listitem *item;
 {
-    clear_vartv(&item->li_tv);
+    clear_tv(&item->li_tv);
     vim_free(item);
 }
 
@@ -3181,7 +3398,7 @@ list_append_tv(l, tv)
 
     if (ni == NULL)
 	return FAIL;
-    copy_vartv(tv, &ni->li_tv);
+    copy_tv(tv, &ni->li_tv);
     list_append(l, ni);
     return OK;
 }
@@ -3230,7 +3447,7 @@ list_copy(orig, deep)
 		}
 	    }
 	    else
-		copy_vartv(&item->li_tv, &ni->li_tv);
+		copy_tv(&item->li_tv, &ni->li_tv);
 	    list_append(copy, ni);
 	}
 	++copy->lv_refcount;
@@ -3323,11 +3540,14 @@ tv2string(tv, tofree)
 	case VAR_LIST:
 	    *tofree = list2string(tv);
 	    return *tofree;
+	case VAR_STRING:
+	case VAR_NUMBER:
+	    break;
 	default:
-	    break;
+	    EMSG2(_(e_intern2), "tv2string()");
     }
     *tofree = NULL;
-    return get_vartv_string(tv);
+    return get_tv_string(tv);
 }
 
 /*
@@ -3337,9 +3557,9 @@ tv2string(tv, tofree)
  * Always return OK.
  */
     static int
-get_env_vartv(arg, retvar, evaluate)
+get_env_tv(arg, rettv, evaluate)
     char_u	**arg;
-    typeval	*retvar;
+    typeval	*rettv;
     int		evaluate;
 {
     char_u	*string = NULL;
@@ -3372,8 +3592,8 @@ get_env_vartv(arg, retvar, evaluate)
 	    }
 	    name[len] = cc;
 	}
-	retvar->v_type = VAR_STRING;
-	retvar->vval.v_string = string;
+	rettv->v_type = VAR_STRING;
+	rettv->vval.v_string = string;
     }
 
     return OK;
@@ -3670,10 +3890,10 @@ deref_func_name(name, lenp)
  * Return OK or FAIL.
  */
     static int
-get_func_vartv(name, len, retvar, arg, firstline, lastline, doesrange, evaluate)
+get_func_tv(name, len, rettv, arg, firstline, lastline, doesrange, evaluate)
     char_u	*name;		/* name of the function */
     int		len;		/* length of "name" */
-    typeval	*retvar;
+    typeval	*rettv;
     char_u	**arg;		/* argument, pointing to the '(' */
     linenr_T	firstline;	/* first line of range */
     linenr_T	lastline;	/* last line of range */
@@ -3710,13 +3930,13 @@ get_func_vartv(name, len, retvar, arg, f
 	ret = FAIL;
 
     if (ret == OK)
-	ret = call_func(name, len, retvar, argcount, argvars,
+	ret = call_func(name, len, rettv, argcount, argvars,
 				    firstline, lastline, doesrange, evaluate);
     else if (!aborting())
 	EMSG2(_("E116: Invalid arguments for function %s"), name);
 
     while (--argcount >= 0)
-	clear_vartv(&argvars[argcount]);
+	clear_tv(&argvars[argcount]);
 
     *arg = skipwhite(argp);
     return ret;
@@ -3728,11 +3948,11 @@ get_func_vartv(name, len, retvar, arg, f
  * Return OK or FAIL.
  */
     static int
-call_func(name, len, retvar, argcount, argvars, firstline, lastline,
+call_func(name, len, rettv, argcount, argvars, firstline, lastline,
 							  doesrange, evaluate)
     char_u	*name;		/* name of the function */
     int		len;		/* length of "name" */
-    typeval	*retvar;		/* return value goes here */
+    typeval	*rettv;		/* return value goes here */
     int		argcount;	/* number of "argvars" */
     typeval	*argvars;	/* vars for arguments */
     linenr_T	firstline;	/* first line of range */
@@ -3812,7 +4032,7 @@ call_func(name, len, retvar, argcount, a
     /* execute the function if no errors detected and executing */
     if (evaluate && error == ERROR_NONE)
     {
-	retvar->v_type = VAR_NUMBER;	/* default is number retvar */
+	rettv->v_type = VAR_NUMBER;	/* default is number rettv */
 	error = ERROR_UNKNOWN;
 
 	if (!ASCII_ISLOWER(fname[0]))
@@ -3851,7 +4071,7 @@ call_func(name, len, retvar, argcount, a
 		    save_search_patterns();
 		    saveRedobuff();
 		    ++fp->calls;
-		    call_user_func(fp, argcount, argvars, retvar,
+		    call_user_func(fp, argcount, argvars, rettv,
 							 firstline, lastline);
 		    --fp->calls;
 		    restoreRedobuff();
@@ -3875,7 +4095,7 @@ call_func(name, len, retvar, argcount, a
 		else
 		{
 		    argvars[argcount].v_type = VAR_UNKNOWN;
-		    functions[i].f_func(argvars, retvar);
+		    functions[i].f_func(argvars, rettv);
 		    error = ERROR_NONE;
 		}
 	    }
@@ -3918,31 +4138,31 @@ call_func(name, len, retvar, argcount, a
  * or "append(list, item)" function
  */
     static void
-f_append(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_append(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     long	lnum;
 
-    retvar->vval.v_number = 1; /* Default: Failed */
+    rettv->vval.v_number = 1; /* Default: Failed */
     if (argvars[0].v_type == VAR_LIST)
     {
 	if (argvars[0].vval.v_list != NULL
 		&& list_append_tv(argvars[0].vval.v_list, &argvars[1]) == OK)
-	    copy_vartv(&argvars[0], retvar);
-    }
-    else
-    {
-	lnum = get_vartv_lnum(argvars);
+	    copy_tv(&argvars[0], rettv);
+    }
+    else
+    {
+	lnum = get_tv_lnum(argvars);
 	if (lnum >= 0
 		&& lnum <= curbuf->b_ml.ml_line_count
 		&& u_save(lnum, lnum + 1) == OK)
 	{
-	    ml_append(lnum, get_vartv_string(&argvars[1]), (colnr_T)0, FALSE);
+	    ml_append(lnum, get_tv_string(&argvars[1]), (colnr_T)0, FALSE);
 	    if (curwin->w_cursor.lnum > lnum)
 		++curwin->w_cursor.lnum;
 	    appended_lines_mark(lnum, 1L);
-	    retvar->vval.v_number = 0;
+	    rettv->vval.v_number = 0;
 	}
     }
 }
@@ -3952,11 +4172,11 @@ f_append(argvars, retvar)
  */
 /* ARGSUSED */
     static void
-f_argc(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->vval.v_number = ARGCOUNT;
+f_argc(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->vval.v_number = ARGCOUNT;
 }
 
 /*
@@ -3964,29 +4184,29 @@ f_argc(argvars, retvar)
  */
 /* ARGSUSED */
     static void
-f_argidx(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->vval.v_number = curwin->w_arg_idx;
+f_argidx(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->vval.v_number = curwin->w_arg_idx;
 }
 
 /*
  * "argv(nr)" function
  */
     static void
-f_argv(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_argv(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     int		idx;
 
-    idx = get_vartv_number(&argvars[0]);
+    idx = get_tv_number(&argvars[0]);
     if (idx >= 0 && idx < ARGCOUNT)
-	retvar->vval.v_string = vim_strsave(alist_name(&ARGLIST[idx]));
-    else
-	retvar->vval.v_string = NULL;
-    retvar->v_type = VAR_STRING;
+	rettv->vval.v_string = vim_strsave(alist_name(&ARGLIST[idx]));
+    else
+	rettv->vval.v_string = NULL;
+    rettv->v_type = VAR_STRING;
 }
 
 /*
@@ -3994,9 +4214,9 @@ f_argv(argvars, retvar)
  */
 /* ARGSUSED */
     static void
-f_browse(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_browse(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_BROWSE
     int		save;
@@ -4006,18 +4226,18 @@ f_browse(argvars, retvar)
     char_u	buf[NUMBUFLEN];
     char_u	buf2[NUMBUFLEN];
 
-    save = get_vartv_number(&argvars[0]);
-    title = get_vartv_string(&argvars[1]);
-    initdir = get_vartv_string_buf(&argvars[2], buf);
-    defname = get_vartv_string_buf(&argvars[3], buf2);
-
-    retvar->vval.v_string =
+    save = get_tv_number(&argvars[0]);
+    title = get_tv_string(&argvars[1]);
+    initdir = get_tv_string_buf(&argvars[2], buf);
+    defname = get_tv_string_buf(&argvars[3], buf2);
+
+    rettv->vval.v_string =
 		 do_browse(save ? BROWSE_SAVE : 0,
 				 title, defname, NULL, initdir, NULL, curbuf);
 #else
-    retvar->vval.v_string = NULL;
-#endif
-    retvar->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
+#endif
+    rettv->v_type = VAR_STRING;
 }
 
 /*
@@ -4025,24 +4245,24 @@ f_browse(argvars, retvar)
  */
 /* ARGSUSED */
     static void
-f_browsedir(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_browsedir(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_BROWSE
     char_u	*title;
     char_u	*initdir;
     char_u	buf[NUMBUFLEN];
 
-    title = get_vartv_string(&argvars[0]);
-    initdir = get_vartv_string_buf(&argvars[1], buf);
-
-    retvar->vval.v_string = do_browse(BROWSE_DIR,
+    title = get_tv_string(&argvars[0]);
+    initdir = get_tv_string_buf(&argvars[1], buf);
+
+    rettv->vval.v_string = do_browse(BROWSE_DIR,
 				    title, NULL, NULL, initdir, NULL, curbuf);
 #else
-    retvar->vval.v_string = NULL;
-#endif
-    retvar->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
+#endif
+    rettv->v_type = VAR_STRING;
 }
 
 /*
@@ -4081,55 +4301,55 @@ find_buffer(avar)
  * "bufexists(expr)" function
  */
     static void
-f_bufexists(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->vval.v_number = (find_buffer(&argvars[0]) != NULL);
+f_bufexists(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->vval.v_number = (find_buffer(&argvars[0]) != NULL);
 }
 
 /*
  * "buflisted(expr)" function
  */
     static void
-f_buflisted(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_buflisted(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     buf_T	*buf;
 
     buf = find_buffer(&argvars[0]);
-    retvar->vval.v_number = (buf != NULL && buf->b_p_bl);
+    rettv->vval.v_number = (buf != NULL && buf->b_p_bl);
 }
 
 /*
  * "bufloaded(expr)" function
  */
     static void
-f_bufloaded(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_bufloaded(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     buf_T	*buf;
 
     buf = find_buffer(&argvars[0]);
-    retvar->vval.v_number = (buf != NULL && buf->b_ml.ml_mfp != NULL);
+    rettv->vval.v_number = (buf != NULL && buf->b_ml.ml_mfp != NULL);
 }
 
 /*
  * Get buffer by number or pattern.
  */
     static buf_T *
-get_buf_vartv(avar)
-    typeval	*avar;
-{
-    char_u	*name = avar->vval.v_string;
+get_buf_tv(tv)
+    typeval	*tv;
+{
+    char_u	*name = tv->vval.v_string;
     int		save_magic;
     char_u	*save_cpo;
     buf_T	*buf;
 
-    if (avar->v_type == VAR_NUMBER)
-	return buflist_findnr((int)avar->vval.v_number);
+    if (tv->v_type == VAR_NUMBER)
+	return buflist_findnr((int)tv->vval.v_number);
     if (name == NULL || *name == NUL)
 	return curbuf;
     if (name[0] == '$' && name[1] == NUL)
@@ -4149,7 +4369,7 @@ get_buf_vartv(avar)
 
     /* If not found, try expanding the name, like done for bufexists(). */
     if (buf == NULL)
-	buf = find_buffer(avar);
+	buf = find_buffer(tv);
 
     return buf;
 }
@@ -4158,19 +4378,19 @@ get_buf_vartv(avar)
  * "bufname(expr)" function
  */
     static void
-f_bufname(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_bufname(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     buf_T	*buf;
 
     ++emsg_off;
-    buf = get_buf_vartv(&argvars[0]);
-    retvar->v_type = VAR_STRING;
+    buf = get_buf_tv(&argvars[0]);
+    rettv->v_type = VAR_STRING;
     if (buf != NULL && buf->b_fname != NULL)
-	retvar->vval.v_string = vim_strsave(buf->b_fname);
-    else
-	retvar->vval.v_string = NULL;
+	rettv->vval.v_string = vim_strsave(buf->b_fname);
+    else
+	rettv->vval.v_string = NULL;
     --emsg_off;
 }
 
@@ -4178,18 +4398,18 @@ f_bufname(argvars, retvar)
  * "bufnr(expr)" function
  */
     static void
-f_bufnr(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_bufnr(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     buf_T	*buf;
 
     ++emsg_off;
-    buf = get_buf_vartv(&argvars[0]);
+    buf = get_buf_tv(&argvars[0]);
     if (buf != NULL)
-	retvar->vval.v_number = buf->b_fnum;
-    else
-	retvar->vval.v_number = -1;
+	rettv->vval.v_number = buf->b_fnum;
+    else
+	rettv->vval.v_number = -1;
     --emsg_off;
 }
 
@@ -4197,9 +4417,9 @@ f_bufnr(argvars, retvar)
  * "bufwinnr(nr)" function
  */
     static void
-f_bufwinnr(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_bufwinnr(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_WINDOWS
     win_T	*wp;
@@ -4208,7 +4428,7 @@ f_bufwinnr(argvars, retvar)
     buf_T	*buf;
 
     ++emsg_off;
-    buf = get_buf_vartv(&argvars[0]);
+    buf = get_buf_tv(&argvars[0]);
 #ifdef FEAT_WINDOWS
     for (wp = firstwin; wp; wp = wp->w_next)
     {
@@ -4216,9 +4436,9 @@ f_bufwinnr(argvars, retvar)
 	if (wp->w_buffer == buf)
 	    break;
     }
-    retvar->vval.v_number = (wp != NULL ? winnr : -1);
+    rettv->vval.v_number = (wp != NULL ? winnr : -1);
 #else
-    retvar->vval.v_number = (curwin->w_buffer == buf ? 1 : -1);
+    rettv->vval.v_number = (curwin->w_buffer == buf ? 1 : -1);
 #endif
     --emsg_off;
 }
@@ -4228,20 +4448,20 @@ f_bufwinnr(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_byte2line(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_byte2line(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifndef FEAT_BYTEOFF
-    retvar->vval.v_number = -1;
+    rettv->vval.v_number = -1;
 #else
     long	boff = 0;
 
-    boff = get_vartv_number(&argvars[0]) - 1;
+    boff = get_tv_number(&argvars[0]) - 1;
     if (boff < 0)
-	retvar->vval.v_number = -1;
-    else
-	retvar->vval.v_number = ml_find_line_or_offset(curbuf,
+	rettv->vval.v_number = -1;
+    else
+	rettv->vval.v_number = ml_find_line_or_offset(curbuf,
 							  (linenr_T)0, &boff);
 #endif
 }
@@ -4251,9 +4471,9 @@ f_byte2line(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_byteidx(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_byteidx(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_MBYTE
     char_u	*t;
@@ -4261,9 +4481,9 @@ f_byteidx(argvars, retvar)
     char_u	*str;
     long	idx;
 
-    str = get_vartv_string(&argvars[0]);
-    idx = get_vartv_number(&argvars[1]);
-    retvar->vval.v_number = -1;
+    str = get_tv_string(&argvars[0]);
+    idx = get_tv_number(&argvars[1]);
+    rettv->vval.v_number = -1;
     if (idx < 0)
 	return;
 
@@ -4275,10 +4495,10 @@ f_byteidx(argvars, retvar)
 	    return;
 	t += mb_ptr2len_check(t);
     }
-    retvar->vval.v_number = t - str;
+    rettv->vval.v_number = t - str;
 #else
     if (idx <= STRLEN(str))
-	retvar->vval.v_number = idx;
+	rettv->vval.v_number = idx;
 #endif
 }
 
@@ -4286,51 +4506,51 @@ f_byteidx(argvars, retvar)
  * "char2nr(string)" function
  */
     static void
-f_char2nr(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_char2nr(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_MBYTE
     if (has_mbyte)
-	retvar->vval.v_number =
-				(*mb_ptr2char)(get_vartv_string(&argvars[0]));
-    else
-#endif
-    retvar->vval.v_number = get_vartv_string(&argvars[0])[0];
+	rettv->vval.v_number =
+				(*mb_ptr2char)(get_tv_string(&argvars[0]));
+    else
+#endif
+    rettv->vval.v_number = get_tv_string(&argvars[0])[0];
 }
 
 /*
  * "cindent(lnum)" function
  */
     static void
-f_cindent(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_cindent(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_CINDENT
     pos_T	pos;
     linenr_T	lnum;
 
     pos = curwin->w_cursor;
-    lnum = get_vartv_lnum(argvars);
+    lnum = get_tv_lnum(argvars);
     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
     {
 	curwin->w_cursor.lnum = lnum;
-	retvar->vval.v_number = get_c_indent();
+	rettv->vval.v_number = get_c_indent();
 	curwin->w_cursor = pos;
     }
     else
 #endif
-	retvar->vval.v_number = -1;
+	rettv->vval.v_number = -1;
 }
 
 /*
  * "col(string)" function
  */
     static void
-f_col(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_col(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     colnr_T	col = 0;
     pos_T	*fp;
@@ -4373,7 +4593,7 @@ f_col(argvars, retvar)
 #endif
 	}
     }
-    retvar->vval.v_number = col;
+    rettv->vval.v_number = col;
 }
 
 /*
@@ -4381,9 +4601,9 @@ f_col(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_confirm(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_confirm(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
     char_u	*message;
@@ -4394,17 +4614,17 @@ f_confirm(argvars, retvar)
     int		type = VIM_GENERIC;
     int		c;
 
-    message = get_vartv_string(&argvars[0]);
+    message = get_tv_string(&argvars[0]);
     if (argvars[1].v_type != VAR_UNKNOWN)
     {
-	buttons = get_vartv_string_buf(&argvars[1], buf);
+	buttons = get_tv_string_buf(&argvars[1], buf);
 	if (argvars[2].v_type != VAR_UNKNOWN)
 	{
-	    def = get_vartv_number(&argvars[2]);
+	    def = get_tv_number(&argvars[2]);
 	    if (argvars[3].v_type != VAR_UNKNOWN)
 	    {
 		/* avoid that TOUPPER_ASC calls get_var_string_buf() twice */
-		c = *get_vartv_string_buf(&argvars[3], buf2);
+		c = *get_tv_string_buf(&argvars[3], buf2);
 		switch (TOUPPER_ASC(c))
 		{
 		    case 'E': type = VIM_ERROR; break;
@@ -4420,10 +4640,10 @@ f_confirm(argvars, retvar)
     if (buttons == NULL || *buttons == NUL)
 	buttons = (char_u *)_("&Ok");
 
-    retvar->vval.v_number = do_dialog(type, NULL, message, buttons,
+    rettv->vval.v_number = do_dialog(type, NULL, message, buttons,
 								   def, NULL);
 #else
-    retvar->vval.v_number = 0;
+    rettv->vval.v_number = 0;
 #endif
 }
 
@@ -4431,17 +4651,17 @@ f_confirm(argvars, retvar)
  * "copy()" function
  */
     static void
-f_copy(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_copy(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     if (argvars[0].v_type == VAR_LIST)
     {
-	retvar->v_type = VAR_LIST;
-	retvar->vval.v_list = list_copy(argvars[0].vval.v_list, FALSE);
-    }
-    else
-	copy_vartv(&argvars[0], retvar);
+	rettv->v_type = VAR_LIST;
+	rettv->vval.v_list = list_copy(argvars[0].vval.v_list, FALSE);
+    }
+    else
+	copy_tv(&argvars[0], rettv);
 }
 
 /*
@@ -4451,9 +4671,9 @@ f_copy(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_cscope_connection(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_cscope_connection(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_CSCOPE
     int		num = 0;
@@ -4464,15 +4684,15 @@ f_cscope_connection(argvars, retvar)
     if (argvars[0].v_type != VAR_UNKNOWN
 	    && argvars[1].v_type != VAR_UNKNOWN)
     {
-	num = (int)get_vartv_number(&argvars[0]);
-	dbpath = get_vartv_string(&argvars[1]);
+	num = (int)get_tv_number(&argvars[0]);
+	dbpath = get_tv_string(&argvars[1]);
 	if (argvars[2].v_type != VAR_UNKNOWN)
-	    prepend = get_vartv_string_buf(&argvars[2], buf);
-    }
-
-    retvar->vval.v_number = cs_connection(num, dbpath, prepend);
+	    prepend = get_tv_string_buf(&argvars[2], buf);
+    }
+
+    rettv->vval.v_number = cs_connection(num, dbpath, prepend);
 #else
-    retvar->vval.v_number = 0;
+    rettv->vval.v_number = 0;
 #endif
 }
 
@@ -4483,16 +4703,16 @@ f_cscope_connection(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_cursor(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_cursor(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     long	line, col;
 
-    line = get_vartv_lnum(argvars);
+    line = get_tv_lnum(argvars);
     if (line > 0)
 	curwin->w_cursor.lnum = line;
-    col = get_vartv_number(&argvars[1]);
+    col = get_tv_number(&argvars[1]);
     if (col > 0)
 	curwin->w_cursor.col = col - 1;
 #ifdef FEAT_VIRTUALEDIT
@@ -4514,31 +4734,31 @@ f_cursor(argvars, retvar)
  * "deepcopy()" function
  */
     static void
-f_deepcopy(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_deepcopy(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     if (argvars[0].v_type == VAR_LIST)
     {
-	retvar->v_type = VAR_LIST;
-	retvar->vval.v_list = list_copy(argvars[0].vval.v_list, TRUE);
-    }
-    else
-	copy_vartv(&argvars[0], retvar);
+	rettv->v_type = VAR_LIST;
+	rettv->vval.v_list = list_copy(argvars[0].vval.v_list, TRUE);
+    }
+    else
+	copy_tv(&argvars[0], rettv);
 }
 
 /*
  * "delete()" function
  */
     static void
-f_delete(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_delete(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     if (check_restricted() || check_secure())
-	retvar->vval.v_number = -1;
-    else
-	retvar->vval.v_number = mch_remove(get_vartv_string(&argvars[0]));
+	rettv->vval.v_number = -1;
+    else
+	rettv->vval.v_number = mch_remove(get_tv_string(&argvars[0]));
 }
 
 /*
@@ -4546,14 +4766,14 @@ f_delete(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_did_filetype(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_did_filetype(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_AUTOCMD
-    retvar->vval.v_number = did_filetype;
+    rettv->vval.v_number = did_filetype;
 #else
-    retvar->vval.v_number = 0;
+    rettv->vval.v_number = 0;
 #endif
 }
 
@@ -4562,12 +4782,12 @@ f_did_filetype(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_diff_filler(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_diff_filler(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_DIFF
-    retvar->vval.v_number = diff_check_fill(curwin, get_vartv_lnum(argvars));
+    rettv->vval.v_number = diff_check_fill(curwin, get_tv_lnum(argvars));
 #endif
 }
 
@@ -4576,12 +4796,12 @@ f_diff_filler(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_diff_hlID(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_diff_hlID(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_DIFF
-    linenr_T		lnum = get_vartv_lnum(argvars);
+    linenr_T		lnum = get_tv_lnum(argvars);
     static linenr_T	prev_lnum = 0;
     static int		changedtick = 0;
     static int		fnum = 0;
@@ -4620,13 +4840,13 @@ f_diff_hlID(argvars, retvar)
 
     if (hlID == HLF_CHD || hlID == HLF_TXD)
     {
-	col = get_vartv_number(&argvars[1]) - 1;
+	col = get_tv_number(&argvars[1]) - 1;
 	if (col >= change_start && col <= change_end)
 	    hlID = HLF_TXD;			/* changed text */
 	else
 	    hlID = HLF_CHD;			/* changed line */
     }
-    retvar->vval.v_number = hlID == (enum hlf_value)0 ? 0 : (int)hlID;
+    rettv->vval.v_number = hlID == (enum hlf_value)0 ? 0 : (int)hlID;
 #endif
 }
 
@@ -4634,16 +4854,16 @@ f_diff_hlID(argvars, retvar)
  * "escape({string}, {chars})" function
  */
     static void
-f_escape(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_escape(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	buf[NUMBUFLEN];
 
-    retvar->vval.v_string =
-	vim_strsave_escaped(get_vartv_string(&argvars[0]),
-		get_vartv_string_buf(&argvars[1], buf));
-    retvar->v_type = VAR_STRING;
+    rettv->vval.v_string =
+	vim_strsave_escaped(get_tv_string(&argvars[0]),
+		get_tv_string_buf(&argvars[1], buf));
+    rettv->v_type = VAR_STRING;
 }
 
 /*
@@ -4651,38 +4871,38 @@ f_escape(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_eventhandler(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->vval.v_number = vgetc_busy;
+f_eventhandler(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->vval.v_number = vgetc_busy;
 }
 
 /*
  * "executable()" function
  */
     static void
-f_executable(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->vval.v_number = mch_can_exe(get_vartv_string(&argvars[0]));
+f_executable(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->vval.v_number = mch_can_exe(get_tv_string(&argvars[0]));
 }
 
 /*
  * "exists()" function
  */
     static void
-f_exists(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_exists(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*p;
     char_u	*name;
     int		n = FALSE;
     int		len = 0;
 
-    p = get_vartv_string(&argvars[0]);
+    p = get_tv_string(&argvars[0]);
     if (*p == '$')			/* environment variable */
     {
 	/* first try "normal" environment variables (fast) */
@@ -4698,7 +4918,7 @@ f_exists(argvars, retvar)
 	}
     }
     else if (*p == '&' || *p == '+')			/* option */
-	n = (get_option_vartv(&p, NULL, TRUE) == OK);
+	n = (get_option_tv(&p, NULL, TRUE) == OK);
     else if (*p == '*')			/* internal or user defined function */
     {
 	n = function_exists(p + 1);
@@ -4720,17 +4940,14 @@ f_exists(argvars, retvar)
     }
     else				/* internal variable */
     {
-#ifdef FEAT_MAGIC_BRACES
 	char_u	*expr_start;
 	char_u	*expr_end;
 	char_u  *temp_string = NULL;
 	char_u	*s;
-#endif
 	name = p;
 
-#ifdef FEAT_MAGIC_BRACES
 	/* Find the end of the name. */
-	s = find_name_end(name, &expr_start, &expr_end);
+	s = find_name_end(name, &expr_start, &expr_end, FALSE);
 	if (expr_start != NULL)
 	{
 	    temp_string = make_expanded_name(name, expr_start, expr_end, s);
@@ -4740,27 +4957,24 @@ f_exists(argvars, retvar)
 		name = temp_string;
 	    }
 	}
-#endif
 	if (len == 0)
 	    len = get_id_len(&p);
 	if (len != 0)
-	    n = (get_var_vartv(name, len, NULL) == OK);
-
-#ifdef FEAT_MAGIC_BRACES
+	    n = (get_var_tv(name, len, NULL) == OK);
+
 	vim_free(temp_string);
-#endif
-    }
-
-    retvar->vval.v_number = n;
+    }
+
+    rettv->vval.v_number = n;
 }
 
 /*
  * "expand()" function
  */
     static void
-f_expand(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_expand(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*s;
     int		len;
@@ -4768,23 +4982,23 @@ f_expand(argvars, retvar)
     int		flags = WILD_SILENT|WILD_USE_NL|WILD_LIST_NOTFOUND;
     expand_T	xpc;
 
-    retvar->v_type = VAR_STRING;
-    s = get_vartv_string(&argvars[0]);
+    rettv->v_type = VAR_STRING;
+    s = get_tv_string(&argvars[0]);
     if (*s == '%' || *s == '#' || *s == '<')
     {
 	++emsg_off;
-	retvar->vval.v_string = eval_vars(s, &len, NULL, &errormsg, s);
+	rettv->vval.v_string = eval_vars(s, &len, NULL, &errormsg, s);
 	--emsg_off;
     }
     else
     {
 	/* When the optional second argument is non-zero, don't remove matches
 	 * for 'suffixes' and 'wildignore' */
-	if (argvars[1].v_type != VAR_UNKNOWN && get_vartv_number(&argvars[1]))
+	if (argvars[1].v_type != VAR_UNKNOWN && get_tv_number(&argvars[1]))
 	    flags |= WILD_KEEP_ALL;
 	ExpandInit(&xpc);
 	xpc.xp_context = EXPAND_FILES;
-	retvar->vval.v_string = ExpandOne(&xpc, s, NULL, flags, WILD_ALL);
+	rettv->vval.v_string = ExpandOne(&xpc, s, NULL, flags, WILD_ALL);
 	ExpandCleanup(&xpc);
     }
 }
@@ -4793,15 +5007,15 @@ f_expand(argvars, retvar)
  * "filereadable()" function
  */
     static void
-f_filereadable(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_filereadable(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     FILE	*fd;
     char_u	*p;
     int		n;
 
-    p = get_vartv_string(&argvars[0]);
+    p = get_tv_string(&argvars[0]);
     if (*p && !mch_isdir(p) && (fd = mch_fopen((char *)p, "r")) != NULL)
     {
 	n = TRUE;
@@ -4810,7 +5024,7 @@ f_filereadable(argvars, retvar)
     else
 	n = FALSE;
 
-    retvar->vval.v_number = n;
+    rettv->vval.v_number = n;
 }
 
 /*
@@ -4818,9 +5032,9 @@ f_filereadable(argvars, retvar)
  * rights to write into.
  */
     static void
-f_filewritable(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_filewritable(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*p;
     int		retval = 0;
@@ -4828,7 +5042,7 @@ f_filewritable(argvars, retvar)
     int		perm = 0;
 #endif
 
-    p = get_vartv_string(&argvars[0]);
+    p = get_tv_string(&argvars[0]);
 #if defined(UNIX) || defined(VMS)
     perm = mch_getperm(p);
 #endif
@@ -4849,35 +5063,35 @@ f_filewritable(argvars, retvar)
 	if (mch_isdir(p))
 	    ++retval;
     }
-    retvar->vval.v_number = retval;
+    rettv->vval.v_number = retval;
 }
 
 /*
  * "finddir({fname}[, {path}[, {count}]])" function
  */
     static void
-f_finddir(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    f_findfilendir(argvars, retvar, TRUE);
+f_finddir(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    f_findfilendir(argvars, rettv, TRUE);
 }
 
 /*
  * "findfile({fname}[, {path}[, {count}]])" function
  */
     static void
-f_findfile(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    f_findfilendir(argvars, retvar, FALSE);
-}
-
-    static void
-f_findfilendir(argvars, retvar, dir)
-    typeval	*argvars;
-    typeval	*retvar;
+f_findfile(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    f_findfilendir(argvars, rettv, FALSE);
+}
+
+    static void
+f_findfilendir(argvars, rettv, dir)
+    typeval	*argvars;
+    typeval	*rettv;
     int		dir;
 {
 #ifdef FEAT_SEARCHPATH
@@ -4889,16 +5103,16 @@ f_findfilendir(argvars, retvar, dir)
     int		count = 1;
     int		first = TRUE;
 
-    fname = get_vartv_string(&argvars[0]);
+    fname = get_tv_string(&argvars[0]);
 
     if (argvars[1].v_type != VAR_UNKNOWN)
     {
-	p = get_vartv_string_buf(&argvars[1], pathbuf);
+	p = get_tv_string_buf(&argvars[1], pathbuf);
 	if (*p != NUL)
 	    path = p;
 
 	if (argvars[2].v_type != VAR_UNKNOWN)
-	    count = get_vartv_number(&argvars[2]);
+	    count = get_tv_number(&argvars[2]);
     }
 
     do
@@ -4910,20 +5124,20 @@ f_findfilendir(argvars, retvar, dir)
 	first = FALSE;
     } while (--count > 0 && fresult != NULL);
 
-    retvar->vval.v_string = fresult;
+    rettv->vval.v_string = fresult;
 #else
-    retvar->vval.v_string = NULL;
-#endif
-    retvar->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
+#endif
+    rettv->v_type = VAR_STRING;
 }
 
 /*
  * "fnamemodify({fname}, {mods})" function
  */
     static void
-f_fnamemodify(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_fnamemodify(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*fname;
     char_u	*mods;
@@ -4932,17 +5146,17 @@ f_fnamemodify(argvars, retvar)
     char_u	*fbuf = NULL;
     char_u	buf[NUMBUFLEN];
 
-    fname = get_vartv_string(&argvars[0]);
-    mods = get_vartv_string_buf(&argvars[1], buf);
+    fname = get_tv_string(&argvars[0]);
+    mods = get_tv_string_buf(&argvars[1], buf);
     len = (int)STRLEN(fname);
 
     (void)modify_fname(mods, &usedlen, &fname, &fbuf, &len);
 
-    retvar->v_type = VAR_STRING;
+    rettv->v_type = VAR_STRING;
     if (fname == NULL)
-	retvar->vval.v_string = NULL;
-    else
-	retvar->vval.v_string = vim_strnsave(fname, len);
+	rettv->vval.v_string = NULL;
+    else
+	rettv->vval.v_string = vim_strnsave(fname, len);
     vim_free(fbuf);
 }
 
@@ -4950,70 +5164,70 @@ f_fnamemodify(argvars, retvar)
  * "foldclosed()" function
  */
     static void
-f_foldclosed(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    foldclosed_both(argvars, retvar, FALSE);
+f_foldclosed(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    foldclosed_both(argvars, rettv, FALSE);
 }
 
 /*
  * "foldclosedend()" function
  */
     static void
-f_foldclosedend(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    foldclosed_both(argvars, retvar, TRUE);
+f_foldclosedend(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    foldclosed_both(argvars, rettv, TRUE);
 }
 
 /*
  * "foldclosed()" function
  */
     static void
-foldclosed_both(argvars, retvar, end)
-    typeval	*argvars;
-    typeval	*retvar;
+foldclosed_both(argvars, rettv, end)
+    typeval	*argvars;
+    typeval	*rettv;
     int		end;
 {
 #ifdef FEAT_FOLDING
     linenr_T	lnum;
     linenr_T	first, last;
 
-    lnum = get_vartv_lnum(argvars);
+    lnum = get_tv_lnum(argvars);
     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
     {
 	if (hasFoldingWin(curwin, lnum, &first, &last, FALSE, NULL))
 	{
 	    if (end)
-		retvar->vval.v_number = (varnumber_T)last;
+		rettv->vval.v_number = (varnumber_T)last;
 	    else
-		retvar->vval.v_number = (varnumber_T)first;
+		rettv->vval.v_number = (varnumber_T)first;
 	    return;
 	}
     }
 #endif
-    retvar->vval.v_number = -1;
+    rettv->vval.v_number = -1;
 }
 
 /*
  * "foldlevel()" function
  */
     static void
-f_foldlevel(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_foldlevel(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_FOLDING
     linenr_T	lnum;
 
-    lnum = get_vartv_lnum(argvars);
+    lnum = get_tv_lnum(argvars);
     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
-	retvar->vval.v_number = foldLevel(lnum);
-    else
-#endif
-	retvar->vval.v_number = 0;
+	rettv->vval.v_number = foldLevel(lnum);
+    else
+#endif
+	rettv->vval.v_number = 0;
 }
 
 /*
@@ -5021,9 +5235,9 @@ f_foldlevel(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_foldtext(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_foldtext(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_FOLDING
     linenr_T	lnum;
@@ -5033,8 +5247,8 @@ f_foldtext(argvars, retvar)
     char	*txt;
 #endif
 
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = NULL;
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
 #ifdef FEAT_FOLDING
     if ((linenr_T)vimvars[VV_FOLDSTART].val > 0
 	    && (linenr_T)vimvars[VV_FOLDEND].val <= curbuf->b_ml.ml_line_count
@@ -5077,7 +5291,7 @@ f_foldtext(argvars, retvar)
 	    STRCAT(r, s);
 	    /* remove 'foldmarker' and 'commentstring' */
 	    foldtext_cleanup(r + len);
-	    retvar->vval.v_string = r;
+	    rettv->vval.v_string = r;
 	}
     }
 #endif
@@ -5088,9 +5302,9 @@ f_foldtext(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_foldtextresult(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_foldtextresult(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_FOLDING
     linenr_T	lnum;
@@ -5100,10 +5314,10 @@ f_foldtextresult(argvars, retvar)
     int		fold_count;
 #endif
 
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = NULL;
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
 #ifdef FEAT_FOLDING
-    lnum = get_vartv_lnum(argvars);
+    lnum = get_tv_lnum(argvars);
     fold_count = foldedCount(curwin, lnum, &foldinfo);
     if (fold_count > 0)
     {
@@ -5111,7 +5325,7 @@ f_foldtextresult(argvars, retvar)
 							      &foldinfo, buf);
 	if (text == buf)
 	    text = vim_strsave(text);
-	retvar->vval.v_string = text;
+	rettv->vval.v_string = text;
     }
 #endif
 }
@@ -5121,11 +5335,11 @@ f_foldtextresult(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_foreground(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->vval.v_number = 0;
+f_foreground(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->vval.v_number = 0;
 #ifdef FEAT_GUI
     if (gui.in_use)
 	gui_mch_set_foreground();
@@ -5141,21 +5355,21 @@ f_foreground(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_function(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_function(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*s;
 
-    s = get_vartv_string(&argvars[0]);
+    s = get_tv_string(&argvars[0]);
     if (s == NULL || *s == NUL || isdigit(*s))
 	EMSG2(_(e_invarg2), s);
     else if (!function_exists(s))
 	EMSG2(_("E999: Unknown function: %s"), s);
     else
     {
-	retvar->vval.v_string = vim_strsave(s);
-	retvar->v_type = VAR_FUNC;
+	rettv->vval.v_string = vim_strsave(s);
+	rettv->v_type = VAR_FUNC;
     }
 }
 
@@ -5163,9 +5377,9 @@ f_function(argvars, retvar)
  * "getchar()" function
  */
     static void
-f_getchar(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_getchar(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     varnumber_T		n;
 
@@ -5174,7 +5388,7 @@ f_getchar(argvars, retvar)
     if (argvars[0].v_type == VAR_UNKNOWN)
 	/* getchar(): blocking wait. */
 	n = safe_vgetc();
-    else if (get_vartv_number(&argvars[0]) == 1)
+    else if (get_tv_number(&argvars[0]) == 1)
 	/* getchar(1): only check if char avail */
 	n = vpeekc();
     else if (vpeekc() == NUL)
@@ -5186,7 +5400,7 @@ f_getchar(argvars, retvar)
     --no_mapping;
     --allow_keys;
 
-    retvar->vval.v_number = n;
+    rettv->vval.v_number = n;
     if (IS_SPECIAL(n) || mod_mask != 0)
     {
 	char_u		temp[10];   /* modifier: 3, mbyte-char: 6, NUL: 1 */
@@ -5212,8 +5426,8 @@ f_getchar(argvars, retvar)
 	else
 	    temp[i++] = n;
 	temp[i++] = NUL;
-	retvar->v_type = VAR_STRING;
-	retvar->vval.v_string = vim_strsave(temp);
+	rettv->v_type = VAR_STRING;
+	rettv->vval.v_string = vim_strsave(temp);
     }
 }
 
@@ -5222,11 +5436,11 @@ f_getchar(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_getcharmod(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->vval.v_number = mod_mask;
+f_getcharmod(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->vval.v_number = mod_mask;
 }
 
 /*
@@ -5234,12 +5448,12 @@ f_getcharmod(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_getcmdline(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = get_cmdline_str();
+f_getcmdline(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = get_cmdline_str();
 }
 
 /*
@@ -5247,20 +5461,20 @@ f_getcmdline(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_getcmdpos(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->vval.v_number = get_cmdline_pos() + 1;
+f_getcmdpos(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->vval.v_number = get_cmdline_pos() + 1;
 }
 
 /*
  * "getbufvar()" function
  */
     static void
-f_getbufvar(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_getbufvar(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     buf_T	*buf;
     buf_T	*save_curbuf;
@@ -5268,11 +5482,11 @@ f_getbufvar(argvars, retvar)
     VAR		v;
 
     ++emsg_off;
-    buf = get_buf_vartv(&argvars[0]);
-    varname = get_vartv_string(&argvars[1]);
-
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = NULL;
+    buf = get_buf_tv(&argvars[0]);
+    varname = get_tv_string(&argvars[1]);
+
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
 
     if (buf != NULL && varname != NULL)
     {
@@ -5282,7 +5496,7 @@ f_getbufvar(argvars, retvar)
 	    save_curbuf = curbuf;
 	    curbuf = buf;
 
-	    get_option_vartv(&varname, retvar, TRUE);
+	    get_option_tv(&varname, rettv, TRUE);
 
 	    /* restore previous notion of curbuf */
 	    curbuf = save_curbuf;
@@ -5292,7 +5506,7 @@ f_getbufvar(argvars, retvar)
 	    /* look up the variable */
 	    v = find_var_in_ga(&buf->b_vars, varname);
 	    if (v != NULL)
-		copy_vartv(&v->tv, retvar);
+		copy_tv(&v->tv, rettv);
 	}
     }
 
@@ -5304,20 +5518,20 @@ f_getbufvar(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_getcwd(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_getcwd(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	cwd[MAXPATHL];
 
-    retvar->v_type = VAR_STRING;
+    rettv->v_type = VAR_STRING;
     if (mch_dirname(cwd, MAXPATHL) == FAIL)
-	retvar->vval.v_string = NULL;
-    else
-    {
-	retvar->vval.v_string = vim_strsave(cwd);
+	rettv->vval.v_string = NULL;
+    else
+    {
+	rettv->vval.v_string = vim_strsave(cwd);
 #ifdef BACKSLASH_IN_FILENAME
-	slash_adjust(retvar->vval.v_string);
+	slash_adjust(rettv->vval.v_string);
 #endif
     }
 }
@@ -5327,12 +5541,12 @@ f_getcwd(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_getfontname(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = NULL;
+f_getfontname(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
 #ifdef FEAT_GUI
     if (gui.in_use)
     {
@@ -5348,14 +5562,14 @@ f_getfontname(argvars, retvar)
 	}
 	else
 	{
-	    name = get_vartv_string(&argvars[0]);
+	    name = get_tv_string(&argvars[0]);
 	    if (STRCMP(name, "*") == 0)	    /* don't use font dialog */
 		return;
 	    font = gui_mch_get_font(name, FALSE);
 	    if (font == NOFONT)
 		return;	    /* Invalid font name, return empty string. */
 	}
-	retvar->vval.v_string = gui_mch_get_fontname(font, name);
+	rettv->vval.v_string = gui_mch_get_fontname(font, name);
 	if (argvars[0].v_type != VAR_UNKNOWN)
 	    gui_mch_free_font(font);
     }
@@ -5366,9 +5580,9 @@ f_getfontname(argvars, retvar)
  * "getfperm({fname})" function
  */
     static void
-f_getfperm(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_getfperm(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*fname;
     struct stat st;
@@ -5376,9 +5590,9 @@ f_getfperm(argvars, retvar)
     char_u	flags[] = "rwx";
     int		i;
 
-    fname = get_vartv_string(&argvars[0]);
-
-    retvar->v_type = VAR_STRING;
+    fname = get_tv_string(&argvars[0]);
+
+    rettv->v_type = VAR_STRING;
     if (mch_stat((char *)fname, &st) >= 0)
     {
 	perm = vim_strsave((char_u *)"---------");
@@ -5391,70 +5605,70 @@ f_getfperm(argvars, retvar)
 	    }
 	}
     }
-    retvar->vval.v_string = perm;
+    rettv->vval.v_string = perm;
 }
 
 /*
  * "getfsize({fname})" function
  */
     static void
-f_getfsize(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_getfsize(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*fname;
     struct stat	st;
 
-    fname = get_vartv_string(&argvars[0]);
-
-    retvar->v_type = VAR_NUMBER;
+    fname = get_tv_string(&argvars[0]);
+
+    rettv->v_type = VAR_NUMBER;
 
     if (mch_stat((char *)fname, &st) >= 0)
     {
 	if (mch_isdir(fname))
-	    retvar->vval.v_number = 0;
+	    rettv->vval.v_number = 0;
 	else
-	    retvar->vval.v_number = (varnumber_T)st.st_size;
-    }
-    else
-	  retvar->vval.v_number = -1;
+	    rettv->vval.v_number = (varnumber_T)st.st_size;
+    }
+    else
+	  rettv->vval.v_number = -1;
 }
 
 /*
  * "getftime({fname})" function
  */
     static void
-f_getftime(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_getftime(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*fname;
     struct stat	st;
 
-    fname = get_vartv_string(&argvars[0]);
+    fname = get_tv_string(&argvars[0]);
 
     if (mch_stat((char *)fname, &st) >= 0)
-	retvar->vval.v_number = (varnumber_T)st.st_mtime;
-    else
-	retvar->vval.v_number = -1;
+	rettv->vval.v_number = (varnumber_T)st.st_mtime;
+    else
+	rettv->vval.v_number = -1;
 }
 
 /*
  * "getftype({fname})" function
  */
     static void
-f_getftype(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_getftype(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*fname;
     struct stat st;
     char_u	*type = NULL;
     char	*t;
 
-    fname = get_vartv_string(&argvars[0]);
-
-    retvar->v_type = VAR_STRING;
+    fname = get_tv_string(&argvars[0]);
+
+    rettv->v_type = VAR_STRING;
     if (mch_lstat((char *)fname, &st) >= 0)
     {
 #ifdef S_ISREG
@@ -5516,39 +5730,39 @@ f_getftype(argvars, retvar)
 #endif
 	type = vim_strsave((char_u *)t);
     }
-    retvar->vval.v_string = type;
+    rettv->vval.v_string = type;
 }
 
 /*
  * "getreg()" function
  */
     static void
-f_getreg(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_getreg(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*strregname;
     int		regname;
 
     if (argvars[0].v_type != VAR_UNKNOWN)
-	strregname = get_vartv_string(&argvars[0]);
+	strregname = get_tv_string(&argvars[0]);
     else
 	strregname = vimvars[VV_REG].val;
     regname = (strregname == NULL ? '"' : *strregname);
     if (regname == 0)
 	regname = '"';
 
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = get_reg_contents(regname, TRUE);
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = get_reg_contents(regname, TRUE);
 }
 
 /*
  * "getregtype()" function
  */
     static void
-f_getregtype(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_getregtype(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*strregname;
     int		regname;
@@ -5556,7 +5770,7 @@ f_getregtype(argvars, retvar)
     long	reglen = 0;
 
     if (argvars[0].v_type != VAR_UNKNOWN)
-	strregname = get_vartv_string(&argvars[0]);
+	strregname = get_tv_string(&argvars[0]);
     else
 	/* Default to v:register */
 	strregname = vimvars[VV_REG].val;
@@ -5578,30 +5792,30 @@ f_getregtype(argvars, retvar)
 		break;
 #endif
     }
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = vim_strsave(buf);
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = vim_strsave(buf);
 }
 
 /*
  * "getline(lnum)" function
  */
     static void
-f_getline(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_getline(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     linenr_T	lnum;
     char_u	*p;
 
-    lnum = get_vartv_lnum(argvars);
+    lnum = get_tv_lnum(argvars);
 
     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
 	p = ml_get(lnum);
     else
 	p = (char_u *)"";
 
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = vim_strsave(p);
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = vim_strsave(p);
 }
 
 /*
@@ -5609,18 +5823,18 @@ f_getline(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_getwinposx(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->vval.v_number = -1;
+f_getwinposx(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->vval.v_number = -1;
 #ifdef FEAT_GUI
     if (gui.in_use)
     {
 	int	    x, y;
 
 	if (gui_mch_get_winpos(&x, &y) == OK)
-	    retvar->vval.v_number = x;
+	    rettv->vval.v_number = x;
     }
 #endif
 }
@@ -5630,18 +5844,18 @@ f_getwinposx(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_getwinposy(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->vval.v_number = -1;
+f_getwinposy(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->vval.v_number = -1;
 #ifdef FEAT_GUI
     if (gui.in_use)
     {
 	int	    x, y;
 
 	if (gui_mch_get_winpos(&x, &y) == OK)
-	    retvar->vval.v_number = y;
+	    rettv->vval.v_number = y;
     }
 #endif
 }
@@ -5650,9 +5864,9 @@ f_getwinposy(argvars, retvar)
  * "getwinvar()" function
  */
     static void
-f_getwinvar(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_getwinvar(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     win_T	*win, *oldcurwin;
     char_u	*varname;
@@ -5660,10 +5874,10 @@ f_getwinvar(argvars, retvar)
 
     ++emsg_off;
     win = find_win_by_nr(&argvars[0]);
-    varname = get_vartv_string(&argvars[1]);
-
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = NULL;
+    varname = get_tv_string(&argvars[1]);
+
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
 
     if (win != NULL && varname != NULL)
     {
@@ -5673,7 +5887,7 @@ f_getwinvar(argvars, retvar)
 	    oldcurwin = curwin;
 	    curwin = win;
 
-	    get_option_vartv(&varname, retvar, 1);
+	    get_option_tv(&varname, rettv, 1);
 
 	    /* restore previous notion of curwin */
 	    curwin = oldcurwin;
@@ -5683,7 +5897,7 @@ f_getwinvar(argvars, retvar)
 	    /* look up the variable */
 	    v = find_var_in_ga(&win->w_vars, varname);
 	    if (v != NULL)
-		copy_vartv(&v->tv, retvar);
+		copy_tv(&v->tv, rettv);
 	}
     }
 
@@ -5694,16 +5908,16 @@ f_getwinvar(argvars, retvar)
  * "glob()" function
  */
     static void
-f_glob(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_glob(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     expand_T	xpc;
 
     ExpandInit(&xpc);
     xpc.xp_context = EXPAND_FILES;
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = ExpandOne(&xpc, get_vartv_string(&argvars[0]),
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]),
 				     NULL, WILD_USE_NL|WILD_SILENT, WILD_ALL);
     ExpandCleanup(&xpc);
 }
@@ -5712,24 +5926,24 @@ f_glob(argvars, retvar)
  * "globpath()" function
  */
     static void
-f_globpath(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_globpath(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	buf1[NUMBUFLEN];
 
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = globpath(get_vartv_string(&argvars[0]),
-				     get_vartv_string_buf(&argvars[1], buf1));
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = globpath(get_tv_string(&argvars[0]),
+				     get_tv_string_buf(&argvars[1], buf1));
 }
 
 /*
  * "has()" function
  */
     static void
-f_has(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_has(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     int		i;
     char_u	*name;
@@ -5892,9 +6106,6 @@ f_has(argvars, retvar)
 	"gui_athena",
 # endif
 #endif
-#ifdef FEAT_GUI_BEOS
-	"gui_beos",
-#endif
 #ifdef FEAT_GUI_KDE
 	"gui_kde",
 #endif
@@ -6157,7 +6368,7 @@ f_has(argvars, retvar)
 	NULL
     };
 
-    name = get_vartv_string(&argvars[0]);
+    name = get_tv_string(&argvars[0]);
     for (i = 0; has_list[i] != NULL; ++i)
 	if (STRICMP(name, has_list[i]) == 0)
 	{
@@ -6217,31 +6428,31 @@ f_has(argvars, retvar)
 #endif
     }
 
-    retvar->vval.v_number = n;
+    rettv->vval.v_number = n;
 }
 
 /*
  * "hasmapto()" function
  */
     static void
-f_hasmapto(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_hasmapto(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*name;
     char_u	*mode;
     char_u	buf[NUMBUFLEN];
 
-    name = get_vartv_string(&argvars[0]);
+    name = get_tv_string(&argvars[0]);
     if (argvars[1].v_type == VAR_UNKNOWN)
 	mode = (char_u *)"nvo";
     else
-	mode = get_vartv_string_buf(&argvars[1], buf);
+	mode = get_tv_string_buf(&argvars[1], buf);
 
     if (map_to_exists(name, mode))
-	retvar->vval.v_number = TRUE;
-    else
-	retvar->vval.v_number = FALSE;
+	rettv->vval.v_number = TRUE;
+    else
+	rettv->vval.v_number = FALSE;
 }
 
 /*
@@ -6249,9 +6460,9 @@ f_hasmapto(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_histadd(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_histadd(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_CMDHIST
     int		histype;
@@ -6259,18 +6470,18 @@ f_histadd(argvars, retvar)
     char_u	buf[NUMBUFLEN];
 #endif
 
-    retvar->vval.v_number = FALSE;
+    rettv->vval.v_number = FALSE;
     if (check_restricted() || check_secure())
 	return;
 #ifdef FEAT_CMDHIST
-    histype = get_histtype(get_vartv_string(&argvars[0]));
+    histype = get_histtype(get_tv_string(&argvars[0]));
     if (histype >= 0)
     {
-	str = get_vartv_string_buf(&argvars[1], buf);
+	str = get_tv_string_buf(&argvars[1], buf);
 	if (*str != NUL)
 	{
 	    add_to_history(histype, str, FALSE, NUL);
-	    retvar->vval.v_number = TRUE;
+	    rettv->vval.v_number = TRUE;
 	    return;
 	}
     }
@@ -6282,9 +6493,9 @@ f_histadd(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_histdel(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_histdel(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_CMDHIST
     int		n;
@@ -6292,18 +6503,18 @@ f_histdel(argvars, retvar)
 
     if (argvars[1].v_type == VAR_UNKNOWN)
 	/* only one argument: clear entire history */
-	n = clr_history(get_histtype(get_vartv_string(&argvars[0])));
+	n = clr_history(get_histtype(get_tv_string(&argvars[0])));
     else if (argvars[1].v_type == VAR_NUMBER)
 	/* index given: remove that entry */
-	n = del_history_idx(get_histtype(get_vartv_string(&argvars[0])),
-					  (int)get_vartv_number(&argvars[1]));
+	n = del_history_idx(get_histtype(get_tv_string(&argvars[0])),
+					  (int)get_tv_number(&argvars[1]));
     else
 	/* string given: remove all matching entries */
-	n = del_history_entry(get_histtype(get_vartv_string(&argvars[0])),
-				      get_vartv_string_buf(&argvars[1], buf));
-    retvar->vval.v_number = n;
+	n = del_history_entry(get_histtype(get_tv_string(&argvars[0])),
+				      get_tv_string_buf(&argvars[1], buf));
+    rettv->vval.v_number = n;
 #else
-    retvar->vval.v_number = 0;
+    rettv->vval.v_number = 0;
 #endif
 }
 
@@ -6312,24 +6523,24 @@ f_histdel(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_histget(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_histget(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_CMDHIST
     int		type;
     int		idx;
 
-    type = get_histtype(get_vartv_string(&argvars[0]));
+    type = get_histtype(get_tv_string(&argvars[0]));
     if (argvars[1].v_type == VAR_UNKNOWN)
 	idx = get_history_idx(type);
     else
-	idx = (int)get_vartv_number(&argvars[1]);
-    retvar->vval.v_string = vim_strsave(get_history_entry(type, idx));
+	idx = (int)get_tv_number(&argvars[1]);
+    rettv->vval.v_string = vim_strsave(get_history_entry(type, idx));
 #else
-    retvar->vval.v_string = NULL;
-#endif
-    retvar->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
+#endif
+    rettv->v_type = VAR_STRING;
 }
 
 /*
@@ -6337,42 +6548,42 @@ f_histget(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_histnr(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_histnr(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     int		i;
 
 #ifdef FEAT_CMDHIST
-    i = get_histtype(get_vartv_string(&argvars[0]));
+    i = get_histtype(get_tv_string(&argvars[0]));
     if (i >= HIST_CMD && i < HIST_COUNT)
 	i = get_history_idx(i);
     else
 #endif
 	i = -1;
-    retvar->vval.v_number = i;
+    rettv->vval.v_number = i;
 }
 
 /*
  * "highlight_exists()" function
  */
     static void
-f_hlexists(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->vval.v_number = highlight_exists(get_vartv_string(&argvars[0]));
+f_hlexists(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->vval.v_number = highlight_exists(get_tv_string(&argvars[0]));
 }
 
 /*
  * "highlightID(name)" function
  */
     static void
-f_hlID(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->vval.v_number = syn_name2id(get_vartv_string(&argvars[0]));
+f_hlID(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->vval.v_number = syn_name2id(get_tv_string(&argvars[0]));
 }
 
 /*
@@ -6380,15 +6591,15 @@ f_hlID(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_hostname(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_hostname(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u hostname[256];
 
     mch_get_host_name(hostname, 256);
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = vim_strsave(hostname);
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = vim_strsave(hostname);
 }
 
 /*
@@ -6396,9 +6607,9 @@ f_hostname(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_iconv(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_iconv(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_MBYTE
     char_u	buf1[NUMBUFLEN];
@@ -6407,21 +6618,21 @@ f_iconv(argvars, retvar)
     vimconv_T	vimconv;
 #endif
 
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = NULL;
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
 
 #ifdef FEAT_MBYTE
-    str = get_vartv_string(&argvars[0]);
-    from = enc_canonize(enc_skip(get_vartv_string_buf(&argvars[1], buf1)));
-    to = enc_canonize(enc_skip(get_vartv_string_buf(&argvars[2], buf2)));
+    str = get_tv_string(&argvars[0]);
+    from = enc_canonize(enc_skip(get_tv_string_buf(&argvars[1], buf1)));
+    to = enc_canonize(enc_skip(get_tv_string_buf(&argvars[2], buf2)));
     vimconv.vc_type = CONV_NONE;
     convert_setup(&vimconv, from, to);
 
     /* If the encodings are equal, no conversion needed. */
     if (vimconv.vc_type == CONV_NONE)
-	retvar->vval.v_string = vim_strsave(str);
-    else
-	retvar->vval.v_string = string_convert(&vimconv, str, NULL);
+	rettv->vval.v_string = vim_strsave(str);
+    else
+	rettv->vval.v_string = string_convert(&vimconv, str, NULL);
 
     convert_setup(&vimconv, NULL, NULL);
     vim_free(from);
@@ -6433,17 +6644,17 @@ f_iconv(argvars, retvar)
  * "indent()" function
  */
     static void
-f_indent(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_indent(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     linenr_T	lnum;
 
-    lnum = get_vartv_lnum(argvars);
+    lnum = get_tv_lnum(argvars);
     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
-	retvar->vval.v_number = get_indent_lnum(lnum);
-    else
-	retvar->vval.v_number = -1;
+	rettv->vval.v_number = get_indent_lnum(lnum);
+    else
+	rettv->vval.v_number = -1;
 }
 
 static int inputsecret_flag = 0;
@@ -6453,23 +6664,23 @@ static int inputsecret_flag = 0;
  *     Also handles inputsecret() when inputsecret is set.
  */
     static void
-f_input(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    char_u	*prompt = get_vartv_string(&argvars[0]);
+f_input(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    char_u	*prompt = get_tv_string(&argvars[0]);
     char_u	*p = NULL;
     int		c;
     char_u	buf[NUMBUFLEN];
     int		cmd_silent_save = cmd_silent;
 
-    retvar->v_type = VAR_STRING;
+    rettv->v_type = VAR_STRING;
 
 #ifdef NO_CONSOLE_INPUT
     /* While starting up, there is no place to enter text. */
     if (no_console_input())
     {
-	retvar->vval.v_string = NULL;
+	rettv->vval.v_string = NULL;
 	return;
     }
 #endif
@@ -6498,9 +6709,9 @@ f_input(argvars, retvar)
     }
 
     if (argvars[1].v_type != VAR_UNKNOWN)
-	stuffReadbuffSpec(get_vartv_string_buf(&argvars[1], buf));
-
-    retvar->vval.v_string =
+	stuffReadbuffSpec(get_tv_string_buf(&argvars[1], buf));
+
+    rettv->vval.v_string =
 		getcmdline_prompt(inputsecret_flag ? NUL : '@', p, echo_attr);
 
     /* since the user typed this, no need to wait for return */
@@ -6513,9 +6724,9 @@ f_input(argvars, retvar)
  * "inputdialog()" function
  */
     static void
-f_inputdialog(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_inputdialog(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #if defined(FEAT_GUI_TEXTDIALOG)
     /* Use a GUI dialog if the GUI is running and 'c' is not in 'guioptions' */
@@ -6524,31 +6735,31 @@ f_inputdialog(argvars, retvar)
 	char_u	*message;
 	char_u	buf[NUMBUFLEN];
 
-	message = get_vartv_string(&argvars[0]);
+	message = get_tv_string(&argvars[0]);
 	if (argvars[1].v_type != VAR_UNKNOWN)
 	{
-	    STRNCPY(IObuff, get_vartv_string_buf(&argvars[1], buf), IOSIZE);
+	    STRNCPY(IObuff, get_tv_string_buf(&argvars[1], buf), IOSIZE);
 	    IObuff[IOSIZE - 1] = NUL;
 	}
 	else
 	    IObuff[0] = NUL;
 	if (do_dialog(VIM_QUESTION, NULL, message, (char_u *)_("&OK\n&Cancel"),
 							      1, IObuff) == 1)
-	    retvar->vval.v_string = vim_strsave(IObuff);
+	    rettv->vval.v_string = vim_strsave(IObuff);
 	else
 	{
 	    if (argvars[1].v_type != VAR_UNKNOWN
 					&& argvars[2].v_type != VAR_UNKNOWN)
-		retvar->vval.v_string = vim_strsave(
-				      get_vartv_string_buf(&argvars[2], buf));
+		rettv->vval.v_string = vim_strsave(
+				      get_tv_string_buf(&argvars[2], buf));
 	    else
-		retvar->vval.v_string = NULL;
-	}
-	retvar->v_type = VAR_STRING;
-    }
-    else
-#endif
-	f_input(argvars, retvar);
+		rettv->vval.v_string = NULL;
+	}
+	rettv->v_type = VAR_STRING;
+    }
+    else
+#endif
+	f_input(argvars, rettv);
 }
 
 static garray_T	    ga_userinput = {0, 0, sizeof(tasave_T), 4, NULL};
@@ -6558,21 +6769,21 @@ static garray_T	    ga_userinput = {0, 0
  */
 /*ARGSUSED*/
     static void
-f_inputrestore(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_inputrestore(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     if (ga_userinput.ga_len > 0)
     {
 	--ga_userinput.ga_len;
 	restore_typeahead((tasave_T *)(ga_userinput.ga_data)
 						       + ga_userinput.ga_len);
-	retvar->vval.v_number = 0; /* OK */
+	rettv->vval.v_number = 0; /* OK */
     }
     else if (p_verbose > 1)
     {
 	msg((char_u *)_("called inputrestore() more often than inputsave()"));
-	retvar->vval.v_number = 1; /* Failed */
+	rettv->vval.v_number = 1; /* Failed */
     }
 }
 
@@ -6581,9 +6792,9 @@ f_inputrestore(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_inputsave(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_inputsave(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     /* Add an entry to the stack of typehead storage. */
     if (ga_grow(&ga_userinput, 1) == OK)
@@ -6591,23 +6802,23 @@ f_inputsave(argvars, retvar)
 	save_typeahead((tasave_T *)(ga_userinput.ga_data)
 						       + ga_userinput.ga_len);
 	++ga_userinput.ga_len;
-	retvar->vval.v_number = 0; /* OK */
-    }
-    else
-	retvar->vval.v_number = 1; /* Failed */
+	rettv->vval.v_number = 0; /* OK */
+    }
+    else
+	rettv->vval.v_number = 1; /* Failed */
 }
 
 /*
  * "inputsecret()" function
  */
     static void
-f_inputsecret(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_inputsecret(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     ++cmdline_star;
     ++inputsecret_flag;
-    f_input(argvars, retvar);
+    f_input(argvars, rettv);
     --cmdline_star;
     --inputsecret_flag;
 }
@@ -6616,9 +6827,9 @@ f_inputsecret(argvars, retvar)
  * "insert()" function
  */
     static void
-f_insert(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_insert(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     long	before = 0;
     long	n;
@@ -6631,7 +6842,7 @@ f_insert(argvars, retvar)
     else if ((l = argvars[0].vval.v_list) != NULL)
     {
 	if (argvars[2].v_type != VAR_UNKNOWN)
-	    before = get_vartv_number(&argvars[2]);
+	    before = get_tv_number(&argvars[2]);
 
 	if (before < 0)
 	{
@@ -6656,7 +6867,7 @@ f_insert(argvars, retvar)
 	    ni = listitem_alloc();
 	    if (ni != NULL)
 	    {
-		copy_vartv(&argvars[1], &ni->li_tv);
+		copy_tv(&argvars[1], &ni->li_tv);
 		if (item == NULL)
 		    /* Append new item at end of list. */
 		    list_append(l, ni);
@@ -6671,7 +6882,7 @@ f_insert(argvars, retvar)
 			item->li_prev->li_next = ni;
 		    item->li_prev = ni;
 		}
-		copy_vartv(&argvars[0], retvar);
+		copy_tv(&argvars[0], rettv);
 	    }
 	}
     }
@@ -6681,11 +6892,11 @@ f_insert(argvars, retvar)
  * "isdirectory()" function
  */
     static void
-f_isdirectory(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->vval.v_number = mch_isdir(get_vartv_string(&argvars[0]));
+f_isdirectory(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->vval.v_number = mch_isdir(get_tv_string(&argvars[0]));
 }
 
 /*
@@ -6693,9 +6904,9 @@ f_isdirectory(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_last_buffer_nr(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_last_buffer_nr(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     int		n = 0;
     buf_T	*buf;
@@ -6704,26 +6915,26 @@ f_last_buffer_nr(argvars, retvar)
 	if (n < buf->b_fnum)
 	    n = buf->b_fnum;
 
-    retvar->vval.v_number = n;
+    rettv->vval.v_number = n;
 }
 
 /*
  * "len()" function
  */
     static void
-f_len(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_len(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     switch (argvars[0].v_type)
     {
 	case VAR_STRING:
 	case VAR_NUMBER:
-	    retvar->vval.v_number = (varnumber_T)STRLEN(
-					       get_vartv_string(&argvars[0]));
+	    rettv->vval.v_number = (varnumber_T)STRLEN(
+					       get_tv_string(&argvars[0]));
 	    break;
 	case VAR_LIST:
-	    retvar->vval.v_number = list_len(argvars[0].vval.v_list);
+	    rettv->vval.v_number = list_len(argvars[0].vval.v_list);
 	    break;
 	default:
 	    EMSG(_("E999: Invalid type for len()"));
@@ -6735,28 +6946,28 @@ f_len(argvars, retvar)
  * "libcall()" function
  */
     static void
-f_libcall(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    libcall_common(argvars, retvar, VAR_STRING);
+f_libcall(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    libcall_common(argvars, rettv, VAR_STRING);
 }
 
 /*
  * "libcallnr()" function
  */
     static void
-f_libcallnr(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    libcall_common(argvars, retvar, VAR_NUMBER);
-}
-
-    static void
-libcall_common(argvars, retvar, type)
-    typeval	*argvars;
-    typeval	*retvar;
+f_libcallnr(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    libcall_common(argvars, rettv, VAR_NUMBER);
+}
+
+    static void
+libcall_common(argvars, rettv, type)
+    typeval	*argvars;
+    typeval	*rettv;
     int		type;
 {
 #ifdef FEAT_LIBCALL
@@ -6765,11 +6976,11 @@ libcall_common(argvars, retvar, type)
     int			nr_result;
 #endif
 
-    retvar->v_type = type;
+    rettv->v_type = type;
     if (type == VAR_NUMBER)
-	retvar->vval.v_number = 0;
-    else
-	retvar->vval.v_string = NULL;
+	rettv->vval.v_number = 0;
+    else
+	rettv->vval.v_string = NULL;
 
     if (check_restricted() || check_secure())
 	return;
@@ -6785,7 +6996,7 @@ libcall_common(argvars, retvar, type)
 	if (type == VAR_NUMBER)
 	    string_result = NULL;
 	else
-	    string_result = &retvar->vval.v_string;
+	    string_result = &rettv->vval.v_string;
 	if (mch_libcall(argvars[0].vval.v_string,
 			     argvars[1].vval.v_string,
 			     string_in,
@@ -6793,7 +7004,7 @@ libcall_common(argvars, retvar, type)
 			     string_result,
 			     &nr_result) == OK
 		&& type == VAR_NUMBER)
-	    retvar->vval.v_number = nr_result;
+	    rettv->vval.v_number = nr_result;
     }
 #endif
 }
@@ -6802,9 +7013,9 @@ libcall_common(argvars, retvar, type)
  * "line(string)" function
  */
     static void
-f_line(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_line(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     linenr_T	lnum = 0;
     pos_T	*fp;
@@ -6812,7 +7023,7 @@ f_line(argvars, retvar)
     fp = var2fpos(&argvars[0], TRUE);
     if (fp != NULL)
 	lnum = fp->lnum;
-    retvar->vval.v_number = lnum;
+    rettv->vval.v_number = lnum;
 }
 
 /*
@@ -6820,22 +7031,22 @@ f_line(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_line2byte(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_line2byte(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifndef FEAT_BYTEOFF
-    retvar->vval.v_number = -1;
+    rettv->vval.v_number = -1;
 #else
     linenr_T	lnum;
 
-    lnum = get_vartv_lnum(argvars);
+    lnum = get_tv_lnum(argvars);
     if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count + 1)
-	retvar->vval.v_number = -1;
-    else
-	retvar->vval.v_number = ml_find_line_or_offset(curbuf, lnum, NULL);
-    if (retvar->vval.v_number >= 0)
-	++retvar->vval.v_number;
+	rettv->vval.v_number = -1;
+    else
+	rettv->vval.v_number = ml_find_line_or_offset(curbuf, lnum, NULL);
+    if (rettv->vval.v_number >= 0)
+	++rettv->vval.v_number;
 #endif
 }
 
@@ -6843,25 +7054,25 @@ f_line2byte(argvars, retvar)
  * "lispindent(lnum)" function
  */
     static void
-f_lispindent(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_lispindent(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_LISP
     pos_T	pos;
     linenr_T	lnum;
 
     pos = curwin->w_cursor;
-    lnum = get_vartv_lnum(argvars);
+    lnum = get_tv_lnum(argvars);
     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
     {
 	curwin->w_cursor.lnum = lnum;
-	retvar->vval.v_number = get_lisp_indent();
+	rettv->vval.v_number = get_lisp_indent();
 	curwin->w_cursor = pos;
     }
     else
 #endif
-	retvar->vval.v_number = -1;
+	rettv->vval.v_number = -1;
 }
 
 /*
@@ -6869,39 +7080,39 @@ f_lispindent(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_localtime(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->vval.v_number = (varnumber_T)time(NULL);
+f_localtime(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->vval.v_number = (varnumber_T)time(NULL);
 }
 
 /*
  * "maparg()" function
  */
     static void
-f_maparg(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    get_maparg(argvars, retvar, TRUE);
+f_maparg(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    get_maparg(argvars, rettv, TRUE);
 }
 
 /*
  * "mapcheck()" function
  */
     static void
-f_mapcheck(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    get_maparg(argvars, retvar, FALSE);
-}
-
-    static void
-get_maparg(argvars, retvar, exact)
-    typeval	*argvars;
-    typeval	*retvar;
+f_mapcheck(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    get_maparg(argvars, rettv, FALSE);
+}
+
+    static void
+get_maparg(argvars, rettv, exact)
+    typeval	*argvars;
+    typeval	*rettv;
     int		exact;
 {
     char_u	*keys;
@@ -6913,15 +7124,15 @@ get_maparg(argvars, retvar, exact)
     garray_T	ga;
 
     /* return empty string for failure */
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = NULL;
-
-    keys = get_vartv_string(&argvars[0]);
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
+
+    keys = get_tv_string(&argvars[0]);
     if (*keys == NUL)
 	return;
 
     if (argvars[1].v_type != VAR_UNKNOWN)
-	which = get_vartv_string_buf(&argvars[1], buf);
+	which = get_tv_string_buf(&argvars[1], buf);
     else
 	which = (char_u *)"";
     mode = get_map_mode(&which, 0);
@@ -6939,7 +7150,7 @@ get_maparg(argvars, retvar, exact)
 	    ga_concat(&ga, str2special(&rhs, FALSE));
 
 	ga_append(&ga, NUL);
-	retvar->vval.v_string = (char_u *)ga.ga_data;
+	rettv->vval.v_string = (char_u *)ga.ga_data;
     }
 }
 
@@ -6947,39 +7158,39 @@ get_maparg(argvars, retvar, exact)
  * "match()" function
  */
     static void
-f_match(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    find_some_match(argvars, retvar, 1);
+f_match(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    find_some_match(argvars, rettv, 1);
 }
 
 /*
  * "matchend()" function
  */
     static void
-f_matchend(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    find_some_match(argvars, retvar, 0);
+f_matchend(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    find_some_match(argvars, rettv, 0);
 }
 
 /*
  * "matchstr()" function
  */
     static void
-f_matchstr(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    find_some_match(argvars, retvar, 2);
-}
-
-    static void
-find_some_match(argvars, retvar, type)
-    typeval	*argvars;
-    typeval	*retvar;
+f_matchstr(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    find_some_match(argvars, rettv, 2);
+}
+
+    static void
+find_some_match(argvars, rettv, type)
+    typeval	*argvars;
+    typeval	*rettv;
     int		type;
 {
     char_u	*str;
@@ -6996,20 +7207,20 @@ find_some_match(argvars, retvar, type)
     save_cpo = p_cpo;
     p_cpo = (char_u *)"";
 
-    expr = str = get_vartv_string(&argvars[0]);
-    pat = get_vartv_string_buf(&argvars[1], patbuf);
+    expr = str = get_tv_string(&argvars[0]);
+    pat = get_tv_string_buf(&argvars[1], patbuf);
 
     if (type == 2)
     {
-	retvar->v_type = VAR_STRING;
-	retvar->vval.v_string = NULL;
-    }
-    else
-	retvar->vval.v_number = -1;
+	rettv->v_type = VAR_STRING;
+	rettv->vval.v_string = NULL;
+    }
+    else
+	rettv->vval.v_number = -1;
 
     if (argvars[2].v_type != VAR_UNKNOWN)
     {
-	start = get_vartv_number(&argvars[2]);
+	start = get_tv_number(&argvars[2]);
 	if (start < 0)
 	    start = 0;
 	if (start > (long)STRLEN(str))
@@ -7017,7 +7228,7 @@ find_some_match(argvars, retvar, type)
 	str += start;
 
 	if (argvars[3].v_type != VAR_UNKNOWN)
-	    nth = get_vartv_number(&argvars[3]);
+	    nth = get_tv_number(&argvars[3]);
     }
 
     regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING);
@@ -7041,17 +7252,17 @@ find_some_match(argvars, retvar, type)
 	if (match)
 	{
 	    if (type == 2)
-		retvar->vval.v_string = vim_strnsave(regmatch.startp[0],
+		rettv->vval.v_string = vim_strnsave(regmatch.startp[0],
 				(int)(regmatch.endp[0] - regmatch.startp[0]));
 	    else
 	    {
 		if (type != 0)
-		    retvar->vval.v_number =
+		    rettv->vval.v_number =
 				      (varnumber_T)(regmatch.startp[0] - str);
 		else
-		    retvar->vval.v_number =
+		    rettv->vval.v_number =
 					(varnumber_T)(regmatch.endp[0] - str);
-		retvar->vval.v_number += str - expr;
+		rettv->vval.v_number += str - expr;
 	    }
 	}
 	vim_free(regmatch.regprog);
@@ -7066,9 +7277,9 @@ theend:
  */
 /*ARGSUSED*/
     static void
-f_mode(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_mode(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	buf[2];
 
@@ -7097,40 +7308,40 @@ f_mode(argvars, retvar)
 	buf[0] = 'n';
 
     buf[1] = NUL;
-    retvar->vval.v_string = vim_strsave(buf);
-    retvar->v_type = VAR_STRING;
+    rettv->vval.v_string = vim_strsave(buf);
+    rettv->v_type = VAR_STRING;
 }
 
 /*
  * "nr2char()" function
  */
     static void
-f_nr2char(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_nr2char(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	buf[NUMBUFLEN];
 
 #ifdef FEAT_MBYTE
     if (has_mbyte)
-	buf[(*mb_char2bytes)((int)get_vartv_number(&argvars[0]), buf)] = NUL;
-    else
-#endif
-    {
-	buf[0] = (char_u)get_vartv_number(&argvars[0]);
+	buf[(*mb_char2bytes)((int)get_tv_number(&argvars[0]), buf)] = NUL;
+    else
+#endif
+    {
+	buf[0] = (char_u)get_tv_number(&argvars[0]);
 	buf[1] = NUL;
     }
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = vim_strsave(buf);
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = vim_strsave(buf);
 }
 
 /*
  * "remove({list}, {idx})" function
  */
     static void
-f_remove(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_remove(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     listvar	*l;
     listitem	*item;
@@ -7140,13 +7351,13 @@ f_remove(argvars, retvar)
 	EMSG(_("E999: First argument of remove() must be a list"));
     else if ((l = argvars[0].vval.v_list) != NULL)
     {
-	idx = get_vartv_number(&argvars[1]);
+	idx = get_tv_number(&argvars[1]);
 	item = list_getrem(l, idx);
 	if (item == NULL)
 	    EMSGN(_(e_listidx), idx);
 	else
 	{
-	    *retvar = item->li_tv;
+	    *rettv = item->li_tv;
 	    vim_free(item);
 	}
     }
@@ -7156,39 +7367,39 @@ f_remove(argvars, retvar)
  * "rename({from}, {to})" function
  */
     static void
-f_rename(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_rename(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	buf[NUMBUFLEN];
 
     if (check_restricted() || check_secure())
-	retvar->vval.v_number = -1;
-    else
-	retvar->vval.v_number = vim_rename(get_vartv_string(&argvars[0]),
-				      get_vartv_string_buf(&argvars[1], buf));
+	rettv->vval.v_number = -1;
+    else
+	rettv->vval.v_number = vim_rename(get_tv_string(&argvars[0]),
+				      get_tv_string_buf(&argvars[1], buf));
 }
 
 /*
  * "resolve()" function
  */
     static void
-f_resolve(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_resolve(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*p;
 
-    p = get_vartv_string(&argvars[0]);
+    p = get_tv_string(&argvars[0]);
 #ifdef FEAT_SHORTCUT
     {
 	char_u	*v = NULL;
 
 	v = mch_resolve_shortcut(p);
 	if (v != NULL)
-	    retvar->vval.v_string = v;
+	    rettv->vval.v_string = v;
 	else
-	    retvar->vval.v_string = vim_strsave(p);
+	    rettv->vval.v_string = vim_strsave(p);
     }
 #else
 # ifdef HAVE_READLINK
@@ -7235,7 +7446,7 @@ f_resolve(argvars, retvar)
 		    vim_free(p);
 		    vim_free(remain);
 		    EMSG(_("E655: Too many symbolic links (cycle?)"));
-		    retvar->vval.v_string = NULL;
+		    rettv->vval.v_string = NULL;
 		    goto fail;
 		}
 
@@ -7355,35 +7566,35 @@ f_resolve(argvars, retvar)
 		*gettail_sep(p) = NUL;
 	}
 
-	retvar->vval.v_string = p;
+	rettv->vval.v_string = p;
     }
 # else
-    retvar->vval.v_string = vim_strsave(p);
+    rettv->vval.v_string = vim_strsave(p);
 # endif
 #endif
 
-    simplify_filename(retvar->vval.v_string);
+    simplify_filename(rettv->vval.v_string);
 
 #ifdef HAVE_READLINK
 fail:
 #endif
-    retvar->v_type = VAR_STRING;
+    rettv->v_type = VAR_STRING;
 }
 
 /*
  * "simplify()" function
  */
     static void
-f_simplify(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_simplify(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*p;
 
-    p = get_vartv_string(&argvars[0]);
-    retvar->vval.v_string = vim_strsave(p);
-    simplify_filename(retvar->vval.v_string);	/* simplify in place */
-    retvar->v_type = VAR_STRING;
+    p = get_tv_string(&argvars[0]);
+    rettv->vval.v_string = vim_strsave(p);
+    simplify_filename(rettv->vval.v_string);	/* simplify in place */
+    rettv->v_type = VAR_STRING;
 }
 
 #define SP_NOMOVE	1	/* don't move cursor */
@@ -7394,9 +7605,9 @@ f_simplify(argvars, retvar)
  * "search()" function
  */
     static void
-f_search(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_search(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*pat;
     pos_T	pos;
@@ -7405,15 +7616,15 @@ f_search(argvars, retvar)
     int		dir;
     int		flags = 0;
 
-    retvar->vval.v_number = 0;	/* default: FAIL */
-
-    pat = get_vartv_string(&argvars[0]);
+    rettv->vval.v_number = 0;	/* default: FAIL */
+
+    pat = get_tv_string(&argvars[0]);
     dir = get_search_arg(&argvars[1], &flags);	/* may set p_ws */
     if (dir == 0)
 	goto theend;
     if ((flags & ~SP_NOMOVE) != 0)
     {
-	EMSG2(_(e_invarg2), get_vartv_string(&argvars[1]));
+	EMSG2(_(e_invarg2), get_tv_string(&argvars[1]));
 	goto theend;
     }
 
@@ -7421,7 +7632,7 @@ f_search(argvars, retvar)
     if (searchit(curwin, curbuf, &pos, dir, pat, 1L,
 					      SEARCH_KEEP, RE_SEARCH) != FAIL)
     {
-	retvar->vval.v_number = pos.lnum;
+	rettv->vval.v_number = pos.lnum;
 	curwin->w_cursor = pos;
 	/* "/$" will put the cursor after the end of the line, may need to
 	 * correct that here */
@@ -7439,9 +7650,9 @@ theend:
  * "searchpair()" function
  */
     static void
-f_searchpair(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_searchpair(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*spat, *mpat, *epat;
     char_u	*skip;
@@ -7462,16 +7673,16 @@ f_searchpair(argvars, retvar)
     int		nest = 1;
     int		err;
 
-    retvar->vval.v_number = 0;	/* default: FAIL */
+    rettv->vval.v_number = 0;	/* default: FAIL */
 
     /* Make 'cpoptions' empty, the 'l' flag should not be used here. */
     save_cpo = p_cpo;
     p_cpo = (char_u *)"";
 
     /* Get the three pattern arguments: start, middle, end. */
-    spat = get_vartv_string(&argvars[0]);
-    mpat = get_vartv_string_buf(&argvars[1], nbuf1);
-    epat = get_vartv_string_buf(&argvars[2], nbuf2);
+    spat = get_tv_string(&argvars[0]);
+    mpat = get_tv_string_buf(&argvars[1], nbuf1);
+    epat = get_tv_string_buf(&argvars[2], nbuf2);
 
     /* Make two search patterns: start/end (pat2, for in nested pairs) and
      * start/middle/end (pat3, for the top pair). */
@@ -7496,7 +7707,7 @@ f_searchpair(argvars, retvar)
 	    || argvars[4].v_type == VAR_UNKNOWN)
 	skip = (char_u *)"";
     else
-	skip = get_vartv_string_buf(&argvars[4], nbuf3);
+	skip = get_tv_string_buf(&argvars[4], nbuf3);
 
     save_cursor = curwin->w_cursor;
     pos = curwin->w_cursor;
@@ -7524,7 +7735,7 @@ f_searchpair(argvars, retvar)
 	    {
 		/* Evaluating {skip} caused an error, break here. */
 		curwin->w_cursor = save_cursor;
-		retvar->vval.v_number = -1;
+		rettv->vval.v_number = -1;
 		break;
 	    }
 	    if (r)
@@ -7550,9 +7761,9 @@ f_searchpair(argvars, retvar)
 	{
 	    /* Found the match: return matchcount or line number. */
 	    if (flags & SP_RETCOUNT)
-		++retvar->vval.v_number;
+		++rettv->vval.v_number;
 	    else
-		retvar->vval.v_number = pos.lnum;
+		rettv->vval.v_number = pos.lnum;
 	    curwin->w_cursor = pos;
 	    if (!(flags & SP_REPEAT))
 		break;
@@ -7561,7 +7772,7 @@ f_searchpair(argvars, retvar)
     }
 
     /* If 'n' flag is used or search failed: restore cursor position. */
-    if ((flags & SP_NOMOVE) || retvar->vval.v_number == 0)
+    if ((flags & SP_NOMOVE) || rettv->vval.v_number == 0)
 	curwin->w_cursor = save_cursor;
 
 theend:
@@ -7588,7 +7799,7 @@ get_search_arg(varp, flagsp)
 
     if (varp->v_type != VAR_UNKNOWN)
     {
-	flags = get_vartv_string_buf(varp, nbuf);
+	flags = get_tv_string_buf(varp, nbuf);
 	while (*flags != NUL)
 	{
 	    switch (*flags)
@@ -7625,9 +7836,9 @@ get_search_arg(varp, flagsp)
  */
 /*ARGSUSED*/
     static void
-f_setbufvar(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_setbufvar(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     buf_T	*buf;
 #ifdef FEAT_AUTOCMD
@@ -7642,8 +7853,8 @@ f_setbufvar(argvars, retvar)
     if (check_restricted() || check_secure())
 	return;
     ++emsg_off;
-    buf = get_buf_vartv(&argvars[0]);
-    varname = get_vartv_string(&argvars[1]);
+    buf = get_buf_tv(&argvars[0]);
+    varname = get_tv_string(&argvars[1]);
     varp = &argvars[2];
 
     if (buf != NULL && varname != NULL && varp != NULL)
@@ -7659,8 +7870,8 @@ f_setbufvar(argvars, retvar)
 	if (*varname == '&')
 	{
 	    ++varname;
-	    set_option_value(varname, get_vartv_number(varp),
-				 get_vartv_string_buf(varp, nbuf), OPT_LOCAL);
+	    set_option_value(varname, get_tv_number(varp),
+				 get_tv_string_buf(varp, nbuf), OPT_LOCAL);
 	}
 	else
 	{
@@ -7688,28 +7899,28 @@ f_setbufvar(argvars, retvar)
  * "setcmdpos()" function
  */
     static void
-f_setcmdpos(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->vval.v_number = set_cmdline_pos(
-				      (int)get_vartv_number(&argvars[0]) - 1);
+f_setcmdpos(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->vval.v_number = set_cmdline_pos(
+				      (int)get_tv_number(&argvars[0]) - 1);
 }
 
 /*
  * "setline()" function
  */
     static void
-f_setline(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_setline(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     linenr_T	lnum;
     char_u	*line;
 
-    lnum = get_vartv_lnum(argvars);
-    line = get_vartv_string(&argvars[1]);
-    retvar->vval.v_number = 1;		/* FAIL is default */
+    lnum = get_tv_lnum(argvars);
+    line = get_tv_string(&argvars[1]);
+    rettv->vval.v_number = 1;		/* FAIL is default */
 
     if (lnum >= 1
 	    && lnum <= curbuf->b_ml.ml_line_count
@@ -7718,7 +7929,7 @@ f_setline(argvars, retvar)
     {
 	changed_bytes(lnum, 0);
 	check_cursor_col();
-	retvar->vval.v_number = 0;
+	rettv->vval.v_number = 0;
     }
 }
 
@@ -7726,9 +7937,9 @@ f_setline(argvars, retvar)
  * "setreg()" function
  */
     static void
-f_setreg(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_setreg(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     int		regname;
     char_u	*strregname;
@@ -7741,8 +7952,8 @@ f_setreg(argvars, retvar)
     yank_type = MAUTO;
     append = FALSE;
 
-    strregname = get_vartv_string(argvars);
-    retvar->vval.v_number = 1;		/* FAIL is default */
+    strregname = get_tv_string(argvars);
+    rettv->vval.v_number = 1;		/* FAIL is default */
 
     regname = (strregname == NULL ? '"' : *strregname);
     if (regname == 0 || regname == '@')
@@ -7752,7 +7963,7 @@ f_setreg(argvars, retvar)
 
     if (argvars[2].v_type != VAR_UNKNOWN)
     {
-	for (stropt = get_vartv_string(&argvars[2]); *stropt != NUL; ++stropt)
+	for (stropt = get_tv_string(&argvars[2]); *stropt != NUL; ++stropt)
 	    switch (*stropt)
 	    {
 		case 'a': case 'A':	/* append */
@@ -7778,9 +7989,9 @@ f_setreg(argvars, retvar)
 	    }
     }
 
-    write_reg_contents_ex(regname, get_vartv_string(&argvars[1]), -1,
+    write_reg_contents_ex(regname, get_tv_string(&argvars[1]), -1,
 						append, yank_type, block_len);
-    retvar->vval.v_number = 0;
+    rettv->vval.v_number = 0;
 }
 
 
@@ -7789,9 +8000,9 @@ f_setreg(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_setwinvar(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_setwinvar(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     win_T	*win;
 #ifdef FEAT_WINDOWS
@@ -7805,7 +8016,7 @@ f_setwinvar(argvars, retvar)
 	return;
     ++emsg_off;
     win = find_win_by_nr(&argvars[0]);
-    varname = get_vartv_string(&argvars[1]);
+    varname = get_tv_string(&argvars[1]);
     varp = &argvars[2];
 
     if (win != NULL && varname != NULL && varp != NULL)
@@ -7820,8 +8031,8 @@ f_setwinvar(argvars, retvar)
 	if (*varname == '&')
 	{
 	    ++varname;
-	    set_option_value(varname, get_vartv_number(varp),
-				 get_vartv_string_buf(varp, nbuf), OPT_LOCAL);
+	    set_option_value(varname, get_tv_number(varp),
+				 get_tv_string_buf(varp, nbuf), OPT_LOCAL);
 	}
 	else
 	{
@@ -7852,13 +8063,13 @@ f_setwinvar(argvars, retvar)
  * "nextnonblank()" function
  */
     static void
-f_nextnonblank(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_nextnonblank(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     linenr_T	lnum;
 
-    for (lnum = get_vartv_lnum(argvars); ; ++lnum)
+    for (lnum = get_tv_lnum(argvars); ; ++lnum)
     {
 	if (lnum > curbuf->b_ml.ml_line_count)
 	{
@@ -7868,26 +8079,26 @@ f_nextnonblank(argvars, retvar)
 	if (*skipwhite(ml_get(lnum)) != NUL)
 	    break;
     }
-    retvar->vval.v_number = lnum;
+    rettv->vval.v_number = lnum;
 }
 
 /*
  * "prevnonblank()" function
  */
     static void
-f_prevnonblank(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_prevnonblank(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     linenr_T	lnum;
 
-    lnum = get_vartv_lnum(argvars);
+    lnum = get_tv_lnum(argvars);
     if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count)
 	lnum = 0;
     else
 	while (lnum >= 1 && *skipwhite(ml_get(lnum)) == NUL)
 	    --lnum;
-    retvar->vval.v_number = lnum;
+    rettv->vval.v_number = lnum;
 }
 
 #if defined(FEAT_CLIENTSERVER) && defined(FEAT_X11)
@@ -7924,9 +8135,9 @@ check_connection()
 
 /*ARGSUSED*/
     static void
-f_serverlist(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_serverlist(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*r = NULL;
 
@@ -7939,15 +8150,15 @@ f_serverlist(argvars, retvar)
 	r = serverGetVimNames(X_DISPLAY);
 # endif
 #endif
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = r;
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = r;
 }
 
 /*ARGSUSED*/
     static void
-f_remote_peek(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_remote_peek(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_CLIENTSERVER
     var		v;
@@ -7958,44 +8169,44 @@ f_remote_peek(argvars, retvar)
 
     if (check_restricted() || check_secure())
     {
-	retvar->vval.v_number = -1;
+	rettv->vval.v_number = -1;
 	return;
     }
 # ifdef WIN32
-    sscanf(get_vartv_string(&argvars[0]), "%x", &n);
+    sscanf(get_tv_string(&argvars[0]), "%x", &n);
     if (n == 0)
-	retvar->vval.v_number = -1;
+	rettv->vval.v_number = -1;
     else
     {
 	s = serverGetReply((HWND)n, FALSE, FALSE, FALSE);
-	retvar->vval.v_number = (s != NULL);
+	rettv->vval.v_number = (s != NULL);
     }
 # else
-    retvar->vval.v_number = 0;
+    rettv->vval.v_number = 0;
     if (check_connection() == FAIL)
 	return;
 
-    retvar->vval.v_number = serverPeekReply(X_DISPLAY,
-			   serverStrToWin(get_vartv_string(&argvars[0])), &s);
+    rettv->vval.v_number = serverPeekReply(X_DISPLAY,
+			   serverStrToWin(get_tv_string(&argvars[0])), &s);
 # endif
 
-    if (argvars[1].v_type != VAR_UNKNOWN && retvar->vval.v_number > 0)
+    if (argvars[1].v_type != VAR_UNKNOWN && rettv->vval.v_number > 0)
     {
 	v.tv.v_type = VAR_STRING;
 	v.tv.vval.v_string = vim_strsave(s);
-	set_var(get_vartv_string(&argvars[1]), &v.tv, FALSE);
+	set_var(get_tv_string(&argvars[1]), &v.tv, FALSE);
 	vim_free(v.tv.vval.v_string);
     }
 #else
-    retvar->vval.v_number = -1;
+    rettv->vval.v_number = -1;
 #endif
 }
 
 /*ARGSUSED*/
     static void
-f_remote_read(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_remote_read(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*r = NULL;
 
@@ -8006,33 +8217,33 @@ f_remote_read(argvars, retvar)
 	/* The server's HWND is encoded in the 'id' parameter */
 	int		n = 0;
 
-	sscanf(get_vartv_string(&argvars[0]), "%x", &n);
+	sscanf(get_tv_string(&argvars[0]), "%x", &n);
 	if (n != 0)
 	    r = serverGetReply((HWND)n, FALSE, TRUE, TRUE);
 	if (r == NULL)
 # else
 	if (check_connection() == FAIL || serverReadReply(X_DISPLAY,
-		serverStrToWin(get_vartv_string(&argvars[0])), &r, FALSE) < 0)
+		serverStrToWin(get_tv_string(&argvars[0])), &r, FALSE) < 0)
 # endif
 	    EMSG(_("E277: Unable to read a server reply"));
     }
 #endif
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = r;
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = r;
 }
 
 /*ARGSUSED*/
     static void
-f_server2client(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_server2client(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_CLIENTSERVER
     char_u	buf[NUMBUFLEN];
-    char_u	*server = get_vartv_string(&argvars[0]);
-    char_u	*reply = get_vartv_string_buf(&argvars[1], buf);
-
-    retvar->vval.v_number = -1;
+    char_u	*server = get_tv_string(&argvars[0]);
+    char_u	*reply = get_tv_string_buf(&argvars[1], buf);
+
+    rettv->vval.v_number = -1;
     if (check_restricted() || check_secure())
 	return;
 # ifdef FEAT_X11
@@ -8045,19 +8256,19 @@ f_server2client(argvars, retvar)
 	EMSG(_("E258: Unable to send to client"));
 	return;
     }
-    retvar->vval.v_number = 0;
+    rettv->vval.v_number = 0;
 #else
-    retvar->vval.v_number = -1;
+    rettv->vval.v_number = -1;
 #endif
 }
 
 #ifdef FEAT_CLIENTSERVER
-static void remote_common __ARGS((typeval *argvars, typeval *retvar, int expr));
-
-    static void
-remote_common(argvars, retvar, expr)
-    typeval	*argvars;
-    typeval	*retvar;
+static void remote_common __ARGS((typeval *argvars, typeval *rettv, int expr));
+
+    static void
+remote_common(argvars, rettv, expr)
+    typeval	*argvars;
+    typeval	*rettv;
     int		expr;
 {
     char_u	*server_name;
@@ -8078,8 +8289,8 @@ remote_common(argvars, retvar, expr)
 	return;
 # endif
 
-    server_name = get_vartv_string(&argvars[0]);
-    keys = get_vartv_string_buf(&argvars[1], buf);
+    server_name = get_tv_string(&argvars[0]);
+    keys = get_tv_string_buf(&argvars[1], buf);
 # ifdef WIN32
     if (serverSendToVim(server_name, keys, &r, &w, expr, TRUE) < 0)
 # else
@@ -8094,7 +8305,7 @@ remote_common(argvars, retvar, expr)
 	return;
     }
 
-    retvar->vval.v_string = r;
+    rettv->vval.v_string = r;
 
     if (argvars[2].v_type != VAR_UNKNOWN)
     {
@@ -8104,7 +8315,7 @@ remote_common(argvars, retvar, expr)
 	sprintf((char *)str, "0x%x", (unsigned int)w);
 	v.tv.v_type = VAR_STRING;
 	v.tv.vval.v_string = vim_strsave(str);
-	set_var(get_vartv_string(&argvars[2]), &v.tv, FALSE);
+	set_var(get_tv_string(&argvars[2]), &v.tv, FALSE);
 	vim_free(v.tv.vval.v_string);
     }
 }
@@ -8115,14 +8326,14 @@ remote_common(argvars, retvar, expr)
  */
 /*ARGSUSED*/
     static void
-f_remote_expr(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = NULL;
+f_remote_expr(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
 #ifdef FEAT_CLIENTSERVER
-    remote_common(argvars, retvar, TRUE);
+    remote_common(argvars, rettv, TRUE);
 #endif
 }
 
@@ -8131,14 +8342,14 @@ f_remote_expr(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_remote_send(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = NULL;
+f_remote_send(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
 #ifdef FEAT_CLIENTSERVER
-    remote_common(argvars, retvar, FALSE);
+    remote_common(argvars, rettv, FALSE);
 #endif
 }
 
@@ -8147,21 +8358,21 @@ f_remote_send(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_remote_foreground(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->vval.v_number = 0;
+f_remote_foreground(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->vval.v_number = 0;
 #ifdef FEAT_CLIENTSERVER
 # ifdef WIN32
     /* On Win32 it's done in this application. */
-    serverForeground(get_vartv_string(&argvars[0]));
+    serverForeground(get_tv_string(&argvars[0]));
 # else
     /* Send a foreground() expression to the server. */
     argvars[1].v_type = VAR_STRING;
     argvars[1].vval.v_string = vim_strsave((char_u *)"foreground()");
     argvars[2].v_type = VAR_UNKNOWN;
-    remote_common(argvars, retvar, TRUE);
+    remote_common(argvars, rettv, TRUE);
     vim_free(argvars[1].vval.v_string);
 # endif
 #endif
@@ -8172,9 +8383,9 @@ f_remote_foreground(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_repeat(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_repeat(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*p;
     int		n;
@@ -8183,11 +8394,11 @@ f_repeat(argvars, retvar)
     char_u	*r;
     int		i;
 
-    p = get_vartv_string(&argvars[0]);
-    n = get_vartv_number(&argvars[1]);
-
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = NULL;
+    p = get_tv_string(&argvars[0]);
+    n = get_tv_number(&argvars[1]);
+
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
 
     slen = (int)STRLEN(p);
     len = slen * n;
@@ -8203,7 +8414,7 @@ f_repeat(argvars, retvar)
         r[len] = NUL;
     }
 
-    retvar->vval.v_string = r;
+    rettv->vval.v_string = r;
 }
 
 #ifdef HAVE_STRFTIME
@@ -8211,26 +8422,26 @@ f_repeat(argvars, retvar)
  * "strftime({format}[, {time}])" function
  */
     static void
-f_strftime(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_strftime(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	result_buf[256];
     struct tm	*curtime;
     time_t	seconds;
     char_u	*p;
 
-    retvar->v_type = VAR_STRING;
-
-    p = get_vartv_string(&argvars[0]);
+    rettv->v_type = VAR_STRING;
+
+    p = get_tv_string(&argvars[0]);
     if (argvars[1].v_type == VAR_UNKNOWN)
 	seconds = time(NULL);
     else
-	seconds = (time_t)get_vartv_number(&argvars[1]);
+	seconds = (time_t)get_tv_number(&argvars[1]);
     curtime = localtime(&seconds);
     /* MSVC returns NULL for an invalid value of seconds. */
     if (curtime == NULL)
-	retvar->vval.v_string = vim_strsave((char_u *)_("(Invalid)"));
+	rettv->vval.v_string = vim_strsave((char_u *)_("(Invalid)"));
     else
     {
 # ifdef FEAT_MBYTE
@@ -8254,10 +8465,10 @@ f_strftime(argvars, retvar)
 	    vim_free(p);
 	convert_setup(&conv, enc, p_enc);
 	if (conv.vc_type != CONV_NONE)
-	    retvar->vval.v_string = string_convert(&conv, result_buf, NULL);
+	    rettv->vval.v_string = string_convert(&conv, result_buf, NULL);
 	else
 # endif
-	    retvar->vval.v_string = vim_strsave(result_buf);
+	    rettv->vval.v_string = vim_strsave(result_buf);
 
 # ifdef FEAT_MBYTE
 	/* Release conversion descriptors */
@@ -8272,32 +8483,32 @@ f_strftime(argvars, retvar)
  * "stridx()" function
  */
     static void
-f_stridx(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_stridx(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	buf[NUMBUFLEN];
     char_u	*needle;
     char_u	*haystack;
     char_u	*pos;
 
-    needle = get_vartv_string(&argvars[1]);
-    haystack = get_vartv_string_buf(&argvars[0], buf);
+    needle = get_tv_string(&argvars[1]);
+    haystack = get_tv_string_buf(&argvars[0], buf);
     pos	= (char_u *)strstr((char *)haystack, (char *)needle);
 
     if (pos == NULL)
-	retvar->vval.v_number = -1;
-    else
-	retvar->vval.v_number = (varnumber_T) (pos - haystack);
+	rettv->vval.v_number = -1;
+    else
+	rettv->vval.v_number = (varnumber_T) (pos - haystack);
 }
 
 /*
  * "strridx()" function
  */
     static void
-f_strridx(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_strridx(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	buf[NUMBUFLEN];
     char_u	*needle;
@@ -8305,8 +8516,8 @@ f_strridx(argvars, retvar)
     char_u	*rest;
     char_u	*lastmatch = NULL;
 
-    needle = get_vartv_string(&argvars[1]);
-    haystack = get_vartv_string_buf(&argvars[0], buf);
+    needle = get_tv_string(&argvars[1]);
+    haystack = get_tv_string_buf(&argvars[0], buf);
     if (*needle == NUL)
 	/* Empty string matches past the end. */
 	lastmatch = haystack + STRLEN(haystack);
@@ -8320,58 +8531,58 @@ f_strridx(argvars, retvar)
 	}
 
     if (lastmatch == NULL)
-	retvar->vval.v_number = -1;
-    else
-	retvar->vval.v_number = (varnumber_T)(lastmatch - haystack);
+	rettv->vval.v_number = -1;
+    else
+	rettv->vval.v_number = (varnumber_T)(lastmatch - haystack);
 }
 
 /*
  * "string()" function
  */
     static void
-f_string(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_string(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*tofree;
 
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = tv2string(&argvars[0], &tofree);
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = tv2string(&argvars[0], &tofree);
     if (tofree == NULL)
-	retvar->vval.v_string = vim_strsave(retvar->vval.v_string);
+	rettv->vval.v_string = vim_strsave(rettv->vval.v_string);
 }
 
 /*
  * "strlen()" function
  */
     static void
-f_strlen(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->vval.v_number = (varnumber_T)(STRLEN(
-					      get_vartv_string(&argvars[0])));
+f_strlen(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->vval.v_number = (varnumber_T)(STRLEN(
+					      get_tv_string(&argvars[0])));
 }
 
 /*
  * "strpart()" function
  */
     static void
-f_strpart(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_strpart(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*p;
     int		n;
     int		len;
     int		slen;
 
-    p = get_vartv_string(&argvars[0]);
+    p = get_tv_string(&argvars[0]);
     slen = (int)STRLEN(p);
 
-    n = get_vartv_number(&argvars[1]);
+    n = get_tv_number(&argvars[1]);
     if (argvars[2].v_type != VAR_UNKNOWN)
-	len = get_vartv_number(&argvars[2]);
+	len = get_tv_number(&argvars[2]);
     else
 	len = slen - n;	    /* default len: all bytes that are available. */
 
@@ -8391,20 +8602,20 @@ f_strpart(argvars, retvar)
     else if (n + len > slen)
 	len = slen - n;
 
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = vim_strnsave(p + n, len);
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = vim_strnsave(p + n, len);
 }
 
 /*
  * "strtrans()" function
  */
     static void
-f_strtrans(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = transstr(get_vartv_string(&argvars[0]));
+f_strtrans(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = transstr(get_tv_string(&argvars[0]));
 }
 
 /*
@@ -8412,9 +8623,9 @@ f_strtrans(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_synID(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_synID(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     int		id = 0;
 #ifdef FEAT_SYN_HL
@@ -8422,16 +8633,16 @@ f_synID(argvars, retvar)
     long	col;
     int		trans;
 
-    line = get_vartv_lnum(argvars);
-    col = get_vartv_number(&argvars[1]) - 1;
-    trans = get_vartv_number(&argvars[2]);
+    line = get_tv_lnum(argvars);
+    col = get_tv_number(&argvars[1]) - 1;
+    trans = get_tv_number(&argvars[2]);
 
     if (line >= 1 && line <= curbuf->b_ml.ml_line_count
 	    && col >= 0 && col < (long)STRLEN(ml_get(line)))
 	id = syn_get_id(line, col, trans);
 #endif
 
-    retvar->vval.v_number = id;
+    rettv->vval.v_number = id;
 }
 
 /*
@@ -8439,9 +8650,9 @@ f_synID(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_synIDattr(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_synIDattr(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*p = NULL;
 #ifdef FEAT_SYN_HL
@@ -8451,11 +8662,11 @@ f_synIDattr(argvars, retvar)
     char_u	modebuf[NUMBUFLEN];
     int		modec;
 
-    id = get_vartv_number(&argvars[0]);
-    what = get_vartv_string(&argvars[1]);
+    id = get_tv_number(&argvars[0]);
+    what = get_tv_string(&argvars[1]);
     if (argvars[2].v_type != VAR_UNKNOWN)
     {
-	mode = get_vartv_string_buf(&argvars[2], modebuf);
+	mode = get_tv_string_buf(&argvars[2], modebuf);
 	modec = TOLOWER_ASC(mode[0]);
 	if (modec != 't' && modec != 'c'
 #ifdef FEAT_GUI
@@ -8518,8 +8729,8 @@ f_synIDattr(argvars, retvar)
     if (p != NULL)
 	p = vim_strsave(p);
 #endif
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = p;
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = p;
 }
 
 /*
@@ -8527,14 +8738,14 @@ f_synIDattr(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_synIDtrans(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_synIDtrans(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     int		id;
 
 #ifdef FEAT_SYN_HL
-    id = get_vartv_number(&argvars[0]);
+    id = get_tv_number(&argvars[0]);
 
     if (id > 0)
 	id = syn_get_final_id(id);
@@ -8542,16 +8753,16 @@ f_synIDtrans(argvars, retvar)
 #endif
 	id = 0;
 
-    retvar->vval.v_number = id;
+    rettv->vval.v_number = id;
 }
 
 /*
  * "system()" function
  */
     static void
-f_system(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_system(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*res = NULL;
     char_u	*p;
@@ -8578,7 +8789,7 @@ f_system(argvars, retvar)
 	    EMSG2(_(e_notopen), infile);
 	    goto done;
 	}
-	p = get_vartv_string_buf(&argvars[1], buf);
+	p = get_tv_string_buf(&argvars[1], buf);
 	if (fwrite(p, STRLEN(p), 1, fd) != 1)
 	    err = TRUE;
 	if (fclose(fd) != 0)
@@ -8590,7 +8801,7 @@ f_system(argvars, retvar)
 	}
     }
 
-    res = get_cmd_output(get_vartv_string(&argvars[0]), infile, SHELL_SILENT);
+    res = get_cmd_output(get_tv_string(&argvars[0]), infile, SHELL_SILENT);
 
 #ifdef USE_CR
     /* translate <CR> into <NL> */
@@ -8629,40 +8840,40 @@ done:
 	mch_remove(infile);
 	vim_free(infile);
     }
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = res;
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = res;
 }
 
 /*
  * "submatch()" function
  */
     static void
-f_submatch(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
-{
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = reg_submatch((int)get_vartv_number(&argvars[0]));
+f_submatch(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
+{
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = reg_submatch((int)get_tv_number(&argvars[0]));
 }
 
 /*
  * "substitute()" function
  */
     static void
-f_substitute(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_substitute(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	patbuf[NUMBUFLEN];
     char_u	subbuf[NUMBUFLEN];
     char_u	flagsbuf[NUMBUFLEN];
 
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = do_string_sub(
-	    get_vartv_string(&argvars[0]),
-	    get_vartv_string_buf(&argvars[1], patbuf),
-	    get_vartv_string_buf(&argvars[2], subbuf),
-	    get_vartv_string_buf(&argvars[3], flagsbuf));
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = do_string_sub(
+	    get_tv_string(&argvars[0]),
+	    get_tv_string_buf(&argvars[1], patbuf),
+	    get_tv_string_buf(&argvars[2], subbuf),
+	    get_tv_string_buf(&argvars[3], flagsbuf));
 }
 
 /*
@@ -8670,14 +8881,14 @@ f_substitute(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_tempname(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_tempname(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     static int	x = 'A';
 
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = vim_tempname(x);
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = vim_tempname(x);
 
     /* Advance 'x' to use A-Z and 0-9, so that there are at least 34 different
      * names.  Skip 'I' and 'O', they are used for shell redirection. */
@@ -8705,15 +8916,15 @@ f_tempname(argvars, retvar)
  * "tolower(string)" function
  */
     static void
-f_tolower(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_tolower(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*p;
 
-    p = vim_strsave(get_vartv_string(&argvars[0]));
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = p;
+    p = vim_strsave(get_tv_string(&argvars[0]));
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = p;
 
     if (p != NULL)
 	while (*p != NUL)
@@ -8748,15 +8959,15 @@ f_tolower(argvars, retvar)
  * "toupper(string)" function
  */
     static void
-f_toupper(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_toupper(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*p;
 
-    p = vim_strsave(get_vartv_string(&argvars[0]));
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = p;
+    p = vim_strsave(get_tv_string(&argvars[0]));
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = p;
 
     if (p != NULL)
 	while (*p != NUL)
@@ -8791,9 +9002,9 @@ f_toupper(argvars, retvar)
  * "tr(string, fromstr, tostr)" function
  */
     static void
-f_tr(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_tr(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     char_u	*instr;
     char_u	*fromstr;
@@ -8812,13 +9023,13 @@ f_tr(argvars, retvar)
     char_u	buf2[NUMBUFLEN];
     garray_T	ga;
 
-    instr = get_vartv_string(&argvars[0]);
-    fromstr = get_vartv_string_buf(&argvars[1], buf);
-    tostr = get_vartv_string_buf(&argvars[2], buf2);
+    instr = get_tv_string(&argvars[0]);
+    fromstr = get_tv_string_buf(&argvars[1], buf);
+    tostr = get_tv_string_buf(&argvars[2], buf2);
 
     /* Default return value: empty string. */
-    retvar->v_type = VAR_STRING;
-    retvar->vval.v_string = NULL;
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
     ga_init2(&ga, (int)sizeof(char), 80);
 
 #ifdef FEAT_MBYTE
@@ -8901,30 +9112,30 @@ error:
 	}
     }
 
-    retvar->vval.v_string = ga.ga_data;
+    rettv->vval.v_string = ga.ga_data;
 }
 
 /*
  * "type(expr)" function
  */
     static void
-f_type(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_type(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     if (argvars[0].v_type == VAR_NUMBER)
-	retvar->vval.v_number = 0;
-    else
-	retvar->vval.v_number = 1;
+	rettv->vval.v_number = 0;
+    else
+	rettv->vval.v_number = 1;
 }
 
 /*
  * "virtcol(string)" function
  */
     static void
-f_virtcol(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_virtcol(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     colnr_T	vcol = 0;
     pos_T	*fp;
@@ -8936,7 +9147,7 @@ f_virtcol(argvars, retvar)
 	++vcol;
     }
 
-    retvar->vval.v_number = vcol;
+    rettv->vval.v_number = vcol;
 }
 
 /*
@@ -8944,26 +9155,26 @@ f_virtcol(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_visualmode(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_visualmode(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_VISUAL
     char_u	str[2];
 
-    retvar->v_type = VAR_STRING;
+    rettv->v_type = VAR_STRING;
     str[0] = curbuf->b_visual_mode_eval;
     str[1] = NUL;
-    retvar->vval.v_string = vim_strsave(str);
+    rettv->vval.v_string = vim_strsave(str);
 
     /* A non-zero number or non-empty string argument: reset mode. */
     if ((argvars[0].v_type == VAR_NUMBER
 		&& argvars[0].vval.v_number != 0)
 	    || (argvars[0].v_type == VAR_STRING
-		&& *get_vartv_string(&argvars[0]) != NUL))
+		&& *get_tv_string(&argvars[0]) != NUL))
 	curbuf->b_visual_mode_eval = NUL;
 #else
-    retvar->vval.v_number = 0; /* return anything, it won't work anyway */
+    rettv->vval.v_number = 0; /* return anything, it won't work anyway */
 #endif
 }
 
@@ -8971,17 +9182,17 @@ f_visualmode(argvars, retvar)
  * "winbufnr(nr)" function
  */
     static void
-f_winbufnr(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_winbufnr(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     win_T	*wp;
 
     wp = find_win_by_nr(&argvars[0]);
     if (wp == NULL)
-	retvar->vval.v_number = -1;
-    else
-	retvar->vval.v_number = wp->w_buffer->b_fnum;
+	rettv->vval.v_number = -1;
+    else
+	rettv->vval.v_number = wp->w_buffer->b_fnum;
 }
 
 /*
@@ -8989,29 +9200,29 @@ f_winbufnr(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_wincol(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_wincol(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     validate_cursor();
-    retvar->vval.v_number = curwin->w_wcol + 1;
+    rettv->vval.v_number = curwin->w_wcol + 1;
 }
 
 /*
  * "winheight(nr)" function
  */
     static void
-f_winheight(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_winheight(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     win_T	*wp;
 
     wp = find_win_by_nr(&argvars[0]);
     if (wp == NULL)
-	retvar->vval.v_number = -1;
-    else
-	retvar->vval.v_number = wp->w_height;
+	rettv->vval.v_number = -1;
+    else
+	rettv->vval.v_number = wp->w_height;
 }
 
 /*
@@ -9019,12 +9230,12 @@ f_winheight(argvars, retvar)
  */
 /*ARGSUSED*/
     static void
-f_winline(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_winline(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     validate_cursor();
-    retvar->vval.v_number = curwin->w_wrow + 1;
+    rettv->vval.v_number = curwin->w_wrow + 1;
 }
 
 /*
@@ -9032,9 +9243,9 @@ f_winline(argvars, retvar)
  */
 /* ARGSUSED */
     static void
-f_winnr(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_winnr(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     int		nr = 1;
 #ifdef FEAT_WINDOWS
@@ -9044,7 +9255,7 @@ f_winnr(argvars, retvar)
 
     if (argvars[0].v_type != VAR_UNKNOWN)
     {
-	arg = get_vartv_string(&argvars[0]);
+	arg = get_tv_string(&argvars[0]);
 	if (STRCMP(arg, "$") == 0)
 	    twin = lastwin;
 	else if (STRCMP(arg, "#") == 0)
@@ -9064,7 +9275,7 @@ f_winnr(argvars, retvar)
 	for (wp = firstwin; wp != twin; wp = wp->w_next)
 	    ++nr;
 #endif
-    retvar->vval.v_number = nr;
+    rettv->vval.v_number = nr;
 }
 
 /*
@@ -9072,9 +9283,9 @@ f_winnr(argvars, retvar)
  */
 /* ARGSUSED */
     static void
-f_winrestcmd(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_winrestcmd(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
 #ifdef FEAT_WINDOWS
     win_T	*wp;
@@ -9095,31 +9306,31 @@ f_winrestcmd(argvars, retvar)
     }
     ga_append(&ga, NUL);
 
-    retvar->vval.v_string = ga.ga_data;
+    rettv->vval.v_string = ga.ga_data;
 #else
-    retvar->vval.v_string = NULL;
-#endif
-    retvar->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
+#endif
+    rettv->v_type = VAR_STRING;
 }
 
 /*
  * "winwidth(nr)" function
  */
     static void
-f_winwidth(argvars, retvar)
-    typeval	*argvars;
-    typeval	*retvar;
+f_winwidth(argvars, rettv)
+    typeval	*argvars;
+    typeval	*rettv;
 {
     win_T	*wp;
 
     wp = find_win_by_nr(&argvars[0]);
     if (wp == NULL)
-	retvar->vval.v_number = -1;
+	rettv->vval.v_number = -1;
     else
 #ifdef FEAT_VERTSPLIT
-	retvar->vval.v_number = wp->w_width;
+	rettv->vval.v_number = wp->w_width;
 #else
-	retvar->vval.v_number = Columns;
+	rettv->vval.v_number = Columns;
 #endif
 }
 
@@ -9132,7 +9343,7 @@ find_win_by_nr(vp)
 #endif
     int		nr;
 
-    nr = get_vartv_number(vp);
+    nr = get_tv_number(vp);
 
 #ifdef FEAT_WINDOWS
     if (nr == 0)
@@ -9161,7 +9372,7 @@ var2fpos(varp, lnum)
     static pos_T	pos;
     pos_T	*pp;
 
-    name = get_vartv_string(varp);
+    name = get_tv_string(varp);
     if (name[0] == '.')		/* cursor */
 	return &curwin->w_cursor;
     if (name[0] == '\'')	/* mark */
@@ -9248,11 +9459,9 @@ get_func_len(arg, alias, evaluate)
     int		evaluate;
 {
     int		len;
-#ifdef FEAT_MAGIC_BRACES
     char_u	*p;
     char_u	*expr_start;
     char_u	*expr_end;
-#endif
 
     *alias = NULL;  /* default to no alias */
 
@@ -9270,12 +9479,10 @@ get_func_len(arg, alias, evaluate)
 	*arg += len;
     }
 
-#ifdef FEAT_MAGIC_BRACES
     /*
-     * Find the end of the name;
+     * Find the end of the name; check for {} construction.
      */
-    p = find_name_end(*arg, &expr_start, &expr_end);
-    /* check for {} construction */
+    p = find_name_end(*arg, &expr_start, &expr_end, FALSE);
     if (expr_start != NULL)
     {
 	char_u	*temp_string;
@@ -9298,7 +9505,6 @@ get_func_len(arg, alias, evaluate)
 	*arg = skipwhite(p);
 	return (int)STRLEN(temp_string);
     }
-#endif
 
     len += get_id_len(arg);
     if (len == 0)
@@ -9307,34 +9513,58 @@ get_func_len(arg, alias, evaluate)
     return len;
 }
 
+/*
+ * Find the end of a variable or function name, taking care of magic braces.
+ * If "expr_start" is not NULL then "expr_start" and "expr_end" are set to the
+ * start and end of the first magic braces item.
+ * Return a pointer to just after the name.  Equal to "arg" if there is no
+ * valid name.
+ */
     static char_u *
-find_name_end(arg, expr_start, expr_end)
+find_name_end(arg, expr_start, expr_end, incl_br)
     char_u	*arg;
     char_u	**expr_start;
     char_u	**expr_end;
-{
-    int		nesting = 0;
+    int		incl_br;	/* Include [] indexes */
+{
+    int		mb_nest = 0;
+    int		br_nest = 0;
     char_u	*p;
 
-    *expr_start = NULL;
-    *expr_end = NULL;
-
-    for (p = arg; (*p != NUL && (eval_isnamec(*p) || nesting != 0)); ++p)
-    {
-#ifdef FEAT_MAGIC_BRACES
-	if (*p == '{')
-	{
-	    nesting++;
-	    if (*expr_start == NULL)
-		*expr_start = p;
-	}
-	else if (*p == '}')
-	{
-	    nesting--;
-	    if (nesting == 0 && *expr_end == NULL)
-		*expr_end = p;
-	}
-#endif
+    if (expr_start != NULL)
+    {
+	*expr_start = NULL;
+	*expr_end = NULL;
+    }
+
+    for (p = arg; *p != NUL
+		    && (eval_isnamec(*p)
+			|| (*p == '[' && incl_br)
+			|| mb_nest != 0
+			|| br_nest != 0); ++p)
+    {
+	if (mb_nest == 0)
+	{
+	    if (*p == '[')
+		++br_nest;
+	    else if (*p == ']')
+		--br_nest;
+	}
+	if (br_nest == 0)
+	{
+	    if (*p == '{')
+	    {
+		mb_nest++;
+		if (expr_start != NULL && *expr_start == NULL)
+		    *expr_start = p;
+	    }
+	    else if (*p == '}')
+	    {
+		mb_nest--;
+		if (expr_start != NULL && mb_nest == 0 && *expr_end == NULL)
+		    *expr_end = p;
+	    }
+	}
     }
 
     return p;
@@ -9347,11 +9577,7 @@ find_name_end(arg, expr_start, expr_end)
 eval_isnamec(c)
     int	    c;
 {
-    return (ASCII_ISALNUM(c) || c == '_' || c == ':'
-#ifdef FEAT_MAGIC_BRACES
-	    || c == '{' || c == '}'
-#endif
-	    );
+    return (ASCII_ISALNUM(c) || c == '_' || c == ':' || c == '{' || c == '}');
 }
 
 /*
@@ -9556,10 +9782,10 @@ set_cmdarg(eap, oldarg)
  * Return OK or FAIL.
  */
     static int
-get_var_vartv(name, len, retvar)
+get_var_tv(name, len, rettv)
     char_u	*name;
     int		len;		/* length of "name" */
-    typeval	*retvar;	/* NULL when only checking existence */
+    typeval	*rettv;		/* NULL when only checking existence */
 {
     int		ret = OK;
     typeval	tv;
@@ -9606,12 +9832,12 @@ get_var_vartv(name, len, retvar)
 
     if (tv.v_type == VAR_UNKNOWN)
     {
-	if (retvar != NULL)
-	    EMSG2(_("E121: Undefined variable: %s"), name);
+	if (rettv != NULL)
+	    EMSG2(_(e_undefvar), name);
 	ret = FAIL;
     }
-    else if (retvar != NULL)
-	copy_vartv(&tv, retvar);
+    else if (rettv != NULL)
+	copy_tv(&tv, rettv);
 
     name[len] = cc;
 
@@ -9619,20 +9845,11 @@ get_var_vartv(name, len, retvar)
 }
 
 /*
- * Allocate memory for a variable, and make it emtpy (0 or NULL value).
- */
-    static VAR
-alloc_var()
-{
-    return (VAR)alloc_clear((unsigned)sizeof(var));
-}
-
-/*
  * Allocate memory for a variable type-value, and make it emtpy (0 or NULL
  * value).
  */
     static typeval *
-alloc_vartv()
+alloc_tv()
 {
     return (typeval *)alloc_clear((unsigned)sizeof(typeval));
 }
@@ -9643,27 +9860,27 @@ alloc_vartv()
  * Return NULL for out of memory, the variable otherwise.
  */
     static typeval *
-alloc_string_vartv(s)
+alloc_string_tv(s)
     char_u	*s;
 {
-    typeval	*retvar;
-
-    retvar = alloc_vartv();
-    if (retvar != NULL)
-    {
-	retvar->v_type = VAR_STRING;
-	retvar->vval.v_string = s;
+    typeval	*rettv;
+
+    rettv = alloc_tv();
+    if (rettv != NULL)
+    {
+	rettv->v_type = VAR_STRING;
+	rettv->vval.v_string = s;
     }
     else
 	vim_free(s);
-    return retvar;
+    return rettv;
 }
 
 /*
  * Free the memory for a variable type-value.
  */
     static void
-free_vartv(varp)
+free_tv(varp)
     typeval *varp;
 {
     if (varp != NULL)
@@ -9688,7 +9905,7 @@ free_vartv(varp)
  * Free the memory for a variable value and set the value to NULL or 0.
  */
     static void
-clear_vartv(varp)
+clear_tv(varp)
     typeval *varp;
 {
     if (varp != NULL)
@@ -9703,11 +9920,26 @@ clear_vartv(varp)
 	    case VAR_LIST:
 		list_unref(varp->vval.v_list);
 		break;
-	    default:
+	    case VAR_NUMBER:
 		varp->vval.v_number = 0;
 		break;
-	}
-    }
+	    case VAR_UNKNOWN:
+		break;
+	    default:
+		EMSG2(_(e_intern2), "clear_tv()");
+	}
+    }
+}
+
+/*
+ * Set the value of a variable to NULL without freeing items.
+ */
+    static void
+init_tv(varp)
+    typeval *varp;
+{
+    if (varp != NULL)
+	vim_memset(varp, 0, sizeof(typeval));
 }
 
 /*
@@ -9715,7 +9947,7 @@ clear_vartv(varp)
  * If it is a String variable, uses vim_str2nr().
  */
     static long
-get_vartv_number(varp)
+get_tv_number(varp)
     typeval	*varp;
 {
     long	n = 0L;
@@ -9743,19 +9975,19 @@ get_vartv_number(varp)
  * Get the lnum from the first argument.  Also accepts ".", "$", etc.
  */
     static linenr_T
-get_vartv_lnum(argvars)
-    typeval	*argvars;
-{
-    typeval	retvar;
+get_tv_lnum(argvars)
+    typeval	*argvars;
+{
+    typeval	rettv;
     linenr_T	lnum;
 
-    lnum = get_vartv_number(&argvars[0]);
+    lnum = get_tv_number(&argvars[0]);
     if (lnum == 0)  /* no valid number, try using line() */
     {
-	retvar.v_type = VAR_NUMBER;
-	f_line(argvars, &retvar);
-	lnum = retvar.vval.v_number;
-	clear_vartv(&retvar);
+	rettv.v_type = VAR_NUMBER;
+	f_line(argvars, &rettv);
+	lnum = rettv.vval.v_number;
+	clear_tv(&rettv);
     }
     return lnum;
 }
@@ -9769,16 +10001,16 @@ get_vartv_lnum(argvars)
  * Never returns NULL;
  */
     static char_u *
-get_vartv_string(varp)
+get_tv_string(varp)
     typeval	*varp;
 {
     static char_u   mybuf[NUMBUFLEN];
 
-    return get_vartv_string_buf(varp, mybuf);
+    return get_tv_string_buf(varp, mybuf);
 }
 
     static char_u *
-get_vartv_string_buf(varp, buf)
+get_tv_string_buf(varp, buf)
     typeval	*varp;
     char_u	*buf;
 {
@@ -9798,7 +10030,7 @@ get_vartv_string_buf(varp, buf)
 		return varp->vval.v_string;
 	    break;
 	default:
-	    EMSG(_("E999: Internal error: get_vartv_string_buf()"));
+	    EMSG2(_(e_intern2), "get_tv_string_buf()");
 	    break;
     }
     return (char_u *)"";
@@ -9971,7 +10203,7 @@ clear_var(v)
 {
     vim_free(v->v_name);
     v->v_name = NULL;
-    clear_vartv(&v->tv);
+    clear_tv(&v->tv);
 }
 
 /*
@@ -10046,15 +10278,15 @@ list_one_var_a(prefix, name, type, strin
 }
 
 /*
- * Set variable "name" to value in "varp".
+ * Set variable "name" to value in "tv".
  * If the variable already exists, the value is updated.
  * Otherwise the variable is created.
  */
     static void
-set_var(name, varp, copy)
+set_var(name, tv, copy)
     char_u	*name;
-    typeval	*varp;
-    int		copy;	    /* make copy of value in "varp" */
+    typeval	*tv;
+    int		copy;	    /* make copy of value in "tv" */
 {
     int		i;
     VAR		v;
@@ -10076,22 +10308,22 @@ set_var(name, varp, copy)
 	    if (vimvars[i].type == VAR_STRING)
 	    {
 		vim_free(vimvars[i].val);
-		if (copy || varp->v_type != VAR_STRING)
-		    vimvars[i].val = vim_strsave(get_vartv_string(varp));
+		if (copy || tv->v_type != VAR_STRING)
+		    vimvars[i].val = vim_strsave(get_tv_string(tv));
 		else
 		{
 		    /* Take over the string to avoid an extra alloc/free. */
-		    vimvars[i].val = varp->vval.v_string;
-		    varp->vval.v_string = NULL;
+		    vimvars[i].val = tv->vval.v_string;
+		    tv->vval.v_string = NULL;
 		}
 	    }
 	    else
-		vimvars[i].val = (char_u *)get_vartv_number(varp);
+		vimvars[i].val = (char_u *)get_tv_number(tv);
 	}
 	return;
     }
 
-    if (varp->v_type == VAR_FUNC)
+    if (tv->v_type == VAR_FUNC)
     {
 	if (!(vim_strchr((char_u *)"wbs", name[0]) != NULL && name[1] == ':')
 		&& !ASCII_ISUPPER((name[0] != NUL && name[1] == ':')
@@ -10110,17 +10342,16 @@ set_var(name, varp, copy)
     v = find_var(name, TRUE);
     if (v != NULL)	    /* existing variable, only need to free string */
     {
-	if (v->tv.v_type != varp->v_type
+	if (v->tv.v_type != tv->v_type
 		&& !((v->tv.v_type == VAR_STRING
 			|| v->tv.v_type == VAR_NUMBER)
-		    && (varp->v_type == VAR_STRING
-			|| varp->v_type == VAR_NUMBER)))
+		    && (tv->v_type == VAR_STRING
+			|| tv->v_type == VAR_NUMBER)))
 	{
 	    EMSG2(_("E999: Variable type mismatch for: %s"), name);
 	    return;
 	}
-	if (v->tv.v_type == VAR_STRING || v->tv.v_type == VAR_FUNC)
-	    vim_free(v->tv.vval.v_string);
+	clear_tv(&v->tv);
     }
     else		    /* add a new variable */
     {
@@ -10147,13 +10378,12 @@ set_var(name, varp, copy)
 	if (i == gap->ga_len)
 	    ++gap->ga_len;
     }
-    if (copy || (varp->v_type != VAR_STRING && varp->v_type != VAR_FUNC))
-	copy_vartv(varp, &v->tv);
-    else
-    {
-	v->tv.v_type = varp->v_type;
-	v->tv.vval.v_string = varp->vval.v_string;
-	varp->vval.v_string = NULL;
+    if (copy || tv->v_type == VAR_NUMBER)
+	copy_tv(tv, &v->tv);
+    else
+    {
+	v->tv = *tv;
+	init_tv(tv);
     }
 }
 
@@ -10163,7 +10393,7 @@ set_var(name, varp, copy)
  * Does not make a copy of a list!
  */
     static void
-copy_vartv(from, to)
+copy_tv(from, to)
     typeval *from;
     typeval *to;
 {
@@ -10190,7 +10420,7 @@ copy_vartv(from, to)
 	    }
 	    break;
 	default:
-	    EMSG(_("E999: Internal error: copy_vartv()"));
+	    EMSG2(_(e_intern2), "copy_tv()");
 	    break;
     }
 }
@@ -10205,7 +10435,7 @@ ex_echo(eap)
     exarg_T	*eap;
 {
     char_u	*arg = eap->arg;
-    typeval	retvar;
+    typeval	rettv;
     char_u	*tofree;
     char_u	*p;
     int		needclr = TRUE;
@@ -10216,7 +10446,7 @@ ex_echo(eap)
     while (*arg != NUL && *arg != '|' && *arg != '\n' && !got_int)
     {
 	p = arg;
-	if (eval1(&arg, &retvar, !eap->skip) == FAIL)
+	if (eval1(&arg, &rettv, !eap->skip) == FAIL)
 	{
 	    /*
 	     * Report the invalid expression unless the expression evaluation
@@ -10239,7 +10469,7 @@ ex_echo(eap)
 	    }
 	    else if (eap->cmdidx == CMD_echo)
 		msg_puts_attr((char_u *)" ", echo_attr);
-	    for (p = tv2string(&retvar, &tofree); *p != NUL && !got_int; ++p)
+	    for (p = tv2string(&rettv, &tofree); *p != NUL && !got_int; ++p)
 		if (*p == '\n' || *p == '\r' || *p == TAB)
 		{
 		    if (*p != TAB && needclr)
@@ -10266,7 +10496,7 @@ ex_echo(eap)
 		}
 	    vim_free(tofree);
 	}
-	clear_vartv(&retvar);
+	clear_tv(&rettv);
 	arg = skipwhite(arg);
     }
     eap->nextcmd = check_nextcmd(arg);
@@ -10311,7 +10541,7 @@ ex_execute(eap)
     exarg_T	*eap;
 {
     char_u	*arg = eap->arg;
-    typeval	retvar;
+    typeval	rettv;
     int		ret = OK;
     char_u	*p;
     garray_T	ga;
@@ -10325,7 +10555,7 @@ ex_execute(eap)
     while (*arg != NUL && *arg != '|' && *arg != '\n')
     {
 	p = arg;
-	if (eval1(&arg, &retvar, !eap->skip) == FAIL)
+	if (eval1(&arg, &rettv, !eap->skip) == FAIL)
 	{
 	    /*
 	     * Report the invalid expression unless the expression evaluation
@@ -10340,11 +10570,11 @@ ex_execute(eap)
 
 	if (!eap->skip)
 	{
-	    p = get_vartv_string(&retvar);
+	    p = get_tv_string(&rettv);
 	    len = (int)STRLEN(p);
 	    if (ga_grow(&ga, len + 2) == FAIL)
 	    {
-		clear_vartv(&retvar);
+		clear_tv(&rettv);
 		ret = FAIL;
 		break;
 	    }
@@ -10354,7 +10584,7 @@ ex_execute(eap)
 	    ga.ga_len += len;
 	}
 
-	clear_vartv(&retvar);
+	clear_tv(&rettv);
 	arg = skipwhite(arg);
     }
 
@@ -10432,9 +10662,7 @@ ex_function(eap)
     char_u	*theline;
     int		j;
     int		c;
-#ifdef FEAT_MAGIC_BRACES
     int		saved_did_emsg;
-#endif
     char_u	*name = NULL;
     char_u	*p;
     char_u	*arg;
@@ -10476,12 +10704,10 @@ ex_function(eap)
 	else
 	    eap->skip = TRUE;
     }
-#ifdef FEAT_MAGIC_BRACES
     /* An error in a function call during evaluation of an expression in magic
      * braces should not cause the function not to be defined. */
     saved_did_emsg = did_emsg;
     did_emsg = FALSE;
-#endif
 
     /*
      * ":function func" with only function name: list function.
@@ -10784,9 +11010,7 @@ ex_function(eap)
     fp->flags = flags;
     fp->calls = 0;
     fp->script_ID = current_SID;
-#ifdef FEAT_MAGIC_BRACES
     did_emsg |= saved_did_emsg;
-#endif
     vim_free(skip_until);
     return;
 
@@ -10796,9 +11020,7 @@ erret:
     ga_clear_strings(&newlines);
 erret_name:
     vim_free(name);
-#ifdef FEAT_MAGIC_BRACES
     did_emsg |= saved_did_emsg;
-#endif
 }
 
 /*
@@ -10826,14 +11048,13 @@ trans_function_name(pp, skip, internal)
     lead = eval_fname_script(start);
     if (lead > 0)
 	start += lead;
-    end = find_name_end(start, &expr_start, &expr_end);
+    end = find_name_end(start, &expr_start, &expr_end, FALSE);
     if (end == start)
     {
 	if (!skip)
 	    EMSG(_("E129: Function name required"));
 	return NULL;
     }
-#ifdef FEAT_MAGIC_BRACES
     if (expr_start != NULL && !skip)
     {
 	/* expand magic curlies */
@@ -10855,7 +11076,6 @@ trans_function_name(pp, skip, internal)
 	len = (int)STRLEN(temp_string);
     }
     else
-#endif
 	len = (int)(end - start);
 
     /*
@@ -11129,11 +11349,11 @@ ex_delfunction(eap)
  * Call a user function.
  */
     static void
-call_user_func(fp, argcount, argvars, retvar, firstline, lastline)
+call_user_func(fp, argcount, argvars, rettv, firstline, lastline)
     ufunc_T	*fp;		/* pointer to function */
     int		argcount;	/* nr of args */
     typeval	*argvars;	/* arguments */
-    typeval	*retvar;		/* return value */
+    typeval	*rettv;		/* return value */
     linenr_T	firstline;	/* first line of range */
     linenr_T	lastline;	/* last line of range */
 {
@@ -11149,8 +11369,8 @@ call_user_func(fp, argcount, argvars, re
     if (depth >= p_mfd)
     {
 	EMSG(_("E132: Function call depth is higher than 'maxfuncdepth'"));
-	retvar->v_type = VAR_NUMBER;
-	retvar->vval.v_number = -1;
+	rettv->v_type = VAR_NUMBER;
+	rettv->vval.v_number = -1;
 	return;
     }
     ++depth;
@@ -11162,8 +11382,8 @@ call_user_func(fp, argcount, argvars, re
     fc.func = fp;
     fc.argcount = argcount;
     fc.argvars = argvars;
-    fc.retvar = retvar;
-    retvar->vval.v_number = 0;
+    fc.rettv = rettv;
+    rettv->vval.v_number = 0;
     fc.linenr = 0;
     fc.returned = FALSE;
     fc.level = ex_nesting_level;
@@ -11216,7 +11436,7 @@ call_user_func(fp, argcount, argvars, re
 			msg_outnum((long)argvars[i].vval.v_number);
 		    else
 		    {
-			trunc_string(get_vartv_string(&argvars[i]),
+			trunc_string(get_tv_string(&argvars[i]),
 							    buf, MSG_BUF_LEN);
 			msg_puts((char_u *)"\"");
 			msg_puts(buf);
@@ -11242,11 +11462,11 @@ call_user_func(fp, argcount, argvars, re
     --RedrawingDisabled;
 
     /* when the function was aborted because of an error, return -1 */
-    if ((did_emsg && (fp->flags & FC_ABORT)) || retvar->v_type == VAR_UNKNOWN)
-    {
-	clear_vartv(retvar);
-	retvar->v_type = VAR_NUMBER;
-	retvar->vval.v_number = -1;
+    if ((did_emsg && (fp->flags & FC_ABORT)) || rettv->v_type == VAR_UNKNOWN)
+    {
+	clear_tv(rettv);
+	rettv->v_type = VAR_NUMBER;
+	rettv->vval.v_number = -1;
     }
 
     /* when being verbose, mention the return value */
@@ -11264,12 +11484,12 @@ call_user_func(fp, argcount, argvars, re
 
 	if (aborting())
 	    smsg((char_u *)_("%s aborted"), sn);
-	else if (fc.retvar->v_type == VAR_NUMBER)
+	else if (fc.rettv->v_type == VAR_NUMBER)
 	    smsg((char_u *)_("%s returning #%ld"), sn,
-					      (long)fc.retvar->vval.v_number);
-	else if (fc.retvar->v_type == VAR_STRING)
-	{
-	    val = get_vartv_string(fc.retvar);
+					      (long)fc.rettv->vval.v_number);
+	else if (fc.rettv->v_type == VAR_STRING)
+	{
+	    val = get_tv_string(fc.rettv);
 	    if (STRLEN(val) > IOSIZE / 2 - 50)
 		val = val + STRLEN(val) - (IOSIZE / 2 - 50);
 	    smsg((char_u *)_("%s returning \"%s\""), sn, val);
@@ -11309,7 +11529,7 @@ ex_return(eap)
     exarg_T	*eap;
 {
     char_u	*arg = eap->arg;
-    var		retvar;
+    typeval	rettv;
     int		returning = FALSE;
 
     if (current_funccal == NULL)
@@ -11323,12 +11543,12 @@ ex_return(eap)
 
     eap->nextcmd = NULL;
     if ((*arg != NUL && *arg != '|' && *arg != '\n')
-	    && eval0(arg, &retvar, &eap->nextcmd, !eap->skip) != FAIL)
+	    && eval0(arg, &rettv, &eap->nextcmd, !eap->skip) != FAIL)
     {
 	if (!eap->skip)
-	    returning = do_return(eap, FALSE, TRUE, &retvar);
+	    returning = do_return(eap, FALSE, TRUE, &rettv);
 	else
-	    clear_vartv(&retvar.tv);
+	    clear_tv(&rettv);
     }
     /* It's safer to return also on error. */
     else if (!eap->skip)
@@ -11357,16 +11577,16 @@ ex_return(eap)
  * Return from a function.  Possibly makes the return pending.  Also called
  * for a pending return at the ":endtry" or after returning from an extra
  * do_cmdline().  "reanimate" is used in the latter case.  "is_cmd" is set
- * when called due to a ":return" command.  "value" may point to a variable
- * with the return value.  Returns TRUE when the return can be carried out,
+ * when called due to a ":return" command.  "rettv" may point to a typeval
+ * with the return rettv.  Returns TRUE when the return can be carried out,
  * FALSE when the return gets pending.
  */
     int
-do_return(eap, reanimate, is_cmd, value)
+do_return(eap, reanimate, is_cmd, rettv)
     exarg_T	*eap;
     int		reanimate;
     int		is_cmd;
-    void	*value;
+    void	*rettv;
 {
     int		idx;
     struct condstack *cstack = eap->cstack;
@@ -11387,38 +11607,38 @@ do_return(eap, reanimate, is_cmd, value)
 	cstack->cs_pending[idx] = CSTP_RETURN;
 
 	if (!is_cmd && !reanimate)
-	    /* A pending return again gets pending.  "value" points to an
-	     * allocated variable with the value of the original ":return"'s
+	    /* A pending return again gets pending.  "rettv" points to an
+	     * allocated variable with the rettv of the original ":return"'s
 	     * argument if present or is NULL else. */
-	    cstack->cs_retvar[idx] = value;
+	    cstack->cs_rettv[idx] = rettv;
 	else
 	{
 	    /* When undoing a return in order to make it pending, get the stored
-	     * return value. */
+	     * return rettv. */
 	    if (reanimate)
-		value = current_funccal->retvar;
-
-	    if (value != NULL)
+		rettv = current_funccal->rettv;
+
+	    if (rettv != NULL)
 	    {
 		/* Store the value of the pending return. */
-		if ((cstack->cs_retvar[idx] = alloc_var()) != NULL)
-		    *(typeval *)cstack->cs_retvar[idx] = *(typeval *)value;
+		if ((cstack->cs_rettv[idx] = alloc_tv()) != NULL)
+		    *(typeval *)cstack->cs_rettv[idx] = *(typeval *)rettv;
 		else
 		    EMSG(_(e_outofmem));
 	    }
 	    else
-		cstack->cs_retvar[idx] = NULL;
+		cstack->cs_rettv[idx] = NULL;
 
 	    if (reanimate)
 	    {
 		/* The pending return value could be overwritten by a ":return"
 		 * without argument in a finally clause; reset the default
 		 * return value. */
-		current_funccal->retvar->v_type = VAR_NUMBER;
-		current_funccal->retvar->vval.v_number = 0;
-	    }
-	}
-	report_make_pending(CSTP_RETURN, value);
+		current_funccal->rettv->v_type = VAR_NUMBER;
+		current_funccal->rettv->vval.v_number = 0;
+	    }
+	}
+	report_make_pending(CSTP_RETURN, rettv);
     }
     else
     {
@@ -11427,12 +11647,12 @@ do_return(eap, reanimate, is_cmd, value)
 	/* If the return is carried out now, store the return value.  For
 	 * a return immediately after reanimation, the value is already
 	 * there. */
-	if (!reanimate && value != NULL)
-	{
-	    clear_vartv(current_funccal->retvar);
-	    *current_funccal->retvar = *(typeval *)value;
+	if (!reanimate && rettv != NULL)
+	{
+	    clear_tv(current_funccal->rettv);
+	    *current_funccal->rettv = *(typeval *)rettv;
 	    if (!is_cmd)
-		vim_free(value);
+		vim_free(rettv);
 	}
     }
 
@@ -11443,34 +11663,34 @@ do_return(eap, reanimate, is_cmd, value)
  * Free the variable with a pending return value.
  */
     void
-discard_pending_return(retvar)
-    void	*retvar;
-{
-    /* The variable was copied from one with an undefined v_name.  So we can't
-     * use free_vartv() to clear and free it. */
-    clear_vartv(&((VAR)retvar)->tv);
-    vim_free(retvar);
-}
-
-/*
- * Generate a return command for producing the value of "retvar".  The result
+discard_pending_return(rettv)
+    void	*rettv;
+{
+    free_tv((typeval *)rettv);
+}
+
+/*
+ * Generate a return command for producing the value of "rettv".  The result
  * is an allocated string.  Used by report_pending() for verbose messages.
  */
     char_u *
-get_return_cmd(retvar)
-    void	*retvar;
-{
-    char_u	*s = IObuff;
-
-    if (retvar == NULL || ((VAR)retvar)->tv.v_type == VAR_UNKNOWN)
-	s = (char_u *)":return";
-    else if (((VAR)retvar)->tv.v_type == VAR_STRING)
-	sprintf((char *)IObuff, ":return \"%s\"",
-		((VAR)retvar)->tv.vval.v_string);
-    else
-	sprintf((char *)IObuff, ":return %ld",
-		(long)(((VAR)retvar)->tv.vval.v_number));
-    return vim_strsave(s);
+get_return_cmd(rettv)
+    void	*rettv;
+{
+    char_u	*s;
+    char_u	*tofree = NULL;
+
+    if (rettv == NULL)
+	s = (char_u *)"";
+    else
+	s = tv2string((typeval *)rettv, &tofree);
+
+    STRCPY(IObuff, ":return ");
+    STRNCPY(IObuff + 8, s, IOSIZE - 8);
+    if (STRLEN(s) + 8 >= IOSIZE)
+	STRCPY(IObuff + IOSIZE - 4, "...");
+    vim_free(tofree);
+    return vim_strsave(IObuff);
 }
 
 /*
@@ -11586,7 +11806,7 @@ read_viminfo_varlist(virp, writing)
 {
     char_u	*tab;
     int		is_string = FALSE;
-    typeval	*vartvp = NULL;
+    typeval	*tvp = NULL;
     char_u	*val;
 
     if (!writing && (find_viminfo_parameter('!') != NULL))
@@ -11601,28 +11821,28 @@ read_viminfo_varlist(virp, writing)
 	    tab = vim_strchr(tab, '\t');
 	    if (tab != NULL)
 	    {
-		/* create a nameless variable to hold the value */
+		/* create a typeval to hold the value */
 		if (is_string)
 		{
 		    val = viminfo_readstring(virp,
 				       (int)(tab - virp->vir_line + 1), TRUE);
 		    if (val != NULL)
-			vartvp = alloc_string_vartv(val);
+			tvp = alloc_string_tv(val);
 		}
 		else
 		{
-		    vartvp = alloc_vartv();
-		    if (vartvp != NULL)
+		    tvp = alloc_tv();
+		    if (tvp != NULL)
 		    {
-			vartvp->v_type = VAR_NUMBER;
-			vartvp->vval.v_number = atol((char *)tab + 1);
+			tvp->v_type = VAR_NUMBER;
+			tvp->vval.v_number = atol((char *)tab + 1);
 		    }
 		}
 		/* assign the value to the variable */
-		if (vartvp != NULL)
+		if (tvp != NULL)
 		{
-		    set_var(virp->vir_line + 1, vartvp, FALSE);
-		    free_vartv(vartvp);
+		    set_var(virp->vir_line + 1, tvp, FALSE);
+		    free_tv(tvp);
 		}
 	    }
 	}
@@ -11641,6 +11861,8 @@ write_viminfo_varlist(fp)
     garray_T	*gap = &variables;		/* global variable */
     VAR		this_var;
     int		i;
+    char	*s;
+    char_u	*tofree;
 
     if (find_viminfo_parameter('!') == NULL)
 	return;
@@ -11652,9 +11874,19 @@ write_viminfo_varlist(fp)
 	if (this_var->v_name != NULL
 		&& var_flavour(this_var->v_name) == VAR_FLAVOUR_VIMINFO)
 	{
-	    fprintf(fp, "!%s\t%s\t", this_var->v_name,
-			  (this_var->tv.v_type == VAR_STRING) ? "STR" : "NUM");
-	    viminfo_writestring(fp, get_var_string(this_var));
+	    switch (this_var->tv.v_type)
+	    {
+		case VAR_STRING: s = "STR"; break;
+		case VAR_NUMBER: s = "NUM"; break;
+		case VAR_LIST:   s = "LST"; break;
+		case VAR_FUNC:   s = "FUN"; break;
+		default:
+		     EMSGN(_("E999: Internal error: write_viminfo_varlist(): %ld"), (long)this_var->tv.v_type);
+		     s = "ERR";
+	    }
+	    fprintf(fp, "!%s\t%s\t", this_var->v_name, s);
+	    viminfo_writestring(fp, tv2string(&this_var->tv, &tofree));
+	    vim_free(tofree);
 	}
     }
 }