Problem: Vim9: Internal error when invoking closure in legacy context.
Solution: Give a more appropriate error message. (closes #9251)
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"));
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
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 3720,
/**/
3719,
/**/
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)