mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 8.2.3720: Vim9: Internal error when invoking closure in legacy context
Problem: Vim9: Internal error when invoking closure in legacy context. Solution: Give a more appropriate error message. (closes #9251)
This commit is contained in:
@@ -689,3 +689,5 @@ EXTERN char e_cannot_find_variable_to_unlock_str[]
|
|||||||
INIT(= N_("E1246: Cannot find variable to (un)lock: %s"));
|
INIT(= N_("E1246: Cannot find variable to (un)lock: %s"));
|
||||||
EXTERN char e_line_number_out_of_range[]
|
EXTERN char e_line_number_out_of_range[]
|
||||||
INIT(= N_("E1247: Line number out of range"));
|
INIT(= N_("E1247: Line number out of range"));
|
||||||
|
EXTERN char e_closure_called_from_invalid_context[]
|
||||||
|
INIT(= N_("E1248: Closure called from invalid context"));
|
||||||
|
@@ -2384,6 +2384,21 @@ def Test_global_closure_called_directly()
|
|||||||
delfunc g:Inner
|
delfunc g:Inner
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
|
def Test_closure_called_from_legacy()
|
||||||
|
var lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
def Func()
|
||||||
|
var outer = 'foo'
|
||||||
|
var F = () => {
|
||||||
|
outer = 'bar'
|
||||||
|
}
|
||||||
|
execute printf('call %s()', string(F))
|
||||||
|
enddef
|
||||||
|
Func()
|
||||||
|
END
|
||||||
|
CheckScriptFailure(lines, 'E1248')
|
||||||
|
enddef
|
||||||
|
|
||||||
def Test_failure_in_called_function()
|
def Test_failure_in_called_function()
|
||||||
# this was using the frame index as the return value
|
# this was using the frame index as the return value
|
||||||
var lines =<< trim END
|
var lines =<< trim END
|
||||||
|
@@ -753,6 +753,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
3720,
|
||||||
/**/
|
/**/
|
||||||
3719,
|
3719,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -2733,7 +2733,13 @@ exec_instructions(ectx_T *ectx)
|
|||||||
if (outer == NULL)
|
if (outer == NULL)
|
||||||
{
|
{
|
||||||
SOURCING_LNUM = iptr->isn_lnum;
|
SOURCING_LNUM = iptr->isn_lnum;
|
||||||
iemsg("LOADOUTER depth more than scope levels");
|
if (ectx->ec_frame_idx == ectx->ec_initial_frame_idx
|
||||||
|
|| ectx->ec_outer_ref == NULL)
|
||||||
|
// Possibly :def function called from legacy
|
||||||
|
// context.
|
||||||
|
emsg(_(e_closure_called_from_invalid_context));
|
||||||
|
else
|
||||||
|
iemsg("LOADOUTER depth more than scope levels");
|
||||||
goto theend;
|
goto theend;
|
||||||
}
|
}
|
||||||
tv = ((typval_T *)outer->out_stack->ga_data)
|
tv = ((typval_T *)outer->out_stack->ga_data)
|
||||||
|
Reference in New Issue
Block a user