Skip to content

Commit

Permalink
patch 8.2.3720: Vim9: Internal error when invoking closure in legacy …
Browse files Browse the repository at this point in the history
…context

Problem:    Vim9: Internal error when invoking closure in legacy context.
Solution:   Give a more appropriate error message. (closes #9251)
  • Loading branch information
brammool committed Dec 2, 2021
1 parent f8bc0ce commit 69c7617
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 1 deletion.
2 changes: 2 additions & 0 deletions src/errors.h
Expand Up @@ -689,3 +689,5 @@ EXTERN char e_cannot_find_variable_to_unlock_str[]
INIT(= N_("E1246: Cannot find variable to (un)lock: %s"));
EXTERN char e_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"));
15 changes: 15 additions & 0 deletions src/testdir/test_vim9_func.vim
Expand Up @@ -2384,6 +2384,21 @@ def Test_global_closure_called_directly()
delfunc g:Inner
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()
# this was using the frame index as the return value
var lines =<< trim END
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -753,6 +753,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
3720,
/**/
3719,
/**/
Expand Down
8 changes: 7 additions & 1 deletion src/vim9execute.c
Expand Up @@ -2733,7 +2733,13 @@ exec_instructions(ectx_T *ectx)
if (outer == NULL)
{
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;
}
tv = ((typval_T *)outer->out_stack->ga_data)
Expand Down

0 comments on commit 69c7617

Please sign in to comment.