diff --git a/src/evalfunc.c b/src/evalfunc.c
index 15c625c..cbe2a4e 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -1133,12 +1133,12 @@
  * Returns -1 on error.
  */
     static linenr_T
-get_tv_lnum(typval_T *argvars)
+tv_get_lnum(typval_T *argvars)
 {
     typval_T	rettv;
     linenr_T	lnum;
 
-    lnum = (linenr_T)get_tv_number_chk(&argvars[0], NULL);
+    lnum = (linenr_T)tv_get_number_chk(&argvars[0], NULL);
     if (lnum == 0)  /* no valid number, try using line() */
     {
 	rettv.v_type = VAR_NUMBER;
@@ -1149,6 +1149,22 @@
     return lnum;
 }
 
+/*
+ * Get the lnum from the first argument.
+ * Also accepts "$", then "buf" is used.
+ * Returns 0 on error.
+ */
+    static linenr_T
+tv_get_lnum_buf(typval_T *argvars, buf_T *buf)
+{
+    if (argvars[0].v_type == VAR_STRING
+	    && argvars[0].vval.v_string != NULL
+	    && argvars[0].vval.v_string[0] == '$'
+	    && buf != NULL)
+	return buf->b_ml.ml_line_count;
+    return (linenr_T)tv_get_number_chk(&argvars[0], NULL);
+}
+
 #ifdef FEAT_FLOAT
 /*
  * Get the float value of "argvars[0]" into "f".
@@ -1187,7 +1203,7 @@
 	varnumber_T	n;
 	int		error = FALSE;
 
-	n = get_tv_number_chk(&argvars[0], &error);
+	n = tv_get_number_chk(&argvars[0], &error);
 	if (error)
 	    rettv->vval.v_number = -1;
 	else if (n > 0)
@@ -1240,24 +1256,8 @@
     static void
 f_and(typval_T *argvars, typval_T *rettv)
 {
-    rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL)
-					& get_tv_number_chk(&argvars[1], NULL);
-}
-
-/*
- * Get the lnum from the first argument.
- * Also accepts "$", then "buf" is used.
- * Returns 0 on error.
- */
-    static linenr_T
-get_tv_lnum_buf(typval_T *argvars, buf_T *buf)
-{
-    if (argvars[0].v_type == VAR_STRING
-	    && argvars[0].vval.v_string != NULL
-	    && argvars[0].vval.v_string[0] == '$'
-	    && buf != NULL)
-	return buf->b_ml.ml_line_count;
-    return (linenr_T)get_tv_number_chk(&argvars[0], NULL);
+    rettv->vval.v_number = tv_get_number_chk(&argvars[0], NULL)
+					& tv_get_number_chk(&argvars[1], NULL);
 }
 
 /*
@@ -1330,7 +1330,7 @@
 	li = l->lv_first;
     }
     else
-	line = get_tv_string_chk(lines);
+	line = tv_get_string_chk(lines);
 
     /* default result is zero == OK */
     for (;;)
@@ -1340,7 +1340,7 @@
 	    /* list argument, get next string */
 	    if (li == NULL)
 		break;
-	    line = get_tv_string_chk(&li->li_tv);
+	    line = tv_get_string_chk(&li->li_tv);
 	    li = li->li_next;
 	}
 
@@ -1411,7 +1411,7 @@
     static void
 f_append(typval_T *argvars, typval_T *rettv)
 {
-    linenr_T	lnum = get_tv_lnum(&argvars[0]);
+    linenr_T	lnum = tv_get_lnum(&argvars[0]);
 
     set_buffer_lines(curbuf, lnum, TRUE, &argvars[1], rettv);
 }
@@ -1430,7 +1430,7 @@
 	rettv->vval.v_number = 1; /* FAIL */
     else
     {
-	lnum = get_tv_lnum_buf(&argvars[1], buf);
+	lnum = tv_get_lnum_buf(&argvars[1], buf);
 	set_buffer_lines(buf, lnum, TRUE, &argvars[2], rettv);
     }
 }
@@ -1447,7 +1447,7 @@
 	// use the current window
 	rettv->vval.v_number = ARGCOUNT;
     else if (argvars[0].v_type == VAR_NUMBER
-					   && get_tv_number(&argvars[0]) == -1)
+					   && tv_get_number(&argvars[0]) == -1)
 	// use the global argument list
 	rettv->vval.v_number = GARGCOUNT;
     else
@@ -1516,7 +1516,7 @@
 	    argcount = ARGCOUNT;
 	}
 	else if (argvars[1].v_type == VAR_NUMBER
-					   && get_tv_number(&argvars[1]) == -1)
+					   && tv_get_number(&argvars[1]) == -1)
 	{
 	    arglist = GARGLIST;
 	    argcount = GARGCOUNT;
@@ -1535,7 +1535,7 @@
 
 	rettv->v_type = VAR_STRING;
 	rettv->vval.v_string = NULL;
-	idx = get_tv_number_chk(&argvars[0], NULL);
+	idx = tv_get_number_chk(&argvars[0], NULL);
 	if (arglist != NULL && idx >= 0 && idx < argcount)
 	    rettv->vval.v_string = vim_strsave(alist_name(&arglist[idx]));
 	else if (idx == -1)
@@ -1717,7 +1717,7 @@
 	   )
 	    post_balloon(balloonEval, NULL, argvars[0].vval.v_list);
 	else
-	    post_balloon(balloonEval, get_tv_string_chk(&argvars[0]), NULL);
+	    post_balloon(balloonEval, tv_get_string_chk(&argvars[0]), NULL);
     }
 }
 
@@ -1727,7 +1727,7 @@
 {
     if (rettv_list_alloc(rettv) == OK)
     {
-	char_u *msg = get_tv_string_chk(&argvars[0]);
+	char_u *msg = tv_get_string_chk(&argvars[0]);
 
 	if (msg != NULL)
 	{
@@ -1762,10 +1762,10 @@
     char_u	buf2[NUMBUFLEN];
     int		error = FALSE;
 
-    save = (int)get_tv_number_chk(&argvars[0], &error);
-    title = get_tv_string_chk(&argvars[1]);
-    initdir = get_tv_string_buf_chk(&argvars[2], buf);
-    defname = get_tv_string_buf_chk(&argvars[3], buf2);
+    save = (int)tv_get_number_chk(&argvars[0], &error);
+    title = tv_get_string_chk(&argvars[1]);
+    initdir = tv_get_string_buf_chk(&argvars[2], buf);
+    defname = tv_get_string_buf_chk(&argvars[3], buf2);
 
     if (error || title == NULL || initdir == NULL || defname == NULL)
 	rettv->vval.v_string = NULL;
@@ -1790,8 +1790,8 @@
     char_u	*initdir;
     char_u	buf[NUMBUFLEN];
 
-    title = get_tv_string_chk(&argvars[0]);
-    initdir = get_tv_string_buf_chk(&argvars[1], buf);
+    title = tv_get_string_chk(&argvars[0]);
+    initdir = tv_get_string_buf_chk(&argvars[1], buf);
 
     if (title == NULL || initdir == NULL)
 	rettv->vval.v_string = NULL;
@@ -1924,7 +1924,7 @@
 {
     buf_T	*buf;
 
-    (void)get_tv_number(&argvars[0]);	    /* issue errmsg if type error */
+    (void)tv_get_number(&argvars[0]);	    /* issue errmsg if type error */
     ++emsg_off;
     buf = get_buf_tv(&argvars[0], FALSE);
     rettv->v_type = VAR_STRING;
@@ -1945,7 +1945,7 @@
     int		error = FALSE;
     char_u	*name;
 
-    (void)get_tv_number(&argvars[0]);	    /* issue errmsg if type error */
+    (void)tv_get_number(&argvars[0]);	    /* issue errmsg if type error */
     ++emsg_off;
     buf = get_buf_tv(&argvars[0], FALSE);
     --emsg_off;
@@ -1954,9 +1954,9 @@
      * new buffer. */
     if (buf == NULL
 	    && argvars[1].v_type != VAR_UNKNOWN
-	    && get_tv_number_chk(&argvars[1], &error) != 0
+	    && tv_get_number_chk(&argvars[1], &error) != 0
 	    && !error
-	    && (name = get_tv_string_chk(&argvars[0])) != NULL
+	    && (name = tv_get_string_chk(&argvars[0])) != NULL
 	    && !error)
 	buf = buflist_new(name, NULL, (linenr_T)1, 0);
 
@@ -1973,7 +1973,7 @@
     int		winnr = 0;
     buf_T	*buf;
 
-    (void)get_tv_number(&argvars[0]);	    /* issue errmsg if type error */
+    (void)tv_get_number(&argvars[0]);	    /* issue errmsg if type error */
     ++emsg_off;
     buf = get_buf_tv(&argvars[0], TRUE);
     FOR_ALL_WINDOWS(wp)
@@ -2015,7 +2015,7 @@
 #else
     long	boff = 0;
 
-    boff = get_tv_number(&argvars[0]) - 1;  /* boff gets -1 on type error */
+    boff = tv_get_number(&argvars[0]) - 1;  /* boff gets -1 on type error */
     if (boff < 0)
 	rettv->vval.v_number = -1;
     else
@@ -2033,8 +2033,8 @@
     char_u	*str;
     varnumber_T	idx;
 
-    str = get_tv_string_chk(&argvars[0]);
-    idx = get_tv_number_chk(&argvars[1], NULL);
+    str = tv_get_string_chk(&argvars[0]);
+    idx = tv_get_number_chk(&argvars[1], NULL);
     rettv->vval.v_number = -1;
     if (str == NULL || idx < 0)
 	return;
@@ -2101,7 +2101,7 @@
 	func = partial_name(partial);
     }
     else
-	func = get_tv_string(&argvars[0]);
+	func = tv_get_string(&argvars[0]);
     if (*func == NUL)
 	return;		/* type error or empty name */
 
@@ -2189,7 +2189,7 @@
     rettv->vval.v_number = -1;
     if (channel != NULL)
     {
-	char_u	*what = get_tv_string(&argvars[1]);
+	char_u	*what = tv_get_string(&argvars[1]);
 	int	part;
 
 	if (STRCMP(what, "err") == 0)
@@ -2241,7 +2241,7 @@
     static void
 f_ch_log(typval_T *argvars, typval_T *rettv UNUSED)
 {
-    char_u	*msg = get_tv_string(&argvars[0]);
+    char_u	*msg = tv_get_string(&argvars[0]);
     channel_T	*channel = NULL;
 
     if (argvars[1].v_type != VAR_UNKNOWN)
@@ -2263,9 +2263,9 @@
     /* Don't open a file in restricted mode. */
     if (check_restricted() || check_secure())
 	return;
-    fname = get_tv_string(&argvars[0]);
+    fname = tv_get_string(&argvars[0]);
     if (argvars[1].v_type == VAR_STRING)
-	opt = get_tv_string_buf(&argvars[1], buf);
+	opt = tv_get_string_buf(&argvars[1], buf);
     ch_logfile(fname, opt);
 }
 
@@ -2403,16 +2403,16 @@
 	int	utf8 = 0;
 
 	if (argvars[1].v_type != VAR_UNKNOWN)
-	    utf8 = (int)get_tv_number_chk(&argvars[1], NULL);
+	    utf8 = (int)tv_get_number_chk(&argvars[1], NULL);
 
 	if (utf8)
-	    rettv->vval.v_number = (*utf_ptr2char)(get_tv_string(&argvars[0]));
+	    rettv->vval.v_number = (*utf_ptr2char)(tv_get_string(&argvars[0]));
 	else
-	    rettv->vval.v_number = (*mb_ptr2char)(get_tv_string(&argvars[0]));
+	    rettv->vval.v_number = (*mb_ptr2char)(tv_get_string(&argvars[0]));
     }
     else
 #endif
-    rettv->vval.v_number = get_tv_string(&argvars[0])[0];
+    rettv->vval.v_number = tv_get_string(&argvars[0])[0];
 }
 
 /*
@@ -2426,7 +2426,7 @@
     linenr_T	lnum;
 
     pos = curwin->w_cursor;
-    lnum = get_tv_lnum(argvars);
+    lnum = tv_get_lnum(argvars);
     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
     {
 	curwin->w_cursor.lnum = lnum;
@@ -2526,7 +2526,7 @@
 	return;
     }
 
-    startcol = (int)get_tv_number_chk(&argvars[0], NULL);
+    startcol = (int)tv_get_number_chk(&argvars[0], NULL);
     if (startcol <= 0)
 	return;
 
@@ -2573,20 +2573,20 @@
     char_u	*typestr;
     int		error = FALSE;
 
-    message = get_tv_string_chk(&argvars[0]);
+    message = tv_get_string_chk(&argvars[0]);
     if (message == NULL)
 	error = TRUE;
     if (argvars[1].v_type != VAR_UNKNOWN)
     {
-	buttons = get_tv_string_buf_chk(&argvars[1], buf);
+	buttons = tv_get_string_buf_chk(&argvars[1], buf);
 	if (buttons == NULL)
 	    error = TRUE;
 	if (argvars[2].v_type != VAR_UNKNOWN)
 	{
-	    def = (int)get_tv_number_chk(&argvars[2], &error);
+	    def = (int)tv_get_number_chk(&argvars[2], &error);
 	    if (argvars[3].v_type != VAR_UNKNOWN)
 	    {
-		typestr = get_tv_string_buf_chk(&argvars[3], buf2);
+		typestr = tv_get_string_buf_chk(&argvars[3], buf2);
 		if (typestr == NULL)
 		    error = TRUE;
 		else
@@ -2665,11 +2665,11 @@
     int		error = FALSE;
 
     if (argvars[2].v_type != VAR_UNKNOWN)
-	ic = (int)get_tv_number_chk(&argvars[2], &error);
+	ic = (int)tv_get_number_chk(&argvars[2], &error);
 
     if (argvars[0].v_type == VAR_STRING)
     {
-	char_u *expr = get_tv_string_chk(&argvars[1]);
+	char_u *expr = tv_get_string_chk(&argvars[1]);
 	char_u *p = argvars[0].vval.v_string;
 	char_u *next;
 
@@ -2713,7 +2713,7 @@
 	    {
 		if (argvars[3].v_type != VAR_UNKNOWN)
 		{
-		    idx = (long)get_tv_number_chk(&argvars[3], &error);
+		    idx = (long)tv_get_number_chk(&argvars[3], &error);
 		    if (!error)
 		    {
 			li = list_find(l, idx);
@@ -2778,10 +2778,10 @@
     if (argvars[0].v_type != VAR_UNKNOWN
 	    && argvars[1].v_type != VAR_UNKNOWN)
     {
-	num = (int)get_tv_number(&argvars[0]);
-	dbpath = get_tv_string(&argvars[1]);
+	num = (int)tv_get_number(&argvars[0]);
+	dbpath = tv_get_string(&argvars[1]);
 	if (argvars[2].v_type != VAR_UNKNOWN)
-	    prepend = get_tv_string_buf(&argvars[2], buf);
+	    prepend = tv_get_string_buf(&argvars[2], buf);
     }
 
     rettv->vval.v_number = cs_connection(num, dbpath, prepend);
@@ -2828,11 +2828,11 @@
     }
     else
     {
-	line = get_tv_lnum(argvars);
-	col = (long)get_tv_number_chk(&argvars[1], NULL);
+	line = tv_get_lnum(argvars);
+	col = (long)tv_get_number_chk(&argvars[1], NULL);
 #ifdef FEAT_VIRTUALEDIT
 	if (argvars[2].v_type != VAR_UNKNOWN)
-	    coladd = (long)get_tv_number_chk(&argvars[2], NULL);
+	    coladd = (long)tv_get_number_chk(&argvars[2], NULL);
 #endif
     }
     if (line < 0 || col < 0
@@ -2871,7 +2871,7 @@
     int		pid;
 
     rettv->vval.v_number = FAIL;
-    pid = (int)get_tv_number(&argvars[0]);
+    pid = (int)tv_get_number(&argvars[0]);
     if (pid == 0)
 	EMSG(_(e_invarg));
     else
@@ -2898,7 +2898,7 @@
     int		copyID;
 
     if (argvars[1].v_type != VAR_UNKNOWN)
-	noref = (int)get_tv_number_chk(&argvars[1], NULL);
+	noref = (int)tv_get_number_chk(&argvars[1], NULL);
     if (noref < 0 || noref > 1)
 	EMSG(_(e_invarg));
     else
@@ -2922,7 +2922,7 @@
     if (check_restricted() || check_secure())
 	return;
 
-    name = get_tv_string(&argvars[0]);
+    name = tv_get_string(&argvars[0]);
     if (name == NULL || *name == NUL)
     {
 	EMSG(_(e_invarg));
@@ -2930,7 +2930,7 @@
     }
 
     if (argvars[1].v_type != VAR_UNKNOWN)
-	flags = get_tv_string_buf(&argvars[1], nbuf);
+	flags = tv_get_string_buf(&argvars[1], nbuf);
     else
 	flags = (char_u *)"";
 
@@ -2971,9 +2971,9 @@
     }
     is_curbuf = buf == curbuf;
 
-    first = get_tv_lnum_buf(&argvars[1], buf);
+    first = tv_get_lnum_buf(&argvars[1], buf);
     if (argvars[2].v_type != VAR_UNKNOWN)
-	last = get_tv_lnum_buf(&argvars[2], buf);
+	last = tv_get_lnum_buf(&argvars[2], buf);
     else
 	last = first;
 
@@ -3048,7 +3048,7 @@
 f_diff_filler(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_DIFF
-    rettv->vval.v_number = diff_check_fill(curwin, get_tv_lnum(argvars));
+    rettv->vval.v_number = diff_check_fill(curwin, tv_get_lnum(argvars));
 #endif
 }
 
@@ -3059,7 +3059,7 @@
 f_diff_hlID(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_DIFF
-    linenr_T		lnum = get_tv_lnum(argvars);
+    linenr_T		lnum = tv_get_lnum(argvars);
     static linenr_T	prev_lnum = 0;
     static varnumber_T	changedtick = 0;
     static int		fnum = 0;
@@ -3100,7 +3100,7 @@
 
     if (hlID == HLF_CHD || hlID == HLF_TXD)
     {
-	col = get_tv_number(&argvars[1]) - 1; /* ignore type error in {col} */
+	col = tv_get_number(&argvars[1]) - 1; /* ignore type error in {col} */
 	if (col >= change_start && col <= change_end)
 	    hlID = HLF_TXD;			/* changed text */
 	else
@@ -3177,8 +3177,8 @@
 {
     char_u	buf[NUMBUFLEN];
 
-    rettv->vval.v_string = vim_strsave_escaped(get_tv_string(&argvars[0]),
-					 get_tv_string_buf(&argvars[1], buf));
+    rettv->vval.v_string = vim_strsave_escaped(tv_get_string(&argvars[0]),
+					 tv_get_string_buf(&argvars[1], buf));
     rettv->v_type = VAR_STRING;
 }
 
@@ -3190,7 +3190,7 @@
 {
     char_u	*s, *p;
 
-    s = get_tv_string_chk(&argvars[0]);
+    s = tv_get_string_chk(&argvars[0]);
     if (s != NULL)
 	s = skipwhite(s);
 
@@ -3222,7 +3222,7 @@
     static void
 f_executable(typval_T *argvars, typval_T *rettv)
 {
-    char_u *name = get_tv_string(&argvars[0]);
+    char_u *name = tv_get_string(&argvars[0]);
 
     /* Check in $PATH and also check directly if there is a directory name. */
     rettv->vval.v_number = mch_can_exe(name, NULL, TRUE)
@@ -3270,7 +3270,7 @@
 
     if (item == NULL)
 	return NULL;
-    s = get_tv_string_buf_chk(&item->li_tv, buf);
+    s = tv_get_string_buf_chk(&item->li_tv, buf);
     *p = item->li_next;
     return s == NULL ? NULL : vim_strsave(s);
 }
@@ -3305,7 +3305,7 @@
     }
     else
     {
-	cmd = get_tv_string_chk(&argvars[0]);
+	cmd = tv_get_string_chk(&argvars[0]);
 	if (cmd == NULL)
 	    return;
     }
@@ -3313,7 +3313,7 @@
     if (argvars[1].v_type != VAR_UNKNOWN)
     {
 	char_u	buf[NUMBUFLEN];
-	char_u  *s = get_tv_string_buf_chk(&argvars[1], buf);
+	char_u  *s = tv_get_string_buf_chk(&argvars[1], buf);
 
 	if (s == NULL)
 	    return;
@@ -3388,7 +3388,7 @@
 {
     char_u *p = NULL;
 
-    (void)mch_can_exe(get_tv_string(&argvars[0]), &p, TRUE);
+    (void)mch_can_exe(tv_get_string(&argvars[0]), &p, TRUE);
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = p;
 }
@@ -3402,7 +3402,7 @@
     char_u	*p;
     int		n = FALSE;
 
-    p = get_tv_string(&argvars[0]);
+    p = tv_get_string(&argvars[0]);
     if (*p == '$')			/* environment variable */
     {
 	/* first try "normal" environment variables (fast) */
@@ -3480,13 +3480,13 @@
     rettv->v_type = VAR_STRING;
     if (argvars[1].v_type != VAR_UNKNOWN
 	    && argvars[2].v_type != VAR_UNKNOWN
-	    && get_tv_number_chk(&argvars[2], &error)
+	    && tv_get_number_chk(&argvars[2], &error)
 	    && !error)
     {
 	rettv_list_set(rettv, NULL);
     }
 
-    s = get_tv_string(&argvars[0]);
+    s = tv_get_string(&argvars[0]);
     if (*s == '%' || *s == '#' || *s == '<')
     {
 	++emsg_off;
@@ -3507,7 +3507,7 @@
 	/* When the optional second argument is non-zero, don't remove matches
 	 * for 'wildignore' and don't put matches for 'suffixes' at the end. */
 	if (argvars[1].v_type != VAR_UNKNOWN
-				    && get_tv_number_chk(&argvars[1], &error))
+				    && tv_get_number_chk(&argvars[1], &error))
 	    options |= WILD_KEEP_ALL;
 	if (!error)
 	{
@@ -3556,7 +3556,7 @@
 	{
 	    if (argvars[2].v_type != VAR_UNKNOWN)
 	    {
-		before = (long)get_tv_number_chk(&argvars[2], &error);
+		before = (long)tv_get_number_chk(&argvars[2], &error);
 		if (error)
 		    return;		/* type error; errmsg already given */
 
@@ -3595,7 +3595,7 @@
 	    {
 		static char *(av[]) = {"keep", "force", "error"};
 
-		action = get_tv_string_chk(&argvars[2]);
+		action = tv_get_string_chk(&argvars[2]);
 		if (action == NULL)
 		    return;		/* type error; errmsg already given */
 		for (i = 0; i < 3; ++i)
@@ -3640,11 +3640,11 @@
     if (check_secure())
 	return;
 
-    keys = get_tv_string(&argvars[0]);
+    keys = tv_get_string(&argvars[0]);
 
     if (argvars[1].v_type != VAR_UNKNOWN)
     {
-	flags = get_tv_string_buf(&argvars[1], nbuf);
+	flags = tv_get_string_buf(&argvars[1], nbuf);
 	for ( ; *flags != NUL; ++flags)
 	{
 	    switch (*flags)
@@ -3707,7 +3707,7 @@
 #ifndef O_NONBLOCK
 # define O_NONBLOCK 0
 #endif
-    p = get_tv_string(&argvars[0]);
+    p = tv_get_string(&argvars[0]);
     if (*p && !mch_isdir(p) && (fd = mch_open((char *)p,
 					      O_RDONLY | O_NONBLOCK, 0)) >= 0)
     {
@@ -3727,7 +3727,7 @@
     static void
 f_filewritable(typval_T *argvars, typval_T *rettv)
 {
-    rettv->vval.v_number = filewritable(get_tv_string(&argvars[0]));
+    rettv->vval.v_number = filewritable(tv_get_string(&argvars[0]));
 }
 
     static void
@@ -3751,11 +3751,11 @@
     rettv->v_type = VAR_STRING;
 
 #ifdef FEAT_SEARCHPATH
-    fname = get_tv_string(&argvars[0]);
+    fname = tv_get_string(&argvars[0]);
 
     if (argvars[1].v_type != VAR_UNKNOWN)
     {
-	p = get_tv_string_buf_chk(&argvars[1], pathbuf);
+	p = tv_get_string_buf_chk(&argvars[1], pathbuf);
 	if (p == NULL)
 	    error = TRUE;
 	else
@@ -3764,7 +3764,7 @@
 		path = p;
 
 	    if (argvars[2].v_type != VAR_UNKNOWN)
-		count = (int)get_tv_number_chk(&argvars[2], &error);
+		count = (int)tv_get_number_chk(&argvars[2], &error);
 	}
     }
 
@@ -3883,7 +3883,7 @@
 f_fnameescape(typval_T *argvars, typval_T *rettv)
 {
     rettv->vval.v_string = vim_strsave_fnameescape(
-					   get_tv_string(&argvars[0]), FALSE);
+					   tv_get_string(&argvars[0]), FALSE);
     rettv->v_type = VAR_STRING;
 }
 
@@ -3900,8 +3900,8 @@
     char_u	*fbuf = NULL;
     char_u	buf[NUMBUFLEN];
 
-    fname = get_tv_string_chk(&argvars[0]);
-    mods = get_tv_string_buf_chk(&argvars[1], buf);
+    fname = tv_get_string_chk(&argvars[0]);
+    mods = tv_get_string_buf_chk(&argvars[1], buf);
     if (fname == NULL || mods == NULL)
 	fname = NULL;
     else
@@ -3931,7 +3931,7 @@
     linenr_T	lnum;
     linenr_T	first, last;
 
-    lnum = get_tv_lnum(argvars);
+    lnum = tv_get_lnum(argvars);
     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
     {
 	if (hasFoldingWin(curwin, lnum, &first, &last, FALSE, NULL))
@@ -3974,7 +3974,7 @@
 #ifdef FEAT_FOLDING
     linenr_T	lnum;
 
-    lnum = get_tv_lnum(argvars);
+    lnum = tv_get_lnum(argvars);
     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
 	rettv->vval.v_number = foldLevel(lnum);
 #endif
@@ -4067,7 +4067,7 @@
 	return; /* reject recursive use */
     entered = TRUE;
 
-    lnum = get_tv_lnum(argvars);
+    lnum = tv_get_lnum(argvars);
     /* treat illegal types and illegal string values for {lnum} the same */
     if (lnum < 0)
 	lnum = 0;
@@ -4125,7 +4125,7 @@
     else
     {
 	/* function('MyFunc', [arg], dict) */
-	s = get_tv_string(&argvars[0]);
+	s = tv_get_string(&argvars[0]);
 	use_string = TRUE;
     }
 
@@ -4140,7 +4140,7 @@
 
     if (s == NULL || *s == NUL || (use_string && VIM_ISDIGIT(*s))
 					 || (is_funcref && trans_name == NULL))
-	EMSG2(_(e_invarg2), use_string ? get_tv_string(&argvars[0]) : s);
+	EMSG2(_(e_invarg2), use_string ? tv_get_string(&argvars[0]) : s);
     /* Don't check an autoload name for existence here. */
     else if (trans_name != NULL && (is_funcref
 				? find_func(trans_name) == NULL
@@ -4327,7 +4327,7 @@
      * using Lists and Dicts internally.  E.g.: ":echo [garbagecollect()]". */
     want_garbage_collect = TRUE;
 
-    if (argvars[0].v_type != VAR_UNKNOWN && get_tv_number(&argvars[0]) == 1)
+    if (argvars[0].v_type != VAR_UNKNOWN && tv_get_number(&argvars[0]) == 1)
 	garbage_collect_at_exit = TRUE;
 }
 
@@ -4349,7 +4349,7 @@
 	{
 	    int		error = FALSE;
 
-	    li = list_find(l, (long)get_tv_number_chk(&argvars[1], &error));
+	    li = list_find(l, (long)tv_get_number_chk(&argvars[1], &error));
 	    if (!error && li != NULL)
 		tv = &li->li_tv;
 	}
@@ -4358,7 +4358,7 @@
     {
 	if ((d = argvars[0].vval.v_dict) != NULL)
 	{
-	    di = dict_find(d, get_tv_string(&argvars[1]), -1);
+	    di = dict_find(d, tv_get_string(&argvars[1]), -1);
 	    if (di != NULL)
 		tv = &di->di_tv;
 	}
@@ -4379,7 +4379,7 @@
 
 	if (pt != NULL)
 	{
-	    char_u *what = get_tv_string(&argvars[1]);
+	    char_u *what = tv_get_string(&argvars[1]);
 	    char_u *n;
 
 	    if (STRCMP(what, "func") == 0 || STRCMP(what, "name") == 0)
@@ -4527,22 +4527,22 @@
 	    filtered = TRUE;
 
 	    di = dict_find(sel_d, (char_u *)"buflisted", -1);
-	    if (di != NULL && get_tv_number(&di->di_tv))
+	    if (di != NULL && tv_get_number(&di->di_tv))
 		sel_buflisted = TRUE;
 
 	    di = dict_find(sel_d, (char_u *)"bufloaded", -1);
-	    if (di != NULL && get_tv_number(&di->di_tv))
+	    if (di != NULL && tv_get_number(&di->di_tv))
 		sel_bufloaded = TRUE;
 
 	    di = dict_find(sel_d, (char_u *)"bufmodified", -1);
-	    if (di != NULL && get_tv_number(&di->di_tv))
+	    if (di != NULL && tv_get_number(&di->di_tv))
 		sel_bufmodified = TRUE;
 	}
     }
     else if (argvars[0].v_type != VAR_UNKNOWN)
     {
 	/* Information about one buffer.  Argument specifies the buffer */
-	(void)get_tv_number(&argvars[0]);   /* issue errmsg if type error */
+	(void)tv_get_number(&argvars[0]);   /* issue errmsg if type error */
 	++emsg_off;
 	argbuf = get_buf_tv(&argvars[0], FALSE);
 	--emsg_off;
@@ -4626,16 +4626,16 @@
     linenr_T	end;
     buf_T	*buf;
 
-    (void)get_tv_number(&argvars[0]);	    /* issue errmsg if type error */
+    (void)tv_get_number(&argvars[0]);	    /* issue errmsg if type error */
     ++emsg_off;
     buf = get_buf_tv(&argvars[0], FALSE);
     --emsg_off;
 
-    lnum = get_tv_lnum_buf(&argvars[1], buf);
+    lnum = tv_get_lnum_buf(&argvars[1], buf);
     if (argvars[2].v_type == VAR_UNKNOWN)
 	end = lnum;
     else
-	end = get_tv_lnum_buf(&argvars[2], buf);
+	end = tv_get_lnum_buf(&argvars[2], buf);
 
     get_buffer_lines(buf, lnum, end, TRUE, rettv);
 }
@@ -4652,8 +4652,8 @@
     dictitem_T	*v;
     int		done = FALSE;
 
-    (void)get_tv_number(&argvars[0]);	    /* issue errmsg if type error */
-    varname = get_tv_string_chk(&argvars[1]);
+    (void)tv_get_number(&argvars[0]);	    /* issue errmsg if type error */
+    varname = tv_get_string_chk(&argvars[1]);
     ++emsg_off;
     buf = get_buf_tv(&argvars[0], FALSE);
 
@@ -4724,7 +4724,7 @@
 	return;
 
 #ifdef FEAT_JUMPLIST
-    (void)get_tv_number(&argvars[0]);	    /* issue errmsg if type error */
+    (void)tv_get_number(&argvars[0]);	    /* issue errmsg if type error */
     ++emsg_off;
     buf = get_buf_tv(&argvars[0], FALSE);
     --emsg_off;
@@ -4788,7 +4788,7 @@
 	if (argvars[0].v_type == VAR_UNKNOWN)
 	    /* getchar(): blocking wait. */
 	    n = plain_vgetc();
-	else if (get_tv_number_chk(&argvars[0], &error) == 1)
+	else if (tv_get_number_chk(&argvars[0], &error) == 1)
 	    /* getchar(1): only check if char avail */
 	    n = vpeekc_any();
 	else if (error || vpeekc_any() == NUL)
@@ -4960,7 +4960,7 @@
 					| WILD_NO_BEEP;
 
     if (argvars[2].v_type != VAR_UNKNOWN)
-	filtered = get_tv_number_chk(&argvars[2], NULL);
+	filtered = tv_get_number_chk(&argvars[2], NULL);
 
     if (p_wic)
 	options |= WILD_ICASE;
@@ -4970,9 +4970,9 @@
 	options |= WILD_KEEP_ALL;
 
     ExpandInit(&xpc);
-    xpc.xp_pattern = get_tv_string(&argvars[0]);
+    xpc.xp_pattern = tv_get_string(&argvars[0]);
     xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
-    xpc.xp_context = cmdcomplete_str_to_type(get_tv_string(&argvars[1]));
+    xpc.xp_context = cmdcomplete_str_to_type(tv_get_string(&argvars[1]));
     if (xpc.xp_context == EXPAND_NOTHING)
     {
 	if (argvars[1].v_type == VAR_STRING)
@@ -5083,7 +5083,7 @@
 	}
 	else
 	{
-	    name = get_tv_string(&argvars[0]);
+	    name = tv_get_string(&argvars[0]);
 	    if (STRCMP(name, "*") == 0)	    /* don't use font dialog */
 		return;
 	    font = gui_mch_get_font(name, FALSE);
@@ -5109,7 +5109,7 @@
     char_u	flags[] = "rwx";
     int		i;
 
-    fname = get_tv_string(&argvars[0]);
+    fname = tv_get_string(&argvars[0]);
 
     rettv->v_type = VAR_STRING;
     if (mch_stat((char *)fname, &st) >= 0)
@@ -5136,7 +5136,7 @@
     char_u	*fname;
     stat_T	st;
 
-    fname = get_tv_string(&argvars[0]);
+    fname = tv_get_string(&argvars[0]);
 
     rettv->v_type = VAR_NUMBER;
 
@@ -5166,7 +5166,7 @@
     char_u	*fname;
     stat_T	st;
 
-    fname = get_tv_string(&argvars[0]);
+    fname = tv_get_string(&argvars[0]);
 
     if (mch_stat((char *)fname, &st) >= 0)
 	rettv->vval.v_number = (varnumber_T)st.st_mtime;
@@ -5185,7 +5185,7 @@
     char_u	*type = NULL;
     char	*t;
 
-    fname = get_tv_string(&argvars[0]);
+    fname = tv_get_string(&argvars[0]);
 
     rettv->v_type = VAR_STRING;
     if (mch_lstat((char *)fname, &st) >= 0)
@@ -5272,7 +5272,7 @@
     linenr_T	end;
     int		retlist;
 
-    lnum = get_tv_lnum(argvars);
+    lnum = tv_get_lnum(argvars);
     if (argvars[1].v_type == VAR_UNKNOWN)
     {
 	end = 0;
@@ -5280,7 +5280,7 @@
     }
     else
     {
-	end = get_tv_lnum(&argvars[1]);
+	end = tv_get_lnum(&argvars[1]);
 	retlist = TRUE;
     }
 
@@ -5490,13 +5490,13 @@
 
     if (argvars[0].v_type != VAR_UNKNOWN)
     {
-	strregname = get_tv_string_chk(&argvars[0]);
+	strregname = tv_get_string_chk(&argvars[0]);
 	error = strregname == NULL;
 	if (argvars[1].v_type != VAR_UNKNOWN)
 	{
-	    arg2 = (int)get_tv_number_chk(&argvars[1], &error);
+	    arg2 = (int)tv_get_number_chk(&argvars[1], &error);
 	    if (!error && argvars[2].v_type != VAR_UNKNOWN)
-		return_list = (int)get_tv_number_chk(&argvars[2], &error);
+		return_list = (int)tv_get_number_chk(&argvars[2], &error);
 	}
     }
     else
@@ -5540,7 +5540,7 @@
 
     if (argvars[0].v_type != VAR_UNKNOWN)
     {
-	strregname = get_tv_string_chk(&argvars[0]);
+	strregname = tv_get_string_chk(&argvars[0]);
 	if (strregname == NULL)	    /* type error; errmsg already given */
 	{
 	    rettv->v_type = VAR_STRING;
@@ -5619,7 +5619,7 @@
     if (argvars[0].v_type != VAR_UNKNOWN)
     {
 	/* Information about one tab page */
-	tparg = find_tabpage((int)get_tv_number_chk(&argvars[0], NULL));
+	tparg = find_tabpage((int)tv_get_number_chk(&argvars[0], NULL));
 	if (tparg == NULL)
 	    return;
     }
@@ -5653,8 +5653,8 @@
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = NULL;
 
-    varname = get_tv_string_chk(&argvars[1]);
-    tp = find_tabpage((int)get_tv_number_chk(&argvars[0], NULL));
+    varname = tv_get_string_chk(&argvars[1]);
+    tp = find_tabpage((int)tv_get_number_chk(&argvars[0], NULL));
     if (tp != NULL && varname != NULL)
     {
 	/* Set tp to be our tabpage, temporarily.  Also set the window to the
@@ -5879,7 +5879,7 @@
 	varnumber_T timeout = 100;
 
 	if (argvars[0].v_type != VAR_UNKNOWN)
-	    timeout = get_tv_number(&argvars[0]);
+	    timeout = tv_get_number(&argvars[0]);
 	term_get_winpos(&x, &y, timeout);
     }
 #endif
@@ -5966,16 +5966,16 @@
     rettv->v_type = VAR_STRING;
     if (argvars[1].v_type != VAR_UNKNOWN)
     {
-	if (get_tv_number_chk(&argvars[1], &error))
+	if (tv_get_number_chk(&argvars[1], &error))
 	    options |= WILD_KEEP_ALL;
 	if (argvars[2].v_type != VAR_UNKNOWN)
 	{
-	    if (get_tv_number_chk(&argvars[2], &error))
+	    if (tv_get_number_chk(&argvars[2], &error))
 	    {
 		rettv_list_set(rettv, NULL);
 	    }
 	    if (argvars[3].v_type != VAR_UNKNOWN
-				    && get_tv_number_chk(&argvars[3], &error))
+				    && tv_get_number_chk(&argvars[3], &error))
 		options |= WILD_ALLLINKS;
 	}
     }
@@ -5986,13 +5986,13 @@
 	if (p_wic)
 	    options += WILD_ICASE;
 	if (rettv->v_type == VAR_STRING)
-	    rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]),
+	    rettv->vval.v_string = ExpandOne(&xpc, tv_get_string(&argvars[0]),
 						     NULL, options, WILD_ALL);
 	else if (rettv_list_alloc(rettv) != FAIL)
 	{
 	  int i;
 
-	  ExpandOne(&xpc, get_tv_string(&argvars[0]),
+	  ExpandOne(&xpc, tv_get_string(&argvars[0]),
 						NULL, options, WILD_ALL_KEEP);
 	  for (i = 0; i < xpc.xp_numfiles; i++)
 	      list_append_string(rettv->vval.v_list, xpc.xp_files[i], -1);
@@ -6012,7 +6012,7 @@
 {
     int		flags = 0;
     char_u	buf1[NUMBUFLEN];
-    char_u	*file = get_tv_string_buf_chk(&argvars[1], buf1);
+    char_u	*file = tv_get_string_buf_chk(&argvars[1], buf1);
     int		error = FALSE;
     garray_T	ga;
     int		i;
@@ -6022,23 +6022,23 @@
     rettv->v_type = VAR_STRING;
     if (argvars[2].v_type != VAR_UNKNOWN)
     {
-	if (get_tv_number_chk(&argvars[2], &error))
+	if (tv_get_number_chk(&argvars[2], &error))
 	    flags |= WILD_KEEP_ALL;
 	if (argvars[3].v_type != VAR_UNKNOWN)
 	{
-	    if (get_tv_number_chk(&argvars[3], &error))
+	    if (tv_get_number_chk(&argvars[3], &error))
 	    {
 		rettv_list_set(rettv, NULL);
 	    }
 	    if (argvars[4].v_type != VAR_UNKNOWN
-				    && get_tv_number_chk(&argvars[4], &error))
+				    && tv_get_number_chk(&argvars[4], &error))
 		flags |= WILD_ALLLINKS;
 	}
     }
     if (file != NULL && !error)
     {
 	ga_init2(&ga, (int)sizeof(char_u *), 10);
-	globpath(get_tv_string(&argvars[0]), file, &ga, flags);
+	globpath(tv_get_string(&argvars[0]), file, &ga, flags);
 	if (rettv->v_type == VAR_STRING)
 	    rettv->vval.v_string = ga_concat_strings(&ga, "\n");
 	else if (rettv_list_alloc(rettv) != FAIL)
@@ -6057,7 +6057,7 @@
     static void
 f_glob2regpat(typval_T *argvars, typval_T *rettv)
 {
-    char_u	*pat = get_tv_string_chk(&argvars[0]);
+    char_u	*pat = tv_get_string_chk(&argvars[0]);
 
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = (pat == NULL)
@@ -6583,7 +6583,7 @@
 	NULL
     };
 
-    name = get_tv_string(&argvars[0]);
+    name = tv_get_string(&argvars[0]);
     for (i = 0; has_list[i] != NULL; ++i)
 	if (STRICMP(name, has_list[i]) == 0)
 	{
@@ -6721,7 +6721,7 @@
 	return;
 
     rettv->vval.v_number = dict_find(argvars[0].vval.v_dict,
-				      get_tv_string(&argvars[1]), -1) != NULL;
+				      tv_get_string(&argvars[1]), -1) != NULL;
 }
 
 /*
@@ -6747,14 +6747,14 @@
     char_u	buf[NUMBUFLEN];
     int		abbr = FALSE;
 
-    name = get_tv_string(&argvars[0]);
+    name = tv_get_string(&argvars[0]);
     if (argvars[1].v_type == VAR_UNKNOWN)
 	mode = (char_u *)"nvo";
     else
     {
-	mode = get_tv_string_buf(&argvars[1], buf);
+	mode = tv_get_string_buf(&argvars[1], buf);
 	if (argvars[2].v_type != VAR_UNKNOWN)
-	    abbr = (int)get_tv_number(&argvars[2]);
+	    abbr = (int)tv_get_number(&argvars[2]);
     }
 
     if (map_to_exists(name, mode, abbr))
@@ -6779,11 +6779,11 @@
     if (check_restricted() || check_secure())
 	return;
 #ifdef FEAT_CMDHIST
-    str = get_tv_string_chk(&argvars[0]);	/* NULL on type error */
+    str = tv_get_string_chk(&argvars[0]);	/* NULL on type error */
     histype = str != NULL ? get_histtype(str) : -1;
     if (histype >= 0)
     {
-	str = get_tv_string_buf(&argvars[1], buf);
+	str = tv_get_string_buf(&argvars[1], buf);
 	if (*str != NUL)
 	{
 	    init_history();
@@ -6806,7 +6806,7 @@
     char_u	buf[NUMBUFLEN];
     char_u	*str;
 
-    str = get_tv_string_chk(&argvars[0]);	/* NULL on type error */
+    str = tv_get_string_chk(&argvars[0]);	/* NULL on type error */
     if (str == NULL)
 	n = 0;
     else if (argvars[1].v_type == VAR_UNKNOWN)
@@ -6815,11 +6815,11 @@
     else if (argvars[1].v_type == VAR_NUMBER)
 	/* index given: remove that entry */
 	n = del_history_idx(get_histtype(str),
-					  (int)get_tv_number(&argvars[1]));
+					  (int)tv_get_number(&argvars[1]));
     else
 	/* string given: remove all matching entries */
 	n = del_history_entry(get_histtype(str),
-				      get_tv_string_buf(&argvars[1], buf));
+				      tv_get_string_buf(&argvars[1], buf));
     rettv->vval.v_number = n;
 #endif
 }
@@ -6835,7 +6835,7 @@
     int		idx;
     char_u	*str;
 
-    str = get_tv_string_chk(&argvars[0]);	/* NULL on type error */
+    str = tv_get_string_chk(&argvars[0]);	/* NULL on type error */
     if (str == NULL)
 	rettv->vval.v_string = NULL;
     else
@@ -6844,7 +6844,7 @@
 	if (argvars[1].v_type == VAR_UNKNOWN)
 	    idx = get_history_idx(type);
 	else
-	    idx = (int)get_tv_number_chk(&argvars[1], NULL);
+	    idx = (int)tv_get_number_chk(&argvars[1], NULL);
 						    /* -1 on type error */
 	rettv->vval.v_string = vim_strsave(get_history_entry(type, idx));
     }
@@ -6863,7 +6863,7 @@
     int		i;
 
 #ifdef FEAT_CMDHIST
-    char_u	*history = get_tv_string_chk(&argvars[0]);
+    char_u	*history = tv_get_string_chk(&argvars[0]);
 
     i = history == NULL ? HIST_CMD - 1 : get_histtype(history);
     if (i >= HIST_CMD && i < HIST_COUNT)
@@ -6880,7 +6880,7 @@
     static void
 f_hlID(typval_T *argvars, typval_T *rettv)
 {
-    rettv->vval.v_number = syn_name2id(get_tv_string(&argvars[0]));
+    rettv->vval.v_number = syn_name2id(tv_get_string(&argvars[0]));
 }
 
 /*
@@ -6889,7 +6889,7 @@
     static void
 f_hlexists(typval_T *argvars, typval_T *rettv)
 {
-    rettv->vval.v_number = highlight_exists(get_tv_string(&argvars[0]));
+    rettv->vval.v_number = highlight_exists(tv_get_string(&argvars[0]));
 }
 
 /*
@@ -6922,9 +6922,9 @@
     rettv->vval.v_string = NULL;
 
 #ifdef FEAT_MBYTE
-    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)));
+    str = tv_get_string(&argvars[0]);
+    from = enc_canonize(enc_skip(tv_get_string_buf(&argvars[1], buf1)));
+    to = enc_canonize(enc_skip(tv_get_string_buf(&argvars[2], buf2)));
     vimconv.vc_type = CONV_NONE;
     convert_setup(&vimconv, from, to);
 
@@ -6948,7 +6948,7 @@
 {
     linenr_T	lnum;
 
-    lnum = get_tv_lnum(argvars);
+    lnum = tv_get_lnum(argvars);
     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
 	rettv->vval.v_number = get_indent_lnum(lnum);
     else
@@ -6982,10 +6982,10 @@
 
 	    /* Start at specified item.  Use the cached index that list_find()
 	     * sets, so that a negative number also works. */
-	    item = list_find(l, (long)get_tv_number_chk(&argvars[2], &error));
+	    item = list_find(l, (long)tv_get_number_chk(&argvars[2], &error));
 	    idx = l->lv_idx;
 	    if (argvars[3].v_type != VAR_UNKNOWN)
-		ic = (int)get_tv_number_chk(&argvars[3], &error);
+		ic = (int)tv_get_number_chk(&argvars[3], &error);
 	    if (error)
 		item = NULL;
 	}
@@ -7025,9 +7025,9 @@
 	char_u	buf[NUMBUFLEN];
 	char_u	*defstr = (char_u *)"";
 
-	message = get_tv_string_chk(&argvars[0]);
+	message = tv_get_string_chk(&argvars[0]);
 	if (argvars[1].v_type != VAR_UNKNOWN
-		&& (defstr = get_tv_string_buf_chk(&argvars[1], buf)) != NULL)
+		&& (defstr = tv_get_string_buf_chk(&argvars[1], buf)) != NULL)
 	    vim_strncpy(IObuff, defstr, IOSIZE - 1);
 	else
 	    IObuff[0] = NUL;
@@ -7041,7 +7041,7 @@
 					&& argvars[1].v_type != VAR_UNKNOWN
 					&& argvars[2].v_type != VAR_UNKNOWN)
 		rettv->vval.v_string = vim_strsave(
-				      get_tv_string_buf(&argvars[2], buf));
+				      tv_get_string_buf(&argvars[2], buf));
 	    else
 		rettv->vval.v_string = NULL;
 	}
@@ -7082,7 +7082,7 @@
 
     for (li = argvars[0].vval.v_list->lv_first; li != NULL; li = li->li_next)
     {
-	msg_puts(get_tv_string(&li->li_tv));
+	msg_puts(tv_get_string(&li->li_tv));
 	msg_putchar('\n');
     }
 
@@ -7164,7 +7164,7 @@
 	    && !tv_check_lock(l->lv_lock, (char_u *)N_("insert() argument"), TRUE))
     {
 	if (argvars[2].v_type != VAR_UNKNOWN)
-	    before = (long)get_tv_number_chk(&argvars[2], &error);
+	    before = (long)tv_get_number_chk(&argvars[2], &error);
 	if (error)
 	    return;		/* type error; errmsg already given */
 
@@ -7193,7 +7193,7 @@
     static void
 f_invert(typval_T *argvars, typval_T *rettv)
 {
-    rettv->vval.v_number = ~get_tv_number_chk(&argvars[0], NULL);
+    rettv->vval.v_number = ~tv_get_number_chk(&argvars[0], NULL);
 }
 
 /*
@@ -7202,7 +7202,7 @@
     static void
 f_isdirectory(typval_T *argvars, typval_T *rettv)
 {
-    rettv->vval.v_number = mch_isdir(get_tv_string(&argvars[0]));
+    rettv->vval.v_number = mch_isdir(tv_get_string(&argvars[0]));
 }
 
 /*
@@ -7232,7 +7232,7 @@
     dictitem_T	*di;
 
     rettv->vval.v_number = -1;
-    end = get_lval(get_tv_string(&argvars[0]), NULL, &lv, FALSE, FALSE,
+    end = get_lval(tv_get_string(&argvars[0]), NULL, &lv, FALSE, FALSE,
 			     GLV_NO_AUTOLOAD | GLV_READ_ONLY, FNE_CHECK_START);
     if (end != NULL && lv.ll_name != NULL)
     {
@@ -7303,7 +7303,7 @@
 
     if (tv->v_type != VAR_JOB)
     {
-	EMSG2(_(e_invarg2), get_tv_string(tv));
+	EMSG2(_(e_invarg2), tv_get_string(tv));
 	return NULL;
     }
     job = tv->vval.v_job;
@@ -7423,7 +7423,7 @@
     if (argvars[1].v_type == VAR_UNKNOWN)
 	sep = (char_u *)" ";
     else
-	sep = get_tv_string_chk(&argvars[1]);
+	sep = tv_get_string_chk(&argvars[1]);
 
     rettv->v_type = VAR_STRING;
 
@@ -7446,7 +7446,7 @@
 {
     js_read_T	reader;
 
-    reader.js_buf = get_tv_string(&argvars[0]);
+    reader.js_buf = tv_get_string(&argvars[0]);
     reader.js_fill = NULL;
     reader.js_used = 0;
     if (json_decode_all(&reader, rettv, JSON_JS) != OK)
@@ -7471,7 +7471,7 @@
 {
     js_read_T	reader;
 
-    reader.js_buf = get_tv_string(&argvars[0]);
+    reader.js_buf = tv_get_string(&argvars[0]);
     reader.js_fill = NULL;
     reader.js_used = 0;
     json_decode_all(&reader, rettv, 0);
@@ -7523,7 +7523,7 @@
 	case VAR_STRING:
 	case VAR_NUMBER:
 	    rettv->vval.v_number = (varnumber_T)STRLEN(
-					       get_tv_string(&argvars[0]));
+					       tv_get_string(&argvars[0]));
 	    break;
 	case VAR_LIST:
 	    rettv->vval.v_number = list_len(argvars[0].vval.v_list);
@@ -7627,7 +7627,7 @@
 #else
     linenr_T	lnum;
 
-    lnum = get_tv_lnum(argvars);
+    lnum = tv_get_lnum(argvars);
     if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count + 1)
 	rettv->vval.v_number = -1;
     else
@@ -7648,7 +7648,7 @@
     linenr_T	lnum;
 
     pos = curwin->w_cursor;
-    lnum = get_tv_lnum(argvars);
+    lnum = tv_get_lnum(argvars);
     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
     {
 	curwin->w_cursor.lnum = lnum;
@@ -7687,18 +7687,18 @@
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = NULL;
 
-    keys = get_tv_string(&argvars[0]);
+    keys = tv_get_string(&argvars[0]);
     if (*keys == NUL)
 	return;
 
     if (argvars[1].v_type != VAR_UNKNOWN)
     {
-	which = get_tv_string_buf_chk(&argvars[1], buf);
+	which = tv_get_string_buf_chk(&argvars[1], buf);
 	if (argvars[2].v_type != VAR_UNKNOWN)
 	{
-	    abbr = (int)get_tv_number(&argvars[2]);
+	    abbr = (int)tv_get_number(&argvars[2]);
 	    if (argvars[3].v_type != VAR_UNKNOWN)
-		get_dict = (int)get_tv_number(&argvars[3]);
+		get_dict = (int)tv_get_number(&argvars[3]);
 	}
     }
     else
@@ -7789,7 +7789,7 @@
     char_u	*str;
     char_u	buf[NUMBUFLEN];
 
-    str = get_tv_string_buf(&argvars[0], buf);
+    str = tv_get_string_buf(&argvars[0], buf);
     do_luaeval(str, argvars + 1, rettv);
 }
 #endif
@@ -7890,11 +7890,11 @@
     }
     else
     {
-	expr = str = get_tv_string(&argvars[0]);
+	expr = str = tv_get_string(&argvars[0]);
 	len = (long)STRLEN(str);
     }
 
-    pat = get_tv_string_buf_chk(&argvars[1], patbuf);
+    pat = tv_get_string_buf_chk(&argvars[1], patbuf);
     if (pat == NULL)
 	goto theend;
 
@@ -7902,7 +7902,7 @@
     {
 	int	    error = FALSE;
 
-	start = (long)get_tv_number_chk(&argvars[2], &error);
+	start = (long)tv_get_number_chk(&argvars[2], &error);
 	if (error)
 	    goto theend;
 	if (l != NULL)
@@ -7931,7 +7931,7 @@
 	}
 
 	if (argvars[3].v_type != VAR_UNKNOWN)
-	    nth = (long)get_tv_number_chk(&argvars[3], &error);
+	    nth = (long)tv_get_number_chk(&argvars[3], &error);
 	if (error)
 	    goto theend;
     }
@@ -8106,8 +8106,8 @@
 {
 #ifdef FEAT_SEARCH_EXTRA
     char_u	buf[NUMBUFLEN];
-    char_u	*grp = get_tv_string_buf_chk(&argvars[0], buf);	/* group */
-    char_u	*pat = get_tv_string_buf_chk(&argvars[1], buf);	/* pattern */
+    char_u	*grp = tv_get_string_buf_chk(&argvars[0], buf);	/* group */
+    char_u	*pat = tv_get_string_buf_chk(&argvars[1], buf);	/* pattern */
     int		prio = 10;	/* default priority */
     int		id = -1;
     int		error = FALSE;
@@ -8120,10 +8120,10 @@
 	return;
     if (argvars[2].v_type != VAR_UNKNOWN)
     {
-	prio = (int)get_tv_number_chk(&argvars[2], &error);
+	prio = (int)tv_get_number_chk(&argvars[2], &error);
 	if (argvars[3].v_type != VAR_UNKNOWN)
 	{
-	    id = (int)get_tv_number_chk(&argvars[3], &error);
+	    id = (int)tv_get_number_chk(&argvars[3], &error);
 	    if (argvars[4].v_type != VAR_UNKNOWN
 		&& matchadd_dict_arg(&argvars[4], &conceal_char, &win) == FAIL)
 		return;
@@ -8160,7 +8160,7 @@
 
     rettv->vval.v_number = -1;
 
-    group = get_tv_string_buf_chk(&argvars[0], buf);
+    group = tv_get_string_buf_chk(&argvars[0], buf);
     if (group == NULL)
 	return;
 
@@ -8175,10 +8175,10 @@
 
     if (argvars[2].v_type != VAR_UNKNOWN)
     {
-	prio = (int)get_tv_number_chk(&argvars[2], &error);
+	prio = (int)tv_get_number_chk(&argvars[2], &error);
 	if (argvars[3].v_type != VAR_UNKNOWN)
 	{
-	    id = (int)get_tv_number_chk(&argvars[3], &error);
+	    id = (int)tv_get_number_chk(&argvars[3], &error);
 
 	    if (argvars[4].v_type != VAR_UNKNOWN
 		&& matchadd_dict_arg(&argvars[4], &conceal_char, &win) == FAIL)
@@ -8209,7 +8209,7 @@
     if (rettv_list_alloc(rettv) == OK)
     {
 #ifdef FEAT_SEARCH_EXTRA
-	int	    id = (int)get_tv_number(&argvars[0]);
+	int	    id = (int)tv_get_number(&argvars[0]);
 	matchitem_T *m;
 
 	if (id >= 1 && id <= 3)
@@ -8238,7 +8238,7 @@
 {
 #ifdef FEAT_SEARCH_EXTRA
     rettv->vval.v_number = match_delete(curwin,
-				       (int)get_tv_number(&argvars[0]), TRUE);
+				       (int)tv_get_number(&argvars[0]), TRUE);
 #endif
 }
 
@@ -8296,13 +8296,13 @@
 	    li = l->lv_first;
 	    if (li != NULL)
 	    {
-		n = get_tv_number_chk(&li->li_tv, &error);
+		n = tv_get_number_chk(&li->li_tv, &error);
 		for (;;)
 		{
 		    li = li->li_next;
 		    if (li == NULL)
 			break;
-		    i = get_tv_number_chk(&li->li_tv, &error);
+		    i = tv_get_number_chk(&li->li_tv, &error);
 		    if (domax ? i > n : i < n)
 			n = i;
 		}
@@ -8325,7 +8325,7 @@
 		if (!HASHITEM_EMPTY(hi))
 		{
 		    --todo;
-		    i = get_tv_number_chk(&HI2DI(hi)->di_tv, &error);
+		    i = tv_get_number_chk(&HI2DI(hi)->di_tv, &error);
 		    if (first)
 		    {
 			n = i;
@@ -8405,7 +8405,7 @@
     if (check_restricted() || check_secure())
 	return;
 
-    dir = get_tv_string_buf(&argvars[0], buf);
+    dir = tv_get_string_buf(&argvars[0], buf);
     if (*dir == NUL)
 	return;
 
@@ -8417,11 +8417,11 @@
     {
 	if (argvars[2].v_type != VAR_UNKNOWN)
 	{
-	    prot = (int)get_tv_number_chk(&argvars[2], NULL);
+	    prot = (int)tv_get_number_chk(&argvars[2], NULL);
 	    if (prot == -1)
 		return;
 	}
-	if (STRCMP(get_tv_string(&argvars[1]), "p") == 0)
+	if (STRCMP(tv_get_string(&argvars[1]), "p") == 0)
 	{
 	    if (mch_isdir(dir))
 	    {
@@ -8535,7 +8535,7 @@
     char_u	*str;
     char_u	buf[NUMBUFLEN];
 
-    str = get_tv_string_buf(&argvars[0], buf);
+    str = tv_get_string_buf(&argvars[0], buf);
     do_mzeval(str, rettv);
 }
 
@@ -8561,7 +8561,7 @@
 {
     linenr_T	lnum;
 
-    for (lnum = get_tv_lnum(argvars); ; ++lnum)
+    for (lnum = tv_get_lnum(argvars); ; ++lnum)
     {
 	if (lnum < 0 || lnum > curbuf->b_ml.ml_line_count)
 	{
@@ -8588,16 +8588,16 @@
 	int	utf8 = 0;
 
 	if (argvars[1].v_type != VAR_UNKNOWN)
-	    utf8 = (int)get_tv_number_chk(&argvars[1], NULL);
+	    utf8 = (int)tv_get_number_chk(&argvars[1], NULL);
 	if (utf8)
-	    buf[(*utf_char2bytes)((int)get_tv_number(&argvars[0]), buf)] = NUL;
+	    buf[(*utf_char2bytes)((int)tv_get_number(&argvars[0]), buf)] = NUL;
 	else
-	    buf[(*mb_char2bytes)((int)get_tv_number(&argvars[0]), buf)] = NUL;
+	    buf[(*mb_char2bytes)((int)tv_get_number(&argvars[0]), buf)] = NUL;
     }
     else
 #endif
     {
-	buf[0] = (char_u)get_tv_number(&argvars[0]);
+	buf[0] = (char_u)tv_get_number(&argvars[0]);
 	buf[1] = NUL;
     }
     rettv->v_type = VAR_STRING;
@@ -8610,8 +8610,8 @@
     static void
 f_or(typval_T *argvars, typval_T *rettv)
 {
-    rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL)
-					| get_tv_number_chk(&argvars[1], NULL);
+    rettv->vval.v_number = tv_get_number_chk(&argvars[0], NULL)
+					| tv_get_number_chk(&argvars[1], NULL);
 }
 
 /*
@@ -8623,7 +8623,7 @@
     char_u	*p;
 
     rettv->v_type = VAR_STRING;
-    p = get_tv_string_chk(&argvars[0]);
+    p = tv_get_string_chk(&argvars[0]);
     if (p == NULL)
 	rettv->vval.v_string = NULL;
     else
@@ -8645,7 +8645,7 @@
     char_u	*str;
     char_u	buf[NUMBUFLEN];
 
-    str = get_tv_string_buf(&argvars[0], buf);
+    str = tv_get_string_buf(&argvars[0], buf);
     do_perleval(str, rettv);
 }
 #endif
@@ -8676,7 +8676,7 @@
 {
     linenr_T	lnum;
 
-    lnum = get_tv_lnum(argvars);
+    lnum = tv_get_lnum(argvars);
     if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count)
 	lnum = 0;
     else
@@ -8708,7 +8708,7 @@
 
     /* Get the required length, allocate the buffer and do it for real. */
     did_emsg = FALSE;
-    fmt = (char *)get_tv_string_buf(&argvars[0], buf);
+    fmt = (char *)tv_get_string_buf(&argvars[0], buf);
     len = vim_vsnprintf_typval(NULL, 0, fmt, ap, argvars + 1);
     if (!did_emsg)
     {
@@ -8797,7 +8797,7 @@
     if (buf == NULL)
 	return;
 
-    text = get_tv_string(&argvars[1]);
+    text = tv_get_string(&argvars[1]);
     vim_free(buf->b_prompt_text);
     buf->b_prompt_text = vim_strsave(text);
 }
@@ -8828,7 +8828,7 @@
     if (p_pyx == 0)
 	p_pyx = 3;
 
-    str = get_tv_string_buf(&argvars[0], buf);
+    str = tv_get_string_buf(&argvars[0], buf);
     do_py3eval(str, rettv);
 }
 #endif
@@ -8846,7 +8846,7 @@
     if (p_pyx == 0)
 	p_pyx = 2;
 
-    str = get_tv_string_buf(&argvars[0], buf);
+    str = tv_get_string_buf(&argvars[0], buf);
     do_pyeval(str, rettv);
 }
 #endif
@@ -8884,7 +8884,7 @@
     varnumber_T	i;
     int		error = FALSE;
 
-    start = get_tv_number_chk(&argvars[0], &error);
+    start = tv_get_number_chk(&argvars[0], &error);
     if (argvars[1].v_type == VAR_UNKNOWN)
     {
 	end = start - 1;
@@ -8892,9 +8892,9 @@
     }
     else
     {
-	end = get_tv_number_chk(&argvars[1], &error);
+	end = tv_get_number_chk(&argvars[1], &error);
 	if (argvars[2].v_type != VAR_UNKNOWN)
-	    stride = get_tv_number_chk(&argvars[2], &error);
+	    stride = tv_get_number_chk(&argvars[2], &error);
     }
 
     if (error)
@@ -8936,10 +8936,10 @@
 
     if (argvars[1].v_type != VAR_UNKNOWN)
     {
-	if (STRCMP(get_tv_string(&argvars[1]), "b") == 0)
+	if (STRCMP(tv_get_string(&argvars[1]), "b") == 0)
 	    binary = TRUE;
 	if (argvars[2].v_type != VAR_UNKNOWN)
-	    maxline = (long)get_tv_number(&argvars[2]);
+	    maxline = (long)tv_get_number(&argvars[2]);
     }
 
     if (rettv_list_alloc(rettv) == FAIL)
@@ -8947,7 +8947,7 @@
 
     /* Always open the file in binary mode, library functions have a mind of
      * their own about CR-LF conversion. */
-    fname = get_tv_string(&argvars[0]);
+    fname = tv_get_string(&argvars[0]);
     if (*fname == NUL || (fd = mch_fopen((char *)fname, READBIN)) == NULL)
     {
 	EMSG2(_(e_notopen), *fname == NUL ? (char_u *)_("<empty>") : fname);
@@ -9318,12 +9318,12 @@
 # endif
     if (argvars[2].v_type != VAR_UNKNOWN
 	    && argvars[3].v_type != VAR_UNKNOWN)
-	timeout = get_tv_number(&argvars[3]);
+	timeout = tv_get_number(&argvars[3]);
 
-    server_name = get_tv_string_chk(&argvars[0]);
+    server_name = tv_get_string_chk(&argvars[0]);
     if (server_name == NULL)
 	return;		/* type error; errmsg already given */
-    keys = get_tv_string_buf(&argvars[1], buf);
+    keys = tv_get_string_buf(&argvars[1], buf);
 # ifdef WIN32
     if (serverSendToVim(server_name, keys, &r, &w, expr, timeout, TRUE) < 0)
 # else
@@ -9349,7 +9349,7 @@
 	char_u		str[30];
 	char_u		*idvar;
 
-	idvar = get_tv_string_chk(&argvars[2]);
+	idvar = tv_get_string_chk(&argvars[2]);
 	if (idvar != NULL && *idvar != NUL)
 	{
 	    sprintf((char *)str, PRINTF_HEX_LONG_U, (long_u)w);
@@ -9385,7 +9385,7 @@
 # ifdef WIN32
     /* On Win32 it's done in this application. */
     {
-	char_u	*server_name = get_tv_string_chk(&argvars[0]);
+	char_u	*server_name = tv_get_string_chk(&argvars[0]);
 
 	if (server_name != NULL)
 	    serverForeground(server_name);
@@ -9419,7 +9419,7 @@
 	rettv->vval.v_number = -1;
 	return;
     }
-    serverid = get_tv_string_chk(&argvars[0]);
+    serverid = tv_get_string_chk(&argvars[0]);
     if (serverid == NULL)
     {
 	rettv->vval.v_number = -1;
@@ -9448,7 +9448,7 @@
 
 	v.di_tv.v_type = VAR_STRING;
 	v.di_tv.vval.v_string = vim_strsave(s);
-	retvar = get_tv_string_chk(&argvars[1]);
+	retvar = tv_get_string_chk(&argvars[1]);
 	if (retvar != NULL)
 	    set_var(retvar, &v.di_tv, FALSE);
 	vim_free(v.di_tv.vval.v_string);
@@ -9464,7 +9464,7 @@
     char_u	*r = NULL;
 
 #ifdef FEAT_CLIENTSERVER
-    char_u	*serverid = get_tv_string_chk(&argvars[0]);
+    char_u	*serverid = tv_get_string_chk(&argvars[0]);
 
     if (serverid != NULL && !check_restricted() && !check_secure())
     {
@@ -9475,7 +9475,7 @@
 # endif
 
 	if (argvars[1].v_type != VAR_UNKNOWN)
-	    timeout = get_tv_number(&argvars[1]);
+	    timeout = tv_get_number(&argvars[1]);
 
 # ifdef WIN32
 	sscanf((char *)serverid, SCANF_HEX_LONG_U, &n);
@@ -9514,7 +9514,7 @@
 f_remote_startserver(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_CLIENTSERVER
-    char_u	*server = get_tv_string_chk(&argvars[0]);
+    char_u	*server = tv_get_string_chk(&argvars[0]);
 
     if (server == NULL)
 	return;		/* type error; errmsg already given */
@@ -9557,7 +9557,7 @@
 	else if ((d = argvars[0].vval.v_dict) != NULL
 		&& !tv_check_lock(d->dv_lock, arg_errmsg, TRUE))
 	{
-	    key = get_tv_string_chk(&argvars[1]);
+	    key = tv_get_string_chk(&argvars[1]);
 	    if (key != NULL)
 	    {
 		di = dict_find(d, key, -1);
@@ -9580,7 +9580,7 @@
     {
 	int	    error = FALSE;
 
-	idx = (long)get_tv_number_chk(&argvars[1], &error);
+	idx = (long)tv_get_number_chk(&argvars[1], &error);
 	if (error)
 	    ;		/* type error: do nothing, errmsg already given */
 	else if ((item = list_find(l, idx)) == NULL)
@@ -9597,7 +9597,7 @@
 	    else
 	    {
 		/* Remove range of items, return list with values. */
-		end = (long)get_tv_number_chk(&argvars[2], &error);
+		end = (long)tv_get_number_chk(&argvars[2], &error);
 		if (error)
 		    ;		/* type error: do nothing */
 		else if ((item2 = list_find(l, end)) == NULL)
@@ -9644,8 +9644,8 @@
     if (check_restricted() || check_secure())
 	rettv->vval.v_number = -1;
     else
-	rettv->vval.v_number = vim_rename(get_tv_string(&argvars[0]),
-				      get_tv_string_buf(&argvars[1], buf));
+	rettv->vval.v_number = vim_rename(tv_get_string(&argvars[0]),
+				      tv_get_string_buf(&argvars[1], buf));
 }
 
 /*
@@ -9661,7 +9661,7 @@
     char_u	*r;
     int		i;
 
-    n = (int)get_tv_number(&argvars[1]);
+    n = (int)tv_get_number(&argvars[1]);
     if (argvars[0].v_type == VAR_LIST)
     {
 	if (rettv_list_alloc(rettv) == OK && argvars[0].vval.v_list != NULL)
@@ -9672,7 +9672,7 @@
     }
     else
     {
-	p = get_tv_string(&argvars[0]);
+	p = tv_get_string(&argvars[0]);
 	rettv->v_type = VAR_STRING;
 	rettv->vval.v_string = NULL;
 
@@ -9704,7 +9704,7 @@
     char_u	*buf = NULL;
 #endif
 
-    p = get_tv_string(&argvars[0]);
+    p = tv_get_string(&argvars[0]);
 #ifdef FEAT_SHORTCUT
     {
 	char_u	*v = NULL;
@@ -9950,7 +9950,7 @@
 
     if (varp->v_type != VAR_UNKNOWN)
     {
-	flags = get_tv_string_buf_chk(varp, nbuf);
+	flags = tv_get_string_buf_chk(varp, nbuf);
 	if (flags == NULL)
 	    return 0;		/* type error; errmsg already given */
 	while (*flags != NUL)
@@ -10010,7 +10010,7 @@
     int		options = SEARCH_KEEP;
     int		subpatnum;
 
-    pat = get_tv_string(&argvars[0]);
+    pat = tv_get_string(&argvars[0]);
     dir = get_search_arg(&argvars[1], flagsp);	/* may set p_ws */
     if (dir == 0)
 	goto theend;
@@ -10025,13 +10025,13 @@
     /* Optional arguments: line number to stop searching and timeout. */
     if (argvars[1].v_type != VAR_UNKNOWN && argvars[2].v_type != VAR_UNKNOWN)
     {
-	lnum_stop = (long)get_tv_number_chk(&argvars[2], NULL);
+	lnum_stop = (long)tv_get_number_chk(&argvars[2], NULL);
 	if (lnum_stop < 0)
 	    goto theend;
 #ifdef FEAT_RELTIME
 	if (argvars[3].v_type != VAR_UNKNOWN)
 	{
-	    time_limit = (long)get_tv_number_chk(&argvars[3], NULL);
+	    time_limit = (long)tv_get_number_chk(&argvars[3], NULL);
 	    if (time_limit < 0)
 		goto theend;
 	}
@@ -10052,7 +10052,7 @@
     if (((flags & (SP_REPEAT | SP_RETCOUNT)) != 0)
 	    || ((flags & SP_NOMOVE) && (flags & SP_SETPCMARK)))
     {
-	EMSG2(_(e_invarg2), get_tv_string(&argvars[1]));
+	EMSG2(_(e_invarg2), tv_get_string(&argvars[1]));
 	goto theend;
     }
 
@@ -10127,8 +10127,8 @@
     int		col;
     int		c;
 
-    row = (int)get_tv_number_chk(&argvars[0], NULL) - 1;
-    col = (int)get_tv_number_chk(&argvars[1], NULL) - 1;
+    row = (int)tv_get_number_chk(&argvars[0], NULL) - 1;
+    col = (int)tv_get_number_chk(&argvars[1], NULL) - 1;
     if (row < 0 || row >= screen_Rows
 	    || col < 0 || col >= screen_Columns)
 	c = -1;
@@ -10148,8 +10148,8 @@
     int		off;
     int		c;
 
-    row = (int)get_tv_number_chk(&argvars[0], NULL) - 1;
-    col = (int)get_tv_number_chk(&argvars[1], NULL) - 1;
+    row = (int)tv_get_number_chk(&argvars[0], NULL) - 1;
+    col = (int)tv_get_number_chk(&argvars[1], NULL) - 1;
     if (row < 0 || row >= screen_Rows
 	    || col < 0 || col >= screen_Columns)
 	c = -1;
@@ -10210,12 +10210,12 @@
 
     rettv->vval.v_number = 1;	/* default: FAIL */
 
-    name = get_tv_string_chk(&argvars[0]);
+    name = tv_get_string_chk(&argvars[0]);
     if (argvars[1].v_type != VAR_UNKNOWN)
     {
-	locally = (int)get_tv_number_chk(&argvars[1], &error) == 0;
+	locally = (int)tv_get_number_chk(&argvars[1], &error) == 0;
 	if (!error && argvars[2].v_type != VAR_UNKNOWN)
-	    thisblock = (int)get_tv_number_chk(&argvars[2], &error) != 0;
+	    thisblock = (int)tv_get_number_chk(&argvars[2], &error) != 0;
     }
     if (!error && name != NULL)
 	rettv->vval.v_number = find_decl(name, (int)STRLEN(name),
@@ -10241,9 +10241,9 @@
 
     /* Get the three pattern arguments: start, middle, end. Will result in an
      * error if not a valid argument. */
-    spat = get_tv_string_chk(&argvars[0]);
-    mpat = get_tv_string_buf_chk(&argvars[1], nbuf1);
-    epat = get_tv_string_buf_chk(&argvars[2], nbuf2);
+    spat = tv_get_string_chk(&argvars[0]);
+    mpat = tv_get_string_buf_chk(&argvars[1], nbuf1);
+    epat = tv_get_string_buf_chk(&argvars[2], nbuf2);
     if (spat == NULL || mpat == NULL || epat == NULL)
 	goto theend;	    /* type error */
 
@@ -10258,7 +10258,7 @@
     if ((flags & (SP_END | SP_SUBPAT)) != 0
 	    || ((flags & SP_NOMOVE) && (flags & SP_SETPCMARK)))
     {
-	EMSG2(_(e_invarg2), get_tv_string(&argvars[3]));
+	EMSG2(_(e_invarg2), tv_get_string(&argvars[3]));
 	goto theend;
     }
 
@@ -10277,24 +10277,24 @@
 	    && skip->v_type != VAR_STRING)
 	{
 	    /* Type error */
-	    EMSG2(_(e_invarg2), get_tv_string(&argvars[4]));
+	    EMSG2(_(e_invarg2), tv_get_string(&argvars[4]));
 	    goto theend;
 	}
 	if (argvars[5].v_type != VAR_UNKNOWN)
 	{
-	    lnum_stop = (long)get_tv_number_chk(&argvars[5], NULL);
+	    lnum_stop = (long)tv_get_number_chk(&argvars[5], NULL);
 	    if (lnum_stop < 0)
 	    {
-		EMSG2(_(e_invarg2), get_tv_string(&argvars[5]));
+		EMSG2(_(e_invarg2), tv_get_string(&argvars[5]));
 		goto theend;
 	    }
 #ifdef FEAT_RELTIME
 	    if (argvars[6].v_type != VAR_UNKNOWN)
 	    {
-		time_limit = (long)get_tv_number_chk(&argvars[6], NULL);
+		time_limit = (long)tv_get_number_chk(&argvars[6], NULL);
 		if (time_limit < 0)
 		{
-		    EMSG2(_(e_invarg2), get_tv_string(&argvars[6]));
+		    EMSG2(_(e_invarg2), tv_get_string(&argvars[6]));
 		    goto theend;
 		}
 	    }
@@ -10544,8 +10544,8 @@
 {
 #ifdef FEAT_CLIENTSERVER
     char_u	buf[NUMBUFLEN];
-    char_u	*server = get_tv_string_chk(&argvars[0]);
-    char_u	*reply = get_tv_string_buf_chk(&argvars[1], buf);
+    char_u	*server = tv_get_string_chk(&argvars[0]);
+    char_u	*reply = tv_get_string_buf_chk(&argvars[1], buf);
 
     rettv->vval.v_number = -1;
     if (server == NULL || reply == NULL)
@@ -10600,7 +10600,7 @@
 	rettv->vval.v_number = 1; /* FAIL */
     else
     {
-	lnum = get_tv_lnum_buf(&argvars[1], buf);
+	lnum = tv_get_lnum_buf(&argvars[1], buf);
 	set_buffer_lines(buf, lnum, FALSE, &argvars[2], rettv);
     }
 }
@@ -10618,8 +10618,8 @@
 
     if (check_restricted() || check_secure())
 	return;
-    (void)get_tv_number(&argvars[0]);	    /* issue errmsg if type error */
-    varname = get_tv_string_chk(&argvars[1]);
+    (void)tv_get_number(&argvars[0]);	    /* issue errmsg if type error */
+    varname = tv_get_string_chk(&argvars[1]);
     buf = get_buf_tv(&argvars[0], FALSE);
     varp = &argvars[2];
 
@@ -10636,8 +10636,8 @@
 	    aucmd_prepbuf(&aco, buf);
 
 	    ++varname;
-	    numval = (long)get_tv_number_chk(varp, &error);
-	    strval = get_tv_string_buf_chk(varp, nbuf);
+	    numval = (long)tv_get_number_chk(varp, &error);
+	    strval = tv_get_string_buf_chk(varp, nbuf);
 	    if (!error && strval != NULL)
 		set_option_value(varname, numval, strval, OPT_LOCAL);
 
@@ -10696,12 +10696,12 @@
 
 	di = dict_find(d, (char_u *)"forward", -1);
 	if (di != NULL)
-	    set_csearch_direction((int)get_tv_number(&di->di_tv)
+	    set_csearch_direction((int)tv_get_number(&di->di_tv)
 							? FORWARD : BACKWARD);
 
 	di = dict_find(d, (char_u *)"until", -1);
 	if (di != NULL)
-	    set_csearch_until(!!get_tv_number(&di->di_tv));
+	    set_csearch_until(!!tv_get_number(&di->di_tv));
     }
 }
 
@@ -10711,7 +10711,7 @@
     static void
 f_setcmdpos(typval_T *argvars, typval_T *rettv)
 {
-    int		pos = (int)get_tv_number(&argvars[0]) - 1;
+    int		pos = (int)tv_get_number(&argvars[0]) - 1;
 
     if (pos >= 0)
 	rettv->vval.v_number = set_cmdline_pos(pos);
@@ -10731,10 +10731,10 @@
     int		mode = 0;
 
     rettv->vval.v_number = 0;
-    fname = get_tv_string_chk(&argvars[0]);
+    fname = tv_get_string_chk(&argvars[0]);
     if (fname == NULL)
 	return;
-    mode_str = get_tv_string_buf_chk(&argvars[1], modebuf);
+    mode_str = tv_get_string_buf_chk(&argvars[1], modebuf);
     if (mode_str == NULL)
 	return;
     if (STRLEN(mode_str) != 9)
@@ -10759,7 +10759,7 @@
     static void
 f_setline(typval_T *argvars, typval_T *rettv)
 {
-    linenr_T	lnum = get_tv_lnum(&argvars[0]);
+    linenr_T	lnum = tv_get_lnum(&argvars[0]);
 
     set_buffer_lines(curbuf, lnum, FALSE, &argvars[1], rettv);
 }
@@ -10797,7 +10797,7 @@
 
 	if (action_arg->v_type == VAR_STRING)
 	{
-	    act = get_tv_string_chk(action_arg);
+	    act = tv_get_string_chk(action_arg);
 	    if (act == NULL)
 		return;		/* type error; errmsg already given */
 	    if ((*act == 'a' || *act == 'r' || *act == ' ' || *act == 'f') &&
@@ -10971,7 +10971,7 @@
     colnr_T	curswant = -1;
 
     rettv->vval.v_number = -1;
-    name = get_tv_string_chk(argvars);
+    name = tv_get_string_chk(argvars);
     if (name != NULL)
     {
 	if (list2fpos(&argvars[1], &pos, &fnum, &curswant) == OK)
@@ -11029,7 +11029,7 @@
     yank_type = MAUTO;
     append = FALSE;
 
-    strregname = get_tv_string_chk(argvars);
+    strregname = tv_get_string_chk(argvars);
     rettv->vval.v_number = 1;		/* FAIL is default */
 
     if (strregname == NULL)
@@ -11040,7 +11040,7 @@
 
     if (argvars[2].v_type != VAR_UNKNOWN)
     {
-	stropt = get_tv_string_chk(&argvars[2]);
+	stropt = tv_get_string_chk(&argvars[2]);
 	if (stropt == NULL)
 	    return;		/* type error */
 	for (; *stropt != NUL; ++stropt)
@@ -11093,12 +11093,12 @@
 	for (li = ll == NULL ? NULL : ll->lv_first; li != NULL;
 							     li = li->li_next)
 	{
-	    strval = get_tv_string_buf_chk(&li->li_tv, buf);
+	    strval = tv_get_string_buf_chk(&li->li_tv, buf);
 	    if (strval == NULL)
 		goto free_lstval;
 	    if (strval == buf)
 	    {
-		/* Need to make a copy, next get_tv_string_buf_chk() will
+		/* Need to make a copy, next tv_get_string_buf_chk() will
 		 * overwrite the string. */
 		strval = vim_strsave(buf);
 		if (strval == NULL)
@@ -11118,7 +11118,7 @@
     }
     else
     {
-	strval = get_tv_string_chk(&argvars[1]);
+	strval = tv_get_string_chk(&argvars[1]);
 	if (strval == NULL)
 	    return;
 	write_reg_contents_ex(regname, strval, -1,
@@ -11143,8 +11143,8 @@
     if (check_restricted() || check_secure())
 	return;
 
-    tp = find_tabpage((int)get_tv_number_chk(&argvars[0], NULL));
-    varname = get_tv_string_chk(&argvars[1]);
+    tp = find_tabpage((int)tv_get_number_chk(&argvars[0], NULL));
+    varname = tv_get_string_chk(&argvars[1]);
     varp = &argvars[2];
 
     if (varname != NULL && varp != NULL && tp != NULL)
@@ -11211,7 +11211,7 @@
     else if (argvars[2].v_type == VAR_STRING)
     {
 	char_u	*actstr;
-	actstr = get_tv_string_chk(&argvars[2]);
+	actstr = tv_get_string_chk(&argvars[2]);
 	if (actstr == NULL)
 	    return;
 	if ((*actstr == 'r' || *actstr == 'a') && actstr[1] == NUL)
@@ -11250,7 +11250,7 @@
 {
     char_u	*p;
 
-    p = get_tv_string(&argvars[0]);
+    p = tv_get_string(&argvars[0]);
     rettv->vval.v_string = vim_strsave(
 				    sha256_bytes(p, (int)STRLEN(p), NULL, 0));
     rettv->v_type = VAR_STRING;
@@ -11266,7 +11266,7 @@
     int do_special = non_zero_arg(&argvars[1]);
 
     rettv->vval.v_string = vim_strsave_shellescape(
-			   get_tv_string(&argvars[0]), do_special, do_special);
+			   tv_get_string(&argvars[0]), do_special, do_special);
     rettv->v_type = VAR_STRING;
 }
 
@@ -11282,7 +11282,7 @@
     {
 	long	col;
 
-	col = (long)get_tv_number_chk(argvars, NULL);
+	col = (long)tv_get_number_chk(argvars, NULL);
 	if (col < 0)
 	    return;	// type error; errmsg already given
 #ifdef FEAT_VARTABS
@@ -11310,7 +11310,7 @@
 
     rettv->vval.v_number = -1;
 
-    name = get_tv_string_chk(&argvars[0]);
+    name = tv_get_string_chk(&argvars[0]);
     if (name == NULL)
 	return;
 
@@ -11355,7 +11355,7 @@
 	return;
 
     if (argvars[0].v_type != VAR_UNKNOWN)
-	name = get_tv_string(&argvars[0]);
+	name = tv_get_string(&argvars[0]);
 
     sign_getlist(name, rettv->vval.v_list);
 }
@@ -11384,7 +11384,7 @@
 	if (buf == NULL)
 	{
 	    EMSG2(_("E158: Invalid buffer name: %s"),
-						get_tv_string(&argvars[0]));
+						tv_get_string(&argvars[0]));
 	    return;
 	}
 
@@ -11399,21 +11399,21 @@
 	    if ((di = dict_find(dict, (char_u *)"lnum", -1)) != NULL)
 	    {
 		// get signs placed at this line
-		(void)get_tv_number_chk(&di->di_tv, &notanum);
+		(void)tv_get_number_chk(&di->di_tv, &notanum);
 		if (notanum)
 		    return;
-		lnum = get_tv_lnum(&di->di_tv);
+		lnum = tv_get_lnum(&di->di_tv);
 	    }
 	    if ((di = dict_find(dict, (char_u *)"id", -1)) != NULL)
 	    {
 		// get sign placed with this identifier
-		sign_id = (int)get_tv_number_chk(&di->di_tv, &notanum);
+		sign_id = (int)tv_get_number_chk(&di->di_tv, &notanum);
 		if (notanum)
 		    return;
 	    }
 	    if ((di = dict_find(dict, (char_u *)"group", -1)) != NULL)
 	    {
-		group = get_tv_string_chk(&di->di_tv);
+		group = tv_get_string_chk(&di->di_tv);
 		if (group == NULL)
 		    return;
 	    }
@@ -11442,7 +11442,7 @@
     rettv->vval.v_number = -1;
 
     // Sign identifer
-    sign_id = (int)get_tv_number_chk(&argvars[0], &notanum);
+    sign_id = (int)tv_get_number_chk(&argvars[0], &notanum);
     if (notanum)
 	return;
     if (sign_id < 0)
@@ -11452,7 +11452,7 @@
     }
 
     // Sign group
-    group = get_tv_string_chk(&argvars[1]);
+    group = tv_get_string_chk(&argvars[1]);
     if (group == NULL)
 	return;
     if (group[0] == '\0')
@@ -11465,7 +11465,7 @@
     }
 
     // Sign name
-    sign_name = get_tv_string_chk(&argvars[2]);
+    sign_name = tv_get_string_chk(&argvars[2]);
     if (sign_name == NULL)
 	goto cleanup;
 
@@ -11473,7 +11473,7 @@
     buf = find_buffer(&argvars[3]);
     if (buf == NULL)
     {
-	EMSG2(_("E158: Invalid buffer name: %s"), get_tv_string(&argvars[2]));
+	EMSG2(_("E158: Invalid buffer name: %s"), tv_get_string(&argvars[2]));
 	goto cleanup;
     }
 
@@ -11489,15 +11489,15 @@
 	// Line number where the sign is to be placed
 	if ((di = dict_find(dict, (char_u *)"lnum", -1)) != NULL)
 	{
-	    (void)get_tv_number_chk(&di->di_tv, &notanum);
+	    (void)tv_get_number_chk(&di->di_tv, &notanum);
 	    if (notanum)
 		goto cleanup;
-	    lnum = get_tv_lnum(&di->di_tv);
+	    lnum = tv_get_lnum(&di->di_tv);
 	}
 	if ((di = dict_find(dict, (char_u *)"priority", -1)) != NULL)
 	{
 	    // Sign priority
-	    prio = (int)get_tv_number_chk(&di->di_tv, &notanum);
+	    prio = (int)tv_get_number_chk(&di->di_tv, &notanum);
 	    if (notanum)
 		goto cleanup;
 	}
@@ -11529,7 +11529,7 @@
     else
     {
 	// Free only the specified sign
-	name = get_tv_string_chk(&argvars[0]);
+	name = tv_get_string_chk(&argvars[0]);
 	if (name == NULL)
 	    return;
 
@@ -11558,7 +11558,7 @@
 	return;
     }
 
-    group = get_tv_string(&argvars[0]);
+    group = tv_get_string(&argvars[0]);
     if (group[0] == '\0')
 	group = NULL;			// global sign group
     else
@@ -11583,7 +11583,7 @@
 	    if (buf == NULL)
 	    {
 		EMSG2(_("E158: Invalid buffer name: %s"),
-						get_tv_string(&di->di_tv));
+						tv_get_string(&di->di_tv));
 		return;
 	    }
 	}
@@ -11615,7 +11615,7 @@
 {
     char_u	*p;
 
-    p = get_tv_string(&argvars[0]);
+    p = tv_get_string(&argvars[0]);
     rettv->vval.v_string = vim_strsave(p);
     simplify_filename(rettv->vval.v_string);	/* simplify in place */
     rettv->v_type = VAR_STRING;
@@ -11713,8 +11713,8 @@
 
     if (sortinfo->item_compare_numbers)
     {
-	varnumber_T	v1 = get_tv_number(tv1);
-	varnumber_T	v2 = get_tv_number(tv2);
+	varnumber_T	v1 = tv_get_number(tv1);
+	varnumber_T	v2 = tv_get_number(tv2);
 
 	return v1 == v2 ? 0 : v1 > v2 ? 1 : -1;
     }
@@ -11722,8 +11722,8 @@
 #ifdef FEAT_FLOAT
     if (sortinfo->item_compare_float)
     {
-	float_T	v1 = get_tv_float(tv1);
-	float_T	v2 = get_tv_float(tv2);
+	float_T	v1 = tv_get_float(tv1);
+	float_T	v2 = tv_get_float(tv2);
 
 	return v1 == v2 ? 0 : v1 > v2 ? 1 : -1;
     }
@@ -11820,7 +11820,7 @@
     if (res == FAIL)
 	res = ITEM_COMPARE_FAIL;
     else
-	res = (int)get_tv_number_chk(&rettv, &sortinfo->item_compare_func_err);
+	res = (int)tv_get_number_chk(&rettv, &sortinfo->item_compare_func_err);
     if (sortinfo->item_compare_func_err)
 	res = ITEM_COMPARE_FAIL;  /* return value has wrong type */
     clear_tv(&rettv);
@@ -11887,13 +11887,13 @@
 	    {
 		int	    error = FALSE;
 
-		i = (long)get_tv_number_chk(&argvars[1], &error);
+		i = (long)tv_get_number_chk(&argvars[1], &error);
 		if (error)
 		    goto theend;	/* type error; errmsg already given */
 		if (i == 1)
 		    info.item_compare_ic = TRUE;
 		else if (argvars[1].v_type != VAR_NUMBER)
-		    info.item_compare_func = get_tv_string(&argvars[1]);
+		    info.item_compare_func = tv_get_string(&argvars[1]);
 		else if (i != 0)
 		{
 		    EMSG(_(e_invarg));
@@ -12059,7 +12059,7 @@
     char_u	*s;
 
     rettv->v_type = VAR_STRING;
-    s = get_tv_string(&argvars[0]);
+    s = tv_get_string(&argvars[0]);
 #ifdef FEAT_SPELL
     rettv->vval.v_string = eval_soundfold(s);
 #else
@@ -12093,7 +12093,7 @@
     }
     else if (curwin->w_p_spell && *curbuf->b_s.b_p_spl != NUL)
     {
-	char_u	*str = get_tv_string_chk(&argvars[0]);
+	char_u	*str = tv_get_string_chk(&argvars[0]);
 	int	capcol = -1;
 
 	if (str != NULL)
@@ -12145,15 +12145,15 @@
 #ifdef FEAT_SPELL
     if (curwin->w_p_spell && *curwin->w_s->b_p_spl != NUL)
     {
-	str = get_tv_string(&argvars[0]);
+	str = tv_get_string(&argvars[0]);
 	if (argvars[1].v_type != VAR_UNKNOWN)
 	{
-	    maxcount = (int)get_tv_number_chk(&argvars[1], &typeerr);
+	    maxcount = (int)tv_get_number_chk(&argvars[1], &typeerr);
 	    if (maxcount <= 0)
 		return;
 	    if (argvars[2].v_type != VAR_UNKNOWN)
 	    {
-		need_capital = (int)get_tv_number_chk(&argvars[2], &typeerr);
+		need_capital = (int)tv_get_number_chk(&argvars[2], &typeerr);
 		if (typeerr)
 		    return;
 	    }
@@ -12201,14 +12201,14 @@
     save_cpo = p_cpo;
     p_cpo = (char_u *)"";
 
-    str = get_tv_string(&argvars[0]);
+    str = tv_get_string(&argvars[0]);
     if (argvars[1].v_type != VAR_UNKNOWN)
     {
-	pat = get_tv_string_buf_chk(&argvars[1], patbuf);
+	pat = tv_get_string_buf_chk(&argvars[1], patbuf);
 	if (pat == NULL)
 	    typeerr = TRUE;
 	if (argvars[2].v_type != VAR_UNKNOWN)
-	    keepempty = (int)get_tv_number_chk(&argvars[2], &typeerr);
+	    keepempty = (int)tv_get_number_chk(&argvars[2], &typeerr);
     }
     if (pat == NULL || *pat == NUL)
 	pat = (char_u *)"[\\x01- ]\\+";
@@ -12284,7 +12284,7 @@
     static void
 f_str2float(typval_T *argvars, typval_T *rettv)
 {
-    char_u *p = skipwhite(get_tv_string(&argvars[0]));
+    char_u *p = skipwhite(tv_get_string(&argvars[0]));
     int     isneg = (*p == '-');
 
     if (*p == '+' || *p == '-')
@@ -12310,7 +12310,7 @@
 
     if (argvars[1].v_type != VAR_UNKNOWN)
     {
-	base = (int)get_tv_number(&argvars[1]);
+	base = (int)tv_get_number(&argvars[1]);
 	if (base != 2 && base != 8 && base != 10 && base != 16)
 	{
 	    EMSG(_(e_invarg));
@@ -12318,7 +12318,7 @@
 	}
     }
 
-    p = skipwhite(get_tv_string(&argvars[0]));
+    p = skipwhite(tv_get_string(&argvars[0]));
     isneg = (*p == '-');
     if (*p == '+' || *p == '-')
 	p = skipwhite(p + 1);
@@ -12351,11 +12351,11 @@
 
     rettv->v_type = VAR_STRING;
 
-    p = get_tv_string(&argvars[0]);
+    p = tv_get_string(&argvars[0]);
     if (argvars[1].v_type == VAR_UNKNOWN)
 	seconds = time(NULL);
     else
-	seconds = (time_t)get_tv_number(&argvars[1]);
+	seconds = (time_t)tv_get_number(&argvars[1]);
     curtime = localtime(&seconds);
     /* MSVC returns NULL for an invalid value of seconds. */
     if (curtime == NULL)
@@ -12409,11 +12409,11 @@
     int		charidx;
 
     rettv->vval.v_number = -1;
-    str = get_tv_string_chk(&argvars[0]);
+    str = tv_get_string_chk(&argvars[0]);
     if (str == NULL)
 	return;
     len = (int)STRLEN(str);
-    charidx = (int)get_tv_number_chk(&argvars[1], &error);
+    charidx = (int)tv_get_number_chk(&argvars[1], &error);
     if (error)
 	return;
 #ifdef FEAT_MBYTE
@@ -12450,8 +12450,8 @@
     char_u	*pos;
     int		start_idx;
 
-    needle = get_tv_string_chk(&argvars[1]);
-    save_haystack = haystack = get_tv_string_buf_chk(&argvars[0], buf);
+    needle = tv_get_string_chk(&argvars[1]);
+    save_haystack = haystack = tv_get_string_buf_chk(&argvars[0], buf);
     rettv->vval.v_number = -1;
     if (needle == NULL || haystack == NULL)
 	return;		/* type error; errmsg already given */
@@ -12460,7 +12460,7 @@
     {
 	int	    error = FALSE;
 
-	start_idx = (int)get_tv_number_chk(&argvars[2], &error);
+	start_idx = (int)tv_get_number_chk(&argvars[2], &error);
 	if (error || start_idx >= (int)STRLEN(haystack))
 	    return;
 	if (start_idx >= 0)
@@ -12496,7 +12496,7 @@
 f_strlen(typval_T *argvars, typval_T *rettv)
 {
     rettv->vval.v_number = (varnumber_T)(STRLEN(
-					      get_tv_string(&argvars[0])));
+					      tv_get_string(&argvars[0])));
 }
 
 /*
@@ -12505,7 +12505,7 @@
     static void
 f_strchars(typval_T *argvars, typval_T *rettv)
 {
-    char_u		*s = get_tv_string(&argvars[0]);
+    char_u		*s = tv_get_string(&argvars[0]);
     int			skipcc = 0;
 #ifdef FEAT_MBYTE
     varnumber_T		len = 0;
@@ -12513,7 +12513,7 @@
 #endif
 
     if (argvars[1].v_type != VAR_UNKNOWN)
-	skipcc = (int)get_tv_number_chk(&argvars[1], NULL);
+	skipcc = (int)tv_get_number_chk(&argvars[1], NULL);
     if (skipcc < 0 || skipcc > 1)
 	EMSG(_(e_invarg));
     else
@@ -12538,11 +12538,11 @@
     static void
 f_strdisplaywidth(typval_T *argvars, typval_T *rettv)
 {
-    char_u	*s = get_tv_string(&argvars[0]);
+    char_u	*s = tv_get_string(&argvars[0]);
     int		col = 0;
 
     if (argvars[1].v_type != VAR_UNKNOWN)
-	col = (int)get_tv_number(&argvars[1]);
+	col = (int)tv_get_number(&argvars[1]);
 
     rettv->vval.v_number = (varnumber_T)(linetabsize_col(col, s) - col);
 }
@@ -12553,7 +12553,7 @@
     static void
 f_strwidth(typval_T *argvars, typval_T *rettv)
 {
-    char_u	*s = get_tv_string(&argvars[0]);
+    char_u	*s = tv_get_string(&argvars[0]);
 
     rettv->vval.v_number = (varnumber_T)(
 #ifdef FEAT_MBYTE
@@ -12579,10 +12579,10 @@
     int		slen;
     int		error = FALSE;
 
-    p = get_tv_string(&argvars[0]);
+    p = tv_get_string(&argvars[0]);
     slen = (int)STRLEN(p);
 
-    nchar = (int)get_tv_number_chk(&argvars[1], &error);
+    nchar = (int)tv_get_number_chk(&argvars[1], &error);
     if (!error)
     {
 	if (nchar > 0)
@@ -12595,7 +12595,7 @@
 	    nbyte = nchar;
 	if (argvars[2].v_type != VAR_UNKNOWN)
 	{
-	    charlen = (int)get_tv_number(&argvars[2]);
+	    charlen = (int)tv_get_number(&argvars[2]);
 	    while (charlen > 0 && nbyte + len < slen)
 	    {
 		int off = nbyte + len;
@@ -12646,14 +12646,14 @@
     int		slen;
     int		error = FALSE;
 
-    p = get_tv_string(&argvars[0]);
+    p = tv_get_string(&argvars[0]);
     slen = (int)STRLEN(p);
 
-    n = (int)get_tv_number_chk(&argvars[1], &error);
+    n = (int)tv_get_number_chk(&argvars[1], &error);
     if (error)
 	len = 0;
     else if (argvars[2].v_type != VAR_UNKNOWN)
-	len = (int)get_tv_number(&argvars[2]);
+	len = (int)tv_get_number(&argvars[2]);
     else
 	len = slen - n;	    /* default len: all bytes that are available. */
 
@@ -12690,8 +12690,8 @@
     char_u	*lastmatch = NULL;
     int		haystack_len, end_idx;
 
-    needle = get_tv_string_chk(&argvars[1]);
-    haystack = get_tv_string_buf_chk(&argvars[0], buf);
+    needle = tv_get_string_chk(&argvars[1]);
+    haystack = tv_get_string_buf_chk(&argvars[0], buf);
 
     rettv->vval.v_number = -1;
     if (needle == NULL || haystack == NULL)
@@ -12701,7 +12701,7 @@
     if (argvars[2].v_type != VAR_UNKNOWN)
     {
 	/* Third argument: upper limit for index */
-	end_idx = (int)get_tv_number_chk(&argvars[2], NULL);
+	end_idx = (int)tv_get_number_chk(&argvars[2], NULL);
 	if (end_idx < 0)
 	    return;	/* can never find a match */
     }
@@ -12737,7 +12737,7 @@
 f_strtrans(typval_T *argvars, typval_T *rettv)
 {
     rettv->v_type = VAR_STRING;
-    rettv->vval.v_string = transstr(get_tv_string(&argvars[0]));
+    rettv->vval.v_string = transstr(tv_get_string(&argvars[0]));
 }
 
 /*
@@ -12750,7 +12750,7 @@
     int		no;
     int		retList = 0;
 
-    no = (int)get_tv_number_chk(&argvars[0], &error);
+    no = (int)tv_get_number_chk(&argvars[0], &error);
     if (error)
 	return;
     if (no < 0 || no >= NSUBEXP)
@@ -12759,7 +12759,7 @@
 	return;
     }
     if (argvars[1].v_type != VAR_UNKNOWN)
-	retList = (int)get_tv_number_chk(&argvars[1], &error);
+	retList = (int)tv_get_number_chk(&argvars[1], &error);
     if (error)
 	return;
 
@@ -12785,16 +12785,16 @@
     char_u	subbuf[NUMBUFLEN];
     char_u	flagsbuf[NUMBUFLEN];
 
-    char_u	*str = get_tv_string_chk(&argvars[0]);
-    char_u	*pat = get_tv_string_buf_chk(&argvars[1], patbuf);
+    char_u	*str = tv_get_string_chk(&argvars[0]);
+    char_u	*pat = tv_get_string_buf_chk(&argvars[1], patbuf);
     char_u	*sub = NULL;
     typval_T	*expr = NULL;
-    char_u	*flg = get_tv_string_buf_chk(&argvars[3], flagsbuf);
+    char_u	*flg = tv_get_string_buf_chk(&argvars[3], flagsbuf);
 
     if (argvars[2].v_type == VAR_FUNC || argvars[2].v_type == VAR_PARTIAL)
 	expr = &argvars[2];
     else
-	sub = get_tv_string_buf_chk(&argvars[2], subbuf);
+	sub = tv_get_string_buf_chk(&argvars[2], subbuf);
 
     rettv->v_type = VAR_STRING;
     if (str == NULL || pat == NULL || (sub == NULL && expr == NULL)
@@ -12811,7 +12811,7 @@
 f_swapinfo(typval_T *argvars, typval_T *rettv)
 {
     if (rettv_dict_alloc(rettv) == OK)
-	get_b0_dict(get_tv_string(argvars), rettv->vval.v_dict);
+	get_b0_dict(tv_get_string(argvars), rettv->vval.v_dict);
 }
 
 /*
@@ -12844,9 +12844,9 @@
     int		trans;
     int		transerr = FALSE;
 
-    lnum = get_tv_lnum(argvars);		/* -1 on type error */
-    col = (linenr_T)get_tv_number(&argvars[1]) - 1;	/* -1 on type error */
-    trans = (int)get_tv_number_chk(&argvars[2], &transerr);
+    lnum = tv_get_lnum(argvars);		/* -1 on type error */
+    col = (linenr_T)tv_get_number(&argvars[1]) - 1;	/* -1 on type error */
+    trans = (int)tv_get_number_chk(&argvars[2], &transerr);
 
     if (!transerr && lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count
 	    && col >= 0 && col < (long)STRLEN(ml_get(lnum)))
@@ -12870,11 +12870,11 @@
     char_u	modebuf[NUMBUFLEN];
     int		modec;
 
-    id = (int)get_tv_number(&argvars[0]);
-    what = get_tv_string(&argvars[1]);
+    id = (int)tv_get_number(&argvars[0]);
+    what = tv_get_string(&argvars[1]);
     if (argvars[2].v_type != VAR_UNKNOWN)
     {
-	mode = get_tv_string_buf(&argvars[2], modebuf);
+	mode = tv_get_string_buf(&argvars[2], modebuf);
 	modec = TOLOWER_ASC(mode[0]);
 	if (modec != 't' && modec != 'c' && modec != 'g')
 	    modec = 0;	/* replace invalid with current */
@@ -12957,7 +12957,7 @@
     int		id;
 
 #ifdef FEAT_SYN_HL
-    id = (int)get_tv_number(&argvars[0]);
+    id = (int)tv_get_number(&argvars[0]);
 
     if (id > 0)
 	id = syn_get_final_id(id);
@@ -12986,8 +12986,8 @@
     rettv_list_set(rettv, NULL);
 
 #if defined(FEAT_SYN_HL) && defined(FEAT_CONCEAL)
-    lnum = get_tv_lnum(argvars);		/* -1 on type error */
-    col = (colnr_T)get_tv_number(&argvars[1]) - 1;	/* -1 on type error */
+    lnum = tv_get_lnum(argvars);		/* -1 on type error */
+    col = (colnr_T)tv_get_number(&argvars[1]) - 1;	/* -1 on type error */
 
     vim_memset(str, NUL, sizeof(str));
 
@@ -13043,8 +13043,8 @@
     rettv_list_set(rettv, NULL);
 
 #ifdef FEAT_SYN_HL
-    lnum = get_tv_lnum(argvars);		/* -1 on type error */
-    col = (colnr_T)get_tv_number(&argvars[1]) - 1;	/* -1 on type error */
+    lnum = tv_get_lnum(argvars);		/* -1 on type error */
+    col = (colnr_T)tv_get_number(&argvars[1]) - 1;	/* -1 on type error */
 
     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count
 	    && col >= 0 && col <= (long)STRLEN(ml_get(lnum))
@@ -13138,7 +13138,7 @@
 	    size_t	len;
 	    char_u	buf[NUMBUFLEN];
 
-	    p = get_tv_string_buf_chk(&argvars[1], buf);
+	    p = tv_get_string_buf_chk(&argvars[1], buf);
 	    if (p == NULL)
 	    {
 		fclose(fd);
@@ -13171,7 +13171,7 @@
 	char_u		*end;
 	int		i;
 
-	res = get_cmd_output(get_tv_string(&argvars[0]), infile, flags, &len);
+	res = get_cmd_output(tv_get_string(&argvars[0]), infile, flags, &len);
 	if (res == NULL)
 	    goto errret;
 
@@ -13211,7 +13211,7 @@
     }
     else
     {
-	res = get_cmd_output(get_tv_string(&argvars[0]), infile, flags, NULL);
+	res = get_cmd_output(tv_get_string(&argvars[0]), infile, flags, NULL);
 #ifdef USE_CR
 	/* translate <CR> into <NL> */
 	if (res != NULL)
@@ -13289,7 +13289,7 @@
 	wp = firstwin;
     else
     {
-	tp = find_tabpage((int)get_tv_number(&argvars[0]));
+	tp = find_tabpage((int)tv_get_number(&argvars[0]));
 	if (tp != NULL)
 	    wp = (tp == curtab) ? firstwin : tp->tp_firstwin;
     }
@@ -13313,7 +13313,7 @@
 
     if (argvars[0].v_type != VAR_UNKNOWN)
     {
-	arg = get_tv_string_chk(&argvars[0]);
+	arg = tv_get_string_chk(&argvars[0]);
 	nr = 0;
 	if (arg != NULL)
 	{
@@ -13343,7 +13343,7 @@
     twin = (tp == curtab) ? curwin : tp->tp_curwin;
     if (argvar->v_type != VAR_UNKNOWN)
     {
-	arg = get_tv_string_chk(argvar);
+	arg = tv_get_string_chk(argvar);
 	if (arg == NULL)
 	    nr = 0;		/* type error; errmsg already given */
 	else if (STRCMP(arg, "$") == 0)
@@ -13385,7 +13385,7 @@
     int		nr = 1;
     tabpage_T	*tp;
 
-    tp = find_tabpage((int)get_tv_number(&argvars[0]));
+    tp = find_tabpage((int)tv_get_number(&argvars[0]));
     if (tp == NULL)
 	nr = 0;
     else
@@ -13426,14 +13426,14 @@
     char_u  *fname = NULL;
     char_u  *tag_pattern;
 
-    tag_pattern = get_tv_string(&argvars[0]);
+    tag_pattern = tv_get_string(&argvars[0]);
 
     rettv->vval.v_number = FALSE;
     if (*tag_pattern == NUL)
 	return;
 
     if (argvars[1].v_type != VAR_UNKNOWN)
-	fname = get_tv_string(&argvars[1]);
+	fname = tv_get_string(&argvars[1]);
     if (rettv_list_alloc(rettv) == OK)
 	(void)get_tags(rettv->vval.v_list, tag_pattern, fname);
 }
@@ -13544,7 +13544,7 @@
 f_test_feedinput(typval_T *argvars, typval_T *rettv UNUSED)
 {
 #ifdef USE_INPUT_BUF
-    char_u	*val = get_tv_string_chk(&argvars[0]);
+    char_u	*val = tv_get_string_chk(&argvars[0]);
 
     if (val != NULL)
     {
@@ -13566,7 +13566,7 @@
 	EMSG(_(e_invarg));
     else
     {
-	name = get_tv_string(&argvars[0]);
+	name = tv_get_string(&argvars[0]);
 	if (reset_option_was_set(name) == FAIL)
 	    EMSG2(_(e_invarg2), name);
     }
@@ -13587,8 +13587,8 @@
 	EMSG(_(e_invarg));
     else
     {
-	name = get_tv_string_chk(&argvars[0]);
-	val = (int)get_tv_number(&argvars[1]);
+	name = tv_get_string_chk(&argvars[0]);
+	val = (int)tv_get_number(&argvars[1]);
 
 	if (STRCMP(name, (char_u *)"redraw") == 0)
 	    disable_redraw_for_testing = val;
@@ -13646,7 +13646,7 @@
     static void
 f_test_ignore_error(typval_T *argvars, typval_T *rettv UNUSED)
 {
-     ignore_error_for_testing(get_tv_string(&argvars[0]));
+     ignore_error_for_testing(tv_get_string(&argvars[0]));
 }
 
 #ifdef FEAT_JOB_CHANNEL
@@ -13709,9 +13709,9 @@
 	EMSG(_(e_invarg));
 	return;
     }
-    which = get_tv_string(&argvars[0]);
-    value = get_tv_number(&argvars[1]);
-    dragging = get_tv_number(&argvars[2]);
+    which = tv_get_string(&argvars[0]);
+    value = tv_get_number(&argvars[1]);
+    dragging = tv_get_number(&argvars[2]);
 
     if (STRCMP(which, "left") == 0)
 	sb = &curwin->w_scrollbars[SBAR_LEFT];
@@ -13735,7 +13735,7 @@
     static void
 f_test_settime(typval_T *argvars, typval_T *rettv UNUSED)
 {
-    time_for_testing = (time_t)get_tv_number(&argvars[0]);
+    time_for_testing = (time_t)tv_get_number(&argvars[0]);
 }
 
 #if defined(FEAT_JOB_CHANNEL) || defined(FEAT_TIMERS) || defined(PROTO)
@@ -13798,7 +13798,7 @@
 	    EMSG(_(e_number_exp));
 	else
 	{
-	    timer = find_timer((int)get_tv_number(&argvars[0]));
+	    timer = find_timer((int)tv_get_number(&argvars[0]));
 	    if (timer != NULL)
 		add_timer_info(rettv, timer);
 	}
@@ -13814,13 +13814,13 @@
 f_timer_pause(typval_T *argvars, typval_T *rettv UNUSED)
 {
     timer_T	*timer = NULL;
-    int		paused = (int)get_tv_number(&argvars[1]);
+    int		paused = (int)tv_get_number(&argvars[1]);
 
     if (argvars[0].v_type != VAR_NUMBER)
 	EMSG(_(e_number_exp));
     else
     {
-	timer = find_timer((int)get_tv_number(&argvars[0]));
+	timer = find_timer((int)tv_get_number(&argvars[0]));
 	if (timer != NULL)
 	    timer->tr_paused = paused;
     }
@@ -13832,7 +13832,7 @@
     static void
 f_timer_start(typval_T *argvars, typval_T *rettv)
 {
-    long	msec = (long)get_tv_number(&argvars[0]);
+    long	msec = (long)tv_get_number(&argvars[0]);
     timer_T	*timer;
     int		repeat = 0;
     char_u	*callback;
@@ -13847,7 +13847,7 @@
 	if (argvars[2].v_type != VAR_DICT
 				   || (dict = argvars[2].vval.v_dict) == NULL)
 	{
-	    EMSG2(_(e_invarg2), get_tv_string(&argvars[2]));
+	    EMSG2(_(e_invarg2), tv_get_string(&argvars[2]));
 	    return;
 	}
 	if (dict_find(dict, (char_u *)"repeat", -1) != NULL)
@@ -13886,7 +13886,7 @@
 	EMSG(_(e_number_exp));
 	return;
     }
-    timer = find_timer((int)get_tv_number(&argvars[0]));
+    timer = find_timer((int)tv_get_number(&argvars[0]));
     if (timer != NULL)
 	stop_timer(timer);
 }
@@ -13908,7 +13908,7 @@
 f_tolower(typval_T *argvars, typval_T *rettv)
 {
     rettv->v_type = VAR_STRING;
-    rettv->vval.v_string = strlow_save(get_tv_string(&argvars[0]));
+    rettv->vval.v_string = strlow_save(tv_get_string(&argvars[0]));
 }
 
 /*
@@ -13918,7 +13918,7 @@
 f_toupper(typval_T *argvars, typval_T *rettv)
 {
     rettv->v_type = VAR_STRING;
-    rettv->vval.v_string = strup_save(get_tv_string(&argvars[0]));
+    rettv->vval.v_string = strup_save(tv_get_string(&argvars[0]));
 }
 
 /*
@@ -13944,9 +13944,9 @@
     char_u	buf2[NUMBUFLEN];
     garray_T	ga;
 
-    in_str = get_tv_string(&argvars[0]);
-    fromstr = get_tv_string_buf_chk(&argvars[1], buf);
-    tostr = get_tv_string_buf_chk(&argvars[2], buf2);
+    in_str = tv_get_string(&argvars[0]);
+    fromstr = tv_get_string_buf_chk(&argvars[1], buf);
+    tostr = tv_get_string_buf_chk(&argvars[2], buf2);
 
     /* Default return value: empty string. */
     rettv->v_type = VAR_STRING;
@@ -14050,7 +14050,7 @@
 {
     char_u	buf1[NUMBUFLEN];
     char_u	buf2[NUMBUFLEN];
-    char_u	*head = get_tv_string_buf_chk(&argvars[0], buf1);
+    char_u	*head = tv_get_string_buf_chk(&argvars[0], buf1);
     char_u	*mask = NULL;
     char_u	*tail;
     char_u	*prev;
@@ -14065,7 +14065,7 @@
     }
 
     if (argvars[1].v_type == VAR_STRING)
-	mask = get_tv_string_buf_chk(&argvars[1], buf2);
+	mask = tv_get_string_buf_chk(&argvars[1], buf2);
 
     while (*head != NUL)
     {
@@ -14169,7 +14169,7 @@
     rettv->v_type = VAR_STRING;
 #ifdef FEAT_PERSISTENT_UNDO
     {
-	char_u *fname = get_tv_string(&argvars[0]);
+	char_u *fname = tv_get_string(&argvars[0]);
 
 	if (*fname == NUL)
 	{
@@ -14332,7 +14332,7 @@
 	tp = curtab;
     else
     {
-	tp = find_tabpage((int)get_tv_number(&argvars[0]));
+	tp = find_tabpage((int)tv_get_number(&argvars[0]));
 	if (tp == NULL)
 	    return;
     }
@@ -14525,12 +14525,12 @@
     if (list == NULL)
 	return;
     for (li = list->lv_first; li != NULL; li = li->li_next)
-	if (get_tv_string_chk(&li->li_tv) == NULL)
+	if (tv_get_string_chk(&li->li_tv) == NULL)
 	    return;
 
     if (argvars[2].v_type != VAR_UNKNOWN)
     {
-	char_u *arg2 = get_tv_string_chk(&argvars[2]);
+	char_u *arg2 = tv_get_string_chk(&argvars[2]);
 
 	if (arg2 == NULL)
 	    return;
@@ -14546,7 +14546,7 @@
 #endif
     }
 
-    fname = get_tv_string_chk(&argvars[1]);
+    fname = tv_get_string_chk(&argvars[1]);
     if (fname == NULL)
 	return;
 
@@ -14580,8 +14580,8 @@
     static void
 f_xor(typval_T *argvars, typval_T *rettv)
 {
-    rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL)
-					^ get_tv_number_chk(&argvars[1], NULL);
+    rettv->vval.v_number = tv_get_number_chk(&argvars[0], NULL)
+					^ tv_get_number_chk(&argvars[1], NULL);
 }
 
 #endif /* FEAT_EVAL */
