changeset 16227:a70f0d6686c4 v8.1.1118

patch 8.1.1118: a couple of conditions are hard to understand commit https://github.com/vim/vim/commit/652de23dc7abf6aa2721ccee7fe279b5cce8069c Author: Bram Moolenaar <Bram@vim.org> Date: Thu Apr 4 20:13:09 2019 +0200 patch 8.1.1118: a couple of conditions are hard to understand Problem: A couple of conditions are hard to understand. Solution: Split the conditions into pieces. (Ozaki Kiichi, closes https://github.com/vim/vim/issues/3879)
author Bram Moolenaar <Bram@vim.org>
date Thu, 04 Apr 2019 20:15:05 +0200
parents e1e238ab3300
children 2cec03568383
files src/getchar.c src/os_unix.c src/version.c
diffstat 3 files changed, 39 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -2030,6 +2030,8 @@ vgetorpeek(int advance)
 	     */
 	    for (;;)
 	    {
+		long	    wait_time;
+
 		/*
 		 * ui_breakcheck() is slow, don't use it too often when
 		 * inside a mapping.  But call it each time for typed
@@ -2828,18 +2830,25 @@ vgetorpeek(int advance)
 		    // that has a <Nop> RHS.
 		    timedout = FALSE;
 
+		if (advance)
+		{
+		    if (typebuf.tb_len == 0
+			    || !(p_timeout
+				 || (p_ttimeout && keylen == KEYLEN_PART_KEY)))
+			// blocking wait
+			wait_time = -1L;
+		    else if (keylen == KEYLEN_PART_KEY && p_ttm >= 0)
+			wait_time = p_ttm;
+		    else
+			wait_time = p_tm;
+		}
+		else
+		    wait_time = 0;
+
 		wait_tb_len = typebuf.tb_len;
 		c = inchar(typebuf.tb_buf + typebuf.tb_off + typebuf.tb_len,
 			typebuf.tb_buflen - typebuf.tb_off - typebuf.tb_len - 1,
-			!advance
-			    ? 0
-			    : ((typebuf.tb_len == 0
-				    || !(p_timeout || (p_ttimeout
-					       && keylen == KEYLEN_PART_KEY)))
-				    ? -1L
-				    : ((keylen == KEYLEN_PART_KEY && p_ttm >= 0)
-					    ? p_ttm
-					    : p_tm)));
+			wait_time);
 
 #ifdef FEAT_CMDL_INFO
 		if (i != 0)
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -5607,19 +5607,25 @@ mch_job_start(char **argv, job_T *job, j
 	close(fd_err[1]);
     if (channel != NULL)
     {
-	int in_fd = use_file_for_in || use_null_for_in
-			? INVALID_FD : fd_in[1] < 0 ? pty_master_fd : fd_in[1];
-	int out_fd = use_file_for_out || use_null_for_out
-		      ? INVALID_FD : fd_out[0] < 0 ? pty_master_fd : fd_out[0];
-	/* When using pty_master_fd only set it for stdout, do not duplicate it
-	 * for stderr, it only needs to be read once. */
-	int err_fd = use_out_for_err || use_file_for_err || use_null_for_err
-		      ? INVALID_FD
-		      : fd_err[0] >= 0
-		         ? fd_err[0]
-		         : (out_fd == pty_master_fd
-				 ? INVALID_FD
-				 : pty_master_fd);
+	int in_fd = INVALID_FD;
+	int out_fd = INVALID_FD;
+	int err_fd = INVALID_FD;
+
+	if (!(use_file_for_in || use_null_for_in))
+	    in_fd = fd_in[1] >= 0 ? fd_in[1] : pty_master_fd;
+
+	if (!(use_file_for_out || use_null_for_out))
+	    out_fd = fd_out[0] >= 0 ? fd_out[0] : pty_master_fd;
+
+	// When using pty_master_fd only set it for stdout, do not duplicate
+	// it for stderr, it only needs to be read once.
+	if (!(use_out_for_err || use_file_for_err || use_null_for_err))
+	{
+	    if (fd_err[0] >= 0)
+		err_fd = fd_err[0];
+	    else if (out_fd != pty_master_fd)
+		err_fd = pty_master_fd;
+	}
 
 	channel_set_pipes(channel, in_fd, out_fd, err_fd);
 	channel_set_job(channel, job, options);
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1118,
+/**/
     1117,
 /**/
     1116,