patch 9.1.0844: if_python: no way to pass local vars to python

Problem:  if_python: no way to pass local vars to python
Solution: Add locals argument to py3eval(), pyeval() and pyxeval()
          (Ben Jackson)

fixes: #8573
closes: #10594

Signed-off-by: Ben Jackson <puremourning@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/if_python3.c b/src/if_python3.c
index 5d45ba1..aa934cb 100644
--- a/src/if_python3.c
+++ b/src/if_python3.c
@@ -1436,7 +1436,11 @@
  * External interface
  */
     static void
-DoPyCommand(const char *cmd, rangeinitializer init_range, runner run, void *arg)
+DoPyCommand(const char *cmd,
+	    dict_T* locals,
+	    rangeinitializer init_range,
+	    runner run,
+	    void *arg)
 {
 #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
     char		*saved_locale;
@@ -1477,7 +1481,7 @@
     cmdbytes = PyUnicode_AsEncodedString(cmdstr, "utf-8", ERRORS_ENCODE_ARG);
     Py_XDECREF(cmdstr);
 
-    run(PyBytes_AsString(cmdbytes), arg, &pygilstate);
+    run(PyBytes_AsString(cmdbytes), locals, arg, &pygilstate);
     Py_XDECREF(cmdbytes);
 
     PyGILState_Release(pygilstate);
@@ -1512,6 +1516,7 @@
 	    p_pyx = 3;
 
 	DoPyCommand(script == NULL ? (char *) eap->arg : (char *) script,
+		NULL,
 		init_range_cmd,
 		(runner) run_cmd,
 		(void *) eap);
@@ -1578,6 +1583,7 @@
 
     // Execute the file
     DoPyCommand(buffer,
+	    NULL,
 	    init_range_cmd,
 	    (runner) run_cmd,
 	    (void *) eap);
@@ -1590,6 +1596,7 @@
 	p_pyx = 3;
 
     DoPyCommand((char *)eap->arg,
+	    NULL,
 	    init_range_cmd,
 	    (runner)run_do,
 	    (void *)eap);
@@ -2137,9 +2144,10 @@
 }
 
     void
-do_py3eval(char_u *str, typval_T *rettv)
+do_py3eval(char_u *str, dict_T *locals, typval_T *rettv)
 {
     DoPyCommand((char *) str,
+	    locals,
 	    init_range_eval,
 	    (runner) run_eval,
 	    (void *) rettv);