patch 8.2.4319: :put does not work properly in compiled function

Problem:    :put does not work properly in compiled function. (John Beckett)
Solution:   Adjust the direction when using line zero.
diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim
index 51a62e0..0ac69e8 100644
--- a/src/testdir/test_vim9_cmd.vim
+++ b/src/testdir/test_vim9_cmd.vim
@@ -1156,7 +1156,13 @@
   :2put =['a', 'b', 'c']
   assert_equal(['ppp', 'a', 'b', 'c', 'above'], getline(2, 6))
 
+  :0put ='first'
+  assert_equal('first', getline(1))
+  :1put! ='first again'
+  assert_equal('first again', getline(1))
+
   # compute range at runtime
+  :%del
   setline(1, range(1, 8))
   @a = 'aaa'
   :$-2put a
diff --git a/src/version.c b/src/version.c
index f30ba25..3535adb 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    4319,
+/**/
     4318,
 /**/
     4317,
diff --git a/src/vim9execute.c b/src/vim9execute.c
index 6c79ff7..961e450 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -4617,7 +4617,12 @@
 			// :put! above cursor
 			dir = BACKWARD;
 		    else if (lnum >= 0)
-			curwin->w_cursor.lnum = iptr->isn_arg.put.put_lnum;
+		    {
+			curwin->w_cursor.lnum = lnum;
+			if (lnum == 0)
+			    // check_cursor() below will move to line 1
+			    dir = BACKWARD;
+		    }
 
 		    if (regname == '=')
 		    {