patch 8.2.4734: getcharpos() may change a mark position

Problem:    getcharpos() may change a mark position.
Solution:   Copy the mark position. (closes #10148)
diff --git a/src/eval.c b/src/eval.c
index b30577f..793a526 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -5636,34 +5636,35 @@
     name = tv_get_string_chk(varp);
     if (name == NULL)
 	return NULL;
+
+    pos.lnum = 0;
     if (name[0] == '.' && (!in_vim9script() || name[1] == NUL))
     {
 	// cursor
 	pos = curwin->w_cursor;
-	if (charcol)
-	    pos.col = buf_byteidx_to_charidx(curbuf, pos.lnum, pos.col);
-	return &pos;
     }
-    if (name[0] == 'v' && name[1] == NUL)	// Visual start
+    else if (name[0] == 'v' && name[1] == NUL)
     {
+	// Visual start
 	if (VIsual_active)
 	    pos = VIsual;
 	else
 	    pos = curwin->w_cursor;
-	if (charcol)
-	    pos.col = buf_byteidx_to_charidx(curbuf, pos.lnum, pos.col);
-	return &pos;
     }
-    if (name[0] == '\'' && (!in_vim9script()
+    else if (name[0] == '\'' && (!in_vim9script()
 					|| (name[1] != NUL && name[2] == NUL)))
     {
 	// mark
 	pp = getmark_buf_fnum(curbuf, name[1], FALSE, fnum);
 	if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0)
 	    return NULL;
+	pos = *pp;
+    }
+    if (pos.lnum != 0)
+    {
 	if (charcol)
-	    pp->col = buf_byteidx_to_charidx(curbuf, pp->lnum, pp->col);
-	return pp;
+	    pos.col = buf_byteidx_to_charidx(curbuf, pos.lnum, pos.col);
+	return &pos;
     }
 
     pos.coladd = 0;