diff options
Diffstat (limited to 'data/vim/patches/8.1.0053')
-rw-r--r-- | data/vim/patches/8.1.0053 | 609 |
1 files changed, 609 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0053 b/data/vim/patches/8.1.0053 new file mode 100644 index 000000000..aa3ff44b1 --- /dev/null +++ b/data/vim/patches/8.1.0053 @@ -0,0 +1,609 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.0053 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 8.1.0053 +Problem: The first argument given to 'completefunc' can be Number or + String, depending on the value. +Solution: Avoid guessing the type of an argument, use typval_T in the + callers of call_vim_function(). (Ozaki Kiichi, closes #2993) +Files: src/edit.c, src/eval.c, src/ex_getln.c, src/mbyte.c, src/normal.c, + src/proto/eval.pro, src/testdir/test_ins_complete.vim + + +*** ../vim-8.1.0052/src/edit.c 2018-06-10 13:12:52.176496009 +0200 +--- src/edit.c 2018-06-12 21:49:32.781522896 +0200 +*************** +*** 4201,4207 **** + { + list_T *matchlist = NULL; + dict_T *matchdict = NULL; +! char_u *args[2]; + char_u *funcname; + pos_T pos; + win_T *curwin_save; +--- 4201,4207 ---- + { + list_T *matchlist = NULL; + dict_T *matchdict = NULL; +! typval_T args[3]; + char_u *funcname; + pos_T pos; + win_T *curwin_save; +*************** +*** 4213,4227 **** + return; + + /* Call 'completefunc' to obtain the list of matches. */ +! args[0] = (char_u *)"0"; +! args[1] = base; + + pos = curwin->w_cursor; + curwin_save = curwin; + curbuf_save = curbuf; + + /* Call a function, which returns a list or dict. */ +! if (call_vim_function(funcname, 2, args, FALSE, FALSE, &rettv) == OK) + { + switch (rettv.v_type) + { +--- 4213,4230 ---- + return; + + /* Call 'completefunc' to obtain the list of matches. */ +! args[0].v_type = VAR_NUMBER; +! args[0].vval.v_number = 0; +! args[1].v_type = VAR_STRING; +! args[1].vval.v_string = base != NULL ? base : (char_u *)""; +! args[2].v_type = VAR_UNKNOWN; + + pos = curwin->w_cursor; + curwin_save = curwin; + curbuf_save = curbuf; + + /* Call a function, which returns a list or dict. */ +! if (call_vim_function(funcname, 2, args, &rettv, FALSE) == OK) + { + switch (rettv.v_type) + { +*************** +*** 5528,5534 **** + * Call user defined function 'completefunc' with "a:findstart" + * set to 1 to obtain the length of text to use for completion. + */ +! char_u *args[2]; + int col; + char_u *funcname; + pos_T pos; +--- 5531,5537 ---- + * Call user defined function 'completefunc' with "a:findstart" + * set to 1 to obtain the length of text to use for completion. + */ +! typval_T args[3]; + int col; + char_u *funcname; + pos_T pos; +*************** +*** 5548,5555 **** + return FAIL; + } + +! args[0] = (char_u *)"1"; +! args[1] = NULL; + pos = curwin->w_cursor; + curwin_save = curwin; + curbuf_save = curbuf; +--- 5551,5561 ---- + return FAIL; + } + +! args[0].v_type = VAR_NUMBER; +! args[0].vval.v_number = 1; +! args[1].v_type = VAR_STRING; +! args[1].vval.v_string = (char_u *)""; +! args[2].v_type = VAR_UNKNOWN; + pos = curwin->w_cursor; + curwin_save = curwin; + curbuf_save = curbuf; +*** ../vim-8.1.0052/src/eval.c 2018-05-13 15:42:40.000000000 +0200 +--- src/eval.c 2018-06-12 21:53:10.468274335 +0200 +*************** +*** 1011,1073 **** + + /* + * Call some Vim script function and return the result in "*rettv". +! * Uses argv[argc] for the function arguments. Only Number and String +! * arguments are currently supported. + * Returns OK or FAIL. + */ + int + call_vim_function( + char_u *func, + int argc, +! char_u **argv, +! int safe, /* use the sandbox */ +! int str_arg_only, /* all arguments are strings */ +! typval_T *rettv) + { +- typval_T *argvars; +- varnumber_T n; +- int len; +- int i; + int doesrange; + void *save_funccalp = NULL; + int ret; + +- argvars = (typval_T *)alloc((unsigned)((argc + 1) * sizeof(typval_T))); +- if (argvars == NULL) +- return FAIL; +- +- for (i = 0; i < argc; i++) +- { +- /* Pass a NULL or empty argument as an empty string */ +- if (argv[i] == NULL || *argv[i] == NUL) +- { +- argvars[i].v_type = VAR_STRING; +- argvars[i].vval.v_string = (char_u *)""; +- continue; +- } +- +- if (str_arg_only) +- len = 0; +- else +- { +- /* Recognize a number argument, the others must be strings. A dash +- * is a string too. */ +- vim_str2nr(argv[i], NULL, &len, STR2NR_ALL, &n, NULL, 0); +- if (len == 1 && *argv[i] == '-') +- len = 0; +- } +- if (len != 0 && len == (int)STRLEN(argv[i])) +- { +- argvars[i].v_type = VAR_NUMBER; +- argvars[i].vval.v_number = n; +- } +- else +- { +- argvars[i].v_type = VAR_STRING; +- argvars[i].vval.v_string = argv[i]; +- } +- } +- + if (safe) + { + save_funccalp = save_funccal(); +--- 1011,1032 ---- + + /* + * Call some Vim script function and return the result in "*rettv". +! * Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc] +! * should have type VAR_UNKNOWN. + * Returns OK or FAIL. + */ + int + call_vim_function( + char_u *func, + int argc, +! typval_T *argv, +! typval_T *rettv, +! int safe) /* use the sandbox */ + { + int doesrange; + void *save_funccalp = NULL; + int ret; + + if (safe) + { + save_funccalp = save_funccal(); +*************** +*** 1075,1081 **** + } + + rettv->v_type = VAR_UNKNOWN; /* clear_tv() uses this */ +! ret = call_func(func, (int)STRLEN(func), rettv, argc, argvars, NULL, + curwin->w_cursor.lnum, curwin->w_cursor.lnum, + &doesrange, TRUE, NULL, NULL); + if (safe) +--- 1034,1040 ---- + } + + rettv->v_type = VAR_UNKNOWN; /* clear_tv() uses this */ +! ret = call_func(func, (int)STRLEN(func), rettv, argc, argv, NULL, + curwin->w_cursor.lnum, curwin->w_cursor.lnum, + &doesrange, TRUE, NULL, NULL); + if (safe) +*************** +*** 1083,1089 **** + --sandbox; + restore_funccal(save_funccalp); + } +- vim_free(argvars); + + if (ret == FAIL) + clear_tv(rettv); +--- 1042,1047 ---- +*************** +*** 1094,1113 **** + /* + * Call Vim script function "func" and return the result as a number. + * Returns -1 when calling the function fails. +! * Uses argv[argc] for the function arguments. + */ + varnumber_T + call_func_retnr( + char_u *func, + int argc, +! char_u **argv, + int safe) /* use the sandbox */ + { + typval_T rettv; + varnumber_T retval; + +! /* All arguments are passed as strings, no conversion to number. */ +! if (call_vim_function(func, argc, argv, safe, TRUE, &rettv) == FAIL) + return -1; + + retval = get_tv_number_chk(&rettv, NULL); +--- 1052,1071 ---- + /* + * Call Vim script function "func" and return the result as a number. + * Returns -1 when calling the function fails. +! * Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc] should +! * have type VAR_UNKNOWN. + */ + varnumber_T + call_func_retnr( + char_u *func, + int argc, +! typval_T *argv, + int safe) /* use the sandbox */ + { + typval_T rettv; + varnumber_T retval; + +! if (call_vim_function(func, argc, argv, &rettv, safe) == FAIL) + return -1; + + retval = get_tv_number_chk(&rettv, NULL); +*************** +*** 1122,1141 **** + /* + * Call Vim script function "func" and return the result as a string. + * Returns NULL when calling the function fails. +! * Uses argv[argc] for the function arguments. + */ + void * + call_func_retstr( + char_u *func, + int argc, +! char_u **argv, + int safe) /* use the sandbox */ + { + typval_T rettv; + char_u *retval; + +! /* All arguments are passed as strings, no conversion to number. */ +! if (call_vim_function(func, argc, argv, safe, TRUE, &rettv) == FAIL) + return NULL; + + retval = vim_strsave(get_tv_string(&rettv)); +--- 1080,1099 ---- + /* + * Call Vim script function "func" and return the result as a string. + * Returns NULL when calling the function fails. +! * Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc] should +! * have type VAR_UNKNOWN. + */ + void * + call_func_retstr( + char_u *func, + int argc, +! typval_T *argv, + int safe) /* use the sandbox */ + { + typval_T rettv; + char_u *retval; + +! if (call_vim_function(func, argc, argv, &rettv, safe) == FAIL) + return NULL; + + retval = vim_strsave(get_tv_string(&rettv)); +*************** +*** 1146,1165 **** + + /* + * Call Vim script function "func" and return the result as a List. +! * Uses argv[argc] for the function arguments. + * Returns NULL when there is something wrong. + */ + void * + call_func_retlist( + char_u *func, + int argc, +! char_u **argv, + int safe) /* use the sandbox */ + { + typval_T rettv; + +! /* All arguments are passed as strings, no conversion to number. */ +! if (call_vim_function(func, argc, argv, safe, TRUE, &rettv) == FAIL) + return NULL; + + if (rettv.v_type != VAR_LIST) +--- 1104,1123 ---- + + /* + * Call Vim script function "func" and return the result as a List. +! * Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc] should +! * have type VAR_UNKNOWN. + * Returns NULL when there is something wrong. + */ + void * + call_func_retlist( + char_u *func, + int argc, +! typval_T *argv, + int safe) /* use the sandbox */ + { + typval_T rettv; + +! if (call_vim_function(func, argc, argv, &rettv, safe) == FAIL) + return NULL; + + if (rettv.v_type != VAR_LIST) +*** ../vim-8.1.0052/src/ex_getln.c 2018-05-22 16:58:43.979903077 +0200 +--- src/ex_getln.c 2018-06-12 21:56:34.139120017 +0200 +*************** +*** 5266,5272 **** + + + # if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL) +! static void * call_user_expand_func(void *(*user_expand_func)(char_u *, int, char_u **, int), expand_T *xp, int *num_file, char_u ***file); + + /* + * Call "user_expand_func()" to invoke a user defined Vim script function and +--- 5266,5272 ---- + + + # if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL) +! static void * call_user_expand_func(void *(*user_expand_func)(char_u *, int, typval_T *, int), expand_T *xp, int *num_file, char_u ***file); + + /* + * Call "user_expand_func()" to invoke a user defined Vim script function and +*************** +*** 5274,5288 **** + */ + static void * + call_user_expand_func( +! void *(*user_expand_func)(char_u *, int, char_u **, int), + expand_T *xp, + int *num_file, + char_u ***file) + { + int keep = 0; +! char_u num[50]; +! char_u *args[3]; + int save_current_SID = current_SID; + void *ret; + struct cmdline_info save_ccline; + +--- 5274,5288 ---- + */ + static void * + call_user_expand_func( +! void *(*user_expand_func)(char_u *, int, typval_T *, int), + expand_T *xp, + int *num_file, + char_u ***file) + { + int keep = 0; +! typval_T args[4]; + int save_current_SID = current_SID; ++ char_u *pat = NULL; + void *ret; + struct cmdline_info save_ccline; + +*************** +*** 5297,5306 **** + ccline.cmdbuff[ccline.cmdlen] = 0; + } + +! args[0] = vim_strnsave(xp->xp_pattern, xp->xp_pattern_len); +! args[1] = xp->xp_line; +! sprintf((char *)num, "%d", xp->xp_col); +! args[2] = num; + + /* Save the cmdline, we don't know what the function may do. */ + save_ccline = ccline; +--- 5297,5311 ---- + ccline.cmdbuff[ccline.cmdlen] = 0; + } + +! pat = vim_strnsave(xp->xp_pattern, xp->xp_pattern_len); +! +! args[0].v_type = VAR_STRING; +! args[0].vval.v_string = pat; +! args[1].v_type = VAR_STRING; +! args[1].vval.v_string = xp->xp_line; +! args[2].v_type = VAR_NUMBER; +! args[2].vval.v_number = xp->xp_col; +! args[3].v_type = VAR_UNKNOWN; + + /* Save the cmdline, we don't know what the function may do. */ + save_ccline = ccline; +*************** +*** 5315,5321 **** + if (ccline.cmdbuff != NULL) + ccline.cmdbuff[ccline.cmdlen] = keep; + +! vim_free(args[0]); + return ret; + } + +--- 5320,5326 ---- + if (ccline.cmdbuff != NULL) + ccline.cmdbuff[ccline.cmdlen] = keep; + +! vim_free(pat); + return ret; + } + +*** ../vim-8.1.0052/src/mbyte.c 2018-05-17 13:06:28.000000000 +0200 +--- src/mbyte.c 2018-06-12 21:57:43.682728083 +0200 +*************** +*** 4795,4806 **** + static void + call_imactivatefunc(int active) + { +! char_u *argv[1]; + +! if (active) +! argv[0] = (char_u *)"1"; +! else +! argv[0] = (char_u *)"0"; + (void)call_func_retnr(p_imaf, 1, argv, FALSE); + } + +--- 4795,4805 ---- + static void + call_imactivatefunc(int active) + { +! typval_T argv[2]; + +! argv[0].v_type = VAR_NUMBER; +! argv[0].vval.v_number = active ? 1 : 0; +! argv[1].v_type = VAR_NUMBER; + (void)call_func_retnr(p_imaf, 1, argv, FALSE); + } + +*** ../vim-8.1.0052/src/normal.c 2018-06-03 14:42:17.844505109 +0200 +--- src/normal.c 2018-06-12 21:57:56.386656587 +0200 +*************** +*** 2219,2225 **** + op_function(oparg_T *oap UNUSED) + { + #ifdef FEAT_EVAL +! char_u *(argv[1]); + # ifdef FEAT_VIRTUALEDIT + int save_virtual_op = virtual_op; + # endif +--- 2219,2225 ---- + op_function(oparg_T *oap UNUSED) + { + #ifdef FEAT_EVAL +! typval_T argv[2]; + # ifdef FEAT_VIRTUALEDIT + int save_virtual_op = virtual_op; + # endif +*************** +*** 2235,2246 **** + /* Exclude the end position. */ + decl(&curbuf->b_op_end); + + if (oap->block_mode) +! argv[0] = (char_u *)"block"; + else if (oap->motion_type == MLINE) +! argv[0] = (char_u *)"line"; + else +! argv[0] = (char_u *)"char"; + + # ifdef FEAT_VIRTUALEDIT + /* Reset virtual_op so that 'virtualedit' can be changed in the +--- 2235,2248 ---- + /* Exclude the end position. */ + decl(&curbuf->b_op_end); + ++ argv[0].v_type = VAR_STRING; + if (oap->block_mode) +! argv[0].vval.v_string = (char_u *)"block"; + else if (oap->motion_type == MLINE) +! argv[0].vval.v_string = (char_u *)"line"; + else +! argv[0].vval.v_string = (char_u *)"char"; +! argv[1].v_type = VAR_UNKNOWN; + + # ifdef FEAT_VIRTUALEDIT + /* Reset virtual_op so that 'virtualedit' can be changed in the +*** ../vim-8.1.0052/src/proto/eval.pro 2018-05-17 13:52:32.000000000 +0200 +--- src/proto/eval.pro 2018-06-12 21:45:51.398816540 +0200 +*************** +*** 19,28 **** + list_T *eval_spell_expr(char_u *badword, char_u *expr); + int get_spellword(list_T *list, char_u **pp); + typval_T *eval_expr(char_u *arg, char_u **nextcmd); +! int call_vim_function(char_u *func, int argc, char_u **argv, int safe, int str_arg_only, typval_T *rettv); +! varnumber_T call_func_retnr(char_u *func, int argc, char_u **argv, int safe); +! void *call_func_retstr(char_u *func, int argc, char_u **argv, int safe); +! void *call_func_retlist(char_u *func, int argc, char_u **argv, int safe); + int eval_foldexpr(char_u *arg, int *cp); + void ex_let(exarg_T *eap); + void list_hashtable_vars(hashtab_T *ht, char_u *prefix, int empty, int *first); +--- 19,28 ---- + list_T *eval_spell_expr(char_u *badword, char_u *expr); + int get_spellword(list_T *list, char_u **pp); + typval_T *eval_expr(char_u *arg, char_u **nextcmd); +! int call_vim_function(char_u *func, int argc, typval_T *argv, typval_T *rettv, int safe); +! varnumber_T call_func_retnr(char_u *func, int argc, typval_T *argv, int safe); +! void *call_func_retstr(char_u *func, int argc, typval_T *argv, int safe); +! void *call_func_retlist(char_u *func, int argc, typval_T *argv, int safe); + int eval_foldexpr(char_u *arg, int *cp); + void ex_let(exarg_T *eap); + void list_hashtable_vars(hashtab_T *ht, char_u *prefix, int empty, int *first); +*** ../vim-8.1.0052/src/testdir/test_ins_complete.vim 2018-02-10 16:12:08.000000000 +0100 +--- src/testdir/test_ins_complete.vim 2018-06-12 21:45:51.398816540 +0200 +*************** +*** 117,122 **** +--- 117,147 ---- + set omnifunc= + endfunc + ++ func Test_completefunc_args() ++ let s:args = [] ++ func! CompleteFunc(findstart, base) ++ let s:args += [[a:findstart, empty(a:base)]] ++ endfunc ++ new ++ ++ set completefunc=CompleteFunc ++ call feedkeys("i\<C-X>\<C-U>\<Esc>", 'x') ++ call assert_equal(s:args[0], [1, 1]) ++ call assert_equal(s:args[1][0], 0) ++ set completefunc= ++ ++ let s:args = [] ++ set omnifunc=CompleteFunc ++ call feedkeys("i\<C-X>\<C-O>\<Esc>", 'x') ++ call assert_equal(s:args[0], [1, 1]) ++ call assert_equal(s:args[1][0], 0) ++ set omnifunc= ++ ++ bwipe! ++ unlet s:args ++ delfunc CompleteFunc ++ endfunc ++ + function! s:CompleteDone_CompleteFuncDict( findstart, base ) + if a:findstart + return 0 +*** ../vim-8.1.0052/src/version.c 2018-06-12 21:35:37.518665900 +0200 +--- src/version.c 2018-06-12 21:46:24.302622304 +0200 +*************** +*** 763,764 **** +--- 763,766 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 53, + /**/ + +-- +Bumper sticker: Honk if you love peace and quiet. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |