diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-08-01 15:40:54 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-08-01 15:40:54 +0200 |
commit | 437bafe4c8a83ed71ee006eda7f54b65a90f0d4c (patch) | |
tree | dac9426b1bafe44f050bbb13c027de31117c089d /src/structs.h | |
parent | 580164481924ed8611eb79f0247a0eb1ca0b3b9a (diff) | |
download | vim-git-437bafe4c8a83ed71ee006eda7f54b65a90f0d4c.tar.gz |
patch 7.4.2137v7.4.2137
Problem: Using function() with a name will find another function when it is
redefined.
Solution: Add funcref(). Refer to lambda using a partial. Fix several
reference counting issues.
Diffstat (limited to 'src/structs.h')
-rw-r--r-- | src/structs.h | 92 |
1 files changed, 91 insertions, 1 deletions
diff --git a/src/structs.h b/src/structs.h index 7375c7c2b..11f182a77 100644 --- a/src/structs.h +++ b/src/structs.h @@ -1295,10 +1295,100 @@ struct dictvar_S dict_T *dv_used_prev; /* previous dict in used dicts list */ }; +#if defined(FEAT_EVAL) || defined(PROTO) +typedef struct funccall_S funccall_T; + +/* + * Structure to hold info for a user function. + */ +typedef struct +{ + int uf_varargs; /* variable nr of arguments */ + int uf_flags; + int uf_calls; /* nr of active calls */ + garray_T uf_args; /* arguments */ + garray_T uf_lines; /* function lines */ +#ifdef FEAT_PROFILE + int uf_profiling; /* TRUE when func is being profiled */ + /* profiling the function as a whole */ + int uf_tm_count; /* nr of calls */ + proftime_T uf_tm_total; /* time spent in function + children */ + proftime_T uf_tm_self; /* time spent in function itself */ + proftime_T uf_tm_children; /* time spent in children this call */ + /* profiling the function per line */ + int *uf_tml_count; /* nr of times line was executed */ + proftime_T *uf_tml_total; /* time spent in a line + children */ + proftime_T *uf_tml_self; /* time spent in a line itself */ + proftime_T uf_tml_start; /* start time for current line */ + proftime_T uf_tml_children; /* time spent in children for this line */ + proftime_T uf_tml_wait; /* start wait time for current line */ + int uf_tml_idx; /* index of line being timed; -1 if none */ + int uf_tml_execed; /* line being timed was executed */ +#endif + scid_T uf_script_ID; /* ID of script where function was defined, + used for s: variables */ + int uf_refcount; /* for numbered function: reference count */ + funccall_T *uf_scoped; /* l: local variables for closure */ + char_u uf_name[1]; /* name of function (actually longer); can + start with <SNR>123_ (<SNR> is K_SPECIAL + KS_EXTRA KE_SNR) */ +} ufunc_T; + +#define MAX_FUNC_ARGS 20 /* maximum number of function arguments */ +#define VAR_SHORT_LEN 20 /* short variable name length */ +#define FIXVAR_CNT 12 /* number of fixed variables */ + +/* structure to hold info for a function that is currently being executed. */ +struct funccall_S +{ + ufunc_T *func; /* function being called */ + int linenr; /* next line to be executed */ + int returned; /* ":return" used */ + struct /* fixed variables for arguments */ + { + dictitem_T var; /* variable (without room for name) */ + char_u room[VAR_SHORT_LEN]; /* room for the name */ + } fixvar[FIXVAR_CNT]; + dict_T l_vars; /* l: local function variables */ + dictitem_T l_vars_var; /* variable for l: scope */ + dict_T l_avars; /* a: argument variables */ + dictitem_T l_avars_var; /* variable for a: scope */ + list_T l_varlist; /* list for a:000 */ + listitem_T l_listitems[MAX_FUNC_ARGS]; /* listitems for a:000 */ + typval_T *rettv; /* return value */ + linenr_T breakpoint; /* next line with breakpoint or zero */ + int dbg_tick; /* debug_tick when breakpoint was set */ + int level; /* top nesting level of executed function */ +#ifdef FEAT_PROFILE + proftime_T prof_child; /* time spent in a child */ +#endif + funccall_T *caller; /* calling function or NULL */ + + /* for closure */ + int fc_refcount; + int fc_copyID; /* for garbage collection */ + garray_T fc_funcs; /* list of ufunc_T* which refer this */ +}; + +/* + * Struct used by trans_function_name() + */ +typedef struct +{ + dict_T *fd_dict; /* Dictionary used */ + char_u *fd_newkey; /* new key in "dict" in allocated memory */ + dictitem_T *fd_di; /* Dictionary item used */ +} funcdict_T; + +#endif + struct partial_S { int pt_refcount; /* reference count */ - char_u *pt_name; /* function name */ + char_u *pt_name; /* function name; when NULL use + * pt_func->uf_name */ + ufunc_T *pt_func; /* function pointer; when NULL lookup function + * with pt_name */ int pt_auto; /* when TRUE the partial was created for using dict.member in handle_subscript() */ int pt_argc; /* number of arguments */ |