CheckScriptFailure(lines, 'E1012:')
enddef
+def Test_nested_lambda()
+ var lines =<< trim END
+ vim9script
+ def Func()
+ var x = 4
+ var Lambda1 = {-> 7}
+ var Lambda2 = {-> [Lambda1(), x]}
+ var res = Lambda2()
+ assert_equal([7, 4], res)
+ enddef
+ Func()
+ END
+ CheckScriptSuccess(lines)
+enddef
+
def Test_sort_return_type()
var res: list<number>
res = [1, 2, 3]->sort()
};
// Number of entries used by stack frame for a function call.
-// - function index
-// - instruction index
-// - previous frame index
-#define STACK_FRAME_SIZE 3
+// - ec_dfunc_idx: function index
+// - ec_iidx: instruction index
+// - ec_outer_stack: stack used for closures TODO: can we avoid this?
+// - ec_outer_frame: stack frame for closures
+// - ec_frame_idx: previous frame index
+#define STACK_FRAME_SIZE 5
#ifdef DEFINE_VIM9_GLOBALS
// Store current execution state in stack frame for ISN_RETURN.
STACK_TV_BOT(0)->vval.v_number = ectx->ec_dfunc_idx;
STACK_TV_BOT(1)->vval.v_number = ectx->ec_iidx;
- STACK_TV_BOT(2)->vval.v_number = ectx->ec_frame_idx;
+ STACK_TV_BOT(2)->vval.v_string = (void *)ectx->ec_outer_stack;
+ STACK_TV_BOT(3)->vval.v_number = ectx->ec_outer_frame;
+ STACK_TV_BOT(4)->vval.v_number = ectx->ec_frame_idx;
ectx->ec_frame_idx = ectx->ec_stack.ga_len;
// Initialize local variables
// Restore the previous frame.
ectx->ec_dfunc_idx = STACK_TV(ectx->ec_frame_idx)->vval.v_number;
ectx->ec_iidx = STACK_TV(ectx->ec_frame_idx + 1)->vval.v_number;
- ectx->ec_frame_idx = STACK_TV(ectx->ec_frame_idx + 2)->vval.v_number;
+ ectx->ec_outer_stack =
+ (void *)STACK_TV(ectx->ec_frame_idx + 2)->vval.v_string;
+ ectx->ec_outer_frame = STACK_TV(ectx->ec_frame_idx + 3)->vval.v_number;
+ // restoring ec_frame_idx must be last
+ ectx->ec_frame_idx = STACK_TV(ectx->ec_frame_idx + 4)->vval.v_number;
dfunc = ((dfunc_T *)def_functions.ga_data) + ectx->ec_dfunc_idx;
ectx->ec_instr = dfunc->df_instr;