diff options
Diffstat (limited to 'data/vim/patches/8.1.0475')
-rw-r--r-- | data/vim/patches/8.1.0475 | 544 |
1 files changed, 0 insertions, 544 deletions
diff --git a/data/vim/patches/8.1.0475 b/data/vim/patches/8.1.0475 deleted file mode 100644 index eb47e9c28..000000000 --- a/data/vim/patches/8.1.0475 +++ /dev/null @@ -1,544 +0,0 @@ -To: vim_dev@googlegroups.com -Subject: Patch 8.1.0475 -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.0475 -Problem: Memory not freed on exit when quit in autocmd. -Solution: Remember funccal stack when executing autocmd. -Files: src/structs.h, src/userfunc.c, src/proto/userfunc.pro, - src/fileio.c, src/eval.c, src/ex_cmds2.c, src/main.c - - -*** ../vim-8.1.0474/src/structs.h 2018-10-11 19:27:43.916066156 +0200 ---- src/structs.h 2018-10-14 21:24:09.968948702 +0200 -*************** -*** 1354,1360 **** - int uf_cleared; /* func_clear() was already called */ - garray_T uf_args; /* arguments */ - garray_T uf_lines; /* function lines */ -! #ifdef FEAT_PROFILE - int uf_profiling; /* TRUE when func is being profiled */ - int uf_prof_initialized; - /* profiling the function as a whole */ ---- 1354,1360 ---- - int uf_cleared; /* func_clear() was already called */ - garray_T uf_args; /* arguments */ - garray_T uf_lines; /* function lines */ -! # ifdef FEAT_PROFILE - int uf_profiling; /* TRUE when func is being profiled */ - int uf_prof_initialized; - /* profiling the function as a whole */ -*************** -*** 1371,1377 **** - 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 - sctx_T uf_script_ctx; /* SCTX where function was defined, - used for s: variables */ - int uf_refcount; /* reference count, see func_name_refcount() */ ---- 1371,1377 ---- - 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 - sctx_T uf_script_ctx; /* SCTX where function was defined, - used for s: variables */ - int uf_refcount; /* reference count, see func_name_refcount() */ -*************** -*** 1429,1434 **** ---- 1429,1440 ---- - dictitem_T *fd_di; /* Dictionary item used */ - } funcdict_T; - -+ typedef struct funccal_entry funccal_entry_T; -+ struct funccal_entry { -+ void *top_funccal; -+ funccal_entry_T *next; -+ }; -+ - #else - /* dummy typedefs for function prototypes */ - typedef struct -*** ../vim-8.1.0474/src/userfunc.c 2018-09-10 22:03:36.486401101 +0200 ---- src/userfunc.c 2018-10-14 21:29:00.174642990 +0200 -*************** -*** 1175,1180 **** ---- 1175,1207 ---- - return isdigit(*name) || *name == '<'; - } - -+ static funccal_entry_T *funccal_stack = NULL; -+ -+ /* -+ * Save the current function call pointer, and set it to NULL. -+ * Used when executing autocommands and for ":source". -+ */ -+ void -+ save_funccal(funccal_entry_T *entry) -+ { -+ entry->top_funccal = current_funccal; -+ entry->next = funccal_stack; -+ funccal_stack = entry; -+ current_funccal = NULL; -+ } -+ -+ void -+ restore_funccal(void) -+ { -+ if (funccal_stack == NULL) -+ IEMSG("INTERNAL: restore_funccal()"); -+ else -+ { -+ current_funccal = funccal_stack->top_funccal; -+ funccal_stack = funccal_stack->next; -+ } -+ } -+ - #if defined(EXITFREE) || defined(PROTO) - void - free_all_functions(void) -*************** -*** 1185,1195 **** - long_u todo = 1; - long_u used; - -! /* Clean up the call stack. */ - while (current_funccal != NULL) - { - clear_tv(current_funccal->rettv); - cleanup_function_call(current_funccal); - } - - /* First clear what the functions contain. Since this may lower the ---- 1212,1224 ---- - long_u todo = 1; - long_u used; - -! /* Clean up the current_funccal chain and the funccal stack. */ - while (current_funccal != NULL) - { - clear_tv(current_funccal->rettv); - cleanup_function_call(current_funccal); -+ if (current_funccal == NULL && funccal_stack != NULL) -+ restore_funccal(); - } - - /* First clear what the functions contain. Since this may lower the -*************** -*** 3578,3604 **** - return current_funccal->returned; - } - -- /* -- * Save the current function call pointer, and set it to NULL. -- * Used when executing autocommands and for ":source". -- */ -- void * -- save_funccal(void) -- { -- funccall_T *fc = current_funccal; -- -- current_funccal = NULL; -- return (void *)fc; -- } -- -- void -- restore_funccal(void *vfc) -- { -- funccall_T *fc = (funccall_T *)vfc; -- -- current_funccal = fc; -- } -- - int - free_unref_funccal(int copyID, int testing) - { ---- 3607,3612 ---- -*************** -*** 3702,3726 **** - } - - /* -- * Clear the current_funccal and return the old value. -- * Caller is expected to invoke restore_current_funccal(). -- */ -- void * -- clear_current_funccal() -- { -- funccall_T *f = current_funccal; -- -- current_funccal = NULL; -- return f; -- } -- -- void -- restore_current_funccal(void *f) -- { -- current_funccal = f; -- } -- -- /* - * List function variables, if there is a function. - */ - void ---- 3710,3715 ---- -*** ../vim-8.1.0474/src/proto/userfunc.pro 2018-05-17 13:52:55.000000000 +0200 ---- src/proto/userfunc.pro 2018-10-14 21:23:16.693367431 +0200 -*************** -*** 39,53 **** - int *func_dbg_tick(void *cookie); - int func_level(void *cookie); - int current_func_returned(void); -! void *save_funccal(void); -! void restore_funccal(void *vfc); - int free_unref_funccal(int copyID, int testing); - hashtab_T *get_funccal_local_ht(void); - dictitem_T *get_funccal_local_var(void); - hashtab_T *get_funccal_args_ht(void); - dictitem_T *get_funccal_args_var(void); -- void *clear_current_funccal(void); -- void restore_current_funccal(void *f); - void list_func_vars(int *first); - dict_T *get_current_funccal_dict(hashtab_T *ht); - hashitem_T *find_hi_in_scoped_ht(char_u *name, hashtab_T **pht); ---- 39,51 ---- - int *func_dbg_tick(void *cookie); - int func_level(void *cookie); - int current_func_returned(void); -! void save_funccal(funccal_entry_T *entry); -! void restore_funccal(void); - int free_unref_funccal(int copyID, int testing); - hashtab_T *get_funccal_local_ht(void); - dictitem_T *get_funccal_local_var(void); - hashtab_T *get_funccal_args_ht(void); - dictitem_T *get_funccal_args_var(void); - void list_func_vars(int *first); - dict_T *get_current_funccal_dict(hashtab_T *ht); - hashitem_T *find_hi_in_scoped_ht(char_u *name, hashtab_T **pht); -*** ../vim-8.1.0474/src/fileio.c 2018-10-11 19:27:43.916066156 +0200 ---- src/fileio.c 2018-10-14 21:23:46.449133772 +0200 -*************** -*** 9400,9406 **** - AutoPat *ap; - #ifdef FEAT_EVAL - sctx_T save_current_sctx; -! void *save_funccalp; - char_u *save_cmdarg; - long save_cmdbang; - #endif ---- 9400,9406 ---- - AutoPat *ap; - #ifdef FEAT_EVAL - sctx_T save_current_sctx; -! funccal_entry_T funccal_entry; - char_u *save_cmdarg; - long save_cmdbang; - #endif -*************** -*** 9615,9622 **** - prof_child_enter(&wait_time); /* doesn't count for the caller itself */ - # endif - -! /* Don't use local function variables, if called from a function */ -! save_funccalp = save_funccal(); - #endif - - /* ---- 9615,9622 ---- - prof_child_enter(&wait_time); /* doesn't count for the caller itself */ - # endif - -! // Don't use local function variables, if called from a function. -! save_funccal(&funccal_entry); - #endif - - /* -*************** -*** 9713,9719 **** - autocmd_match = save_autocmd_match; - #ifdef FEAT_EVAL - current_sctx = save_current_sctx; -! restore_funccal(save_funccalp); - # ifdef FEAT_PROFILE - if (do_profiling == PROF_YES) - prof_child_exit(&wait_time); ---- 9713,9719 ---- - autocmd_match = save_autocmd_match; - #ifdef FEAT_EVAL - current_sctx = save_current_sctx; -! restore_funccal(); - # ifdef FEAT_PROFILE - if (do_profiling == PROF_YES) - prof_child_exit(&wait_time); -*** ../vim-8.1.0474/src/eval.c 2018-10-07 20:14:53.091279680 +0200 ---- src/eval.c 2018-10-14 21:24:20.000869665 +0200 -*************** -*** 859,867 **** - int use_sandbox) - { - char_u *retval; -! void *save_funccalp; - -! save_funccalp = save_funccal(); - if (use_sandbox) - ++sandbox; - ++textlock; ---- 859,867 ---- - int use_sandbox) - { - char_u *retval; -! funccal_entry_T funccal_entry; - -! save_funccal(&funccal_entry); - if (use_sandbox) - ++sandbox; - ++textlock; -*************** -*** 869,875 **** - if (use_sandbox) - --sandbox; - --textlock; -! restore_funccal(save_funccalp); - return retval; - } - ---- 869,875 ---- - if (use_sandbox) - --sandbox; - --textlock; -! restore_funccal(); - return retval; - } - -*************** -*** 8532,8538 **** - char_u *tab; - int type = VAR_NUMBER; - typval_T tv; -! void *save_funccal; - - if (!writing && (find_viminfo_parameter('!') != NULL)) - { ---- 8532,8538 ---- - char_u *tab; - int type = VAR_NUMBER; - typval_T tv; -! funccal_entry_T funccal_entry; - - if (!writing && (find_viminfo_parameter('!') != NULL)) - { -*************** -*** 8581,8589 **** - } - - /* when in a function use global variables */ -! save_funccal = clear_current_funccal(); - set_var(virp->vir_line + 1, &tv, FALSE); -! restore_current_funccal(save_funccal); - - if (tv.v_type == VAR_STRING) - vim_free(tv.vval.v_string); ---- 8581,8589 ---- - } - - /* when in a function use global variables */ -! save_funccal(&funccal_entry); - set_var(virp->vir_line + 1, &tv, FALSE); -! restore_funccal(); - - if (tv.v_type == VAR_STRING) - vim_free(tv.vval.v_string); -*** ../vim-8.1.0474/src/ex_cmds2.c 2018-09-30 21:43:17.183693376 +0200 ---- src/ex_cmds2.c 2018-10-14 21:25:18.216409935 +0200 -*************** -*** 4344,4350 **** - #ifdef FEAT_EVAL - sctx_T save_current_sctx; - static scid_T last_current_SID = 0; -! void *save_funccalp; - int save_debug_break_level = debug_break_level; - scriptitem_T *si = NULL; - # ifdef UNIX ---- 4344,4350 ---- - #ifdef FEAT_EVAL - sctx_T save_current_sctx; - static scid_T last_current_SID = 0; -! funccal_entry_T funccalp_entry; - int save_debug_break_level = debug_break_level; - scriptitem_T *si = NULL; - # ifdef UNIX -*************** -*** 4506,4512 **** - - /* Don't use local function variables, if called from a function. - * Also starts profiling timer for nested script. */ -! save_funccalp = save_funccal(); - - /* - * Check if this script was sourced before to finds its SID. ---- 4506,4512 ---- - - /* Don't use local function variables, if called from a function. - * Also starts profiling timer for nested script. */ -! save_funccal(&funccalp_entry); - - /* - * Check if this script was sourced before to finds its SID. -*************** -*** 4665,4671 **** - #ifdef FEAT_EVAL - almosttheend: - current_sctx = save_current_sctx; -! restore_funccal(save_funccalp); - # ifdef FEAT_PROFILE - if (do_profiling == PROF_YES) - prof_child_exit(&wait_start); /* leaving a child now */ ---- 4665,4671 ---- - #ifdef FEAT_EVAL - almosttheend: - current_sctx = save_current_sctx; -! restore_funccal(); - # ifdef FEAT_PROFILE - if (do_profiling == PROF_YES) - prof_child_exit(&wait_start); /* leaving a child now */ -*** ../vim-8.1.0474/src/main.c 2018-09-30 21:43:17.195693290 +0200 ---- src/main.c 2018-10-14 21:26:18.723930303 +0200 -*************** -*** 1717,1723 **** - } - - /* -! * Check for: [r][e][g][vi|vim|view][diff][ex[im]] - * If the executable name starts with "r" we disable shell commands. - * If the next character is "e" we run in Easy mode. - * If the next character is "g" we run the GUI version. ---- 1717,1723 ---- - } - - /* -! * Check for: [r][e][g][vi|vim|view][diff][ex[im]] (sort of) - * If the executable name starts with "r" we disable shell commands. - * If the next character is "e" we run in Easy mode. - * If the next character is "g" we run the GUI version. -*************** -*** 1788,1794 **** - else if (STRNICMP(initstr, "vim", 3) == 0) - initstr += 3; - -! /* Catch "[r][g]vimdiff" and "[r][g]viewdiff". */ - if (STRICMP(initstr, "diff") == 0) - { - #ifdef FEAT_DIFF ---- 1788,1794 ---- - else if (STRNICMP(initstr, "vim", 3) == 0) - initstr += 3; - -! // Catch "[r][g]vimdiff" and "[r][g]viewdiff". - if (STRICMP(initstr, "diff") == 0) - { - #ifdef FEAT_DIFF -*************** -*** 1800,1812 **** - #endif - } - - if (STRNICMP(initstr, "ex", 2) == 0) - { - if (STRNICMP(initstr + 2, "im", 2) == 0) - exmode_active = EXMODE_VIM; - else - exmode_active = EXMODE_NORMAL; -! change_compatible(TRUE); /* set 'compatible' */ - } - } - ---- 1800,1814 ---- - #endif - } - -+ // Checking for "ex" here may catch some weir names, such as "vimex" or -+ // "viewex", we assume the user knows that. - if (STRNICMP(initstr, "ex", 2) == 0) - { - if (STRNICMP(initstr + 2, "im", 2) == 0) - exmode_active = EXMODE_VIM; - else - exmode_active = EXMODE_NORMAL; -! change_compatible(TRUE); // set 'compatible' - } - } - -*************** -*** 4188,4199 **** - char_u *res; - int save_dbl = debug_break_level; - int save_ro = redir_off; -! void *fc = NULL; - - /* Evaluate the expression at the toplevel, don't use variables local to - * the calling function. Except when in debug mode. */ - if (!debug_mode) -! fc = clear_current_funccal(); - - /* Disable debugging, otherwise Vim hangs, waiting for "cont" to be - * typed. */ ---- 4190,4205 ---- - char_u *res; - int save_dbl = debug_break_level; - int save_ro = redir_off; -! funccal_entry_T funccal_entry; -! int did_save_funccal = FALSE; - - /* Evaluate the expression at the toplevel, don't use variables local to - * the calling function. Except when in debug mode. */ - if (!debug_mode) -! { -! save_funccal(&funccal_entry); -! did_save_funccal = TRUE; -! } - - /* Disable debugging, otherwise Vim hangs, waiting for "cont" to be - * typed. */ -*************** -*** 4210,4217 **** - --emsg_silent; - if (emsg_silent < 0) - emsg_silent = 0; -! if (fc != NULL) -! restore_current_funccal(fc); - - /* A client can tell us to redraw, but not to display the cursor, so do - * that here. */ ---- 4216,4223 ---- - --emsg_silent; - if (emsg_silent < 0) - emsg_silent = 0; -! if (did_save_funccal) -! restore_funccal(); - - /* A client can tell us to redraw, but not to display the cursor, so do - * that here. */ -*** ../vim-8.1.0474/src/version.c 2018-10-14 16:25:04.904583951 +0200 ---- src/version.c 2018-10-14 21:37:36.574478570 +0200 -*************** -*** 794,795 **** ---- 794,797 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 475, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -201. When somebody asks you where you are, you tell them in which chat room. - - /// 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 /// |