Compare commits

...

3 Commits

Author SHA1 Message Date
968a5b62ff patch 8.2.3003: Vim9: closure compiled with wrong compile type
Problem:    Vim9: closure compiled with wrong compile type.
Solution:   Use COMPILE_TYPE() when calling a function. (closes #8384)
2021-06-15 19:32:40 +02:00
affd0bc626 patch 8.2.3002: Vim doesn't abort on a fatal Tcl error
Problem:    Vim doesn't abort on a fatal Tcl error.
Solution:   Change emsg() to iemsg(). (Dominique Pellé, closes #8383)
2021-06-15 19:09:43 +02:00
caf1a2f296 patch 8.2.3001: Vim9: memory leak when compilation fails
Problem:    Vim9: memory leak when compilation fails.
Solution:   Free the list of variable names.
2021-06-15 11:27:21 +02:00
5 changed files with 37 additions and 6 deletions

View File

@ -1531,7 +1531,7 @@ tclsetdelcmd(
reflist = reflist->next;
}
// This should never happen. Famous last word?
emsg(_("E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-dev@vim.org"));
iemsg(_("E280: TCL FATAL ERROR: reflist corrupt!? Please report this to vim-dev@vim.org"));
Tcl_SetResult(interp, _("cannot register callback command: buffer/window reference not found"), TCL_STATIC);
return TCL_ERROR;
}

View File

@ -932,6 +932,33 @@ func Test_Backtrace_DefFunction()
call delete('Xtest2.vim')
endfunc
func Test_debug_def_function()
CheckCWD
let file =<< trim END
vim9script
def g:Func()
var n: number
def Closure(): number
return n + 3
enddef
n += Closure()
echo 'result: ' .. n
enddef
END
call writefile(file, 'Xtest.vim')
let buf = RunVimInTerminal('-S Xtest.vim', {})
call RunDbgCmd(buf,
\ ':debug call Func()',
\ ['cmd: call Func()'])
call RunDbgCmd(buf, 'next', ['result: 3'])
call term_sendkeys(buf, "\r")
call StopVimInTerminal(buf)
call delete('Xtest.vim')
endfunc
func Test_debug_backtrace_level()
CheckCWD
let lines =<< trim END

View File

@ -750,6 +750,12 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
3003,
/**/
3002,
/**/
3001,
/**/
3000,
/**/

View File

@ -9724,8 +9724,10 @@ erret:
dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data)
+ ufunc->uf_dfunc_idx;
// Compiling aborted, free the generated instructions.
clear_instr_ga(instr);
VIM_CLEAR(dfunc->df_name);
ga_clear_strings(&dfunc->df_var_names);
// If using the last entry in the table and it was added above, we
// might as well remove it.

View File

@ -752,12 +752,8 @@ call_ufunc(
int error;
int idx;
int did_emsg_before = did_emsg;
compiletype_T compile_type = CT_NONE;
compiletype_T compile_type = COMPILE_TYPE(ufunc);
#ifdef FEAT_PROFILE
if (do_profiling == PROF_YES && ufunc->uf_profiling)
compile_type = CT_PROFILE;
#endif
if (func_needs_compiling(ufunc, compile_type)
&& compile_def_function(ufunc, FALSE, compile_type, NULL)
== FAIL)