0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.1.1815: duplicating info for internal functions

Problem:    Duplicating info for internal functions.
Solution:   Use one table to list internal functions.
This commit is contained in:
Bram Moolenaar 2019-08-04 21:35:12 +02:00
parent 5d458a7b3d
commit 7a4ea1df2f
2 changed files with 493 additions and 542 deletions

View File

@ -422,16 +422,21 @@ typedef struct
// implementation of function
} funcentry_T;
// values for f_argtype; zero means it cannot be used as a method
#define FEARG_1 1 // base is the first argument
#define FEARG_2 2 // base is the second argument
#define FEARG_LAST 9 // base is the last argument
static funcentry_T global_functions[] =
{
#ifdef FEAT_FLOAT
{"abs", 1, 1, 0, f_abs},
{"acos", 1, 1, 0, f_acos}, // WJMc
#endif
{"add", 2, 2, 0, f_add},
{"add", 2, 2, FEARG_1, f_add},
{"and", 2, 2, 0, f_and},
{"append", 2, 2, 0, f_append},
{"appendbufline", 3, 3, 0, f_appendbufline},
{"append", 2, 2, FEARG_LAST, f_append},
{"appendbufline", 3, 3, FEARG_LAST, f_appendbufline},
{"argc", 0, 1, 0, f_argc},
{"argidx", 0, 0, 0, f_argidx},
{"arglistid", 0, 2, 0, f_arglistid},
@ -440,14 +445,14 @@ static funcentry_T global_functions[] =
{"asin", 1, 1, 0, f_asin}, // WJMc
#endif
{"assert_beeps", 1, 2, 0, f_assert_beeps},
{"assert_equal", 2, 3, 0, f_assert_equal},
{"assert_equal", 2, 3, FEARG_2, f_assert_equal},
{"assert_equalfile", 2, 2, 0, f_assert_equalfile},
{"assert_exception", 1, 2, 0, f_assert_exception},
{"assert_fails", 1, 3, 0, f_assert_fails},
{"assert_false", 1, 2, 0, f_assert_false},
{"assert_inrange", 3, 4, 0, f_assert_inrange},
{"assert_match", 2, 3, 0, f_assert_match},
{"assert_notequal", 2, 3, 0, f_assert_notequal},
{"assert_notequal", 2, 3, FEARG_2, f_assert_notequal},
{"assert_notmatch", 2, 3, 0, f_assert_notmatch},
{"assert_report", 1, 1, 0, f_assert_report},
{"assert_true", 1, 2, 0, f_assert_true},
@ -516,12 +521,12 @@ static funcentry_T global_functions[] =
{"complete_info", 0, 1, 0, f_complete_info},
#endif
{"confirm", 1, 4, 0, f_confirm},
{"copy", 1, 1, 0, f_copy},
{"copy", 1, 1, FEARG_1, f_copy},
#ifdef FEAT_FLOAT
{"cos", 1, 1, 0, f_cos},
{"cosh", 1, 1, 0, f_cosh},
#endif
{"count", 2, 4, 0, f_count},
{"count", 2, 4, FEARG_1, f_count},
{"cscope_connection",0,3, 0, f_cscope_connection},
{"cursor", 1, 3, 0, f_cursor},
#ifdef MSWIN
@ -533,10 +538,10 @@ static funcentry_T global_functions[] =
{"did_filetype", 0, 0, 0, f_did_filetype},
{"diff_filler", 1, 1, 0, f_diff_filler},
{"diff_hlID", 2, 2, 0, f_diff_hlID},
{"empty", 1, 1, 0, f_empty},
{"empty", 1, 1, FEARG_1, f_empty},
{"environ", 0, 0, 0, f_environ},
{"escape", 2, 2, 0, f_escape},
{"eval", 1, 1, 0, f_eval},
{"eval", 1, 1, FEARG_1, f_eval},
{"eventhandler", 0, 0, 0, f_eventhandler},
{"executable", 1, 1, 0, f_executable},
{"execute", 1, 2, 0, f_execute},
@ -547,12 +552,12 @@ static funcentry_T global_functions[] =
#endif
{"expand", 1, 3, 0, f_expand},
{"expandcmd", 1, 1, 0, f_expandcmd},
{"extend", 2, 3, 0, f_extend},
{"extend", 2, 3, FEARG_1, f_extend},
{"feedkeys", 1, 2, 0, f_feedkeys},
{"file_readable", 1, 1, 0, f_filereadable}, // obsolete
{"filereadable", 1, 1, 0, f_filereadable},
{"filewritable", 1, 1, 0, f_filewritable},
{"filter", 2, 2, 0, f_filter},
{"filter", 2, 2, FEARG_1, f_filter},
{"finddir", 1, 3, 0, f_finddir},
{"findfile", 1, 3, 0, f_findfile},
#ifdef FEAT_FLOAT
@ -571,7 +576,7 @@ static funcentry_T global_functions[] =
{"funcref", 1, 3, 0, f_funcref},
{"function", 1, 3, 0, f_function},
{"garbagecollect", 0, 1, 0, f_garbagecollect},
{"get", 2, 3, 0, f_get},
{"get", 2, 3, FEARG_1, f_get},
{"getbufinfo", 0, 1, 0, f_getbufinfo},
{"getbufline", 2, 3, 0, f_getbufline},
{"getbufvar", 2, 3, 0, f_getbufvar},
@ -616,7 +621,7 @@ static funcentry_T global_functions[] =
{"glob2regpat", 1, 1, 0, f_glob2regpat},
{"globpath", 2, 5, 0, f_globpath},
{"has", 1, 1, 0, f_has},
{"has_key", 2, 2, 0, f_has_key},
{"has_key", 2, 2, FEARG_1, f_has_key},
{"haslocaldir", 0, 2, 0, f_haslocaldir},
{"hasmapto", 1, 3, 0, f_hasmapto},
{"highlightID", 1, 1, 0, f_hlID}, // obsolete
@ -630,14 +635,14 @@ static funcentry_T global_functions[] =
{"hostname", 0, 0, 0, f_hostname},
{"iconv", 3, 3, 0, f_iconv},
{"indent", 1, 1, 0, f_indent},
{"index", 2, 4, 0, f_index},
{"index", 2, 4, FEARG_1, f_index},
{"input", 1, 3, 0, f_input},
{"inputdialog", 1, 3, 0, f_inputdialog},
{"inputlist", 1, 1, 0, f_inputlist},
{"inputrestore", 0, 0, 0, f_inputrestore},
{"inputsave", 0, 0, 0, f_inputsave},
{"inputsecret", 1, 2, 0, f_inputsecret},
{"insert", 2, 3, 0, f_insert},
{"insert", 2, 3, FEARG_1, f_insert},
{"invert", 1, 1, 0, f_invert},
{"isdirectory", 1, 1, 0, f_isdirectory},
#if defined(FEAT_FLOAT) && defined(HAVE_MATH_H)
@ -647,7 +652,7 @@ static funcentry_T global_functions[] =
#if defined(FEAT_FLOAT) && defined(HAVE_MATH_H)
{"isnan", 1, 1, 0, f_isnan},
#endif
{"items", 1, 1, 0, f_items},
{"items", 1, 1, FEARG_1, f_items},
#ifdef FEAT_JOB_CHANNEL
{"job_getchannel", 1, 1, 0, f_job_getchannel},
{"job_info", 0, 1, 0, f_job_info},
@ -656,14 +661,14 @@ static funcentry_T global_functions[] =
{"job_status", 1, 1, 0, f_job_status},
{"job_stop", 1, 2, 0, f_job_stop},
#endif
{"join", 1, 2, 0, f_join},
{"join", 1, 2, FEARG_1, f_join},
{"js_decode", 1, 1, 0, f_js_decode},
{"js_encode", 1, 1, 0, f_js_encode},
{"json_decode", 1, 1, 0, f_json_decode},
{"json_encode", 1, 1, 0, f_json_encode},
{"keys", 1, 1, 0, f_keys},
{"keys", 1, 1, FEARG_1, f_keys},
{"last_buffer_nr", 0, 0, 0, f_last_buffer_nr}, // obsolete
{"len", 1, 1, 0, f_len},
{"len", 1, 1, FEARG_1, f_len},
{"libcall", 3, 3, 0, f_libcall},
{"libcallnr", 3, 3, 0, f_libcallnr},
{"line", 1, 1, 0, f_line},
@ -681,7 +686,7 @@ static funcentry_T global_functions[] =
#ifdef FEAT_LUA
{"luaeval", 1, 2, 0, f_luaeval},
#endif
{"map", 2, 2, 0, f_map},
{"map", 2, 2, FEARG_1, f_map},
{"maparg", 1, 4, 0, f_maparg},
{"mapcheck", 1, 3, 0, f_mapcheck},
{"match", 2, 4, 0, f_match},
@ -693,8 +698,8 @@ static funcentry_T global_functions[] =
{"matchlist", 2, 4, 0, f_matchlist},
{"matchstr", 2, 4, 0, f_matchstr},
{"matchstrpos", 2, 4, 0, f_matchstrpos},
{"max", 1, 1, 0, f_max},
{"min", 1, 1, 0, f_min},
{"max", 1, 1, FEARG_1, f_max},
{"min", 1, 1, FEARG_1, f_min},
{"mkdir", 1, 3, 0, f_mkdir},
{"mode", 0, 1, 0, f_mode},
#ifdef FEAT_MZSCHEME
@ -775,11 +780,11 @@ static funcentry_T global_functions[] =
{"remote_read", 1, 2, 0, f_remote_read},
{"remote_send", 2, 3, 0, f_remote_send},
{"remote_startserver", 1, 1, 0, f_remote_startserver},
{"remove", 2, 3, 0, f_remove},
{"remove", 2, 3, FEARG_1, f_remove},
{"rename", 2, 2, 0, f_rename},
{"repeat", 2, 2, 0, f_repeat},
{"repeat", 2, 2, FEARG_1, f_repeat},
{"resolve", 1, 1, 0, f_resolve},
{"reverse", 1, 1, 0, f_reverse},
{"reverse", 1, 1, FEARG_1, f_reverse},
#ifdef FEAT_FLOAT
{"round", 1, 1, 0, f_round},
#endif
@ -837,7 +842,7 @@ static funcentry_T global_functions[] =
{"sin", 1, 1, 0, f_sin},
{"sinh", 1, 1, 0, f_sinh},
#endif
{"sort", 1, 3, 0, f_sort},
{"sort", 1, 3, FEARG_1, f_sort},
#ifdef FEAT_SOUND
{"sound_clear", 0, 0, 0, f_sound_clear},
{"sound_playevent", 1, 2, 0, f_sound_playevent},
@ -847,12 +852,12 @@ static funcentry_T global_functions[] =
{"soundfold", 1, 1, 0, f_soundfold},
{"spellbadword", 0, 1, 0, f_spellbadword},
{"spellsuggest", 1, 3, 0, f_spellsuggest},
{"split", 1, 3, 0, f_split},
{"split", 1, 3, FEARG_1, f_split},
#ifdef FEAT_FLOAT
{"sqrt", 1, 1, 0, f_sqrt},
{"str2float", 1, 1, 0, f_str2float},
#endif
{"str2list", 1, 2, 0, f_str2list},
{"str2list", 1, 2, FEARG_1, f_str2list},
{"str2nr", 1, 2, 0, f_str2nr},
{"strcharpart", 2, 3, 0, f_strcharpart},
{"strchars", 1, 2, 0, f_strchars},
@ -862,23 +867,23 @@ static funcentry_T global_functions[] =
#endif
{"strgetchar", 2, 2, 0, f_strgetchar},
{"stridx", 2, 3, 0, f_stridx},
{"string", 1, 1, 0, f_string},
{"strlen", 1, 1, 0, f_strlen},
{"string", 1, 1, FEARG_1, f_string},
{"strlen", 1, 1, FEARG_1, f_strlen},
{"strpart", 2, 3, 0, f_strpart},
{"strridx", 2, 3, 0, f_strridx},
{"strtrans", 1, 1, 0, f_strtrans},
{"strwidth", 1, 1, 0, f_strwidth},
{"strtrans", 1, 1, FEARG_1, f_strtrans},
{"strwidth", 1, 1, FEARG_1, f_strwidth},
{"submatch", 1, 2, 0, f_submatch},
{"substitute", 4, 4, 0, f_substitute},
{"substitute", 4, 4, FEARG_1, f_substitute},
{"swapinfo", 1, 1, 0, f_swapinfo},
{"swapname", 1, 1, 0, f_swapname},
{"synID", 3, 3, 0, f_synID},
{"synIDattr", 2, 3, 0, f_synIDattr},
{"synIDtrans", 1, 1, 0, f_synIDtrans},
{"synIDattr", 2, 3, FEARG_1, f_synIDattr},
{"synIDtrans", 1, 1, FEARG_1, f_synIDtrans},
{"synconcealed", 2, 2, 0, f_synconcealed},
{"synstack", 2, 2, 0, f_synstack},
{"system", 1, 2, 0, f_system},
{"systemlist", 1, 2, 0, f_systemlist},
{"system", 1, 2, FEARG_1, f_system},
{"systemlist", 1, 2, FEARG_1, f_systemlist},
{"tabpagebuflist", 0, 1, 0, f_tabpagebuflist},
{"tabpagenr", 0, 1, 0, f_tabpagenr},
{"tabpagewinnr", 1, 2, 0, f_tabpagewinnr},
@ -960,11 +965,11 @@ static funcentry_T global_functions[] =
#ifdef FEAT_FLOAT
{"trunc", 1, 1, 0, f_trunc},
#endif
{"type", 1, 1, 0, f_type},
{"type", 1, 1, FEARG_1, f_type},
{"undofile", 1, 1, 0, f_undofile},
{"undotree", 0, 0, 0, f_undotree},
{"uniq", 1, 3, 0, f_uniq},
{"values", 1, 1, 0, f_values},
{"uniq", 1, 3, FEARG_1, f_uniq},
{"values", 1, 1, FEARG_1, f_values},
{"virtcol", 1, 1, 0, f_virtcol},
{"visualmode", 0, 1, 0, f_visualmode},
{"wildmenumode", 0, 0, 0, f_wildmenumode},
@ -990,58 +995,6 @@ static funcentry_T global_functions[] =
{"xor", 2, 2, 0, f_xor},
};
// values for f_argtype
#define FEARG_LAST 1 // base is the last argument
#define FEARG_2 2 // base is the second argument
/*
* Methods that call the internal function with the base as one of the
* arguments.
*/
static funcentry_T base_methods[] =
{
{"add", 1, 1, 0, f_add},
{"append", 1, 1, FEARG_LAST, f_append},
{"appendbufline", 2, 2, FEARG_LAST, f_appendbufline},
{"assert_equal", 1, 2, FEARG_2, f_assert_equal},
{"assert_notequal", 1, 2, FEARG_2, f_assert_notequal},
{"copy", 0, 0, 0, f_copy},
{"count", 1, 3, 0, f_count},
{"empty", 0, 0, 0, f_empty},
{"eval", 0, 0, 0, f_eval},
{"extend", 1, 2, 0, f_extend},
{"filter", 1, 1, 0, f_filter},
{"get", 1, 2, 0, f_get},
{"has_key", 1, 1, 0, f_has_key},
{"index", 1, 3, 0, f_index},
{"insert", 1, 2, 0, f_insert},
{"items", 0, 0, 0, f_items},
{"join", 0, 1, 0, f_join},
{"keys", 0, 0, 0, f_keys},
{"len", 0, 0, 0, f_len},
{"map", 1, 1, 0, f_map},
{"max", 0, 0, 0, f_max},
{"min", 0, 0, 0, f_min},
{"remove", 1, 2, 0, f_remove},
{"repeat", 1, 1, 0, f_repeat},
{"reverse", 0, 0, 0, f_reverse},
{"sort", 0, 2, 0, f_sort},
{"split", 0, 2, 0, f_split},
{"str2list", 0, 1, 0, f_str2list},
{"string", 0, 0, 0, f_string},
{"strlen", 0, 0, 0, f_strlen},
{"strtrans", 0, 0, 0, f_strtrans},
{"strwidth", 0, 0, 0, f_strwidth},
{"substitute", 3, 3, 0, f_substitute},
{"synIDattr", 1, 2, 0, f_synIDattr},
{"synIDtrans", 0, 0, 0, f_synIDtrans},
{"system", 0, 1, 0, f_system},
{"systemlist", 0, 2, 0, f_systemlist},
{"type", 0, 0, 0, f_type},
{"uniq", 0, 2, 0, f_uniq},
{"values", 0, 0, 0, f_values},
};
#if defined(FEAT_CMDL_COMPL) || defined(PROTO)
/*
@ -1098,29 +1051,24 @@ get_expr_name(expand_T *xp, int idx)
#endif /* FEAT_CMDL_COMPL */
/*
* Find internal function in table "functions".
* Find internal function "name" in table "global_functions".
* Return index, or -1 if not found
*/
static int
find_internal_func(
char_u *name, // name of the function
funcentry_T *functions) // functions table to use
find_internal_func(char_u *name)
{
int first = 0;
int last;
int cmp;
int x;
if (functions == global_functions)
last = (int)(sizeof(global_functions) / sizeof(funcentry_T)) - 1;
else
last = (int)(sizeof(base_methods) / sizeof(funcentry_T)) - 1;
// Find the function name in the table. Binary search.
while (first <= last)
{
x = first + ((unsigned)(last - first) >> 1);
cmp = STRCMP(name, functions[x].f_name);
cmp = STRCMP(name, global_functions[x].f_name);
if (cmp < 0)
last = x - 1;
else if (cmp > 0)
@ -1134,7 +1082,7 @@ find_internal_func(
int
has_internal_func(char_u *name)
{
return find_internal_func(name, global_functions) >= 0;
return find_internal_func(name) >= 0;
}
int
@ -1146,7 +1094,7 @@ call_internal_func(
{
int i;
i = find_internal_func(name, global_functions);
i = find_internal_func(name);
if (i < 0)
return ERROR_UNKNOWN;
if (argcount < global_functions[i].f_min_argc)
@ -1173,22 +1121,22 @@ call_internal_method(
int fi;
typval_T argv[MAX_FUNC_ARGS + 1];
fi = find_internal_func(name, base_methods);
if (fi < 0)
fi = find_internal_func(name);
if (fi < 0 || global_functions[fi].f_argtype == 0)
return ERROR_UNKNOWN;
if (argcount < base_methods[fi].f_min_argc)
if (argcount + 1 < global_functions[fi].f_min_argc)
return ERROR_TOOFEW;
if (argcount > base_methods[fi].f_max_argc)
if (argcount + 1 > global_functions[fi].f_max_argc)
return ERROR_TOOMANY;
if (base_methods[fi].f_argtype == FEARG_LAST)
if (global_functions[fi].f_argtype == FEARG_LAST)
{
// base value goes last
for (i = 0; i < argcount; ++i)
argv[i] = argvars[i];
argv[argcount] = *basetv;
}
else if (base_methods[fi].f_argtype == FEARG_2)
else if (global_functions[fi].f_argtype == FEARG_2)
{
// base value goes second
argv[0] = argvars[0];
@ -1198,13 +1146,14 @@ call_internal_method(
}
else
{
// FEARG_1: base value goes first
argv[0] = *basetv;
for (i = 0; i < argcount; ++i)
argv[i + 1] = argvars[i];
}
argv[argcount + 1].v_type = VAR_UNKNOWN;
base_methods[fi].f_func(argv, rettv);
global_functions[fi].f_func(argv, rettv);
return ERROR_NONE;
}

View File

@ -773,6 +773,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1815,
/**/
1814,
/**/