changeset 30886:74e64f3a54ef v9.0.0777

patch 9.0.0777: code is indented too much Commit: https://github.com/vim/vim/commit/3f0092c141824356b55b11cd3985baaf4df65334 Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Sun Oct 16 21:43:07 2022 +0100 patch 9.0.0777: code is indented too much Problem: Code is indented too much. Solution: Use an early return. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/11386)
author Bram Moolenaar <Bram@vim.org>
date Sun, 16 Oct 2022 22:45:02 +0200
parents ad476a0a75b8
children cf89c4a14066
files src/change.c src/channel.c src/version.c
diffstat 3 files changed, 293 insertions(+), 289 deletions(-) [+]
line wrap: on
line diff
--- a/src/change.c
+++ b/src/change.c
@@ -28,43 +28,43 @@ change_warning(int col)
 {
     static char *w_readonly = N_("W10: Warning: Changing a readonly file");
 
-    if (curbuf->b_did_warn == FALSE
-	    && curbufIsChanged() == 0
-	    && !autocmd_busy
-	    && curbuf->b_p_ro)
-    {
-	++curbuf_lock;
-	apply_autocmds(EVENT_FILECHANGEDRO, NULL, NULL, FALSE, curbuf);
-	--curbuf_lock;
-	if (!curbuf->b_p_ro)
-	    return;
+    if (curbuf->b_did_warn
+	    || curbufIsChanged()
+	    || autocmd_busy
+	    || !curbuf->b_p_ro)
+	return;
 
-	// Do what msg() does, but with a column offset if the warning should
-	// be after the mode message.
-	msg_start();
-	if (msg_row == Rows - 1)
-	    msg_col = col;
-	msg_source(HL_ATTR(HLF_W));
-	msg_puts_attr(_(w_readonly), HL_ATTR(HLF_W) | MSG_HIST);
+    ++curbuf_lock;
+    apply_autocmds(EVENT_FILECHANGEDRO, NULL, NULL, FALSE, curbuf);
+    --curbuf_lock;
+    if (!curbuf->b_p_ro)
+	return;
+
+    // Do what msg() does, but with a column offset if the warning should
+    // be after the mode message.
+    msg_start();
+    if (msg_row == Rows - 1)
+	msg_col = col;
+    msg_source(HL_ATTR(HLF_W));
+    msg_puts_attr(_(w_readonly), HL_ATTR(HLF_W) | MSG_HIST);
 #ifdef FEAT_EVAL
-	set_vim_var_string(VV_WARNINGMSG, (char_u *)_(w_readonly), -1);
+    set_vim_var_string(VV_WARNINGMSG, (char_u *)_(w_readonly), -1);
 #endif
-	msg_clr_eos();
-	(void)msg_end();
-	if (msg_silent == 0 && !silent_mode
+    msg_clr_eos();
+    (void)msg_end();
+    if (msg_silent == 0 && !silent_mode
 #ifdef FEAT_EVAL
-		&& time_for_testing != 1
+	    && time_for_testing != 1
 #endif
-		)
-	{
-	    out_flush();
-	    ui_delay(1002L, TRUE); // give the user time to think about it
-	}
-	curbuf->b_did_warn = TRUE;
-	redraw_cmdline = FALSE;	// don't redraw and erase the message
-	if (msg_row < Rows - 1)
-	    showmode();
+       )
+    {
+	out_flush();
+	ui_delay(1002L, TRUE); // give the user time to think about it
     }
+    curbuf->b_did_warn = TRUE;
+    redraw_cmdline = FALSE;	// don't redraw and erase the message
+    if (msg_row < Rows - 1)
+	showmode();
 }
 
 /*
@@ -159,25 +159,25 @@ check_recorded_changes(
 	linenr_T	lnume,
 	long		xtra)
 {
-    if (buf->b_recorded_changes != NULL && xtra != 0)
+    if (buf->b_recorded_changes == NULL || xtra == 0)
+	return;
+
+    listitem_T *li;
+    linenr_T    prev_lnum;
+    linenr_T    prev_lnume;
+
+    FOR_ALL_LIST_ITEMS(buf->b_recorded_changes, li)
     {
-	listitem_T *li;
-	linenr_T    prev_lnum;
-	linenr_T    prev_lnume;
-
-	FOR_ALL_LIST_ITEMS(buf->b_recorded_changes, li)
+	prev_lnum = (linenr_T)dict_get_number(
+		li->li_tv.vval.v_dict, "lnum");
+	prev_lnume = (linenr_T)dict_get_number(
+		li->li_tv.vval.v_dict, "end");
+	if (prev_lnum >= lnum || prev_lnum > lnume || prev_lnume >= lnum)
 	{
-	    prev_lnum = (linenr_T)dict_get_number(
-						li->li_tv.vval.v_dict, "lnum");
-	    prev_lnume = (linenr_T)dict_get_number(
-						 li->li_tv.vval.v_dict, "end");
-	    if (prev_lnum >= lnum || prev_lnum > lnume || prev_lnume >= lnum)
-	    {
-		// the current change is going to make the line number in
-		// the older change invalid, flush now
-		invoke_listeners(curbuf);
-		break;
-	    }
+	    // the current change is going to make the line number in
+	    // the older change invalid, flush now
+	    invoke_listeners(curbuf);
+	    break;
 	}
     }
 }
--- a/src/channel.c
+++ b/src/channel.c
@@ -203,44 +203,44 @@ ch_log_active(void)
     static void
 ch_log_lead(const char *what, channel_T *ch, ch_part_T part)
 {
-    if (log_fd != NULL)
-    {
+    if (log_fd == NULL)
+	return;
+
 #ifdef FEAT_RELTIME
-	proftime_T log_now;
-
-	profile_start(&log_now);
-	profile_sub(&log_now, &log_start);
-	fprintf(log_fd, "%s ", profile_msg(&log_now));
+    proftime_T log_now;
+
+    profile_start(&log_now);
+    profile_sub(&log_now, &log_start);
+    fprintf(log_fd, "%s ", profile_msg(&log_now));
 #endif
-	if (ch != NULL)
-	{
-	    if (part < PART_COUNT)
-		fprintf(log_fd, "%son %d(%s): ",
-					   what, ch->ch_id, part_names[part]);
-	    else
-		fprintf(log_fd, "%son %d: ", what, ch->ch_id);
-	}
+    if (ch != NULL)
+    {
+	if (part < PART_COUNT)
+	    fprintf(log_fd, "%son %d(%s): ",
+		    what, ch->ch_id, part_names[part]);
 	else
-	    fprintf(log_fd, "%s: ", what);
+	    fprintf(log_fd, "%son %d: ", what, ch->ch_id);
     }
+    else
+	fprintf(log_fd, "%s: ", what);
 }
 
 #ifndef PROTO  // prototype is in proto.h
     void
 ch_log(channel_T *ch, const char *fmt, ...)
 {
-    if (log_fd != NULL)
-    {
-	va_list ap;
-
-	ch_log_lead("", ch, PART_COUNT);
-	va_start(ap, fmt);
-	vfprintf(log_fd, fmt, ap);
-	va_end(ap);
-	fputc('\n', log_fd);
-	fflush(log_fd);
-	did_repeated_msg = 0;
-    }
+    if (log_fd == NULL)
+	return;
+
+    va_list ap;
+
+    ch_log_lead("", ch, PART_COUNT);
+    va_start(ap, fmt);
+    vfprintf(log_fd, fmt, ap);
+    va_end(ap);
+    fputc('\n', log_fd);
+    fflush(log_fd);
+    did_repeated_msg = 0;
 }
 #endif
 
@@ -250,18 +250,18 @@ ch_error(channel_T *ch, const char *fmt,
     static void
 ch_error(channel_T *ch, const char *fmt, ...)
 {
-    if (log_fd != NULL)
-    {
-	va_list ap;
-
-	ch_log_lead("ERR ", ch, PART_COUNT);
-	va_start(ap, fmt);
-	vfprintf(log_fd, fmt, ap);
-	va_end(ap);
-	fputc('\n', log_fd);
-	fflush(log_fd);
-	did_repeated_msg = 0;
-    }
+    if (log_fd == NULL)
+	return;
+
+    va_list ap;
+
+    ch_log_lead("ERR ", ch, PART_COUNT);
+    va_start(ap, fmt);
+    vfprintf(log_fd, fmt, ap);
+    va_end(ap);
+    fputc('\n', log_fd);
+    fflush(log_fd);
+    did_repeated_msg = 0;
 }
 
 #ifdef MSWIN
@@ -445,15 +445,15 @@ channel_free_channel(channel_T *channel)
     static void
 channel_free(channel_T *channel)
 {
-    if (!in_free_unref_items)
+    if (in_free_unref_items)
+	return;
+
+    if (safe_to_invoke_callback == 0)
+	channel->ch_to_be_freed = TRUE;
+    else
     {
-	if (safe_to_invoke_callback == 0)
-	    channel->ch_to_be_freed = TRUE;
-	else
-	{
-	    channel_free_contents(channel);
-	    channel_free_channel(channel);
-	}
+	channel_free_contents(channel);
+	channel_free_channel(channel);
     }
 }
 
@@ -540,16 +540,18 @@ channel_fd2channel(sock_T fd, ch_part_T 
     channel_T	*channel;
     ch_part_T	part;
 
-    if (fd != INVALID_FD)
-	FOR_ALL_CHANNELS(channel)
-	{
-	    for (part = PART_SOCK; part < PART_IN; ++part)
-		if (channel->ch_part[part].ch_fd == fd)
-		{
-		    *partp = part;
-		    return channel;
-		}
-	}
+    if (fd == INVALID_FD)
+	return NULL;
+
+    FOR_ALL_CHANNELS(channel)
+    {
+	for (part = PART_SOCK; part < PART_IN; ++part)
+	    if (channel->ch_part[part].ch_fd == fd)
+	    {
+		*partp = part;
+		return channel;
+	    }
+    }
     return NULL;
 }
 
@@ -1214,21 +1216,22 @@ channel_find_buffer(char_u *name, int er
 	if (buf == NULL)
 	    buf = buflist_findname_exp(name);
     }
+
+    if (buf != NULL)
+	return buf;
+
+    buf = buflist_new(name == NULL || *name == NUL ? NULL : name,
+	    NULL, (linenr_T)0, BLN_LISTED | BLN_NEW);
     if (buf == NULL)
-    {
-	buf = buflist_new(name == NULL || *name == NUL ? NULL : name,
-				     NULL, (linenr_T)0, BLN_LISTED | BLN_NEW);
-	if (buf == NULL)
-	    return NULL;
-	prepare_buffer(buf);
-
-	curbuf = buf;
-	if (msg)
-	    ml_replace(1, (char_u *)(err ? "Reading from channel error..."
-				   : "Reading from channel output..."), TRUE);
-	changed_bytes(1, 0);
-	curbuf = save_curbuf;
-    }
+	return NULL;
+    prepare_buffer(buf);
+
+    curbuf = buf;
+    if (msg)
+	ml_replace(1, (char_u *)(err ? "Reading from channel error..."
+		    : "Reading from channel output..."), TRUE);
+    changed_bytes(1, 0);
+    curbuf = save_curbuf;
 
     return buf;
 }
@@ -1479,30 +1482,30 @@ ch_close_part(channel_T *channel, ch_par
 {
     sock_T *fd = &channel->ch_part[part].ch_fd;
 
-    if (*fd != INVALID_FD)
+    if (*fd == INVALID_FD)
+	return;
+
+    if (part == PART_SOCK)
+	sock_close(*fd);
+    else
     {
-	if (part == PART_SOCK)
-	    sock_close(*fd);
-	else
+	// When using a pty the same FD is set on multiple parts, only
+	// close it when the last reference is closed.
+	if ((part == PART_IN || channel->CH_IN_FD != *fd)
+		&& (part == PART_OUT || channel->CH_OUT_FD != *fd)
+		&& (part == PART_ERR || channel->CH_ERR_FD != *fd))
 	{
-	    // When using a pty the same FD is set on multiple parts, only
-	    // close it when the last reference is closed.
-	    if ((part == PART_IN || channel->CH_IN_FD != *fd)
-		    && (part == PART_OUT || channel->CH_OUT_FD != *fd)
-		    && (part == PART_ERR || channel->CH_ERR_FD != *fd))
-	    {
 #ifdef MSWIN
-		if (channel->ch_named_pipe)
-		    DisconnectNamedPipe((HANDLE)fd);
+	    if (channel->ch_named_pipe)
+		DisconnectNamedPipe((HANDLE)fd);
 #endif
-		fd_close(*fd);
-	    }
+	    fd_close(*fd);
 	}
-	*fd = INVALID_FD;
-
-	// channel is closed, may want to end the job if it was the last
-	channel->ch_to_be_closed &= ~(1U << part);
     }
+    *fd = INVALID_FD;
+
+    // channel is closed, may want to end the job if it was the last
+    channel->ch_to_be_closed &= ~(1U << part);
 }
 
     void
@@ -1556,34 +1559,34 @@ channel_set_job(channel_T *channel, job_
 
     channel_set_options(channel, options);
 
-    if (job->jv_in_buf != NULL)
+    if (job->jv_in_buf == NULL)
+	return;
+
+    chanpart_T *in_part = &channel->ch_part[PART_IN];
+
+    set_bufref(&in_part->ch_bufref, job->jv_in_buf);
+    ch_log(channel, "reading from buffer '%s'",
+	    (char *)in_part->ch_bufref.br_buf->b_ffname);
+    if (options->jo_set & JO_IN_TOP)
     {
-	chanpart_T *in_part = &channel->ch_part[PART_IN];
-
-	set_bufref(&in_part->ch_bufref, job->jv_in_buf);
-	ch_log(channel, "reading from buffer '%s'",
-				 (char *)in_part->ch_bufref.br_buf->b_ffname);
-	if (options->jo_set & JO_IN_TOP)
+	if (options->jo_in_top == 0 && !(options->jo_set & JO_IN_BOT))
 	{
-	    if (options->jo_in_top == 0 && !(options->jo_set & JO_IN_BOT))
-	    {
-		// Special mode: send last-but-one line when appending a line
-		// to the buffer.
-		in_part->ch_bufref.br_buf->b_write_to_channel = TRUE;
-		in_part->ch_buf_append = TRUE;
-		in_part->ch_buf_top =
-			    in_part->ch_bufref.br_buf->b_ml.ml_line_count + 1;
-	    }
-	    else
-		in_part->ch_buf_top = options->jo_in_top;
+	    // Special mode: send last-but-one line when appending a line
+	    // to the buffer.
+	    in_part->ch_bufref.br_buf->b_write_to_channel = TRUE;
+	    in_part->ch_buf_append = TRUE;
+	    in_part->ch_buf_top =
+		in_part->ch_bufref.br_buf->b_ml.ml_line_count + 1;
 	}
 	else
-	    in_part->ch_buf_top = 1;
-	if (options->jo_set & JO_IN_BOT)
-	    in_part->ch_buf_bot = options->jo_in_bot;
-	else
-	    in_part->ch_buf_bot = in_part->ch_bufref.br_buf->b_ml.ml_line_count;
+	    in_part->ch_buf_top = options->jo_in_top;
     }
+    else
+	in_part->ch_buf_top = 1;
+    if (options->jo_set & JO_IN_BOT)
+	in_part->ch_buf_bot = options->jo_in_bot;
+    else
+	in_part->ch_buf_bot = in_part->ch_bufref.br_buf->b_ml.ml_line_count;
 }
 
 /*
@@ -1599,18 +1602,18 @@ channel_set_req_callback(
     cbq_T *head = &channel->ch_part[part].ch_cb_head;
     cbq_T *item = ALLOC_ONE(cbq_T);
 
-    if (item != NULL)
-    {
-	copy_callback(&item->cq_callback, callback);
-	item->cq_seq_nr = id;
-	item->cq_prev = head->cq_prev;
-	head->cq_prev = item;
-	item->cq_next = NULL;
-	if (item->cq_prev == NULL)
-	    head->cq_next = item;
-	else
-	    item->cq_prev->cq_next = item;
-    }
+    if (item == NULL)
+	return;
+
+    copy_callback(&item->cq_callback, callback);
+    item->cq_seq_nr = id;
+    item->cq_prev = head->cq_prev;
+    head->cq_prev = item;
+    item->cq_next = NULL;
+    if (item->cq_prev == NULL)
+	head->cq_next = item;
+    else
+	item->cq_prev->cq_next = item;
 }
 
     static void
@@ -2636,42 +2639,42 @@ channel_push_json(channel_T *channel, ch
 
     newitem = ALLOC_ONE(jsonq_T);
     if (newitem == NULL)
+    {
 	clear_tv(rettv);
+	return;
+    }
+
+    newitem->jq_value = alloc_tv();
+    if (newitem->jq_value == NULL)
+    {
+	vim_free(newitem);
+	clear_tv(rettv);
+	return;
+    }
+
+    newitem->jq_no_callback = FALSE;
+    *newitem->jq_value = *rettv;
+    if (item == NULL)
+    {
+	// append to the end
+	newitem->jq_prev = head->jq_prev;
+	head->jq_prev = newitem;
+	newitem->jq_next = NULL;
+	if (newitem->jq_prev == NULL)
+	    head->jq_next = newitem;
+	else
+	    newitem->jq_prev->jq_next = newitem;
+    }
     else
     {
-	newitem->jq_value = alloc_tv();
-	if (newitem->jq_value == NULL)
-	{
-	    vim_free(newitem);
-	    clear_tv(rettv);
-	}
+	// append after "item"
+	newitem->jq_prev = item;
+	newitem->jq_next = item->jq_next;
+	item->jq_next = newitem;
+	if (newitem->jq_next == NULL)
+	    head->jq_prev = newitem;
 	else
-	{
-	    newitem->jq_no_callback = FALSE;
-	    *newitem->jq_value = *rettv;
-	    if (item == NULL)
-	    {
-		// append to the end
-		newitem->jq_prev = head->jq_prev;
-		head->jq_prev = newitem;
-		newitem->jq_next = NULL;
-		if (newitem->jq_prev == NULL)
-		    head->jq_next = newitem;
-		else
-		    newitem->jq_prev->jq_next = newitem;
-	    }
-	    else
-	    {
-		// append after "item"
-		newitem->jq_prev = item;
-		newitem->jq_next = item->jq_next;
-		item->jq_next = newitem;
-		if (newitem->jq_next == NULL)
-		    head->jq_prev = newitem;
-		else
-		    newitem->jq_next->jq_prev = newitem;
-	    }
-	}
+	    newitem->jq_next->jq_prev = newitem;
     }
 }
 
@@ -4184,56 +4187,56 @@ common_channel_read(typval_T *argvars, t
     if (opt.jo_set & JO_PART)
 	part = opt.jo_part;
     channel = get_channel_arg(&argvars[0], TRUE, TRUE, part);
-    if (channel != NULL)
+    if (channel == NULL)
+	goto theend;
+
+    if (part == PART_COUNT)
+	part = channel_part_read(channel);
+    mode = channel_get_mode(channel, part);
+    timeout = channel_get_timeout(channel, part);
+    if (opt.jo_set & JO_TIMEOUT)
+	timeout = opt.jo_timeout;
+
+    if (blob)
     {
-	if (part == PART_COUNT)
-	    part = channel_part_read(channel);
-	mode = channel_get_mode(channel, part);
-	timeout = channel_get_timeout(channel, part);
-	if (opt.jo_set & JO_TIMEOUT)
-	    timeout = opt.jo_timeout;
-
-	if (blob)
+	int	    outlen = 0;
+	char_u  *p = channel_read_block(channel, part,
+		timeout, TRUE, &outlen);
+	if (p != NULL)
 	{
-	    int	    outlen = 0;
-	    char_u  *p = channel_read_block(channel, part,
-						       timeout, TRUE, &outlen);
-	    if (p != NULL)
+	    blob_T	*b = blob_alloc();
+
+	    if (b != NULL)
 	    {
-		blob_T	*b = blob_alloc();
-
-		if (b != NULL)
+		b->bv_ga.ga_len = outlen;
+		if (ga_grow(&b->bv_ga, outlen) == FAIL)
+		    blob_free(b);
+		else
 		{
-		    b->bv_ga.ga_len = outlen;
-		    if (ga_grow(&b->bv_ga, outlen) == FAIL)
-			blob_free(b);
-		    else
-		    {
-			memcpy(b->bv_ga.ga_data, p, outlen);
-			rettv_blob_set(rettv, b);
-		    }
+		    memcpy(b->bv_ga.ga_data, p, outlen);
+		    rettv_blob_set(rettv, b);
 		}
-		vim_free(p);
 	    }
+	    vim_free(p);
 	}
-	else if (raw || mode == CH_MODE_RAW || mode == CH_MODE_NL)
-	    rettv->vval.v_string = channel_read_block(channel, part,
-							 timeout, raw, NULL);
+    }
+    else if (raw || mode == CH_MODE_RAW || mode == CH_MODE_NL)
+	rettv->vval.v_string = channel_read_block(channel, part,
+		timeout, raw, NULL);
+    else
+    {
+	if (opt.jo_set & JO_ID)
+	    id = opt.jo_id;
+	channel_read_json_block(channel, part, timeout, id, &listtv);
+	if (listtv != NULL)
+	{
+	    *rettv = *listtv;
+	    vim_free(listtv);
+	}
 	else
 	{
-	    if (opt.jo_set & JO_ID)
-		id = opt.jo_id;
-	    channel_read_json_block(channel, part, timeout, id, &listtv);
-	    if (listtv != NULL)
-	    {
-		*rettv = *listtv;
-		vim_free(listtv);
-	    }
-	    else
-	    {
-		rettv->v_type = VAR_SPECIAL;
-		rettv->vval.v_number = VVAL_NONE;
-	    }
+	    rettv->v_type = VAR_SPECIAL;
+	    rettv->vval.v_number = VVAL_NONE;
 	}
     }
 
@@ -4263,16 +4266,16 @@ channel_handle_events(int only_keep_open
 	for (part = PART_SOCK; part < PART_IN; ++part)
 	{
 	    fd = channel->ch_part[part].ch_fd;
-	    if (fd != INVALID_FD)
-	    {
-		int r = channel_wait(channel, fd, 0);
-
-		if (r == CW_READY)
-		    channel_read(channel, part, "channel_handle_events");
-		else if (r == CW_ERROR)
-		    ch_close_part_on_error(channel, part, TRUE,
-						     "channel_handle_events");
-	    }
+	    if (fd == INVALID_FD)
+		continue;
+
+	    int r = channel_wait(channel, fd, 0);
+
+	    if (r == CW_READY)
+		channel_read(channel, part, "channel_handle_events");
+	    else if (r == CW_ERROR)
+		ch_close_part_on_error(channel, part, TRUE,
+			"channel_handle_events");
 	}
 
 # ifdef __HAIKU__
@@ -4318,17 +4321,17 @@ channel_set_nonblock(channel_T *channel,
     chanpart_T *ch_part = &channel->ch_part[part];
     int		fd = ch_part->ch_fd;
 
-    if (fd != INVALID_FD)
-    {
+    if (fd == INVALID_FD)
+	return;
+
 #ifdef MSWIN
-	u_long	val = 1;
-
-	ioctlsocket(fd, FIONBIO, &val);
+    u_long	val = 1;
+
+    ioctlsocket(fd, FIONBIO, &val);
 #else
-	(void)fcntl(fd, F_SETFL, O_NONBLOCK);
+    (void)fcntl(fd, F_SETFL, O_NONBLOCK);
 #endif
-	ch_part->ch_nonblocking = TRUE;
-    }
+    ch_part->ch_nonblocking = TRUE;
 }
 
 /*
@@ -5218,7 +5221,7 @@ f_ch_close_in(typval_T *argvars, typval_
     void
 f_ch_getbufnr(typval_T *argvars, typval_T *rettv)
 {
-    channel_T *channel;
+    channel_T	*channel;
 
     rettv->vval.v_number = -1;
 
@@ -5228,23 +5231,22 @@ f_ch_getbufnr(typval_T *argvars, typval_
 	return;
 
     channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
-    if (channel != NULL)
-    {
-	char_u	*what = tv_get_string(&argvars[1]);
-	int	part;
-
-	if (STRCMP(what, "err") == 0)
-	    part = PART_ERR;
-	else if (STRCMP(what, "out") == 0)
-	    part = PART_OUT;
-	else if (STRCMP(what, "in") == 0)
-	    part = PART_IN;
-	else
-	    part = PART_SOCK;
-	if (channel->ch_part[part].ch_bufref.br_buf != NULL)
-	    rettv->vval.v_number =
-			      channel->ch_part[part].ch_bufref.br_buf->b_fnum;
-    }
+    if (channel == NULL)
+	return;
+
+    char_u	*what = tv_get_string(&argvars[1]);
+    int		part;
+    if (STRCMP(what, "err") == 0)
+	part = PART_ERR;
+    else if (STRCMP(what, "out") == 0)
+	part = PART_OUT;
+    else if (STRCMP(what, "in") == 0)
+	part = PART_IN;
+    else
+	part = PART_SOCK;
+    if (channel->ch_part[part].ch_bufref.br_buf != NULL)
+	rettv->vval.v_number =
+	    channel->ch_part[part].ch_bufref.br_buf->b_fnum;
 }
 
 /*
@@ -5259,13 +5261,13 @@ f_ch_getjob(typval_T *argvars, typval_T 
 	return;
 
     channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
-    if (channel != NULL)
-    {
-	rettv->v_type = VAR_JOB;
-	rettv->vval.v_job = channel->ch_job;
-	if (channel->ch_job != NULL)
-	    ++channel->ch_job->jv_refcount;
-    }
+    if (channel == NULL)
+	return;
+
+    rettv->v_type = VAR_JOB;
+    rettv->vval.v_job = channel->ch_job;
+    if (channel->ch_job != NULL)
+	++channel->ch_job->jv_refcount;
 }
 
 /*
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    777,
+/**/
     776,
 /**/
     775,