Skip to content

Commit cf915c8

Browse files
committed
Merge remote-tracking branch 'vim/master'
2 parents 04ee357 + ffa9684 commit cf915c8

32 files changed

Lines changed: 391 additions & 176 deletions

runtime/doc/terminal.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,7 @@ Environment variables are used to pass information to the running job:
376376
COLUMNS number of columns in the terminal initially
377377
COLORS number of colors, 't_Co' (256*256*256 in the GUI)
378378
VIM_SERVERNAME v:servername
379+
VIM_TERMINAL v:version
379380

380381

381382
MS-Windows ~

src/channel.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5567,7 +5567,11 @@ job_check_ended(void)
55675567
* Returns NULL when out of memory.
55685568
*/
55695569
job_T *
5570-
job_start(typval_T *argvars, char **argv_arg, jobopt_T *opt_arg)
5570+
job_start(
5571+
typval_T *argvars,
5572+
char **argv_arg,
5573+
jobopt_T *opt_arg,
5574+
int is_terminal UNUSED)
55715575
{
55725576
job_T *job;
55735577
char_u *cmd = NULL;
@@ -5721,7 +5725,7 @@ job_start(typval_T *argvars, char **argv_arg, jobopt_T *opt_arg)
57215725
ch_log(NULL, "Starting job: %s", (char *)ga.ga_data);
57225726
ga_clear(&ga);
57235727
}
5724-
mch_job_start(argv, job, &opt);
5728+
mch_job_start(argv, job, &opt, is_terminal);
57255729
#else
57265730
ch_log(NULL, "Starting job: %s", (char *)cmd);
57275731
mch_job_start((char *)cmd, job, &opt);

src/charset.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1928,8 +1928,8 @@ vim_str2nr(
19281928
while ('0' <= *ptr && *ptr <= '1')
19291929
{
19301930
/* avoid ubsan error for overflow */
1931-
if (un < UVARNUM_MAX / 2)
1932-
un = 2 * un + (unsigned long)(*ptr - '0');
1931+
if (un <= UVARNUM_MAX / 2)
1932+
un = 2 * un + (uvarnumber_T)(*ptr - '0');
19331933
else
19341934
un = UVARNUM_MAX;
19351935
++ptr;
@@ -1943,7 +1943,7 @@ vim_str2nr(
19431943
while ('0' <= *ptr && *ptr <= '7')
19441944
{
19451945
/* avoid ubsan error for overflow */
1946-
if (un < UVARNUM_MAX / 8)
1946+
if (un <= UVARNUM_MAX / 8)
19471947
un = 8 * un + (uvarnumber_T)(*ptr - '0');
19481948
else
19491949
un = UVARNUM_MAX;
@@ -1960,7 +1960,7 @@ vim_str2nr(
19601960
while (vim_isxdigit(*ptr))
19611961
{
19621962
/* avoid ubsan error for overflow */
1963-
if (un < UVARNUM_MAX / 16)
1963+
if (un <= UVARNUM_MAX / 16)
19641964
un = 16 * un + (uvarnumber_T)hex2nr(*ptr);
19651965
else
19661966
un = UVARNUM_MAX;
@@ -1974,9 +1974,12 @@ vim_str2nr(
19741974
/* decimal */
19751975
while (VIM_ISDIGIT(*ptr))
19761976
{
1977+
uvarnumber_T digit = (uvarnumber_T)(*ptr - '0');
1978+
19771979
/* avoid ubsan error for overflow */
1978-
if (un < UVARNUM_MAX / 10)
1979-
un = 10 * un + (uvarnumber_T)(*ptr - '0');
1980+
if (un < UVARNUM_MAX / 10
1981+
|| (un == UVARNUM_MAX / 10 && digit <= UVARNUM_MAX % 10))
1982+
un = 10 * un + digit;
19801983
else
19811984
un = UVARNUM_MAX;
19821985
++ptr;

src/edit.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1903,7 +1903,7 @@ init_prompt(int cmdchar_todo)
19031903
|| Insstart_orig.col != (int)STRLEN(prompt))
19041904
{
19051905
Insstart.lnum = curwin->w_cursor.lnum;
1906-
Insstart.col = STRLEN(prompt);
1906+
Insstart.col = (int)STRLEN(prompt);
19071907
Insstart_orig = Insstart;
19081908
Insstart_textlen = Insstart.col;
19091909
Insstart_blank_vcol = MAXCOL;
@@ -1913,7 +1913,7 @@ init_prompt(int cmdchar_todo)
19131913
if (cmdchar_todo == 'A')
19141914
coladvance((colnr_T)MAXCOL);
19151915
if (cmdchar_todo == 'I' || curwin->w_cursor.col <= (int)STRLEN(prompt))
1916-
curwin->w_cursor.col = STRLEN(prompt);
1916+
curwin->w_cursor.col = (int)STRLEN(prompt);
19171917
/* Make sure the cursor is in a valid position. */
19181918
check_cursor();
19191919
}
@@ -4215,7 +4215,7 @@ expand_by_function(
42154215
{
42164216
list_T *matchlist = NULL;
42174217
dict_T *matchdict = NULL;
4218-
char_u *args[2];
4218+
typval_T args[3];
42194219
char_u *funcname;
42204220
pos_T pos;
42214221
win_T *curwin_save;
@@ -4227,15 +4227,18 @@ expand_by_function(
42274227
return;
42284228

42294229
/* Call 'completefunc' to obtain the list of matches. */
4230-
args[0] = (char_u *)"0";
4231-
args[1] = base;
4230+
args[0].v_type = VAR_NUMBER;
4231+
args[0].vval.v_number = 0;
4232+
args[1].v_type = VAR_STRING;
4233+
args[1].vval.v_string = base != NULL ? base : (char_u *)"";
4234+
args[2].v_type = VAR_UNKNOWN;
42324235

42334236
pos = curwin->w_cursor;
42344237
curwin_save = curwin;
42354238
curbuf_save = curbuf;
42364239

42374240
/* Call a function, which returns a list or dict. */
4238-
if (call_vim_function(funcname, 2, args, FALSE, FALSE, &rettv) == OK)
4241+
if (call_vim_function(funcname, 2, args, &rettv, FALSE) == OK)
42394242
{
42404243
switch (rettv.v_type)
42414244
{
@@ -5542,7 +5545,7 @@ ins_complete(int c, int enable_pum)
55425545
* Call user defined function 'completefunc' with "a:findstart"
55435546
* set to 1 to obtain the length of text to use for completion.
55445547
*/
5545-
char_u *args[2];
5548+
typval_T args[3];
55465549
int col;
55475550
char_u *funcname;
55485551
pos_T pos;
@@ -5562,8 +5565,11 @@ ins_complete(int c, int enable_pum)
55625565
return FAIL;
55635566
}
55645567

5565-
args[0] = (char_u *)"1";
5566-
args[1] = NULL;
5568+
args[0].v_type = VAR_NUMBER;
5569+
args[0].vval.v_number = 1;
5570+
args[1].v_type = VAR_STRING;
5571+
args[1].vval.v_string = (char_u *)"";
5572+
args[2].v_type = VAR_UNKNOWN;
55675573
pos = curwin->w_cursor;
55685574
curwin_save = curwin;
55695575
curbuf_save = curbuf;

src/eval.c

Lines changed: 18 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,79 +1011,37 @@ eval_expr(char_u *arg, char_u **nextcmd)
10111011

10121012
/*
10131013
* Call some Vim script function and return the result in "*rettv".
1014-
* Uses argv[argc] for the function arguments. Only Number and String
1015-
* arguments are currently supported.
1014+
* Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc]
1015+
* should have type VAR_UNKNOWN.
10161016
* Returns OK or FAIL.
10171017
*/
10181018
int
10191019
call_vim_function(
10201020
char_u *func,
10211021
int argc,
1022-
char_u **argv,
1023-
int safe, /* use the sandbox */
1024-
int str_arg_only, /* all arguments are strings */
1025-
typval_T *rettv)
1022+
typval_T *argv,
1023+
typval_T *rettv,
1024+
int safe) /* use the sandbox */
10261025
{
1027-
typval_T *argvars;
1028-
varnumber_T n;
1029-
int len;
1030-
int i;
10311026
int doesrange;
10321027
void *save_funccalp = NULL;
10331028
int ret;
10341029

1035-
argvars = (typval_T *)alloc((unsigned)((argc + 1) * sizeof(typval_T)));
1036-
if (argvars == NULL)
1037-
return FAIL;
1038-
1039-
for (i = 0; i < argc; i++)
1040-
{
1041-
/* Pass a NULL or empty argument as an empty string */
1042-
if (argv[i] == NULL || *argv[i] == NUL)
1043-
{
1044-
argvars[i].v_type = VAR_STRING;
1045-
argvars[i].vval.v_string = (char_u *)"";
1046-
continue;
1047-
}
1048-
1049-
if (str_arg_only)
1050-
len = 0;
1051-
else
1052-
{
1053-
/* Recognize a number argument, the others must be strings. A dash
1054-
* is a string too. */
1055-
vim_str2nr(argv[i], NULL, &len, STR2NR_ALL, &n, NULL, 0);
1056-
if (len == 1 && *argv[i] == '-')
1057-
len = 0;
1058-
}
1059-
if (len != 0 && len == (int)STRLEN(argv[i]))
1060-
{
1061-
argvars[i].v_type = VAR_NUMBER;
1062-
argvars[i].vval.v_number = n;
1063-
}
1064-
else
1065-
{
1066-
argvars[i].v_type = VAR_STRING;
1067-
argvars[i].vval.v_string = argv[i];
1068-
}
1069-
}
1070-
10711030
if (safe)
10721031
{
10731032
save_funccalp = save_funccal();
10741033
++sandbox;
10751034
}
10761035

10771036
rettv->v_type = VAR_UNKNOWN; /* clear_tv() uses this */
1078-
ret = call_func(func, (int)STRLEN(func), rettv, argc, argvars, NULL,
1037+
ret = call_func(func, (int)STRLEN(func), rettv, argc, argv, NULL,
10791038
curwin->w_cursor.lnum, curwin->w_cursor.lnum,
10801039
&doesrange, TRUE, NULL, NULL);
10811040
if (safe)
10821041
{
10831042
--sandbox;
10841043
restore_funccal(save_funccalp);
10851044
}
1086-
vim_free(argvars);
10871045

10881046
if (ret == FAIL)
10891047
clear_tv(rettv);
@@ -1094,20 +1052,20 @@ call_vim_function(
10941052
/*
10951053
* Call Vim script function "func" and return the result as a number.
10961054
* Returns -1 when calling the function fails.
1097-
* Uses argv[argc] for the function arguments.
1055+
* Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc] should
1056+
* have type VAR_UNKNOWN.
10981057
*/
10991058
varnumber_T
11001059
call_func_retnr(
11011060
char_u *func,
11021061
int argc,
1103-
char_u **argv,
1062+
typval_T *argv,
11041063
int safe) /* use the sandbox */
11051064
{
11061065
typval_T rettv;
11071066
varnumber_T retval;
11081067

1109-
/* All arguments are passed as strings, no conversion to number. */
1110-
if (call_vim_function(func, argc, argv, safe, TRUE, &rettv) == FAIL)
1068+
if (call_vim_function(func, argc, argv, &rettv, safe) == FAIL)
11111069
return -1;
11121070

11131071
retval = get_tv_number_chk(&rettv, NULL);
@@ -1122,20 +1080,20 @@ call_func_retnr(
11221080
/*
11231081
* Call Vim script function "func" and return the result as a string.
11241082
* Returns NULL when calling the function fails.
1125-
* Uses argv[argc] for the function arguments.
1083+
* Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc] should
1084+
* have type VAR_UNKNOWN.
11261085
*/
11271086
void *
11281087
call_func_retstr(
11291088
char_u *func,
11301089
int argc,
1131-
char_u **argv,
1090+
typval_T *argv,
11321091
int safe) /* use the sandbox */
11331092
{
11341093
typval_T rettv;
11351094
char_u *retval;
11361095

1137-
/* All arguments are passed as strings, no conversion to number. */
1138-
if (call_vim_function(func, argc, argv, safe, TRUE, &rettv) == FAIL)
1096+
if (call_vim_function(func, argc, argv, &rettv, safe) == FAIL)
11391097
return NULL;
11401098

11411099
retval = vim_strsave(get_tv_string(&rettv));
@@ -1146,20 +1104,20 @@ call_func_retstr(
11461104

11471105
/*
11481106
* Call Vim script function "func" and return the result as a List.
1149-
* Uses argv[argc] for the function arguments.
1107+
* Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc] should
1108+
* have type VAR_UNKNOWN.
11501109
* Returns NULL when there is something wrong.
11511110
*/
11521111
void *
11531112
call_func_retlist(
11541113
char_u *func,
11551114
int argc,
1156-
char_u **argv,
1115+
typval_T *argv,
11571116
int safe) /* use the sandbox */
11581117
{
11591118
typval_T rettv;
11601119

1161-
/* All arguments are passed as strings, no conversion to number. */
1162-
if (call_vim_function(func, argc, argv, safe, TRUE, &rettv) == FAIL)
1120+
if (call_vim_function(func, argc, argv, &rettv, safe) == FAIL)
11631121
return NULL;
11641122

11651123
if (rettv.v_type != VAR_LIST)

src/evalfunc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7273,7 +7273,7 @@ f_job_start(typval_T *argvars, typval_T *rettv)
72737273
rettv->v_type = VAR_JOB;
72747274
if (check_restricted() || check_secure())
72757275
return;
7276-
rettv->vval.v_job = job_start(argvars, NULL, NULL);
7276+
rettv->vval.v_job = job_start(argvars, NULL, NULL, FALSE);
72777277
}
72787278

72797279
/*

src/ex_docmd.c

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4063,8 +4063,16 @@ set_one_cmd_context(
40634063
case CMD_unlet:
40644064
while ((xp->xp_pattern = vim_strchr(arg, ' ')) != NULL)
40654065
arg = xp->xp_pattern + 1;
4066+
40664067
xp->xp_context = EXPAND_USER_VARS;
40674068
xp->xp_pattern = arg;
4069+
4070+
if (*xp->xp_pattern == '$')
4071+
{
4072+
xp->xp_context = EXPAND_ENV_VARS;
4073+
++xp->xp_pattern;
4074+
}
4075+
40684076
break;
40694077

40704078
case CMD_function:
@@ -5334,7 +5342,9 @@ get_bad_opt(char_u *p, exarg_T *eap)
53345342
eap->bad_char = BAD_DROP;
53355343
else if (MB_BYTE2LEN(*p) == 1 && p[1] == NUL)
53365344
eap->bad_char = *p;
5337-
return FAIL;
5345+
else
5346+
return FAIL;
5347+
return OK;
53385348
}
53395349
#endif
53405350

@@ -11310,7 +11320,10 @@ makeopens(
1131011320
* winminheight and winminwidth need to be set to avoid an error if the
1131111321
* user has set winheight or winwidth.
1131211322
*/
11313-
if (put_line(fd, "set winminheight=1 winheight=1 winminwidth=1 winwidth=1") == FAIL)
11323+
if (put_line(fd, "set winminheight=0") == FAIL
11324+
|| put_line(fd, "set winheight=1") == FAIL
11325+
|| put_line(fd, "set winminwidth=0") == FAIL
11326+
|| put_line(fd, "set winwidth=1") == FAIL)
1131411327
return FAIL;
1131511328
if (nr > 1 && ses_winsizes(fd, restore_size, tab_firstwin) == FAIL)
1131611329
return FAIL;

0 commit comments

Comments
 (0)