Patch 8.2.2944

10 views
Skip to first unread message

Bram Moolenaar

unread,
Jun 5, 2021, 2:52:20 PM6/5/21
to vim...@googlegroups.com

Patch 8.2.2944
Problem: Vim9: no error when using job or channel as a string.
Solution: Be more strict about conversion to string. (closes #8312)
Files: src/typval.c, src/job.c, src/proto/job.pro, src/channel.c,
src/proto/channel.pro, src/eval.c, src/vim9execute.c,
src/testdir/test_vim9_builtin.vim


*** ../vim-8.2.2943/src/typval.c 2021-05-09 23:19:17.093003109 +0200
--- src/typval.c 2021-06-05 20:42:37.974740560 +0200
***************
*** 414,420 ****
char_u *
tv_get_string_buf(typval_T *varp, char_u *buf)
{
! char_u *res = tv_get_string_buf_chk(varp, buf);

return res != NULL ? res : (char_u *)"";
}
--- 414,420 ----
char_u *
tv_get_string_buf(typval_T *varp, char_u *buf)
{
! char_u *res = tv_get_string_buf_chk(varp, buf);

return res != NULL ? res : (char_u *)"";
}
***************
*** 478,521 ****
break;
case VAR_JOB:
#ifdef FEAT_JOB_CHANNEL
{
! job_T *job = varp->vval.v_job;
! char *status;
!
! if (job == NULL)
! return (char_u *)"no process";
! status = job->jv_status == JOB_FAILED ? "fail"
! : job->jv_status >= JOB_ENDED ? "dead"
! : "run";
! # ifdef UNIX
! vim_snprintf((char *)buf, NUMBUFLEN,
! "process %ld %s", (long)job->jv_pid, status);
! # elif defined(MSWIN)
! vim_snprintf((char *)buf, NUMBUFLEN,
! "process %ld %s",
! (long)job->jv_proc_info.dwProcessId,
! status);
! # else
! // fall-back
! vim_snprintf((char *)buf, NUMBUFLEN, "process ? %s", status);
! # endif
! return buf;
}
#endif
break;
case VAR_CHANNEL:
#ifdef FEAT_JOB_CHANNEL
{
! channel_T *channel = varp->vval.v_channel;
! char *status = channel_status(channel, -1);
!
! if (channel == NULL)
! vim_snprintf((char *)buf, NUMBUFLEN, "channel %s", status);
! else
! vim_snprintf((char *)buf, NUMBUFLEN,
! "channel %d %s", channel->ch_id, status);
! return buf;
}
#endif
break;
case VAR_UNKNOWN:
--- 478,499 ----
break;
case VAR_JOB:
#ifdef FEAT_JOB_CHANNEL
+ if (in_vim9script())
{
! semsg(_(e_using_invalid_value_as_string_str), "job");
! break;
}
+ return job_to_string_buf(varp, buf);
#endif
break;
case VAR_CHANNEL:
#ifdef FEAT_JOB_CHANNEL
+ if (in_vim9script())
{
! semsg(_(e_using_invalid_value_as_string_str), "channel");
! break;
}
+ return channel_to_string_buf(varp, buf);
#endif
break;
case VAR_UNKNOWN:
*** ../vim-8.2.2943/src/job.c 2020-12-09 13:16:09.970838581 +0100
--- src/job.c 2021-06-05 20:40:14.811192286 +0200
***************
*** 1927,1930 ****
--- 1927,1960 ----
rettv->vval.v_number = job_stop(job, argvars, NULL);
}

+ /*
+ * Get a string with information about the job in "varp" in "buf".
+ * "buf" must be at least NUMBUFLEN long.
+ */
+ char_u *
+ job_to_string_buf(typval_T *varp, char_u *buf)
+ {
+ job_T *job = varp->vval.v_job;
+ char *status;
+
+ if (job == NULL)
+ return (char_u *)"no process";
+ status = job->jv_status == JOB_FAILED ? "fail"
+ : job->jv_status >= JOB_ENDED ? "dead"
+ : "run";
+ # ifdef UNIX
+ vim_snprintf((char *)buf, NUMBUFLEN,
+ "process %ld %s", (long)job->jv_pid, status);
+ # elif defined(MSWIN)
+ vim_snprintf((char *)buf, NUMBUFLEN,
+ "process %ld %s",
+ (long)job->jv_proc_info.dwProcessId,
+ status);
+ # else
+ // fall-back
+ vim_snprintf((char *)buf, NUMBUFLEN, "process ? %s", status);
+ # endif
+ return buf;
+ }
+
#endif // FEAT_JOB_CHANNEL
*** ../vim-8.2.2943/src/proto/job.pro 2020-09-05 15:48:32.469546692 +0200
--- src/proto/job.pro 2021-06-05 20:40:29.843144301 +0200
***************
*** 34,37 ****
--- 34,38 ----
void f_job_start(typval_T *argvars, typval_T *rettv);
void f_job_status(typval_T *argvars, typval_T *rettv);
void f_job_stop(typval_T *argvars, typval_T *rettv);
+ char_u *job_to_string_buf(typval_T *varp, char_u *buf);
/* vim: set ft=c : */
*** ../vim-8.2.2943/src/channel.c 2021-03-27 21:23:27.064153032 +0100
--- src/channel.c 2021-06-05 20:41:08.351021945 +0200
***************
*** 5015,5018 ****
--- 5015,5036 ----
rettv->vval.v_string = vim_strsave((char_u *)channel_status(channel, part));
}

+ /*
+ * Get a string with information about the channel in "varp" in "buf".
+ * "buf" must be at least NUMBUFLEN long.
+ */
+ char_u *
+ channel_to_string_buf(typval_T *varp, char_u *buf)
+ {
+ channel_T *channel = varp->vval.v_channel;
+ char *status = channel_status(channel, -1);
+
+ if (channel == NULL)
+ vim_snprintf((char *)buf, NUMBUFLEN, "channel %s", status);
+ else
+ vim_snprintf((char *)buf, NUMBUFLEN,
+ "channel %d %s", channel->ch_id, status);
+ return buf;
+ }
+
#endif // FEAT_JOB_CHANNEL
*** ../vim-8.2.2943/src/proto/channel.pro 2020-09-05 15:48:32.469546692 +0200
--- src/proto/channel.pro 2021-06-05 20:41:57.286867748 +0200
***************
*** 58,61 ****
--- 58,62 ----
void f_ch_sendraw(typval_T *argvars, typval_T *rettv);
void f_ch_setoptions(typval_T *argvars, typval_T *rettv);
void f_ch_status(typval_T *argvars, typval_T *rettv);
+ char_u *channel_to_string_buf(typval_T *varp, char_u *buf);
/* vim: set ft=c : */
*** ../vim-8.2.2943/src/eval.c 2021-06-02 17:07:02.280398156 +0200
--- src/eval.c 2021-06-05 20:41:51.342886407 +0200
***************
*** 5060,5066 ****
case VAR_JOB:
case VAR_CHANNEL:
*tofree = NULL;
! r = tv_get_string_buf(tv, numbuf);
if (composite_val)
{
*tofree = string_quote(r, FALSE);
--- 5060,5067 ----
case VAR_JOB:
case VAR_CHANNEL:
*tofree = NULL;
! r = tv->v_type == VAR_JOB ? job_to_string_buf(tv, numbuf)
! : channel_to_string_buf(tv, numbuf);
if (composite_val)
{
*tofree = string_quote(r, FALSE);
*** ../vim-8.2.2943/src/vim9execute.c 2021-06-05 18:49:35.281702568 +0200
--- src/vim9execute.c 2021-06-05 20:50:11.713367325 +0200
***************
*** 4831,4840 ****
{
typval_T tv;
char_u *name;

tv.v_type = VAR_JOB;
tv.vval.v_job = iptr->isn_arg.job;
! name = tv_get_string(&tv);
smsg("%s%4d PUSHJOB \"%s\"", pfx, current, name);
}
#endif
--- 4831,4841 ----
{
typval_T tv;
char_u *name;
+ char_u buf[NUMBUFLEN];

tv.v_type = VAR_JOB;
tv.vval.v_job = iptr->isn_arg.job;
! name = job_to_string_buf(&tv, buf);
smsg("%s%4d PUSHJOB \"%s\"", pfx, current, name);
}
#endif
*** ../vim-8.2.2943/src/testdir/test_vim9_builtin.vim 2021-06-05 18:15:06.614037266 +0200
--- src/testdir/test_vim9_builtin.vim 2021-06-05 20:45:22.922232926 +0200
***************
*** 1104,1110 ****
assert_equal([], getbufline(b, 2, 1))

if has('job')
! setbufline(b, 2, [function('eval'), {key: 123}, test_null_job()])
assert_equal(["function('eval')",
"{'key': 123}",
"no process"],
--- 1104,1110 ----
assert_equal([], getbufline(b, 2, 1))

if has('job')
! setbufline(b, 2, [function('eval'), {key: 123}, string(test_null_job())])
assert_equal(["function('eval')",
"{'key': 123}",
"no process"],
***************
*** 1250,1255 ****
--- 1250,1265 ----
actual->assert_equal(expected)
enddef

+ def Test_substitute()
+ var res = substitute('A1234', '\d', 'X', '')
+ assert_equal('AX234', res)
+
+ if has('job')
+ assert_fails('"text"->substitute(".*", () => job_start(":"), "")', 'E908: using an invalid value as a String: job')
+ assert_fails('"text"->substitute(".*", () => job_start(":")->job_getchannel(), "")', 'E908: using an invalid value as a String: channel')
+ endif
+ enddef
+
def Test_synID()
new
setline(1, "text")
*** ../vim-8.2.2943/src/version.c 2021-06-05 18:49:35.281702568 +0200
--- src/version.c 2021-06-05 20:26:34.089725440 +0200
***************
*** 752,753 ****
--- 752,755 ----
{ /* Add new patch number below this line */
+ /**/
+ 2944,
/**/

--
JOHN CLEESE PLAYED: SECOND SOLDIER WITH A KEEN INTEREST IN BIRDS, LARGE MAN
WITH DEAD BODY, BLACK KNIGHT, MR NEWT (A VILLAGE
BLACKSMITH INTERESTED IN BURNING WITCHES), A QUITE
EXTRAORDINARILY RUDE FRENCHMAN, TIM THE WIZARD, SIR
LAUNCELOT
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

/// Bram Moolenaar -- Br...@Moolenaar.net -- http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

John Marriott

unread,
Jun 5, 2021, 4:21:56 PM6/5/21
to vim...@googlegroups.com


On 06-Jun-2021 04:52, Bram Moolenaar wrote:
> Patch 8.2.2944
> Problem: Vim9: no error when using job or channel as a string.
> Solution: Be more strict about conversion to string. (closes #8312)
> Files: src/typval.c, src/job.c, src/proto/job.pro, src/channel.c,
> src/proto/channel.pro, src/eval.c, src/vim9execute.c,
> src/testdir/test_vim9_builtin.vim
>
>
After this patch, mingw64 (gcc 11.1.0) throws this warning and then this
linker error if FEAT_JOB_CHANNEL is disabled:
<snip>
gcc -c -I. -Iproto -DWIN32 -DWINVER=0x0603 -D_WIN32_WINNT=0x0603
-DHAVE_PATHDEF -DFEAT_NORMAL -DHAVE_STDINT_H -D__USE_MINGW_ANSI_STDIO
-pipe -march=native -Wall -O3 -fomit-frame-pointer -freg-struct-return
-fpie -fPIE -DFEAT_GUI_MSWIN -DFEAT_CLIPBOARD eval.c -o gobjnative/eval.o
eval.c: In function 'echo_string_core':
eval.c:5063:41: warning: implicit declaration of function
'job_to_string_buf' [-Wimplicit-function-declaration]
 5063 |             r = tv->v_type == VAR_JOB ? job_to_string_buf(tv,
numbuf)
      |                                         ^~~~~~~~~~~~~~~~~
eval.c:5064:46: warning: implicit declaration of function
'channel_to_string_buf' [-Wimplicit-function-declaration]
 5064 |                                            :
channel_to_string_buf(tv, numbuf);
      | ^~~~~~~~~~~~~~~~~~~~~
eval.c:5063:15: warning: assignment to 'char_u *' {aka 'unsigned char
*'} from 'int' makes pointer from integer without a cast [-Wint-conversion]
 5063 |             r = tv->v_type == VAR_JOB ? job_to_string_buf(tv,
numbuf)
      |               ^
...
gcc -I. -Iproto -DWIN32 -DWINVER=0x0603 -D_WIN32_WINNT=0x0603
-DHAVE_PATHDEF -DFEAT_NORMAL -DHAVE_STDINT_H -D__USE_MINGW_ANSI_STDIO
-pipe -march=native -Wall -O3 -fomit-frame-pointer -freg-struct-return
-fpie -fPIE -DFEAT_GUI_MSWIN -DFEAT_CLIPBOARD -Wl,-nxcompat,-dynamicbase
-municode -s -mwindows -o gvim.exe gobjnative/arabic.o
gobjnative/arglist.o gobjnative/autocmd.o gobjnative/beval.o
gobjnative/blob.o gobjnative/blowfish.o gobjnative/buffer.o
gobjnative/bufwrite.o gobjnative/change.o gobjnative/charset.o
gobjnative/cindent.o gobjnative/clientserver.o gobjnative/clipboard.o
gobjnative/cmdexpand.o gobjnative/cmdhist.o gobjnative/crypt.o
gobjnative/crypt_zip.o gobjnative/debugger.o gobjnative/dict.o
gobjnative/diff.o gobjnative/digraph.o gobjnative/drawline.o
gobjnative/drawscreen.o gobjnative/edit.o gobjnative/eval.o
gobjnative/evalbuffer.o gobjnative/evalfunc.o gobjnative/evalvars.o
gobjnative/evalwindow.o gobjnative/ex_cmds.o gobjnative/ex_cmds2.o
gobjnative/ex_docmd.o gobjnative/ex_eval.o gobjnative/ex_getln.o
gobjnative/fileio.o gobjnative/filepath.o gobjnative/findfile.o
gobjnative/float.o gobjnative/fold.o gobjnative/getchar.o
gobjnative/gui_xim.o gobjnative/hardcopy.o gobjnative/hashtab.o
gobjnative/help.o gobjnative/highlight.o gobjnative/if_cscope.o
gobjnative/indent.o gobjnative/insexpand.o gobjnative/json.o
gobjnative/list.o gobjnative/locale.o gobjnative/main.o gobjnative/map.o
gobjnative/mark.o gobjnative/match.o gobjnative/memfile.o
gobjnative/memline.o gobjnative/menu.o gobjnative/message.o
gobjnative/misc1.o gobjnative/misc2.o gobjnative/mouse.o
gobjnative/move.o gobjnative/mbyte.o gobjnative/normal.o
gobjnative/ops.o gobjnative/option.o gobjnative/optionstr.o
gobjnative/os_mswin.o gobjnative/os_win32.o gobjnative/pathdef.o
gobjnative/popupmenu.o gobjnative/popupwin.o gobjnative/profiler.o
gobjnative/quickfix.o gobjnative/regexp.o gobjnative/register.o
gobjnative/scriptfile.o gobjnative/screen.o gobjnative/search.o
gobjnative/session.o gobjnative/sha256.o gobjnative/sign.o
gobjnative/spell.o gobjnative/spellfile.o gobjnative/spellsuggest.o
gobjnative/syntax.o gobjnative/tag.o gobjnative/term.o
gobjnative/testing.o gobjnative/textformat.o gobjnative/textobject.o
gobjnative/textprop.o gobjnative/time.o gobjnative/typval.o
gobjnative/ui.o gobjnative/undo.o gobjnative/usercmd.o
gobjnative/userfunc.o gobjnative/version.o gobjnative/vim9compile.o
gobjnative/vim9execute.o gobjnative/vim9script.o gobjnative/vim9type.o
gobjnative/viminfo.o gobjnative/winclip.o gobjnative/window.o
gobjnative/os_w32exe.o gobjnative/vimres.o gobjnative/xdiffi.o
gobjnative/xemit.o gobjnative/xprepare.o gobjnative/xutils.o
gobjnative/xhistogram.o gobjnative/xpatience.o gobjnative/gui.o
gobjnative/gui_w32.o gobjnative/gui_beval.o -lkernel32 -luser32 -lgdi32
-ladvapi32 -lcomdlg32 -lcomctl32 -lnetapi32 -lversion -lole32 -luuid
d:/users/john/documents/software/mingw/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe:
gobjnative/eval.o:eval.c:(.text+0x3f19): undefined reference to
`channel_to_string_buf'
d:/users/john/documents/software/mingw/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe:
gobjnative/eval.o:eval.c:(.text+0x41c1): undefined reference to
`job_to_string_buf'
collect2.exe: error: ld returned 1 exit status
make: *** [Make_cyg_ming.mak:1076: gvim.exe] Error 1
</snip>

The attachment patch tries to fix it.

Cheers
John
eval.c.8.2.2944.patch

Bram Moolenaar

unread,
Jun 6, 2021, 6:01:11 AM6/6/21
to vim...@googlegroups.com, John Marriott
> </snip>
>
> The attachment patch tries to fix it.

Thanks, I moved the #ifdef instead of copying it.

--
MICHAEL PALIN PLAYED: 1ST SOLDIER WITH A KEEN INTEREST IN BIRDS, DENNIS, MR
DUCK (A VILLAGE CARPENTER WHO IS ALMOST KEENER THAN
ANYONE ELSE TO BURN WITCHES), THREE-HEADED KNIGHT, SIR
GALAHAD, KING OF SWAMP CASTLE, BROTHER MAYNARD'S ROOMATE
Reply all
Reply to author
Forward
0 new messages