xref: /vim-8.2.3635/src/vim9compile.c (revision 83cd0156)
1 /* vi:set ts=8 sts=4 sw=4 noet:
2  *
3  * VIM - Vi IMproved	by Bram Moolenaar
4  *
5  * Do ":help uganda"  in Vim to read copying and usage conditions.
6  * Do ":help credits" in Vim to see a list of people who contributed.
7  * See README.txt for an overview of the Vim source code.
8  */
9 
10 /*
11  * vim9compile.c: :def and dealing with instructions
12  */
13 
14 #define USING_FLOAT_STUFF
15 #include "vim.h"
16 
17 #if defined(FEAT_EVAL) || defined(PROTO)
18 
19 #ifdef VMS
20 # include <float.h>
21 #endif
22 
23 #define DEFINE_VIM9_GLOBALS
24 #include "vim9.h"
25 
26 // values for ctx_skip
27 typedef enum {
28     SKIP_NOT,		// condition is a constant, produce code
29     SKIP_YES,		// condition is a constant, do NOT produce code
30     SKIP_UNKNOWN	// condition is not a constant, produce code
31 } skip_T;
32 
33 /*
34  * Chain of jump instructions where the end label needs to be set.
35  */
36 typedef struct endlabel_S endlabel_T;
37 struct endlabel_S {
38     endlabel_T	*el_next;	    // chain end_label locations
39     int		el_end_label;	    // instruction idx where to set end
40 };
41 
42 /*
43  * info specific for the scope of :if / elseif / else
44  */
45 typedef struct {
46     int		is_seen_else;
47     int		is_seen_skip_not;   // a block was unconditionally executed
48     int		is_had_return;	    // every block ends in :return
49     int		is_if_label;	    // instruction idx at IF or ELSEIF
50     endlabel_T	*is_end_label;	    // instructions to set end label
51 } ifscope_T;
52 
53 /*
54  * info specific for the scope of :while
55  */
56 typedef struct {
57     int		ws_top_label;	    // instruction idx at WHILE
58     endlabel_T	*ws_end_label;	    // instructions to set end
59 } whilescope_T;
60 
61 /*
62  * info specific for the scope of :for
63  */
64 typedef struct {
65     int		fs_top_label;	    // instruction idx at FOR
66     endlabel_T	*fs_end_label;	    // break instructions
67 } forscope_T;
68 
69 /*
70  * info specific for the scope of :try
71  */
72 typedef struct {
73     int		ts_try_label;	    // instruction idx at TRY
74     endlabel_T	*ts_end_label;	    // jump to :finally or :endtry
75     int		ts_catch_label;	    // instruction idx of last CATCH
76     int		ts_caught_all;	    // "catch" without argument encountered
77 } tryscope_T;
78 
79 typedef enum {
80     NO_SCOPE,
81     IF_SCOPE,
82     WHILE_SCOPE,
83     FOR_SCOPE,
84     TRY_SCOPE,
85     BLOCK_SCOPE
86 } scopetype_T;
87 
88 /*
89  * Info for one scope, pointed to by "ctx_scope".
90  */
91 typedef struct scope_S scope_T;
92 struct scope_S {
93     scope_T	*se_outer;	    // scope containing this one
94     scopetype_T se_type;
95     int		se_local_count;	    // ctx_locals.ga_len before scope
96     skip_T	se_skip_save;	    // ctx_skip before the block
97     union {
98 	ifscope_T	se_if;
99 	whilescope_T	se_while;
100 	forscope_T	se_for;
101 	tryscope_T	se_try;
102     } se_u;
103 };
104 
105 /*
106  * Entry for "ctx_locals".  Used for arguments and local variables.
107  */
108 typedef struct {
109     char_u	*lv_name;
110     type_T	*lv_type;
111     int		lv_idx;		// index of the variable on the stack
112     int		lv_from_outer;	// nesting level, using ctx_outer scope
113     int		lv_const;	// when TRUE cannot be assigned to
114     int		lv_arg;		// when TRUE this is an argument
115 } lvar_T;
116 
117 // Destination for an assignment or ":unlet" with an index.
118 typedef enum {
119     dest_local,
120     dest_option,
121     dest_env,
122     dest_global,
123     dest_buffer,
124     dest_window,
125     dest_tab,
126     dest_vimvar,
127     dest_script,
128     dest_reg,
129     dest_expr,
130 } assign_dest_T;
131 
132 // Used by compile_lhs() to store information about the LHS of an assignment
133 // and one argument of ":unlet" with an index.
134 typedef struct {
135     assign_dest_T   lhs_dest;	    // type of destination
136 
137     char_u	    *lhs_name;	    // allocated name excluding the last
138 				    // "[expr]" or ".name".
139     size_t	    lhs_varlen;	    // length of the variable without
140 				    // "[expr]" or ".name"
141     char_u	    *lhs_whole;	    // allocated name including the last
142 				    // "[expr]" or ".name" for :redir
143     size_t	    lhs_varlen_total; // length of the variable including
144 				      // any "[expr]" or ".name"
145     char_u	    *lhs_dest_end;  // end of the destination, including
146 				    // "[expr]" or ".name".
147 
148     int		    lhs_has_index;  // has "[expr]" or ".name"
149 
150     int		    lhs_new_local;  // create new local variable
151     int		    lhs_opt_flags;  // for when destination is an option
152     int		    lhs_vimvaridx;  // for when destination is a v:var
153 
154     lvar_T	    lhs_local_lvar; // used for existing local destination
155     lvar_T	    lhs_arg_lvar;   // used for argument destination
156     lvar_T	    *lhs_lvar;	    // points to destination lvar
157     int		    lhs_scriptvar_sid;
158     int		    lhs_scriptvar_idx;
159 
160     int		    lhs_has_type;   // type was specified
161     type_T	    *lhs_type;
162     type_T	    *lhs_member_type;
163 
164     int		    lhs_append;	    // used by ISN_REDIREND
165 } lhs_T;
166 
167 /*
168  * Context for compiling lines of Vim script.
169  * Stores info about the local variables and condition stack.
170  */
171 struct cctx_S {
172     ufunc_T	*ctx_ufunc;	    // current function
173     int		ctx_lnum;	    // line number in current function
174     char_u	*ctx_line_start;    // start of current line or NULL
175     garray_T	ctx_instr;	    // generated instructions
176 
177     int		ctx_prev_lnum;	    // line number below previous command, for
178 				    // debugging
179 
180     compiletype_T ctx_compile_type;
181 
182     garray_T	ctx_locals;	    // currently visible local variables
183 
184     int		ctx_has_closure;    // set to one if a closures was created in
185 				    // the function
186 
187     garray_T	ctx_imports;	    // imported items
188 
189     skip_T	ctx_skip;
190     scope_T	*ctx_scope;	    // current scope, NULL at toplevel
191     int		ctx_had_return;	    // last seen statement was "return"
192 
193     cctx_T	*ctx_outer;	    // outer scope for lambda or nested
194 				    // function
195     int		ctx_outer_used;	    // var in ctx_outer was used
196 
197     garray_T	ctx_type_stack;	    // type of each item on the stack
198     garray_T	*ctx_type_list;	    // list of pointers to allocated types
199 
200     int		ctx_has_cmdmod;	    // ISN_CMDMOD was generated
201 
202     lhs_T	ctx_redir_lhs;	    // LHS for ":redir => var", valid when
203 				    // lhs_name is not NULL
204 };
205 
206 static void delete_def_function_contents(dfunc_T *dfunc, int mark_deleted);
207 
208 /*
209  * Lookup variable "name" in the local scope and return it in "lvar".
210  * "lvar->lv_from_outer" is incremented accordingly.
211  * If "lvar" is NULL only check if the variable can be found.
212  * Return FAIL if not found.
213  */
214     static int
215 lookup_local(char_u *name, size_t len, lvar_T *lvar, cctx_T *cctx)
216 {
217     int	    idx;
218     lvar_T  *lvp;
219 
220     if (len == 0)
221 	return FAIL;
222 
223     // Find local in current function scope.
224     for (idx = 0; idx < cctx->ctx_locals.ga_len; ++idx)
225     {
226 	lvp = ((lvar_T *)cctx->ctx_locals.ga_data) + idx;
227 	if (STRNCMP(name, lvp->lv_name, len) == 0
228 					       && STRLEN(lvp->lv_name) == len)
229 	{
230 	    if (lvar != NULL)
231 	    {
232 		*lvar = *lvp;
233 		lvar->lv_from_outer = 0;
234 	    }
235 	    return OK;
236 	}
237     }
238 
239     // Find local in outer function scope.
240     if (cctx->ctx_outer != NULL)
241     {
242 	if (lookup_local(name, len, lvar, cctx->ctx_outer) == OK)
243 	{
244 	    if (lvar != NULL)
245 	    {
246 		cctx->ctx_outer_used = TRUE;
247 		++lvar->lv_from_outer;
248 	    }
249 	    return OK;
250 	}
251     }
252 
253     return FAIL;
254 }
255 
256 /*
257  * Lookup an argument in the current function and an enclosing function.
258  * Returns the argument index in "idxp"
259  * Returns the argument type in "type"
260  * Sets "gen_load_outer" to TRUE if found in outer scope.
261  * Returns OK when found, FAIL otherwise.
262  */
263     static int
264 arg_exists(
265 	char_u	*name,
266 	size_t	len,
267 	int	*idxp,
268 	type_T	**type,
269 	int	*gen_load_outer,
270 	cctx_T	*cctx)
271 {
272     int	    idx;
273     char_u  *va_name;
274 
275     if (len == 0)
276 	return FAIL;
277     for (idx = 0; idx < cctx->ctx_ufunc->uf_args_visible; ++idx)
278     {
279 	char_u *arg = FUNCARG(cctx->ctx_ufunc, idx);
280 
281 	if (STRNCMP(name, arg, len) == 0 && arg[len] == NUL)
282 	{
283 	    if (idxp != NULL)
284 	    {
285 		// Arguments are located above the frame pointer.  One further
286 		// if there is a vararg argument
287 		*idxp = idx - (cctx->ctx_ufunc->uf_args.ga_len
288 							    + STACK_FRAME_SIZE)
289 			      + (cctx->ctx_ufunc->uf_va_name != NULL ? -1 : 0);
290 
291 		if (cctx->ctx_ufunc->uf_arg_types != NULL)
292 		    *type = cctx->ctx_ufunc->uf_arg_types[idx];
293 		else
294 		    *type = &t_any;
295 	    }
296 	    return OK;
297 	}
298     }
299 
300     va_name = cctx->ctx_ufunc->uf_va_name;
301     if (va_name != NULL
302 		    && STRNCMP(name, va_name, len) == 0 && va_name[len] == NUL)
303     {
304 	if (idxp != NULL)
305 	{
306 	    // varargs is always the last argument
307 	    *idxp = -STACK_FRAME_SIZE - 1;
308 	    *type = cctx->ctx_ufunc->uf_va_type;
309 	}
310 	return OK;
311     }
312 
313     if (cctx->ctx_outer != NULL)
314     {
315 	// Lookup the name for an argument of the outer function.
316 	if (arg_exists(name, len, idxp, type, gen_load_outer, cctx->ctx_outer)
317 									 == OK)
318 	{
319 	    if (gen_load_outer != NULL)
320 		++*gen_load_outer;
321 	    return OK;
322 	}
323     }
324 
325     return FAIL;
326 }
327 
328 /*
329  * Lookup a script-local variable in the current script, possibly defined in a
330  * block that contains the function "cctx->ctx_ufunc".
331  * "cctx" is NULL at the script level.
332  * If "len" is <= 0 "name" must be NUL terminated.
333  * Return NULL when not found.
334  */
335     static sallvar_T *
336 find_script_var(char_u *name, size_t len, cctx_T *cctx)
337 {
338     scriptitem_T    *si = SCRIPT_ITEM(current_sctx.sc_sid);
339     hashitem_T	    *hi;
340     int		    cc;
341     sallvar_T	    *sav;
342     sallvar_T	    *found_sav;
343     ufunc_T	    *ufunc;
344 
345     // Find the list of all script variables with the right name.
346     if (len > 0)
347     {
348 	cc = name[len];
349 	name[len] = NUL;
350     }
351     hi = hash_find(&si->sn_all_vars.dv_hashtab, name);
352     if (len > 0)
353 	name[len] = cc;
354     if (HASHITEM_EMPTY(hi))
355 	return NULL;
356 
357     sav = HI2SAV(hi);
358     if (sav->sav_block_id == 0)
359 	// variable defined in the top script scope is always visible
360 	return sav;
361 
362     if (cctx == NULL)
363     {
364 	// Not in a function scope, find variable with block id equal to or
365 	// smaller than the current block id.
366 	while (sav != NULL)
367 	{
368 	    if (sav->sav_block_id <= si->sn_current_block_id)
369 		break;
370 	    sav = sav->sav_next;
371 	}
372 	return sav;
373     }
374 
375     // Go over the variables with this name and find one that was visible
376     // from the function.
377     ufunc = cctx->ctx_ufunc;
378     found_sav = sav;
379     while (sav != NULL)
380     {
381 	int idx;
382 
383 	// Go over the blocks that this function was defined in.  If the
384 	// variable block ID matches it was visible to the function.
385 	for (idx = 0; idx < ufunc->uf_block_depth; ++idx)
386 	    if (ufunc->uf_block_ids[idx] == sav->sav_block_id)
387 		return sav;
388 	sav = sav->sav_next;
389     }
390 
391     // Not found, assume variable at script level was visible.
392     return found_sav;
393 }
394 
395 /*
396  * Return TRUE if the script context is Vim9 script.
397  */
398     static int
399 script_is_vim9()
400 {
401     return SCRIPT_ITEM(current_sctx.sc_sid)->sn_version == SCRIPT_VERSION_VIM9;
402 }
403 
404 /*
405  * Lookup a variable (without s: prefix) in the current script.
406  * "cctx" is NULL at the script level.
407  * Returns OK or FAIL.
408  */
409     static int
410 script_var_exists(char_u *name, size_t len, cctx_T *cctx)
411 {
412     if (current_sctx.sc_sid <= 0)
413 	return FAIL;
414     if (script_is_vim9())
415     {
416 	// Check script variables that were visible where the function was
417 	// defined.
418 	if (find_script_var(name, len, cctx) != NULL)
419 	    return OK;
420     }
421     else
422     {
423 	hashtab_T	*ht = &SCRIPT_VARS(current_sctx.sc_sid);
424 	dictitem_T	*di;
425 	int		cc;
426 
427 	// Check script variables that are currently visible
428 	cc = name[len];
429 	name[len] = NUL;
430 	di = find_var_in_ht(ht, 0, name, TRUE);
431 	name[len] = cc;
432 	if (di != NULL)
433 	    return OK;
434     }
435 
436     return FAIL;
437 }
438 
439 /*
440  * Return TRUE if "name" is a local variable, argument, script variable or
441  * imported.
442  */
443     static int
444 variable_exists(char_u *name, size_t len, cctx_T *cctx)
445 {
446     return (cctx != NULL
447 		&& (lookup_local(name, len, NULL, cctx) == OK
448 		    || arg_exists(name, len, NULL, NULL, NULL, cctx) == OK))
449 	    || script_var_exists(name, len, cctx) == OK
450 	    || find_imported(name, len, cctx) != NULL;
451 }
452 
453 /*
454  * Return TRUE if "name" is a local variable, argument, script variable,
455  * imported or function.
456  */
457     static int
458 item_exists(char_u *name, size_t len, int cmd UNUSED, cctx_T *cctx)
459 {
460     int	    is_global;
461     char_u  *p;
462 
463     if (variable_exists(name, len, cctx))
464 	return TRUE;
465 
466     // This is similar to what is in lookup_scriptitem():
467     // Find a function, so that a following "->" works.
468     // Require "(" or "->" to follow, "Cmd" is a user command while "Cmd()" is
469     // a function call.
470     p = skipwhite(name + len);
471 
472     if (name[len] == '(' || (p[0] == '-' && p[1] == '>'))
473     {
474 	// Do not check for an internal function, since it might also be a
475 	// valid command, such as ":split" versus "split()".
476 	// Skip "g:" before a function name.
477 	is_global = (name[0] == 'g' && name[1] == ':');
478 	return find_func(is_global ? name + 2 : name, is_global, cctx) != NULL;
479     }
480     return FALSE;
481 }
482 
483 /*
484  * Check if "p[len]" is already defined, either in script "import_sid" or in
485  * compilation context "cctx".  "cctx" is NULL at the script level.
486  * Does not check the global namespace.
487  * If "is_arg" is TRUE the error message is for an argument name.
488  * Return FAIL and give an error if it defined.
489  */
490     int
491 check_defined(char_u *p, size_t len, cctx_T *cctx, int is_arg)
492 {
493     int		c = p[len];
494     ufunc_T	*ufunc = NULL;
495 
496     // underscore argument is OK
497     if (len == 1 && *p == '_')
498 	return OK;
499 
500     if (script_var_exists(p, len, cctx) == OK)
501     {
502 	if (is_arg)
503 	    semsg(_(e_argument_already_declared_in_script_str), p);
504 	else
505 	    semsg(_(e_variable_already_declared_in_script_str), p);
506 	return FAIL;
507     }
508 
509     p[len] = NUL;
510     if ((cctx != NULL
511 		&& (lookup_local(p, len, NULL, cctx) == OK
512 		    || arg_exists(p, len, NULL, NULL, NULL, cctx) == OK))
513 	    || find_imported(p, len, cctx) != NULL
514 	    || (ufunc = find_func_even_dead(p, FALSE, cctx)) != NULL)
515     {
516 	// A local or script-local function can shadow a global function.
517 	if (ufunc == NULL || ((ufunc->uf_flags & FC_DEAD) == 0
518 		    && (!func_is_global(ufunc)
519 					     || (p[0] == 'g' && p[1] == ':'))))
520 	{
521 	    if (is_arg)
522 		semsg(_(e_argument_name_shadows_existing_variable_str), p);
523 	    else
524 		semsg(_(e_name_already_defined_str), p);
525 	    p[len] = c;
526 	    return FAIL;
527 	}
528     }
529     p[len] = c;
530     return OK;
531 }
532 
533 
534 /////////////////////////////////////////////////////////////////////
535 // Following generate_ functions expect the caller to call ga_grow().
536 
537 #define RETURN_NULL_IF_SKIP(cctx) if (cctx->ctx_skip == SKIP_YES) return NULL
538 #define RETURN_OK_IF_SKIP(cctx) if (cctx->ctx_skip == SKIP_YES) return OK
539 
540 /*
541  * Generate an instruction without arguments.
542  * Returns a pointer to the new instruction, NULL if failed.
543  */
544     static isn_T *
545 generate_instr(cctx_T *cctx, isntype_T isn_type)
546 {
547     garray_T	*instr = &cctx->ctx_instr;
548     isn_T	*isn;
549 
550     RETURN_NULL_IF_SKIP(cctx);
551     if (ga_grow(instr, 1) == FAIL)
552 	return NULL;
553     isn = ((isn_T *)instr->ga_data) + instr->ga_len;
554     isn->isn_type = isn_type;
555     isn->isn_lnum = cctx->ctx_lnum + 1;
556     ++instr->ga_len;
557 
558     return isn;
559 }
560 
561 /*
562  * Generate an instruction without arguments.
563  * "drop" will be removed from the stack.
564  * Returns a pointer to the new instruction, NULL if failed.
565  */
566     static isn_T *
567 generate_instr_drop(cctx_T *cctx, isntype_T isn_type, int drop)
568 {
569     garray_T	*stack = &cctx->ctx_type_stack;
570 
571     RETURN_NULL_IF_SKIP(cctx);
572     stack->ga_len -= drop;
573     return generate_instr(cctx, isn_type);
574 }
575 
576 /*
577  * Generate instruction "isn_type" and put "type" on the type stack.
578  */
579     static isn_T *
580 generate_instr_type(cctx_T *cctx, isntype_T isn_type, type_T *type)
581 {
582     isn_T	*isn;
583     garray_T	*stack = &cctx->ctx_type_stack;
584 
585     if ((isn = generate_instr(cctx, isn_type)) == NULL)
586 	return NULL;
587 
588     if (ga_grow(stack, 1) == FAIL)
589 	return NULL;
590     ((type_T **)stack->ga_data)[stack->ga_len] = type == NULL ? &t_any : type;
591     ++stack->ga_len;
592 
593     return isn;
594 }
595 
596 /*
597  * Generate an ISN_DEBUG instruction.
598  */
599     static isn_T *
600 generate_instr_debug(cctx_T *cctx)
601 {
602     isn_T	*isn;
603     dfunc_T	*dfunc = ((dfunc_T *)def_functions.ga_data)
604 					       + cctx->ctx_ufunc->uf_dfunc_idx;
605 
606     if ((isn = generate_instr(cctx, ISN_DEBUG)) == NULL)
607 	return NULL;
608     isn->isn_arg.debug.dbg_var_names_len = dfunc->df_var_names.ga_len;
609     isn->isn_arg.debug.dbg_break_lnum = cctx->ctx_prev_lnum;
610     return isn;
611 }
612 
613 /*
614  * If type at "offset" isn't already VAR_STRING then generate ISN_2STRING.
615  * But only for simple types.
616  * When "tolerant" is TRUE convert most types to string, e.g. a List.
617  */
618     static int
619 may_generate_2STRING(int offset, int tolerant, cctx_T *cctx)
620 {
621     isn_T	*isn;
622     isntype_T	isntype = ISN_2STRING;
623     garray_T	*stack = &cctx->ctx_type_stack;
624     type_T	**type;
625 
626     RETURN_OK_IF_SKIP(cctx);
627     type = ((type_T **)stack->ga_data) + stack->ga_len + offset;
628     switch ((*type)->tt_type)
629     {
630 	// nothing to be done
631 	case VAR_STRING: return OK;
632 
633 	// conversion possible
634 	case VAR_SPECIAL:
635 	case VAR_BOOL:
636 	case VAR_NUMBER:
637 	case VAR_FLOAT:
638 			 break;
639 
640 	// conversion possible (with runtime check)
641 	case VAR_ANY:
642 	case VAR_UNKNOWN:
643 			 isntype = ISN_2STRING_ANY;
644 			 break;
645 
646 	// conversion possible when tolerant
647 	case VAR_LIST:
648 			 if (tolerant)
649 			 {
650 			     isntype = ISN_2STRING_ANY;
651 			     break;
652 			 }
653 			 // FALLTHROUGH
654 
655 	// conversion not possible
656 	case VAR_VOID:
657 	case VAR_BLOB:
658 	case VAR_FUNC:
659 	case VAR_PARTIAL:
660 	case VAR_DICT:
661 	case VAR_JOB:
662 	case VAR_CHANNEL:
663 	case VAR_INSTR:
664 			 to_string_error((*type)->tt_type);
665 			 return FAIL;
666     }
667 
668     *type = &t_string;
669     if ((isn = generate_instr(cctx, isntype)) == NULL)
670 	return FAIL;
671     isn->isn_arg.tostring.offset = offset;
672     isn->isn_arg.tostring.tolerant = tolerant;
673 
674     return OK;
675 }
676 
677     static int
678 check_number_or_float(vartype_T type1, vartype_T type2, char_u *op)
679 {
680     if (!((type1 == VAR_NUMBER || type1 == VAR_FLOAT || type1 == VAR_ANY)
681 	    && (type2 == VAR_NUMBER || type2 == VAR_FLOAT
682 							 || type2 == VAR_ANY)))
683     {
684 	if (*op == '+')
685 	    emsg(_(e_wrong_argument_type_for_plus));
686 	else
687 	    semsg(_(e_char_requires_number_or_float_arguments), *op);
688 	return FAIL;
689     }
690     return OK;
691 }
692 
693     static int
694 generate_add_instr(
695 	cctx_T *cctx,
696 	vartype_T vartype,
697 	type_T *type1,
698 	type_T *type2)
699 {
700     garray_T	*stack = &cctx->ctx_type_stack;
701     isn_T	*isn = generate_instr_drop(cctx,
702 		      vartype == VAR_NUMBER ? ISN_OPNR
703 		    : vartype == VAR_LIST ? ISN_ADDLIST
704 		    : vartype == VAR_BLOB ? ISN_ADDBLOB
705 #ifdef FEAT_FLOAT
706 		    : vartype == VAR_FLOAT ? ISN_OPFLOAT
707 #endif
708 		    : ISN_OPANY, 1);
709 
710     if (vartype != VAR_LIST && vartype != VAR_BLOB
711 	    && type1->tt_type != VAR_ANY
712 	    && type2->tt_type != VAR_ANY
713 	    && check_number_or_float(
714 			type1->tt_type, type2->tt_type, (char_u *)"+") == FAIL)
715 	return FAIL;
716 
717     if (isn != NULL)
718 	isn->isn_arg.op.op_type = EXPR_ADD;
719 
720     // When concatenating two lists with different member types the member type
721     // becomes "any".
722     if (vartype == VAR_LIST
723 	    && type1->tt_type == VAR_LIST && type2->tt_type == VAR_LIST
724 	    && type1->tt_member != type2->tt_member)
725 	(((type_T **)stack->ga_data)[stack->ga_len - 1]) = &t_list_any;
726 
727     return isn == NULL ? FAIL : OK;
728 }
729 
730 /*
731  * Get the type to use for an instruction for an operation on "type1" and
732  * "type2".  If they are matching use a type-specific instruction. Otherwise
733  * fall back to runtime type checking.
734  */
735     static vartype_T
736 operator_type(type_T *type1, type_T *type2)
737 {
738     if (type1->tt_type == type2->tt_type
739 	    && (type1->tt_type == VAR_NUMBER
740 		|| type1->tt_type == VAR_LIST
741 #ifdef FEAT_FLOAT
742 		|| type1->tt_type == VAR_FLOAT
743 #endif
744 		|| type1->tt_type == VAR_BLOB))
745 	return type1->tt_type;
746     return VAR_ANY;
747 }
748 
749 /*
750  * Generate an instruction with two arguments.  The instruction depends on the
751  * type of the arguments.
752  */
753     static int
754 generate_two_op(cctx_T *cctx, char_u *op)
755 {
756     garray_T	*stack = &cctx->ctx_type_stack;
757     type_T	*type1;
758     type_T	*type2;
759     vartype_T	vartype;
760     isn_T	*isn;
761 
762     RETURN_OK_IF_SKIP(cctx);
763 
764     // Get the known type of the two items on the stack.
765     type1 = ((type_T **)stack->ga_data)[stack->ga_len - 2];
766     type2 = ((type_T **)stack->ga_data)[stack->ga_len - 1];
767     vartype = operator_type(type1, type2);
768 
769     switch (*op)
770     {
771 	case '+':
772 		  if (generate_add_instr(cctx, vartype, type1, type2) == FAIL)
773 		      return FAIL;
774 		  break;
775 
776 	case '-':
777 	case '*':
778 	case '/': if (check_number_or_float(type1->tt_type, type2->tt_type,
779 								   op) == FAIL)
780 		      return FAIL;
781 		  if (vartype == VAR_NUMBER)
782 		      isn = generate_instr_drop(cctx, ISN_OPNR, 1);
783 #ifdef FEAT_FLOAT
784 		  else if (vartype == VAR_FLOAT)
785 		      isn = generate_instr_drop(cctx, ISN_OPFLOAT, 1);
786 #endif
787 		  else
788 		      isn = generate_instr_drop(cctx, ISN_OPANY, 1);
789 		  if (isn != NULL)
790 		      isn->isn_arg.op.op_type = *op == '*'
791 				 ? EXPR_MULT : *op == '/'? EXPR_DIV : EXPR_SUB;
792 		  break;
793 
794 	case '%': if ((type1->tt_type != VAR_ANY
795 					       && type1->tt_type != VAR_NUMBER)
796 			  || (type2->tt_type != VAR_ANY
797 					      && type2->tt_type != VAR_NUMBER))
798 		  {
799 		      emsg(_(e_percent_requires_number_arguments));
800 		      return FAIL;
801 		  }
802 		  isn = generate_instr_drop(cctx,
803 			      vartype == VAR_NUMBER ? ISN_OPNR : ISN_OPANY, 1);
804 		  if (isn != NULL)
805 		      isn->isn_arg.op.op_type = EXPR_REM;
806 		  break;
807     }
808 
809     // correct type of result
810     if (vartype == VAR_ANY)
811     {
812 	type_T *type = &t_any;
813 
814 #ifdef FEAT_FLOAT
815 	// float+number and number+float results in float
816 	if ((type1->tt_type == VAR_NUMBER || type1->tt_type == VAR_FLOAT)
817 		&& (type2->tt_type == VAR_NUMBER || type2->tt_type == VAR_FLOAT))
818 	    type = &t_float;
819 #endif
820 	((type_T **)stack->ga_data)[stack->ga_len - 1] = type;
821     }
822 
823     return OK;
824 }
825 
826 /*
827  * Get the instruction to use for comparing "type1" with "type2"
828  * Return ISN_DROP when failed.
829  */
830     static isntype_T
831 get_compare_isn(exprtype_T exprtype, vartype_T type1, vartype_T type2)
832 {
833     isntype_T	isntype = ISN_DROP;
834 
835     if (type1 == VAR_UNKNOWN)
836 	type1 = VAR_ANY;
837     if (type2 == VAR_UNKNOWN)
838 	type2 = VAR_ANY;
839 
840     if (type1 == type2)
841     {
842 	switch (type1)
843 	{
844 	    case VAR_BOOL: isntype = ISN_COMPAREBOOL; break;
845 	    case VAR_SPECIAL: isntype = ISN_COMPARESPECIAL; break;
846 	    case VAR_NUMBER: isntype = ISN_COMPARENR; break;
847 	    case VAR_FLOAT: isntype = ISN_COMPAREFLOAT; break;
848 	    case VAR_STRING: isntype = ISN_COMPARESTRING; break;
849 	    case VAR_BLOB: isntype = ISN_COMPAREBLOB; break;
850 	    case VAR_LIST: isntype = ISN_COMPARELIST; break;
851 	    case VAR_DICT: isntype = ISN_COMPAREDICT; break;
852 	    case VAR_FUNC: isntype = ISN_COMPAREFUNC; break;
853 	    default: isntype = ISN_COMPAREANY; break;
854 	}
855     }
856     else if (type1 == VAR_ANY || type2 == VAR_ANY
857 	    || ((type1 == VAR_NUMBER || type1 == VAR_FLOAT)
858 	      && (type2 == VAR_NUMBER || type2 == VAR_FLOAT)))
859 	isntype = ISN_COMPAREANY;
860 
861     if ((exprtype == EXPR_IS || exprtype == EXPR_ISNOT)
862 	    && (isntype == ISN_COMPAREBOOL
863 	    || isntype == ISN_COMPARESPECIAL
864 	    || isntype == ISN_COMPARENR
865 	    || isntype == ISN_COMPAREFLOAT))
866     {
867 	semsg(_(e_cannot_use_str_with_str),
868 		exprtype == EXPR_IS ? "is" : "isnot" , vartype_name(type1));
869 	return ISN_DROP;
870     }
871     if (isntype == ISN_DROP
872 	    || ((exprtype != EXPR_EQUAL && exprtype != EXPR_NEQUAL
873 		    && (type1 == VAR_BOOL || type1 == VAR_SPECIAL
874 		       || type2 == VAR_BOOL || type2 == VAR_SPECIAL)))
875 	    || ((exprtype != EXPR_EQUAL && exprtype != EXPR_NEQUAL
876 				 && exprtype != EXPR_IS && exprtype != EXPR_ISNOT
877 		    && (type1 == VAR_BLOB || type2 == VAR_BLOB
878 			|| type1 == VAR_LIST || type2 == VAR_LIST))))
879     {
880 	semsg(_(e_cannot_compare_str_with_str),
881 		vartype_name(type1), vartype_name(type2));
882 	return ISN_DROP;
883     }
884     return isntype;
885 }
886 
887     int
888 check_compare_types(exprtype_T type, typval_T *tv1, typval_T *tv2)
889 {
890     if (get_compare_isn(type, tv1->v_type, tv2->v_type) == ISN_DROP)
891 	return FAIL;
892     return OK;
893 }
894 
895 /*
896  * Generate an ISN_COMPARE* instruction with a boolean result.
897  */
898     static int
899 generate_COMPARE(cctx_T *cctx, exprtype_T exprtype, int ic)
900 {
901     isntype_T	isntype;
902     isn_T	*isn;
903     garray_T	*stack = &cctx->ctx_type_stack;
904     vartype_T	type1;
905     vartype_T	type2;
906 
907     RETURN_OK_IF_SKIP(cctx);
908 
909     // Get the known type of the two items on the stack.  If they are matching
910     // use a type-specific instruction. Otherwise fall back to runtime type
911     // checking.
912     type1 = ((type_T **)stack->ga_data)[stack->ga_len - 2]->tt_type;
913     type2 = ((type_T **)stack->ga_data)[stack->ga_len - 1]->tt_type;
914     isntype = get_compare_isn(exprtype, type1, type2);
915     if (isntype == ISN_DROP)
916 	return FAIL;
917 
918     if ((isn = generate_instr(cctx, isntype)) == NULL)
919 	return FAIL;
920     isn->isn_arg.op.op_type = exprtype;
921     isn->isn_arg.op.op_ic = ic;
922 
923     // takes two arguments, puts one bool back
924     if (stack->ga_len >= 2)
925     {
926 	--stack->ga_len;
927 	((type_T **)stack->ga_data)[stack->ga_len - 1] = &t_bool;
928     }
929 
930     return OK;
931 }
932 
933 /*
934  * Generate an ISN_2BOOL instruction.
935  * "offset" is the offset in the type stack.
936  */
937     static int
938 generate_2BOOL(cctx_T *cctx, int invert, int offset)
939 {
940     isn_T	*isn;
941     garray_T	*stack = &cctx->ctx_type_stack;
942 
943     RETURN_OK_IF_SKIP(cctx);
944     if ((isn = generate_instr(cctx, ISN_2BOOL)) == NULL)
945 	return FAIL;
946     isn->isn_arg.tobool.invert = invert;
947     isn->isn_arg.tobool.offset = offset;
948 
949     // type becomes bool
950     ((type_T **)stack->ga_data)[stack->ga_len + offset] = &t_bool;
951 
952     return OK;
953 }
954 
955 /*
956  * Generate an ISN_COND2BOOL instruction.
957  */
958     static int
959 generate_COND2BOOL(cctx_T *cctx)
960 {
961     isn_T	*isn;
962     garray_T	*stack = &cctx->ctx_type_stack;
963 
964     RETURN_OK_IF_SKIP(cctx);
965     if ((isn = generate_instr(cctx, ISN_COND2BOOL)) == NULL)
966 	return FAIL;
967 
968     // type becomes bool
969     ((type_T **)stack->ga_data)[stack->ga_len - 1] = &t_bool;
970 
971     return OK;
972 }
973 
974     static int
975 generate_TYPECHECK(
976 	cctx_T	    *cctx,
977 	type_T	    *expected,
978 	int	    offset,
979 	int	    argidx)
980 {
981     isn_T	*isn;
982     garray_T	*stack = &cctx->ctx_type_stack;
983 
984     RETURN_OK_IF_SKIP(cctx);
985     if ((isn = generate_instr(cctx, ISN_CHECKTYPE)) == NULL)
986 	return FAIL;
987     isn->isn_arg.type.ct_type = alloc_type(expected);
988     isn->isn_arg.type.ct_off = (int8_T)offset;
989     isn->isn_arg.type.ct_arg_idx = (int8_T)argidx;
990 
991     // type becomes expected
992     ((type_T **)stack->ga_data)[stack->ga_len + offset] = expected;
993 
994     return OK;
995 }
996 
997     static int
998 generate_SETTYPE(
999 	cctx_T	    *cctx,
1000 	type_T	    *expected)
1001 {
1002     isn_T	*isn;
1003 
1004     RETURN_OK_IF_SKIP(cctx);
1005     if ((isn = generate_instr(cctx, ISN_SETTYPE)) == NULL)
1006 	return FAIL;
1007     isn->isn_arg.type.ct_type = alloc_type(expected);
1008     return OK;
1009 }
1010 
1011 /*
1012  * Return TRUE if "actual" could be "expected" and a runtime typecheck is to be
1013  * used.  Return FALSE if the types will never match.
1014  */
1015     int
1016 use_typecheck(type_T *actual, type_T *expected)
1017 {
1018     if (actual->tt_type == VAR_ANY
1019 	    || actual->tt_type == VAR_UNKNOWN
1020 	    || (actual->tt_type == VAR_FUNC
1021 		&& (expected->tt_type == VAR_FUNC
1022 					   || expected->tt_type == VAR_PARTIAL)
1023 		&& (actual->tt_member == &t_any || actual->tt_argcount < 0)
1024 		&& ((actual->tt_member == &t_void)
1025 					 == (expected->tt_member == &t_void))))
1026 	return TRUE;
1027     if ((actual->tt_type == VAR_LIST || actual->tt_type == VAR_DICT)
1028 				       && actual->tt_type == expected->tt_type)
1029 	// This takes care of a nested list or dict.
1030 	return use_typecheck(actual->tt_member, expected->tt_member);
1031     return FALSE;
1032 }
1033 
1034 /*
1035  * Check that
1036  * - "actual" matches "expected" type or
1037  * - "actual" is a type that can be "expected" type: add a runtime check; or
1038  * - return FAIL.
1039  * If "actual_is_const" is TRUE then the type won't change at runtime, do not
1040  * generate a TYPECHECK.
1041  */
1042     int
1043 need_type(
1044 	type_T	*actual,
1045 	type_T	*expected,
1046 	int	offset,
1047 	int	arg_idx,
1048 	cctx_T	*cctx,
1049 	int	silent,
1050 	int	actual_is_const)
1051 {
1052     where_T where = WHERE_INIT;
1053 
1054     if (expected == &t_bool && actual != &t_bool
1055 					&& (actual->tt_flags & TTFLAG_BOOL_OK))
1056     {
1057 	// Using "0", "1" or the result of an expression with "&&" or "||" as a
1058 	// boolean is OK but requires a conversion.
1059 	generate_2BOOL(cctx, FALSE, offset);
1060 	return OK;
1061     }
1062 
1063     where.wt_index = arg_idx;
1064     if (check_type(expected, actual, FALSE, where) == OK)
1065 	return OK;
1066 
1067     // If the actual type can be the expected type add a runtime check.
1068     // If it's a constant a runtime check makes no sense.
1069     if ((!actual_is_const || actual == &t_any)
1070 					    && use_typecheck(actual, expected))
1071     {
1072 	generate_TYPECHECK(cctx, expected, offset, arg_idx);
1073 	return OK;
1074     }
1075 
1076     if (!silent)
1077 	arg_type_mismatch(expected, actual, arg_idx);
1078     return FAIL;
1079 }
1080 
1081 /*
1082  * Check that the top of the type stack has a type that can be used as a
1083  * condition.  Give an error and return FAIL if not.
1084  */
1085     static int
1086 bool_on_stack(cctx_T *cctx)
1087 {
1088     garray_T	*stack = &cctx->ctx_type_stack;
1089     type_T	*type;
1090 
1091     type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
1092     if (type == &t_bool)
1093 	return OK;
1094 
1095     if (type == &t_any || type == &t_number || type == &t_number_bool)
1096 	// Number 0 and 1 are OK to use as a bool.  "any" could also be a bool.
1097 	// This requires a runtime type check.
1098 	return generate_COND2BOOL(cctx);
1099 
1100     return need_type(type, &t_bool, -1, 0, cctx, FALSE, FALSE);
1101 }
1102 
1103 /*
1104  * Generate an ISN_PUSHNR instruction.
1105  */
1106     static int
1107 generate_PUSHNR(cctx_T *cctx, varnumber_T number)
1108 {
1109     isn_T	*isn;
1110     garray_T	*stack = &cctx->ctx_type_stack;
1111 
1112     RETURN_OK_IF_SKIP(cctx);
1113     if ((isn = generate_instr_type(cctx, ISN_PUSHNR, &t_number)) == NULL)
1114 	return FAIL;
1115     isn->isn_arg.number = number;
1116 
1117     if (number == 0 || number == 1)
1118 	// A 0 or 1 number can also be used as a bool.
1119 	((type_T **)stack->ga_data)[stack->ga_len - 1] = &t_number_bool;
1120     return OK;
1121 }
1122 
1123 /*
1124  * Generate an ISN_PUSHBOOL instruction.
1125  */
1126     static int
1127 generate_PUSHBOOL(cctx_T *cctx, varnumber_T number)
1128 {
1129     isn_T	*isn;
1130 
1131     RETURN_OK_IF_SKIP(cctx);
1132     if ((isn = generate_instr_type(cctx, ISN_PUSHBOOL, &t_bool)) == NULL)
1133 	return FAIL;
1134     isn->isn_arg.number = number;
1135 
1136     return OK;
1137 }
1138 
1139 /*
1140  * Generate an ISN_PUSHSPEC instruction.
1141  */
1142     static int
1143 generate_PUSHSPEC(cctx_T *cctx, varnumber_T number)
1144 {
1145     isn_T	*isn;
1146 
1147     RETURN_OK_IF_SKIP(cctx);
1148     if ((isn = generate_instr_type(cctx, ISN_PUSHSPEC, &t_special)) == NULL)
1149 	return FAIL;
1150     isn->isn_arg.number = number;
1151 
1152     return OK;
1153 }
1154 
1155 #ifdef FEAT_FLOAT
1156 /*
1157  * Generate an ISN_PUSHF instruction.
1158  */
1159     static int
1160 generate_PUSHF(cctx_T *cctx, float_T fnumber)
1161 {
1162     isn_T	*isn;
1163 
1164     RETURN_OK_IF_SKIP(cctx);
1165     if ((isn = generate_instr_type(cctx, ISN_PUSHF, &t_float)) == NULL)
1166 	return FAIL;
1167     isn->isn_arg.fnumber = fnumber;
1168 
1169     return OK;
1170 }
1171 #endif
1172 
1173 /*
1174  * Generate an ISN_PUSHS instruction.
1175  * Consumes "str".
1176  */
1177     static int
1178 generate_PUSHS(cctx_T *cctx, char_u *str)
1179 {
1180     isn_T	*isn;
1181 
1182     if (cctx->ctx_skip == SKIP_YES)
1183     {
1184 	vim_free(str);
1185 	return OK;
1186     }
1187     if ((isn = generate_instr_type(cctx, ISN_PUSHS, &t_string)) == NULL)
1188 	return FAIL;
1189     isn->isn_arg.string = str;
1190 
1191     return OK;
1192 }
1193 
1194 /*
1195  * Generate an ISN_PUSHCHANNEL instruction.
1196  * Consumes "channel".
1197  */
1198     static int
1199 generate_PUSHCHANNEL(cctx_T *cctx, channel_T *channel)
1200 {
1201     isn_T	*isn;
1202 
1203     RETURN_OK_IF_SKIP(cctx);
1204     if ((isn = generate_instr_type(cctx, ISN_PUSHCHANNEL, &t_channel)) == NULL)
1205 	return FAIL;
1206     isn->isn_arg.channel = channel;
1207 
1208     return OK;
1209 }
1210 
1211 /*
1212  * Generate an ISN_PUSHJOB instruction.
1213  * Consumes "job".
1214  */
1215     static int
1216 generate_PUSHJOB(cctx_T *cctx, job_T *job)
1217 {
1218     isn_T	*isn;
1219 
1220     RETURN_OK_IF_SKIP(cctx);
1221     if ((isn = generate_instr_type(cctx, ISN_PUSHJOB, &t_channel)) == NULL)
1222 	return FAIL;
1223     isn->isn_arg.job = job;
1224 
1225     return OK;
1226 }
1227 
1228 /*
1229  * Generate an ISN_PUSHBLOB instruction.
1230  * Consumes "blob".
1231  */
1232     static int
1233 generate_PUSHBLOB(cctx_T *cctx, blob_T *blob)
1234 {
1235     isn_T	*isn;
1236 
1237     RETURN_OK_IF_SKIP(cctx);
1238     if ((isn = generate_instr_type(cctx, ISN_PUSHBLOB, &t_blob)) == NULL)
1239 	return FAIL;
1240     isn->isn_arg.blob = blob;
1241 
1242     return OK;
1243 }
1244 
1245 /*
1246  * Generate an ISN_PUSHFUNC instruction with name "name".
1247  * Consumes "name".
1248  */
1249     static int
1250 generate_PUSHFUNC(cctx_T *cctx, char_u *name, type_T *type)
1251 {
1252     isn_T	*isn;
1253 
1254     RETURN_OK_IF_SKIP(cctx);
1255     if ((isn = generate_instr_type(cctx, ISN_PUSHFUNC, type)) == NULL)
1256 	return FAIL;
1257     isn->isn_arg.string = name == NULL ? NULL : vim_strsave(name);
1258 
1259     return OK;
1260 }
1261 
1262 /*
1263  * Generate an ISN_GETITEM instruction with "index".
1264  * "with_op" is TRUE for "+=" and other operators, the stack has the current
1265  * value below the list with values.
1266  */
1267     static int
1268 generate_GETITEM(cctx_T *cctx, int index, int with_op)
1269 {
1270     isn_T	*isn;
1271     garray_T	*stack = &cctx->ctx_type_stack;
1272     type_T	*type = ((type_T **)stack->ga_data)[stack->ga_len
1273 							  - (with_op ? 2 : 1)];
1274     type_T	*item_type = &t_any;
1275 
1276     RETURN_OK_IF_SKIP(cctx);
1277 
1278     if (type->tt_type != VAR_LIST)
1279     {
1280 	// cannot happen, caller has checked the type
1281 	emsg(_(e_listreq));
1282 	return FAIL;
1283     }
1284     item_type = type->tt_member;
1285     if ((isn = generate_instr(cctx, ISN_GETITEM)) == NULL)
1286 	return FAIL;
1287     isn->isn_arg.getitem.gi_index = index;
1288     isn->isn_arg.getitem.gi_with_op = with_op;
1289 
1290     // add the item type to the type stack
1291     if (ga_grow(stack, 1) == FAIL)
1292 	return FAIL;
1293     ((type_T **)stack->ga_data)[stack->ga_len] = item_type;
1294     ++stack->ga_len;
1295     return OK;
1296 }
1297 
1298 /*
1299  * Generate an ISN_SLICE instruction with "count".
1300  */
1301     static int
1302 generate_SLICE(cctx_T *cctx, int count)
1303 {
1304     isn_T	*isn;
1305 
1306     RETURN_OK_IF_SKIP(cctx);
1307     if ((isn = generate_instr(cctx, ISN_SLICE)) == NULL)
1308 	return FAIL;
1309     isn->isn_arg.number = count;
1310     return OK;
1311 }
1312 
1313 /*
1314  * Generate an ISN_CHECKLEN instruction with "min_len".
1315  */
1316     static int
1317 generate_CHECKLEN(cctx_T *cctx, int min_len, int more_OK)
1318 {
1319     isn_T	*isn;
1320 
1321     RETURN_OK_IF_SKIP(cctx);
1322 
1323     if ((isn = generate_instr(cctx, ISN_CHECKLEN)) == NULL)
1324 	return FAIL;
1325     isn->isn_arg.checklen.cl_min_len = min_len;
1326     isn->isn_arg.checklen.cl_more_OK = more_OK;
1327 
1328     return OK;
1329 }
1330 
1331 /*
1332  * Generate an ISN_STORE instruction.
1333  */
1334     static int
1335 generate_STORE(cctx_T *cctx, isntype_T isn_type, int idx, char_u *name)
1336 {
1337     isn_T	*isn;
1338 
1339     RETURN_OK_IF_SKIP(cctx);
1340     if ((isn = generate_instr_drop(cctx, isn_type, 1)) == NULL)
1341 	return FAIL;
1342     if (name != NULL)
1343 	isn->isn_arg.string = vim_strsave(name);
1344     else
1345 	isn->isn_arg.number = idx;
1346 
1347     return OK;
1348 }
1349 
1350 /*
1351  * Generate an ISN_STOREOUTER instruction.
1352  */
1353     static int
1354 generate_STOREOUTER(cctx_T *cctx, int idx, int level)
1355 {
1356     isn_T	*isn;
1357 
1358     RETURN_OK_IF_SKIP(cctx);
1359     if ((isn = generate_instr_drop(cctx, ISN_STOREOUTER, 1)) == NULL)
1360 	return FAIL;
1361     isn->isn_arg.outer.outer_idx = idx;
1362     isn->isn_arg.outer.outer_depth = level;
1363 
1364     return OK;
1365 }
1366 
1367 /*
1368  * Generate an ISN_STORENR instruction (short for ISN_PUSHNR + ISN_STORE)
1369  */
1370     static int
1371 generate_STORENR(cctx_T *cctx, int idx, varnumber_T value)
1372 {
1373     isn_T	*isn;
1374 
1375     RETURN_OK_IF_SKIP(cctx);
1376     if ((isn = generate_instr(cctx, ISN_STORENR)) == NULL)
1377 	return FAIL;
1378     isn->isn_arg.storenr.stnr_idx = idx;
1379     isn->isn_arg.storenr.stnr_val = value;
1380 
1381     return OK;
1382 }
1383 
1384 /*
1385  * Generate an ISN_STOREOPT instruction
1386  */
1387     static int
1388 generate_STOREOPT(cctx_T *cctx, char_u *name, int opt_flags)
1389 {
1390     isn_T	*isn;
1391 
1392     RETURN_OK_IF_SKIP(cctx);
1393     if ((isn = generate_instr_drop(cctx, ISN_STOREOPT, 1)) == NULL)
1394 	return FAIL;
1395     isn->isn_arg.storeopt.so_name = vim_strsave(name);
1396     isn->isn_arg.storeopt.so_flags = opt_flags;
1397 
1398     return OK;
1399 }
1400 
1401 /*
1402  * Generate an ISN_LOAD or similar instruction.
1403  */
1404     static int
1405 generate_LOAD(
1406 	cctx_T	    *cctx,
1407 	isntype_T   isn_type,
1408 	int	    idx,
1409 	char_u	    *name,
1410 	type_T	    *type)
1411 {
1412     isn_T	*isn;
1413 
1414     RETURN_OK_IF_SKIP(cctx);
1415     if ((isn = generate_instr_type(cctx, isn_type, type)) == NULL)
1416 	return FAIL;
1417     if (name != NULL)
1418 	isn->isn_arg.string = vim_strsave(name);
1419     else
1420 	isn->isn_arg.number = idx;
1421 
1422     return OK;
1423 }
1424 
1425 /*
1426  * Generate an ISN_LOADOUTER instruction
1427  */
1428     static int
1429 generate_LOADOUTER(
1430 	cctx_T	    *cctx,
1431 	int	    idx,
1432 	int	    nesting,
1433 	type_T	    *type)
1434 {
1435     isn_T	*isn;
1436 
1437     RETURN_OK_IF_SKIP(cctx);
1438     if ((isn = generate_instr_type(cctx, ISN_LOADOUTER, type)) == NULL)
1439 	return FAIL;
1440     isn->isn_arg.outer.outer_idx = idx;
1441     isn->isn_arg.outer.outer_depth = nesting;
1442 
1443     return OK;
1444 }
1445 
1446 /*
1447  * Generate an ISN_LOADV instruction for v:var.
1448  */
1449     static int
1450 generate_LOADV(
1451 	cctx_T	    *cctx,
1452 	char_u	    *name,
1453 	int	    error)
1454 {
1455     int	    di_flags;
1456     int	    vidx = find_vim_var(name, &di_flags);
1457     type_T  *type;
1458 
1459     RETURN_OK_IF_SKIP(cctx);
1460     if (vidx < 0)
1461     {
1462 	if (error)
1463 	    semsg(_(e_variable_not_found_str), name);
1464 	return FAIL;
1465     }
1466     type = typval2type_vimvar(get_vim_var_tv(vidx), cctx->ctx_type_list);
1467 
1468     return generate_LOAD(cctx, ISN_LOADV, vidx, NULL, type);
1469 }
1470 
1471 /*
1472  * Generate an ISN_UNLET instruction.
1473  */
1474     static int
1475 generate_UNLET(cctx_T *cctx, isntype_T isn_type, char_u *name, int forceit)
1476 {
1477     isn_T	*isn;
1478 
1479     RETURN_OK_IF_SKIP(cctx);
1480     if ((isn = generate_instr(cctx, isn_type)) == NULL)
1481 	return FAIL;
1482     isn->isn_arg.unlet.ul_name = vim_strsave(name);
1483     isn->isn_arg.unlet.ul_forceit = forceit;
1484 
1485     return OK;
1486 }
1487 
1488 /*
1489  * Generate an ISN_LOCKCONST instruction.
1490  */
1491     static int
1492 generate_LOCKCONST(cctx_T *cctx)
1493 {
1494     isn_T	*isn;
1495 
1496     RETURN_OK_IF_SKIP(cctx);
1497     if ((isn = generate_instr(cctx, ISN_LOCKCONST)) == NULL)
1498 	return FAIL;
1499     return OK;
1500 }
1501 
1502 /*
1503  * Generate an ISN_LOADS instruction.
1504  */
1505     static int
1506 generate_OLDSCRIPT(
1507 	cctx_T	    *cctx,
1508 	isntype_T   isn_type,
1509 	char_u	    *name,
1510 	int	    sid,
1511 	type_T	    *type)
1512 {
1513     isn_T	*isn;
1514 
1515     RETURN_OK_IF_SKIP(cctx);
1516     if (isn_type == ISN_LOADS)
1517 	isn = generate_instr_type(cctx, isn_type, type);
1518     else
1519 	isn = generate_instr_drop(cctx, isn_type, 1);
1520     if (isn == NULL)
1521 	return FAIL;
1522     isn->isn_arg.loadstore.ls_name = vim_strsave(name);
1523     isn->isn_arg.loadstore.ls_sid = sid;
1524 
1525     return OK;
1526 }
1527 
1528 /*
1529  * Generate an ISN_LOADSCRIPT or ISN_STORESCRIPT instruction.
1530  */
1531     static int
1532 generate_VIM9SCRIPT(
1533 	cctx_T	    *cctx,
1534 	isntype_T   isn_type,
1535 	int	    sid,
1536 	int	    idx,
1537 	type_T	    *type)
1538 {
1539     isn_T	*isn;
1540     scriptref_T	*sref;
1541     scriptitem_T *si = SCRIPT_ITEM(sid);
1542 
1543     RETURN_OK_IF_SKIP(cctx);
1544     if (isn_type == ISN_LOADSCRIPT)
1545 	isn = generate_instr_type(cctx, isn_type, type);
1546     else
1547 	isn = generate_instr_drop(cctx, isn_type, 1);
1548     if (isn == NULL)
1549 	return FAIL;
1550 
1551     // This requires three arguments, which doesn't fit in an instruction, thus
1552     // we need to allocate a struct for this.
1553     sref = ALLOC_ONE(scriptref_T);
1554     if (sref == NULL)
1555 	return FAIL;
1556     isn->isn_arg.script.scriptref = sref;
1557     sref->sref_sid = sid;
1558     sref->sref_idx = idx;
1559     sref->sref_seq = si->sn_script_seq;
1560     sref->sref_type = type;
1561     return OK;
1562 }
1563 
1564 /*
1565  * Generate an ISN_NEWLIST instruction.
1566  */
1567     static int
1568 generate_NEWLIST(cctx_T *cctx, int count)
1569 {
1570     isn_T	*isn;
1571     garray_T	*stack = &cctx->ctx_type_stack;
1572     type_T	*type;
1573     type_T	*member;
1574 
1575     RETURN_OK_IF_SKIP(cctx);
1576     if ((isn = generate_instr(cctx, ISN_NEWLIST)) == NULL)
1577 	return FAIL;
1578     isn->isn_arg.number = count;
1579 
1580     // get the member type from all the items on the stack.
1581     if (count == 0)
1582 	member = &t_void;
1583     else
1584 	member = get_member_type_from_stack(
1585 	    ((type_T **)stack->ga_data) + stack->ga_len, count, 1,
1586 							  cctx->ctx_type_list);
1587     type = get_list_type(member, cctx->ctx_type_list);
1588 
1589     // drop the value types
1590     stack->ga_len -= count;
1591 
1592     // add the list type to the type stack
1593     if (ga_grow(stack, 1) == FAIL)
1594 	return FAIL;
1595     ((type_T **)stack->ga_data)[stack->ga_len] = type;
1596     ++stack->ga_len;
1597 
1598     return OK;
1599 }
1600 
1601 /*
1602  * Generate an ISN_NEWDICT instruction.
1603  */
1604     static int
1605 generate_NEWDICT(cctx_T *cctx, int count)
1606 {
1607     isn_T	*isn;
1608     garray_T	*stack = &cctx->ctx_type_stack;
1609     type_T	*type;
1610     type_T	*member;
1611 
1612     RETURN_OK_IF_SKIP(cctx);
1613     if ((isn = generate_instr(cctx, ISN_NEWDICT)) == NULL)
1614 	return FAIL;
1615     isn->isn_arg.number = count;
1616 
1617     if (count == 0)
1618 	member = &t_void;
1619     else
1620 	member = get_member_type_from_stack(
1621 	    ((type_T **)stack->ga_data) + stack->ga_len, count, 2,
1622 							  cctx->ctx_type_list);
1623     type = get_dict_type(member, cctx->ctx_type_list);
1624 
1625     // drop the key and value types
1626     stack->ga_len -= 2 * count;
1627 
1628     // add the dict type to the type stack
1629     if (ga_grow(stack, 1) == FAIL)
1630 	return FAIL;
1631     ((type_T **)stack->ga_data)[stack->ga_len] = type;
1632     ++stack->ga_len;
1633 
1634     return OK;
1635 }
1636 
1637 /*
1638  * Generate an ISN_FUNCREF instruction.
1639  */
1640     static int
1641 generate_FUNCREF(cctx_T *cctx, ufunc_T *ufunc)
1642 {
1643     isn_T	*isn;
1644     garray_T	*stack = &cctx->ctx_type_stack;
1645 
1646     RETURN_OK_IF_SKIP(cctx);
1647     if ((isn = generate_instr(cctx, ISN_FUNCREF)) == NULL)
1648 	return FAIL;
1649     isn->isn_arg.funcref.fr_func = ufunc->uf_dfunc_idx;
1650     cctx->ctx_has_closure = 1;
1651 
1652     // If the referenced function is a closure, it may use items further up in
1653     // the nested context, including this one.
1654     if (ufunc->uf_flags & FC_CLOSURE)
1655 	cctx->ctx_ufunc->uf_flags |= FC_CLOSURE;
1656 
1657     if (ga_grow(stack, 1) == FAIL)
1658 	return FAIL;
1659     ((type_T **)stack->ga_data)[stack->ga_len] =
1660 	       ufunc->uf_func_type == NULL ? &t_func_any : ufunc->uf_func_type;
1661     ++stack->ga_len;
1662 
1663     return OK;
1664 }
1665 
1666 /*
1667  * Generate an ISN_NEWFUNC instruction.
1668  * "lambda_name" and "func_name" must be in allocated memory and will be
1669  * consumed.
1670  */
1671     static int
1672 generate_NEWFUNC(cctx_T *cctx, char_u *lambda_name, char_u *func_name)
1673 {
1674     isn_T	*isn;
1675 
1676     if (cctx->ctx_skip == SKIP_YES)
1677     {
1678 	vim_free(lambda_name);
1679 	vim_free(func_name);
1680 	return OK;
1681     }
1682     if ((isn = generate_instr(cctx, ISN_NEWFUNC)) == NULL)
1683     {
1684 	vim_free(lambda_name);
1685 	vim_free(func_name);
1686 	return FAIL;
1687     }
1688     isn->isn_arg.newfunc.nf_lambda = lambda_name;
1689     isn->isn_arg.newfunc.nf_global = func_name;
1690 
1691     return OK;
1692 }
1693 
1694 /*
1695  * Generate an ISN_DEF instruction: list functions
1696  */
1697     static int
1698 generate_DEF(cctx_T *cctx, char_u *name, size_t len)
1699 {
1700     isn_T	*isn;
1701 
1702     RETURN_OK_IF_SKIP(cctx);
1703     if ((isn = generate_instr(cctx, ISN_DEF)) == NULL)
1704 	return FAIL;
1705     if (len > 0)
1706     {
1707 	isn->isn_arg.string = vim_strnsave(name, len);
1708 	if (isn->isn_arg.string == NULL)
1709 	    return FAIL;
1710     }
1711     return OK;
1712 }
1713 
1714 /*
1715  * Generate an ISN_JUMP instruction.
1716  */
1717     static int
1718 generate_JUMP(cctx_T *cctx, jumpwhen_T when, int where)
1719 {
1720     isn_T	*isn;
1721     garray_T	*stack = &cctx->ctx_type_stack;
1722 
1723     RETURN_OK_IF_SKIP(cctx);
1724     if ((isn = generate_instr(cctx, ISN_JUMP)) == NULL)
1725 	return FAIL;
1726     isn->isn_arg.jump.jump_when = when;
1727     isn->isn_arg.jump.jump_where = where;
1728 
1729     if (when != JUMP_ALWAYS && stack->ga_len > 0)
1730 	--stack->ga_len;
1731 
1732     return OK;
1733 }
1734 
1735 /*
1736  * Generate an ISN_JUMP_IF_ARG_SET instruction.
1737  */
1738     static int
1739 generate_JUMP_IF_ARG_SET(cctx_T *cctx, int arg_off)
1740 {
1741     isn_T	*isn;
1742 
1743     RETURN_OK_IF_SKIP(cctx);
1744     if ((isn = generate_instr(cctx, ISN_JUMP_IF_ARG_SET)) == NULL)
1745 	return FAIL;
1746     isn->isn_arg.jumparg.jump_arg_off = arg_off;
1747     // jump_where is set later
1748     return OK;
1749 }
1750 
1751     static int
1752 generate_FOR(cctx_T *cctx, int loop_idx)
1753 {
1754     isn_T	*isn;
1755     garray_T	*stack = &cctx->ctx_type_stack;
1756 
1757     RETURN_OK_IF_SKIP(cctx);
1758     if ((isn = generate_instr(cctx, ISN_FOR)) == NULL)
1759 	return FAIL;
1760     isn->isn_arg.forloop.for_idx = loop_idx;
1761 
1762     if (ga_grow(stack, 1) == FAIL)
1763 	return FAIL;
1764     // type doesn't matter, will be stored next
1765     ((type_T **)stack->ga_data)[stack->ga_len] = &t_any;
1766     ++stack->ga_len;
1767 
1768     return OK;
1769 }
1770 /*
1771  * Generate an ISN_TRYCONT instruction.
1772  */
1773     static int
1774 generate_TRYCONT(cctx_T *cctx, int levels, int where)
1775 {
1776     isn_T	*isn;
1777 
1778     RETURN_OK_IF_SKIP(cctx);
1779     if ((isn = generate_instr(cctx, ISN_TRYCONT)) == NULL)
1780 	return FAIL;
1781     isn->isn_arg.trycont.tct_levels = levels;
1782     isn->isn_arg.trycont.tct_where = where;
1783 
1784     return OK;
1785 }
1786 
1787 
1788 /*
1789  * Generate an ISN_BCALL instruction.
1790  * "method_call" is TRUE for "value->method()"
1791  * Return FAIL if the number of arguments is wrong.
1792  */
1793     static int
1794 generate_BCALL(cctx_T *cctx, int func_idx, int argcount, int method_call)
1795 {
1796     isn_T	*isn;
1797     garray_T	*stack = &cctx->ctx_type_stack;
1798     int		argoff;
1799     type_T	**argtypes = NULL;
1800     type_T	*shuffled_argtypes[MAX_FUNC_ARGS];
1801     type_T	*maptype = NULL;
1802 
1803     RETURN_OK_IF_SKIP(cctx);
1804     argoff = check_internal_func(func_idx, argcount);
1805     if (argoff < 0)
1806 	return FAIL;
1807 
1808     if (method_call && argoff > 1)
1809     {
1810 	if ((isn = generate_instr(cctx, ISN_SHUFFLE)) == NULL)
1811 	    return FAIL;
1812 	isn->isn_arg.shuffle.shfl_item = argcount;
1813 	isn->isn_arg.shuffle.shfl_up = argoff - 1;
1814     }
1815 
1816     if (argcount > 0)
1817     {
1818 	// Check the types of the arguments.
1819 	argtypes = ((type_T **)stack->ga_data) + stack->ga_len - argcount;
1820 	if (method_call && argoff > 1)
1821 	{
1822 	    int i;
1823 
1824 	    for (i = 0; i < argcount; ++i)
1825 		shuffled_argtypes[i] = (i < argoff - 1)
1826 			    ? argtypes[i + 1]
1827 			    : (i == argoff - 1) ? argtypes[0] : argtypes[i];
1828 	    argtypes = shuffled_argtypes;
1829 	}
1830 	if (internal_func_check_arg_types(argtypes, func_idx, argcount,
1831 								 cctx) == FAIL)
1832 	    return FAIL;
1833 	if (internal_func_is_map(func_idx))
1834 	    maptype = *argtypes;
1835     }
1836 
1837     if ((isn = generate_instr(cctx, ISN_BCALL)) == NULL)
1838 	return FAIL;
1839     isn->isn_arg.bfunc.cbf_idx = func_idx;
1840     isn->isn_arg.bfunc.cbf_argcount = argcount;
1841 
1842     // Drop the argument types and push the return type.
1843     stack->ga_len -= argcount;
1844     if (ga_grow(stack, 1) == FAIL)
1845 	return FAIL;
1846     ((type_T **)stack->ga_data)[stack->ga_len] =
1847 			  internal_func_ret_type(func_idx, argcount, argtypes);
1848     ++stack->ga_len;
1849 
1850     if (maptype != NULL && maptype->tt_member != NULL
1851 					       && maptype->tt_member != &t_any)
1852 	// Check that map() didn't change the item types.
1853 	generate_TYPECHECK(cctx, maptype, -1, 1);
1854 
1855     return OK;
1856 }
1857 
1858 /*
1859  * Generate an ISN_LISTAPPEND instruction.  Works like add().
1860  * Argument count is already checked.
1861  */
1862     static int
1863 generate_LISTAPPEND(cctx_T *cctx)
1864 {
1865     garray_T	*stack = &cctx->ctx_type_stack;
1866     type_T	*list_type;
1867     type_T	*item_type;
1868     type_T	*expected;
1869 
1870     // Caller already checked that list_type is a list.
1871     list_type = ((type_T **)stack->ga_data)[stack->ga_len - 2];
1872     item_type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
1873     expected = list_type->tt_member;
1874     if (need_type(item_type, expected, -1, 0, cctx, FALSE, FALSE) == FAIL)
1875 	return FAIL;
1876 
1877     if (generate_instr(cctx, ISN_LISTAPPEND) == NULL)
1878 	return FAIL;
1879 
1880     --stack->ga_len;	    // drop the argument
1881     return OK;
1882 }
1883 
1884 /*
1885  * Generate an ISN_BLOBAPPEND instruction.  Works like add().
1886  * Argument count is already checked.
1887  */
1888     static int
1889 generate_BLOBAPPEND(cctx_T *cctx)
1890 {
1891     garray_T	*stack = &cctx->ctx_type_stack;
1892     type_T	*item_type;
1893 
1894     // Caller already checked that blob_type is a blob.
1895     item_type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
1896     if (need_type(item_type, &t_number, -1, 0, cctx, FALSE, FALSE) == FAIL)
1897 	return FAIL;
1898 
1899     if (generate_instr(cctx, ISN_BLOBAPPEND) == NULL)
1900 	return FAIL;
1901 
1902     --stack->ga_len;	    // drop the argument
1903     return OK;
1904 }
1905 
1906 /*
1907  * Return TRUE if "ufunc" should be compiled, taking into account whether
1908  * "profile" indicates profiling is to be done.
1909  */
1910     int
1911 func_needs_compiling(ufunc_T *ufunc, compiletype_T compile_type)
1912 {
1913     switch (ufunc->uf_def_status)
1914     {
1915 	case UF_TO_BE_COMPILED:
1916 	    return TRUE;
1917 
1918 	case UF_COMPILED:
1919 	{
1920 	    dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data)
1921 							 + ufunc->uf_dfunc_idx;
1922 
1923 	    switch (compile_type)
1924 	    {
1925 		case CT_PROFILE:
1926 #ifdef FEAT_PROFILE
1927 		    return dfunc->df_instr_prof == NULL;
1928 #endif
1929 		case CT_NONE:
1930 		    return dfunc->df_instr == NULL;
1931 		case CT_DEBUG:
1932 		    return dfunc->df_instr_debug == NULL;
1933 	    }
1934 	}
1935 
1936 	case UF_NOT_COMPILED:
1937 	case UF_COMPILE_ERROR:
1938 	case UF_COMPILING:
1939 	    break;
1940     }
1941     return FALSE;
1942 }
1943 
1944 /*
1945  * Generate an ISN_DCALL or ISN_UCALL instruction.
1946  * Return FAIL if the number of arguments is wrong.
1947  */
1948     static int
1949 generate_CALL(cctx_T *cctx, ufunc_T *ufunc, int pushed_argcount)
1950 {
1951     isn_T	*isn;
1952     garray_T	*stack = &cctx->ctx_type_stack;
1953     int		regular_args = ufunc->uf_args.ga_len;
1954     int		argcount = pushed_argcount;
1955 
1956     RETURN_OK_IF_SKIP(cctx);
1957     if (argcount > regular_args && !has_varargs(ufunc))
1958     {
1959 	semsg(_(e_toomanyarg), printable_func_name(ufunc));
1960 	return FAIL;
1961     }
1962     if (argcount < regular_args - ufunc->uf_def_args.ga_len)
1963     {
1964 	semsg(_(e_toofewarg), printable_func_name(ufunc));
1965 	return FAIL;
1966     }
1967 
1968     if (ufunc->uf_def_status != UF_NOT_COMPILED
1969 	    && ufunc->uf_def_status != UF_COMPILE_ERROR)
1970     {
1971 	int		i;
1972 
1973 	for (i = 0; i < argcount; ++i)
1974 	{
1975 	    type_T *expected;
1976 	    type_T *actual;
1977 
1978 	    actual = ((type_T **)stack->ga_data)[stack->ga_len - argcount + i];
1979 	    if (actual == &t_special
1980 			      && i >= regular_args - ufunc->uf_def_args.ga_len)
1981 	    {
1982 		// assume v:none used for default argument value
1983 		continue;
1984 	    }
1985 	    if (i < regular_args)
1986 	    {
1987 		if (ufunc->uf_arg_types == NULL)
1988 		    continue;
1989 		expected = ufunc->uf_arg_types[i];
1990 	    }
1991 	    else if (ufunc->uf_va_type == NULL
1992 					   || ufunc->uf_va_type == &t_list_any)
1993 		// possibly a lambda or "...: any"
1994 		expected = &t_any;
1995 	    else
1996 		expected = ufunc->uf_va_type->tt_member;
1997 	    if (need_type(actual, expected, -argcount + i, i + 1, cctx,
1998 							  TRUE, FALSE) == FAIL)
1999 	    {
2000 		arg_type_mismatch(expected, actual, i + 1);
2001 		return FAIL;
2002 	    }
2003 	}
2004 	if (func_needs_compiling(ufunc, COMPILE_TYPE(ufunc))
2005 		&& compile_def_function(ufunc, ufunc->uf_ret_type == NULL,
2006 					    COMPILE_TYPE(ufunc), NULL) == FAIL)
2007 	    return FAIL;
2008     }
2009     if (ufunc->uf_def_status == UF_COMPILE_ERROR)
2010     {
2011 	emsg_funcname(_(e_call_to_function_that_failed_to_compile_str),
2012 							       ufunc->uf_name);
2013 	return FAIL;
2014     }
2015 
2016     if ((isn = generate_instr(cctx,
2017 		    ufunc->uf_def_status != UF_NOT_COMPILED ? ISN_DCALL
2018 							 : ISN_UCALL)) == NULL)
2019 	return FAIL;
2020     if (isn->isn_type == ISN_DCALL)
2021     {
2022 	isn->isn_arg.dfunc.cdf_idx = ufunc->uf_dfunc_idx;
2023 	isn->isn_arg.dfunc.cdf_argcount = argcount;
2024     }
2025     else
2026     {
2027 	// A user function may be deleted and redefined later, can't use the
2028 	// ufunc pointer, need to look it up again at runtime.
2029 	isn->isn_arg.ufunc.cuf_name = vim_strsave(ufunc->uf_name);
2030 	isn->isn_arg.ufunc.cuf_argcount = argcount;
2031     }
2032 
2033     stack->ga_len -= argcount; // drop the arguments
2034     if (ga_grow(stack, 1) == FAIL)
2035 	return FAIL;
2036     // add return value
2037     ((type_T **)stack->ga_data)[stack->ga_len] = ufunc->uf_ret_type;
2038     ++stack->ga_len;
2039 
2040     return OK;
2041 }
2042 
2043 /*
2044  * Generate an ISN_UCALL instruction when the function isn't defined yet.
2045  */
2046     static int
2047 generate_UCALL(cctx_T *cctx, char_u *name, int argcount)
2048 {
2049     isn_T	*isn;
2050     garray_T	*stack = &cctx->ctx_type_stack;
2051 
2052     RETURN_OK_IF_SKIP(cctx);
2053     if ((isn = generate_instr(cctx, ISN_UCALL)) == NULL)
2054 	return FAIL;
2055     isn->isn_arg.ufunc.cuf_name = vim_strsave(name);
2056     isn->isn_arg.ufunc.cuf_argcount = argcount;
2057 
2058     stack->ga_len -= argcount; // drop the arguments
2059     if (ga_grow(stack, 1) == FAIL)
2060 	return FAIL;
2061     // add return value
2062     ((type_T **)stack->ga_data)[stack->ga_len] = &t_any;
2063     ++stack->ga_len;
2064 
2065     return OK;
2066 }
2067 
2068 /*
2069  * Generate an ISN_PCALL instruction.
2070  * "type" is the type of the FuncRef.
2071  */
2072     static int
2073 generate_PCALL(
2074 	cctx_T	*cctx,
2075 	int	argcount,
2076 	char_u	*name,
2077 	type_T	*type,
2078 	int	at_top)
2079 {
2080     isn_T	*isn;
2081     garray_T	*stack = &cctx->ctx_type_stack;
2082     type_T	*ret_type;
2083 
2084     RETURN_OK_IF_SKIP(cctx);
2085 
2086     if (type->tt_type == VAR_ANY)
2087 	ret_type = &t_any;
2088     else if (type->tt_type == VAR_FUNC || type->tt_type == VAR_PARTIAL)
2089     {
2090 	if (type->tt_argcount != -1)
2091 	{
2092 	    int	    varargs = (type->tt_flags & TTFLAG_VARARGS) ? 1 : 0;
2093 
2094 	    if (argcount < type->tt_min_argcount - varargs)
2095 	    {
2096 		semsg(_(e_toofewarg), name);
2097 		return FAIL;
2098 	    }
2099 	    if (!varargs && argcount > type->tt_argcount)
2100 	    {
2101 		semsg(_(e_toomanyarg), name);
2102 		return FAIL;
2103 	    }
2104 	    if (type->tt_args != NULL)
2105 	    {
2106 		int i;
2107 
2108 		for (i = 0; i < argcount; ++i)
2109 		{
2110 		    int	    offset = -argcount + i - (at_top ? 0 : 1);
2111 		    type_T *actual = ((type_T **)stack->ga_data)[
2112 						       stack->ga_len + offset];
2113 		    type_T *expected;
2114 
2115 		    if (varargs && i >= type->tt_argcount - 1)
2116 			expected = type->tt_args[
2117 					     type->tt_argcount - 1]->tt_member;
2118 		    else if (i >= type->tt_min_argcount
2119 						       && actual == &t_special)
2120 			expected = &t_any;
2121 		    else
2122 			expected = type->tt_args[i];
2123 		    if (need_type(actual, expected, offset, i + 1,
2124 						    cctx, TRUE, FALSE) == FAIL)
2125 		    {
2126 			arg_type_mismatch(expected, actual, i + 1);
2127 			return FAIL;
2128 		    }
2129 		}
2130 	    }
2131 	}
2132 	ret_type = type->tt_member;
2133 	if (ret_type == &t_unknown)
2134 	    // return type not known yet, use a runtime check
2135 	    ret_type = &t_any;
2136     }
2137     else
2138     {
2139 	semsg(_(e_not_callable_type_str), name);
2140 	return FAIL;
2141     }
2142 
2143     if ((isn = generate_instr(cctx, ISN_PCALL)) == NULL)
2144 	return FAIL;
2145     isn->isn_arg.pfunc.cpf_top = at_top;
2146     isn->isn_arg.pfunc.cpf_argcount = argcount;
2147 
2148     stack->ga_len -= argcount; // drop the arguments
2149 
2150     // drop the funcref/partial, get back the return value
2151     ((type_T **)stack->ga_data)[stack->ga_len - 1] = ret_type;
2152 
2153     // If partial is above the arguments it must be cleared and replaced with
2154     // the return value.
2155     if (at_top && generate_instr(cctx, ISN_PCALL_END) == NULL)
2156 	return FAIL;
2157 
2158     return OK;
2159 }
2160 
2161 /*
2162  * Generate an ISN_STRINGMEMBER instruction.
2163  */
2164     static int
2165 generate_STRINGMEMBER(cctx_T *cctx, char_u *name, size_t len)
2166 {
2167     isn_T	*isn;
2168     garray_T	*stack = &cctx->ctx_type_stack;
2169     type_T	*type;
2170 
2171     RETURN_OK_IF_SKIP(cctx);
2172     if ((isn = generate_instr(cctx, ISN_STRINGMEMBER)) == NULL)
2173 	return FAIL;
2174     isn->isn_arg.string = vim_strnsave(name, len);
2175 
2176     // check for dict type
2177     type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
2178     if (type->tt_type != VAR_DICT && type != &t_any)
2179     {
2180 	char *tofree;
2181 
2182 	semsg(_(e_expected_dictionary_for_using_key_str_but_got_str),
2183 					       name, type_name(type, &tofree));
2184 	vim_free(tofree);
2185 	return FAIL;
2186     }
2187     // change dict type to dict member type
2188     if (type->tt_type == VAR_DICT)
2189     {
2190 	((type_T **)stack->ga_data)[stack->ga_len - 1] =
2191 		      type->tt_member == &t_unknown ? &t_any : type->tt_member;
2192     }
2193 
2194     return OK;
2195 }
2196 
2197 /*
2198  * Generate an ISN_ECHO instruction.
2199  */
2200     static int
2201 generate_ECHO(cctx_T *cctx, int with_white, int count)
2202 {
2203     isn_T	*isn;
2204 
2205     RETURN_OK_IF_SKIP(cctx);
2206     if ((isn = generate_instr_drop(cctx, ISN_ECHO, count)) == NULL)
2207 	return FAIL;
2208     isn->isn_arg.echo.echo_with_white = with_white;
2209     isn->isn_arg.echo.echo_count = count;
2210 
2211     return OK;
2212 }
2213 
2214 /*
2215  * Generate an ISN_EXECUTE/ISN_ECHOMSG/ISN_ECHOERR instruction.
2216  */
2217     static int
2218 generate_MULT_EXPR(cctx_T *cctx, isntype_T isn_type, int count)
2219 {
2220     isn_T	*isn;
2221 
2222     if ((isn = generate_instr_drop(cctx, isn_type, count)) == NULL)
2223 	return FAIL;
2224     isn->isn_arg.number = count;
2225 
2226     return OK;
2227 }
2228 
2229 /*
2230  * Generate an ISN_PUT instruction.
2231  */
2232     static int
2233 generate_PUT(cctx_T *cctx, int regname, linenr_T lnum)
2234 {
2235     isn_T	*isn;
2236 
2237     RETURN_OK_IF_SKIP(cctx);
2238     if ((isn = generate_instr(cctx, ISN_PUT)) == NULL)
2239 	return FAIL;
2240     isn->isn_arg.put.put_regname = regname;
2241     isn->isn_arg.put.put_lnum = lnum;
2242     return OK;
2243 }
2244 
2245     static int
2246 generate_EXEC(cctx_T *cctx, char_u *line)
2247 {
2248     isn_T	*isn;
2249 
2250     RETURN_OK_IF_SKIP(cctx);
2251     if ((isn = generate_instr(cctx, ISN_EXEC)) == NULL)
2252 	return FAIL;
2253     isn->isn_arg.string = vim_strsave(line);
2254     return OK;
2255 }
2256 
2257     static int
2258 generate_LEGACY_EVAL(cctx_T *cctx, char_u *line)
2259 {
2260     isn_T	*isn;
2261     garray_T	*stack = &cctx->ctx_type_stack;
2262 
2263     RETURN_OK_IF_SKIP(cctx);
2264     if ((isn = generate_instr(cctx, ISN_LEGACY_EVAL)) == NULL)
2265 	return FAIL;
2266     isn->isn_arg.string = vim_strsave(line);
2267 
2268     if (ga_grow(stack, 1) == FAIL)
2269 	return FAIL;
2270     ((type_T **)stack->ga_data)[stack->ga_len] = &t_any;
2271     ++stack->ga_len;
2272 
2273     return OK;
2274 }
2275 
2276     static int
2277 generate_EXECCONCAT(cctx_T *cctx, int count)
2278 {
2279     isn_T	*isn;
2280 
2281     if ((isn = generate_instr_drop(cctx, ISN_EXECCONCAT, count)) == NULL)
2282 	return FAIL;
2283     isn->isn_arg.number = count;
2284     return OK;
2285 }
2286 
2287 /*
2288  * Generate ISN_RANGE.  Consumes "range".  Return OK/FAIL.
2289  */
2290     static int
2291 generate_RANGE(cctx_T *cctx, char_u *range)
2292 {
2293     isn_T	*isn;
2294     garray_T	*stack = &cctx->ctx_type_stack;
2295 
2296     if ((isn = generate_instr(cctx, ISN_RANGE)) == NULL)
2297 	return FAIL;
2298     isn->isn_arg.string = range;
2299 
2300     if (ga_grow(stack, 1) == FAIL)
2301 	return FAIL;
2302     ((type_T **)stack->ga_data)[stack->ga_len] = &t_number;
2303     ++stack->ga_len;
2304     return OK;
2305 }
2306 
2307     static int
2308 generate_UNPACK(cctx_T *cctx, int var_count, int semicolon)
2309 {
2310     isn_T	*isn;
2311 
2312     RETURN_OK_IF_SKIP(cctx);
2313     if ((isn = generate_instr(cctx, ISN_UNPACK)) == NULL)
2314 	return FAIL;
2315     isn->isn_arg.unpack.unp_count = var_count;
2316     isn->isn_arg.unpack.unp_semicolon = semicolon;
2317     return OK;
2318 }
2319 
2320 /*
2321  * Generate an instruction for any command modifiers.
2322  */
2323     static int
2324 generate_cmdmods(cctx_T *cctx, cmdmod_T *cmod)
2325 {
2326     isn_T	*isn;
2327 
2328     if (has_cmdmod(cmod))
2329     {
2330 	cctx->ctx_has_cmdmod = TRUE;
2331 
2332 	if ((isn = generate_instr(cctx, ISN_CMDMOD)) == NULL)
2333 	    return FAIL;
2334 	isn->isn_arg.cmdmod.cf_cmdmod = ALLOC_ONE(cmdmod_T);
2335 	if (isn->isn_arg.cmdmod.cf_cmdmod == NULL)
2336 	    return FAIL;
2337 	mch_memmove(isn->isn_arg.cmdmod.cf_cmdmod, cmod, sizeof(cmdmod_T));
2338 	// filter program now belongs to the instruction
2339 	cmod->cmod_filter_regmatch.regprog = NULL;
2340     }
2341 
2342     return OK;
2343 }
2344 
2345     static int
2346 generate_undo_cmdmods(cctx_T *cctx)
2347 {
2348     if (cctx->ctx_has_cmdmod && generate_instr(cctx, ISN_CMDMOD_REV) == NULL)
2349 	return FAIL;
2350     cctx->ctx_has_cmdmod = FALSE;
2351     return OK;
2352 }
2353 
2354     static int
2355 misplaced_cmdmod(cctx_T *cctx)
2356 {
2357     garray_T	*instr = &cctx->ctx_instr;
2358 
2359     if (cctx->ctx_has_cmdmod
2360 	    && ((isn_T *)instr->ga_data)[instr->ga_len - 1].isn_type
2361 								 == ISN_CMDMOD)
2362     {
2363 	emsg(_(e_misplaced_command_modifier));
2364 	return TRUE;
2365     }
2366     return FALSE;
2367 }
2368 
2369 /*
2370  * Get the index of the current instruction.
2371  * This compenstates for a preceding ISN_CMDMOD and ISN_PROF_START.
2372  */
2373     static int
2374 current_instr_idx(cctx_T *cctx)
2375 {
2376     garray_T	*instr = &cctx->ctx_instr;
2377     int		idx = instr->ga_len;
2378 
2379     while (idx > 0)
2380     {
2381 	if (cctx->ctx_has_cmdmod && ((isn_T *)instr->ga_data)[idx - 1]
2382 						       .isn_type == ISN_CMDMOD)
2383 	{
2384 	    --idx;
2385 	    continue;
2386 	}
2387 #ifdef FEAT_PROFILE
2388 	if (((isn_T *)instr->ga_data)[idx - 1].isn_type == ISN_PROF_START)
2389 	{
2390 	    --idx;
2391 	    continue;
2392 	}
2393 #endif
2394 	if (((isn_T *)instr->ga_data)[idx - 1].isn_type == ISN_DEBUG)
2395 	{
2396 	    --idx;
2397 	    continue;
2398 	}
2399 	break;
2400     }
2401     return idx;
2402 }
2403 
2404 #ifdef FEAT_PROFILE
2405     static void
2406 may_generate_prof_end(cctx_T *cctx, int prof_lnum)
2407 {
2408     if (cctx->ctx_compile_type == CT_PROFILE && prof_lnum >= 0)
2409 	generate_instr(cctx, ISN_PROF_END);
2410 }
2411 #endif
2412 
2413 /*
2414  * Reserve space for a local variable.
2415  * Return the variable or NULL if it failed.
2416  */
2417     static lvar_T *
2418 reserve_local(
2419 	cctx_T	*cctx,
2420 	char_u	*name,
2421 	size_t	len,
2422 	int	isConst,
2423 	type_T	*type)
2424 {
2425     lvar_T  *lvar;
2426     dfunc_T *dfunc;
2427 
2428     if (arg_exists(name, len, NULL, NULL, NULL, cctx) == OK)
2429     {
2430 	emsg_namelen(_(e_str_is_used_as_argument), name, (int)len);
2431 	return NULL;
2432     }
2433 
2434     if (ga_grow(&cctx->ctx_locals, 1) == FAIL)
2435 	return NULL;
2436     lvar = ((lvar_T *)cctx->ctx_locals.ga_data) + cctx->ctx_locals.ga_len++;
2437     CLEAR_POINTER(lvar);
2438 
2439     // Every local variable uses the next entry on the stack.  We could re-use
2440     // the last ones when leaving a scope, but then variables used in a closure
2441     // might get overwritten.  To keep things simple do not re-use stack
2442     // entries.  This is less efficient, but memory is cheap these days.
2443     dfunc = ((dfunc_T *)def_functions.ga_data) + cctx->ctx_ufunc->uf_dfunc_idx;
2444     lvar->lv_idx = dfunc->df_var_names.ga_len;
2445 
2446     lvar->lv_name = vim_strnsave(name, len == 0 ? STRLEN(name) : len);
2447     lvar->lv_const = isConst;
2448     lvar->lv_type = type;
2449 
2450     // Remember the name for debugging.
2451     if (ga_grow(&dfunc->df_var_names, 1) == FAIL)
2452 	return NULL;
2453     ((char_u **)dfunc->df_var_names.ga_data)[lvar->lv_idx] =
2454 						    vim_strsave(lvar->lv_name);
2455     ++dfunc->df_var_names.ga_len;
2456 
2457     return lvar;
2458 }
2459 
2460 /*
2461  * Remove local variables above "new_top".
2462  */
2463     static void
2464 unwind_locals(cctx_T *cctx, int new_top)
2465 {
2466     if (cctx->ctx_locals.ga_len > new_top)
2467     {
2468 	int	idx;
2469 	lvar_T	*lvar;
2470 
2471 	for (idx = new_top; idx < cctx->ctx_locals.ga_len; ++idx)
2472 	{
2473 	    lvar = ((lvar_T *)cctx->ctx_locals.ga_data) + idx;
2474 	    vim_free(lvar->lv_name);
2475 	}
2476     }
2477     cctx->ctx_locals.ga_len = new_top;
2478 }
2479 
2480 /*
2481  * Free all local variables.
2482  */
2483     static void
2484 free_locals(cctx_T *cctx)
2485 {
2486     unwind_locals(cctx, 0);
2487     ga_clear(&cctx->ctx_locals);
2488 }
2489 
2490 /*
2491  * If "check_writable" is ASSIGN_CONST give an error if the variable was
2492  * defined with :final or :const, if "check_writable" is ASSIGN_FINAL give an
2493  * error if the variable was defined with :const.
2494  */
2495     static int
2496 check_item_writable(svar_T *sv, int check_writable, char_u *name)
2497 {
2498     if ((check_writable == ASSIGN_CONST && sv->sv_const != 0)
2499 	    || (check_writable == ASSIGN_FINAL
2500 					      && sv->sv_const == ASSIGN_CONST))
2501     {
2502 	semsg(_(e_cannot_change_readonly_variable_str), name);
2503 	return FAIL;
2504     }
2505     return OK;
2506 }
2507 
2508 /*
2509  * Find "name" in script-local items of script "sid".
2510  * Pass "check_writable" to check_item_writable().
2511  * Returns the index in "sn_var_vals" if found.
2512  * If found but not in "sn_var_vals" returns -1.
2513  * If not found or the variable is not writable returns -2.
2514  */
2515     int
2516 get_script_item_idx(int sid, char_u *name, int check_writable, cctx_T *cctx)
2517 {
2518     hashtab_T	    *ht;
2519     dictitem_T	    *di;
2520     scriptitem_T    *si = SCRIPT_ITEM(sid);
2521     svar_T	    *sv;
2522     int		    idx;
2523 
2524     if (!SCRIPT_ID_VALID(sid))
2525 	return -1;
2526     if (sid == current_sctx.sc_sid)
2527     {
2528 	sallvar_T *sav = find_script_var(name, 0, cctx);
2529 
2530 	if (sav == NULL)
2531 	    return -2;
2532 	idx = sav->sav_var_vals_idx;
2533 	sv = ((svar_T *)si->sn_var_vals.ga_data) + idx;
2534 	if (check_item_writable(sv, check_writable, name) == FAIL)
2535 	    return -2;
2536 	return idx;
2537     }
2538 
2539     // First look the name up in the hashtable.
2540     ht = &SCRIPT_VARS(sid);
2541     di = find_var_in_ht(ht, 0, name, TRUE);
2542     if (di == NULL)
2543 	return -2;
2544 
2545     // Now find the svar_T index in sn_var_vals.
2546     for (idx = 0; idx < si->sn_var_vals.ga_len; ++idx)
2547     {
2548 	sv = ((svar_T *)si->sn_var_vals.ga_data) + idx;
2549 	if (sv->sv_tv == &di->di_tv)
2550 	{
2551 	    if (check_item_writable(sv, check_writable, name) == FAIL)
2552 		return -2;
2553 	    return idx;
2554 	}
2555     }
2556     return -1;
2557 }
2558 
2559 /*
2560  * Find "name" in imported items of the current script or in "cctx" if not
2561  * NULL.
2562  */
2563     imported_T *
2564 find_imported(char_u *name, size_t len, cctx_T *cctx)
2565 {
2566     int		    idx;
2567 
2568     if (!SCRIPT_ID_VALID(current_sctx.sc_sid))
2569 	return NULL;
2570     if (cctx != NULL)
2571 	for (idx = 0; idx < cctx->ctx_imports.ga_len; ++idx)
2572 	{
2573 	    imported_T *import = ((imported_T *)cctx->ctx_imports.ga_data)
2574 									 + idx;
2575 
2576 	    if (len == 0 ? STRCMP(name, import->imp_name) == 0
2577 			 : STRLEN(import->imp_name) == len
2578 				  && STRNCMP(name, import->imp_name, len) == 0)
2579 		return import;
2580 	}
2581 
2582     return find_imported_in_script(name, len, current_sctx.sc_sid);
2583 }
2584 
2585     imported_T *
2586 find_imported_in_script(char_u *name, size_t len, int sid)
2587 {
2588     scriptitem_T    *si;
2589     int		    idx;
2590 
2591     if (!SCRIPT_ID_VALID(sid))
2592 	return NULL;
2593     si = SCRIPT_ITEM(sid);
2594     for (idx = 0; idx < si->sn_imports.ga_len; ++idx)
2595     {
2596 	imported_T *import = ((imported_T *)si->sn_imports.ga_data) + idx;
2597 
2598 	if (len == 0 ? STRCMP(name, import->imp_name) == 0
2599 		     : STRLEN(import->imp_name) == len
2600 				  && STRNCMP(name, import->imp_name, len) == 0)
2601 	    return import;
2602     }
2603     return NULL;
2604 }
2605 
2606 /*
2607  * Free all imported variables.
2608  */
2609     static void
2610 free_imported(cctx_T *cctx)
2611 {
2612     int idx;
2613 
2614     for (idx = 0; idx < cctx->ctx_imports.ga_len; ++idx)
2615     {
2616 	imported_T *import = ((imported_T *)cctx->ctx_imports.ga_data) + idx;
2617 
2618 	vim_free(import->imp_name);
2619     }
2620     ga_clear(&cctx->ctx_imports);
2621 }
2622 
2623 /*
2624  * Return a pointer to the next line that isn't empty or only contains a
2625  * comment. Skips over white space.
2626  * Returns NULL if there is none.
2627  */
2628     char_u *
2629 peek_next_line_from_context(cctx_T *cctx)
2630 {
2631     int lnum = cctx->ctx_lnum;
2632 
2633     while (++lnum < cctx->ctx_ufunc->uf_lines.ga_len)
2634     {
2635 	char_u *line = ((char_u **)cctx->ctx_ufunc->uf_lines.ga_data)[lnum];
2636 	char_u *p;
2637 
2638 	// ignore NULLs inserted for continuation lines
2639 	if (line != NULL)
2640 	{
2641 	    p = skipwhite(line);
2642 	    if (vim9_bad_comment(p))
2643 		return NULL;
2644 	    if (*p != NUL && !vim9_comment_start(p))
2645 		return p;
2646 	}
2647     }
2648     return NULL;
2649 }
2650 
2651 /*
2652  * Called when checking for a following operator at "arg".  When the rest of
2653  * the line is empty or only a comment, peek the next line.  If there is a next
2654  * line return a pointer to it and set "nextp".
2655  * Otherwise skip over white space.
2656  */
2657     static char_u *
2658 may_peek_next_line(cctx_T *cctx, char_u *arg, char_u **nextp)
2659 {
2660     char_u *p = skipwhite(arg);
2661 
2662     *nextp = NULL;
2663     if (*p == NUL || (VIM_ISWHITE(*arg) && vim9_comment_start(p)))
2664     {
2665 	*nextp = peek_next_line_from_context(cctx);
2666 	if (*nextp != NULL)
2667 	    return *nextp;
2668     }
2669     return p;
2670 }
2671 
2672 /*
2673  * Get the next line of the function from "cctx".
2674  * Skips over empty lines.  Skips over comment lines if "skip_comment" is TRUE.
2675  * Returns NULL when at the end.
2676  */
2677     char_u *
2678 next_line_from_context(cctx_T *cctx, int skip_comment)
2679 {
2680     char_u	*line;
2681 
2682     do
2683     {
2684 	++cctx->ctx_lnum;
2685 	if (cctx->ctx_lnum >= cctx->ctx_ufunc->uf_lines.ga_len)
2686 	{
2687 	    line = NULL;
2688 	    break;
2689 	}
2690 	line = ((char_u **)cctx->ctx_ufunc->uf_lines.ga_data)[cctx->ctx_lnum];
2691 	cctx->ctx_line_start = line;
2692 	SOURCING_LNUM = cctx->ctx_lnum + 1;
2693     } while (line == NULL || *skipwhite(line) == NUL
2694 		     || (skip_comment && vim9_comment_start(skipwhite(line))));
2695     return line;
2696 }
2697 
2698 /*
2699  * Skip over white space at "whitep" and assign to "*arg".
2700  * If "*arg" is at the end of the line, advance to the next line.
2701  * Also when "whitep" points to white space and "*arg" is on a "#".
2702  * Return FAIL if beyond the last line, "*arg" is unmodified then.
2703  */
2704     static int
2705 may_get_next_line(char_u *whitep, char_u **arg, cctx_T *cctx)
2706 {
2707     *arg = skipwhite(whitep);
2708     if (vim9_bad_comment(*arg))
2709 	return FAIL;
2710     if (**arg == NUL || (VIM_ISWHITE(*whitep) && vim9_comment_start(*arg)))
2711     {
2712 	char_u *next = next_line_from_context(cctx, TRUE);
2713 
2714 	if (next == NULL)
2715 	    return FAIL;
2716 	*arg = skipwhite(next);
2717     }
2718     return OK;
2719 }
2720 
2721 /*
2722  * Idem, and give an error when failed.
2723  */
2724     static int
2725 may_get_next_line_error(char_u *whitep, char_u **arg, cctx_T *cctx)
2726 {
2727     if (may_get_next_line(whitep, arg, cctx) == FAIL)
2728     {
2729 	SOURCING_LNUM = cctx->ctx_lnum + 1;
2730 	emsg(_(e_line_incomplete));
2731 	return FAIL;
2732     }
2733     return OK;
2734 }
2735 
2736 
2737 // Structure passed between the compile_expr* functions to keep track of
2738 // constants that have been parsed but for which no code was produced yet.  If
2739 // possible expressions on these constants are applied at compile time.  If
2740 // that is not possible, the code to push the constants needs to be generated
2741 // before other instructions.
2742 // Using 50 should be more than enough of 5 levels of ().
2743 #define PPSIZE 50
2744 typedef struct {
2745     typval_T	pp_tv[PPSIZE];	// stack of ppconst constants
2746     int		pp_used;	// active entries in pp_tv[]
2747     int		pp_is_const;	// all generated code was constants, used for a
2748 				// list or dict with constant members
2749 } ppconst_T;
2750 
2751 static int compile_expr0_ext(char_u **arg,  cctx_T *cctx, int *is_const);
2752 static int compile_expr0(char_u **arg,  cctx_T *cctx);
2753 static int compile_expr1(char_u **arg,  cctx_T *cctx, ppconst_T *ppconst);
2754 
2755 /*
2756  * Generate a PUSH instruction for "tv".
2757  * "tv" will be consumed or cleared.
2758  * Nothing happens if "tv" is NULL or of type VAR_UNKNOWN;
2759  */
2760     static int
2761 generate_tv_PUSH(cctx_T *cctx, typval_T *tv)
2762 {
2763     if (tv != NULL)
2764     {
2765 	switch (tv->v_type)
2766 	{
2767 	    case VAR_UNKNOWN:
2768 		break;
2769 	    case VAR_BOOL:
2770 		generate_PUSHBOOL(cctx, tv->vval.v_number);
2771 		break;
2772 	    case VAR_SPECIAL:
2773 		generate_PUSHSPEC(cctx, tv->vval.v_number);
2774 		break;
2775 	    case VAR_NUMBER:
2776 		generate_PUSHNR(cctx, tv->vval.v_number);
2777 		break;
2778 #ifdef FEAT_FLOAT
2779 	    case VAR_FLOAT:
2780 		generate_PUSHF(cctx, tv->vval.v_float);
2781 		break;
2782 #endif
2783 	    case VAR_BLOB:
2784 		generate_PUSHBLOB(cctx, tv->vval.v_blob);
2785 		tv->vval.v_blob = NULL;
2786 		break;
2787 	    case VAR_STRING:
2788 		generate_PUSHS(cctx, tv->vval.v_string);
2789 		tv->vval.v_string = NULL;
2790 		break;
2791 	    default:
2792 		iemsg("constant type not supported");
2793 		clear_tv(tv);
2794 		return FAIL;
2795 	}
2796 	tv->v_type = VAR_UNKNOWN;
2797     }
2798     return OK;
2799 }
2800 
2801 /*
2802  * Generate code for any ppconst entries.
2803  */
2804     static int
2805 generate_ppconst(cctx_T *cctx, ppconst_T *ppconst)
2806 {
2807     int	    i;
2808     int	    ret = OK;
2809     int	    save_skip = cctx->ctx_skip;
2810 
2811     cctx->ctx_skip = SKIP_NOT;
2812     for (i = 0; i < ppconst->pp_used; ++i)
2813 	if (generate_tv_PUSH(cctx, &ppconst->pp_tv[i]) == FAIL)
2814 	    ret = FAIL;
2815     ppconst->pp_used = 0;
2816     cctx->ctx_skip = save_skip;
2817     return ret;
2818 }
2819 
2820 /*
2821  * Check that the last item of "ppconst" is a bool.
2822  */
2823     static int
2824 check_ppconst_bool(ppconst_T *ppconst)
2825 {
2826     if (ppconst->pp_used > 0)
2827     {
2828 	typval_T    *tv = &ppconst->pp_tv[ppconst->pp_used - 1];
2829 	where_T	    where = WHERE_INIT;
2830 
2831 	return check_typval_type(&t_bool, tv, where);
2832     }
2833     return OK;
2834 }
2835 
2836 /*
2837  * Clear ppconst constants.  Used when failing.
2838  */
2839     static void
2840 clear_ppconst(ppconst_T *ppconst)
2841 {
2842     int	    i;
2843 
2844     for (i = 0; i < ppconst->pp_used; ++i)
2845 	clear_tv(&ppconst->pp_tv[i]);
2846     ppconst->pp_used = 0;
2847 }
2848 
2849 /*
2850  * Compile getting a member from a list/dict/string/blob.  Stack has the
2851  * indexable value and the index or the two indexes of a slice.
2852  */
2853     static int
2854 compile_member(int is_slice, cctx_T *cctx)
2855 {
2856     type_T	**typep;
2857     garray_T	*stack = &cctx->ctx_type_stack;
2858     vartype_T	vartype;
2859     type_T	*idxtype;
2860 
2861     // We can index a list, dict and blob.  If we don't know the type
2862     // we can use the index value type.  If we still don't know use an "ANY"
2863     // instruction.
2864     typep = ((type_T **)stack->ga_data) + stack->ga_len
2865 						  - (is_slice ? 3 : 2);
2866     vartype = (*typep)->tt_type;
2867     idxtype = ((type_T **)stack->ga_data)[stack->ga_len - 1];
2868     // If the index is a string, the variable must be a Dict.
2869     if (*typep == &t_any && idxtype == &t_string)
2870 	vartype = VAR_DICT;
2871     if (vartype == VAR_STRING || vartype == VAR_LIST || vartype == VAR_BLOB)
2872     {
2873 	if (need_type(idxtype, &t_number, -1, 0, cctx, FALSE, FALSE) == FAIL)
2874 	    return FAIL;
2875 	if (is_slice)
2876 	{
2877 	    idxtype = ((type_T **)stack->ga_data)[stack->ga_len - 2];
2878 	    if (need_type(idxtype, &t_number, -2, 0, cctx,
2879 							 FALSE, FALSE) == FAIL)
2880 		return FAIL;
2881 	}
2882     }
2883 
2884     if (vartype == VAR_DICT)
2885     {
2886 	if (is_slice)
2887 	{
2888 	    emsg(_(e_cannot_slice_dictionary));
2889 	    return FAIL;
2890 	}
2891 	if ((*typep)->tt_type == VAR_DICT)
2892 	{
2893 	    *typep = (*typep)->tt_member;
2894 	    if (*typep == &t_unknown)
2895 		// empty dict was used
2896 		*typep = &t_any;
2897 	}
2898 	else
2899 	{
2900 	    if (need_type(*typep, &t_dict_any, -2, 0, cctx,
2901 							 FALSE, FALSE) == FAIL)
2902 		return FAIL;
2903 	    *typep = &t_any;
2904 	}
2905 	if (may_generate_2STRING(-1, FALSE, cctx) == FAIL)
2906 	    return FAIL;
2907 	if (generate_instr_drop(cctx, ISN_MEMBER, 1) == FAIL)
2908 	    return FAIL;
2909     }
2910     else if (vartype == VAR_STRING)
2911     {
2912 	*typep = &t_string;
2913 	if ((is_slice
2914 		? generate_instr_drop(cctx, ISN_STRSLICE, 2)
2915 		: generate_instr_drop(cctx, ISN_STRINDEX, 1)) == FAIL)
2916 	    return FAIL;
2917     }
2918     else if (vartype == VAR_BLOB)
2919     {
2920 	if (is_slice)
2921 	{
2922 	    *typep = &t_blob;
2923 	    if (generate_instr_drop(cctx, ISN_BLOBSLICE, 2) == FAIL)
2924 		return FAIL;
2925 	}
2926 	else
2927 	{
2928 	    *typep = &t_number;
2929 	    if (generate_instr_drop(cctx, ISN_BLOBINDEX, 1) == FAIL)
2930 		return FAIL;
2931 	}
2932     }
2933     else if (vartype == VAR_LIST || *typep == &t_any)
2934     {
2935 	if (is_slice)
2936 	{
2937 	    if (generate_instr_drop(cctx,
2938 		     vartype == VAR_LIST ?  ISN_LISTSLICE : ISN_ANYSLICE,
2939 							    2) == FAIL)
2940 		return FAIL;
2941 	}
2942 	else
2943 	{
2944 	    if ((*typep)->tt_type == VAR_LIST)
2945 	    {
2946 		*typep = (*typep)->tt_member;
2947 		if (*typep == &t_unknown)
2948 		    // empty list was used
2949 		    *typep = &t_any;
2950 	    }
2951 	    if (generate_instr_drop(cctx,
2952 			vartype == VAR_LIST ?  ISN_LISTINDEX : ISN_ANYINDEX, 1)
2953 								       == FAIL)
2954 		return FAIL;
2955 	}
2956     }
2957     else
2958     {
2959 	emsg(_(e_string_list_dict_or_blob_required));
2960 	return FAIL;
2961     }
2962     return OK;
2963 }
2964 
2965 /*
2966  * Generate an instruction to load script-local variable "name", without the
2967  * leading "s:".
2968  * Also finds imported variables.
2969  */
2970     static int
2971 compile_load_scriptvar(
2972 	cctx_T *cctx,
2973 	char_u *name,	    // variable NUL terminated
2974 	char_u *start,	    // start of variable
2975 	char_u **end,	    // end of variable
2976 	int    error)	    // when TRUE may give error
2977 {
2978     scriptitem_T    *si;
2979     int		    idx;
2980     imported_T	    *import;
2981 
2982     if (!SCRIPT_ID_VALID(current_sctx.sc_sid))
2983 	return FAIL;
2984     si = SCRIPT_ITEM(current_sctx.sc_sid);
2985     idx = get_script_item_idx(current_sctx.sc_sid, name, 0, cctx);
2986     if (idx == -1 || si->sn_version != SCRIPT_VERSION_VIM9)
2987     {
2988 	// variable is not in sn_var_vals: old style script.
2989 	return generate_OLDSCRIPT(cctx, ISN_LOADS, name, current_sctx.sc_sid,
2990 								       &t_any);
2991     }
2992     if (idx >= 0)
2993     {
2994 	svar_T		*sv = ((svar_T *)si->sn_var_vals.ga_data) + idx;
2995 
2996 	generate_VIM9SCRIPT(cctx, ISN_LOADSCRIPT,
2997 					current_sctx.sc_sid, idx, sv->sv_type);
2998 	return OK;
2999     }
3000 
3001     import = find_imported(name, 0, cctx);
3002     if (import != NULL)
3003     {
3004 	if (import->imp_flags & IMP_FLAGS_STAR)
3005 	{
3006 	    char_u	*p = skipwhite(*end);
3007 	    char_u	*exp_name;
3008 	    int		cc;
3009 	    ufunc_T	*ufunc;
3010 	    type_T	*type;
3011 
3012 	    // Used "import * as Name", need to lookup the member.
3013 	    if (*p != '.')
3014 	    {
3015 		semsg(_(e_expected_dot_after_name_str), start);
3016 		return FAIL;
3017 	    }
3018 	    ++p;
3019 	    if (VIM_ISWHITE(*p))
3020 	    {
3021 		emsg(_(e_no_white_space_allowed_after_dot));
3022 		return FAIL;
3023 	    }
3024 
3025 	    // isolate one name
3026 	    exp_name = p;
3027 	    while (eval_isnamec(*p))
3028 		++p;
3029 	    cc = *p;
3030 	    *p = NUL;
3031 
3032 	    idx = find_exported(import->imp_sid, exp_name, &ufunc, &type,
3033 								   cctx, TRUE);
3034 	    *p = cc;
3035 	    p = skipwhite(p);
3036 	    *end = p;
3037 
3038 	    if (idx < 0)
3039 	    {
3040 		if (*p == '(' && ufunc != NULL)
3041 		{
3042 		    generate_PUSHFUNC(cctx, ufunc->uf_name, import->imp_type);
3043 		    return OK;
3044 		}
3045 		return FAIL;
3046 	    }
3047 
3048 	    generate_VIM9SCRIPT(cctx, ISN_LOADSCRIPT,
3049 		    import->imp_sid,
3050 		    idx,
3051 		    type);
3052 	}
3053 	else if (import->imp_funcname != NULL)
3054 	    generate_PUSHFUNC(cctx, import->imp_funcname, import->imp_type);
3055 	else
3056 	    generate_VIM9SCRIPT(cctx, ISN_LOADSCRIPT,
3057 		    import->imp_sid,
3058 		    import->imp_var_vals_idx,
3059 		    import->imp_type);
3060 	return OK;
3061     }
3062 
3063     if (error)
3064 	semsg(_(e_item_not_found_str), name);
3065     return FAIL;
3066 }
3067 
3068     static int
3069 generate_funcref(cctx_T *cctx, char_u *name)
3070 {
3071     ufunc_T *ufunc = find_func(name, FALSE, cctx);
3072 
3073     if (ufunc == NULL)
3074 	return FAIL;
3075 
3076     // Need to compile any default values to get the argument types.
3077     if (func_needs_compiling(ufunc, COMPILE_TYPE(ufunc))
3078 	    && compile_def_function(ufunc, TRUE, COMPILE_TYPE(ufunc), NULL)
3079 								       == FAIL)
3080 	return FAIL;
3081     return generate_PUSHFUNC(cctx, ufunc->uf_name, ufunc->uf_func_type);
3082 }
3083 
3084 /*
3085  * Compile a variable name into a load instruction.
3086  * "end" points to just after the name.
3087  * "is_expr" is TRUE when evaluating an expression, might be a funcref.
3088  * When "error" is FALSE do not give an error when not found.
3089  */
3090     static int
3091 compile_load(
3092 	char_u **arg,
3093 	char_u *end_arg,
3094 	cctx_T	*cctx,
3095 	int	is_expr,
3096 	int	error)
3097 {
3098     type_T	*type;
3099     char_u	*name = NULL;
3100     char_u	*end = end_arg;
3101     int		res = FAIL;
3102     int		prev_called_emsg = called_emsg;
3103 
3104     if (*(*arg + 1) == ':')
3105     {
3106 	if (end <= *arg + 2)
3107 	{
3108 	    isntype_T  isn_type;
3109 
3110 	    // load dictionary of namespace
3111 	    switch (**arg)
3112 	    {
3113 		case 'g': isn_type = ISN_LOADGDICT; break;
3114 		case 'w': isn_type = ISN_LOADWDICT; break;
3115 		case 't': isn_type = ISN_LOADTDICT; break;
3116 		case 'b': isn_type = ISN_LOADBDICT; break;
3117 		default:
3118 		    semsg(_(e_namespace_not_supported_str), *arg);
3119 		    goto theend;
3120 	    }
3121 	    if (generate_instr_type(cctx, isn_type, &t_dict_any) == NULL)
3122 		goto theend;
3123 	    res = OK;
3124 	}
3125 	else
3126 	{
3127 	    isntype_T  isn_type = ISN_DROP;
3128 
3129 	    // load namespaced variable
3130 	    name = vim_strnsave(*arg + 2, end - (*arg + 2));
3131 	    if (name == NULL)
3132 		return FAIL;
3133 
3134 	    switch (**arg)
3135 	    {
3136 		case 'v': res = generate_LOADV(cctx, name, error);
3137 			  break;
3138 		case 's': if (is_expr && ASCII_ISUPPER(*name)
3139 				       && find_func(name, FALSE, cctx) != NULL)
3140 			      res = generate_funcref(cctx, name);
3141 			  else
3142 			      res = compile_load_scriptvar(cctx, name,
3143 							    NULL, &end, error);
3144 			  break;
3145 		case 'g': if (vim_strchr(name, AUTOLOAD_CHAR) == NULL)
3146 			  {
3147 			      if (is_expr && ASCII_ISUPPER(*name)
3148 				       && find_func(name, FALSE, cctx) != NULL)
3149 				  res = generate_funcref(cctx, name);
3150 			      else
3151 				  isn_type = ISN_LOADG;
3152 			  }
3153 			  else
3154 			  {
3155 			      isn_type = ISN_LOADAUTO;
3156 			      vim_free(name);
3157 			      name = vim_strnsave(*arg, end - *arg);
3158 			      if (name == NULL)
3159 				  return FAIL;
3160 			  }
3161 			  break;
3162 		case 'w': isn_type = ISN_LOADW; break;
3163 		case 't': isn_type = ISN_LOADT; break;
3164 		case 'b': isn_type = ISN_LOADB; break;
3165 		default:  // cannot happen, just in case
3166 			  semsg(_(e_namespace_not_supported_str), *arg);
3167 			  goto theend;
3168 	    }
3169 	    if (isn_type != ISN_DROP)
3170 	    {
3171 		// Global, Buffer-local, Window-local and Tabpage-local
3172 		// variables can be defined later, thus we don't check if it
3173 		// exists, give an error at runtime.
3174 		res = generate_LOAD(cctx, isn_type, 0, name, &t_any);
3175 	    }
3176 	}
3177     }
3178     else
3179     {
3180 	size_t	    len = end - *arg;
3181 	int	    idx;
3182 	int	    gen_load = FALSE;
3183 	int	    gen_load_outer = 0;
3184 
3185 	name = vim_strnsave(*arg, end - *arg);
3186 	if (name == NULL)
3187 	    return FAIL;
3188 
3189 	if (vim_strchr(name, AUTOLOAD_CHAR) != NULL)
3190 	{
3191 	    script_autoload(name, FALSE);
3192 	    res = generate_LOAD(cctx, ISN_LOADAUTO, 0, name, &t_any);
3193 	}
3194 	else if (arg_exists(*arg, len, &idx, &type, &gen_load_outer, cctx)
3195 									 == OK)
3196 	{
3197 	    if (gen_load_outer == 0)
3198 		gen_load = TRUE;
3199 	}
3200 	else
3201 	{
3202 	    lvar_T lvar;
3203 
3204 	    if (lookup_local(*arg, len, &lvar, cctx) == OK)
3205 	    {
3206 		type = lvar.lv_type;
3207 		idx = lvar.lv_idx;
3208 		if (lvar.lv_from_outer != 0)
3209 		    gen_load_outer = lvar.lv_from_outer;
3210 		else
3211 		    gen_load = TRUE;
3212 	    }
3213 	    else
3214 	    {
3215 		// "var" can be script-local even without using "s:" if it
3216 		// already exists in a Vim9 script or when it's imported.
3217 		if (script_var_exists(*arg, len, cctx) == OK
3218 			|| find_imported(name, 0, cctx) != NULL)
3219 		   res = compile_load_scriptvar(cctx, name, *arg, &end, FALSE);
3220 
3221 		// When evaluating an expression and the name starts with an
3222 		// uppercase letter it can be a user defined function.
3223 		// generate_funcref() will fail if the function can't be found.
3224 		if (res == FAIL && is_expr && ASCII_ISUPPER(*name))
3225 		    res = generate_funcref(cctx, name);
3226 	    }
3227 	}
3228 	if (gen_load)
3229 	    res = generate_LOAD(cctx, ISN_LOAD, idx, NULL, type);
3230 	if (gen_load_outer > 0)
3231 	{
3232 	    res = generate_LOADOUTER(cctx, idx, gen_load_outer, type);
3233 	    cctx->ctx_outer_used = TRUE;
3234 	}
3235     }
3236 
3237     *arg = end;
3238 
3239 theend:
3240     if (res == FAIL && error && called_emsg == prev_called_emsg)
3241 	semsg(_(e_variable_not_found_str), name);
3242     vim_free(name);
3243     return res;
3244 }
3245 
3246     static void
3247 clear_instr_ga(garray_T *gap)
3248 {
3249     int idx;
3250 
3251     for (idx = 0; idx < gap->ga_len; ++idx)
3252 	delete_instr(((isn_T *)gap->ga_data) + idx);
3253     ga_clear(gap);
3254 }
3255 
3256 /*
3257  * Compile a string in a ISN_PUSHS instruction into an ISN_INSTR.
3258  * Returns FAIL if compilation fails.
3259  */
3260     static int
3261 compile_string(isn_T *isn, cctx_T *cctx)
3262 {
3263     char_u	*s = isn->isn_arg.string;
3264     garray_T	save_ga = cctx->ctx_instr;
3265     int		expr_res;
3266     int		trailing_error;
3267     int		instr_count;
3268     isn_T	*instr = NULL;
3269 
3270     // Remove the string type from the stack.
3271     --cctx->ctx_type_stack.ga_len;
3272 
3273     // Temporarily reset the list of instructions so that the jump labels are
3274     // correct.
3275     cctx->ctx_instr.ga_len = 0;
3276     cctx->ctx_instr.ga_maxlen = 0;
3277     cctx->ctx_instr.ga_data = NULL;
3278     expr_res = compile_expr0(&s, cctx);
3279     s = skipwhite(s);
3280     trailing_error = *s != NUL;
3281 
3282     if (expr_res == FAIL || trailing_error
3283 				       || ga_grow(&cctx->ctx_instr, 1) == FAIL)
3284     {
3285 	if (trailing_error)
3286 	    semsg(_(e_trailing_arg), s);
3287 	clear_instr_ga(&cctx->ctx_instr);
3288 	cctx->ctx_instr = save_ga;
3289 	++cctx->ctx_type_stack.ga_len;
3290 	return FAIL;
3291     }
3292 
3293     // Move the generated instructions into the ISN_INSTR instruction, then
3294     // restore the list of instructions.
3295     instr_count = cctx->ctx_instr.ga_len;
3296     instr = cctx->ctx_instr.ga_data;
3297     instr[instr_count].isn_type = ISN_FINISH;
3298 
3299     cctx->ctx_instr = save_ga;
3300     vim_free(isn->isn_arg.string);
3301     isn->isn_type = ISN_INSTR;
3302     isn->isn_arg.instr = instr;
3303     return OK;
3304 }
3305 
3306 /*
3307  * Compile the argument expressions.
3308  * "arg" points to just after the "(" and is advanced to after the ")"
3309  */
3310     static int
3311 compile_arguments(char_u **arg, cctx_T *cctx, int *argcount, int is_searchpair)
3312 {
3313     char_u  *p = *arg;
3314     char_u  *whitep = *arg;
3315     int	    must_end = FALSE;
3316     int	    instr_count;
3317 
3318     for (;;)
3319     {
3320 	if (may_get_next_line(whitep, &p, cctx) == FAIL)
3321 	    goto failret;
3322 	if (*p == ')')
3323 	{
3324 	    *arg = p + 1;
3325 	    return OK;
3326 	}
3327 	if (must_end)
3328 	{
3329 	    semsg(_(e_missing_comma_before_argument_str), p);
3330 	    return FAIL;
3331 	}
3332 
3333 	instr_count = cctx->ctx_instr.ga_len;
3334 	if (compile_expr0(&p, cctx) == FAIL)
3335 	    return FAIL;
3336 	++*argcount;
3337 
3338 	if (is_searchpair && *argcount == 5
3339 		&& cctx->ctx_instr.ga_len == instr_count + 1)
3340 	{
3341 	    isn_T *isn = ((isn_T *)cctx->ctx_instr.ga_data) + instr_count;
3342 
3343 	    // {skip} argument of searchpair() can be compiled if not empty
3344 	    if (isn->isn_type == ISN_PUSHS && *isn->isn_arg.string != NUL)
3345 		compile_string(isn, cctx);
3346 	}
3347 
3348 	if (*p != ',' && *skipwhite(p) == ',')
3349 	{
3350 	    semsg(_(e_no_white_space_allowed_before_str_str), ",", p);
3351 	    p = skipwhite(p);
3352 	}
3353 	if (*p == ',')
3354 	{
3355 	    ++p;
3356 	    if (*p != NUL && !VIM_ISWHITE(*p))
3357 		semsg(_(e_white_space_required_after_str_str), ",", p - 1);
3358 	}
3359 	else
3360 	    must_end = TRUE;
3361 	whitep = p;
3362 	p = skipwhite(p);
3363     }
3364 failret:
3365     emsg(_(e_missing_close));
3366     return FAIL;
3367 }
3368 
3369 /*
3370  * Compile a function call:  name(arg1, arg2)
3371  * "arg" points to "name", "arg + varlen" to the "(".
3372  * "argcount_init" is 1 for "value->method()"
3373  * Instructions:
3374  *	EVAL arg1
3375  *	EVAL arg2
3376  *	BCALL / DCALL / UCALL
3377  */
3378     static int
3379 compile_call(
3380 	char_u	    **arg,
3381 	size_t	    varlen,
3382 	cctx_T	    *cctx,
3383 	ppconst_T   *ppconst,
3384 	int	    argcount_init)
3385 {
3386     char_u	*name = *arg;
3387     char_u	*p;
3388     int		argcount = argcount_init;
3389     char_u	namebuf[100];
3390     char_u	fname_buf[FLEN_FIXED + 1];
3391     char_u	*tofree = NULL;
3392     int		error = FCERR_NONE;
3393     ufunc_T	*ufunc = NULL;
3394     int		res = FAIL;
3395     int		is_autoload;
3396     int		is_searchpair;
3397 
3398     // we can evaluate "has('name')" at compile time
3399     if (varlen == 3 && STRNCMP(*arg, "has", 3) == 0)
3400     {
3401 	char_u	    *s = skipwhite(*arg + varlen + 1);
3402 	typval_T    argvars[2];
3403 
3404 	argvars[0].v_type = VAR_UNKNOWN;
3405 	if (*s == '"')
3406 	    (void)eval_string(&s, &argvars[0], TRUE);
3407 	else if (*s == '\'')
3408 	    (void)eval_lit_string(&s, &argvars[0], TRUE);
3409 	s = skipwhite(s);
3410 	if (*s == ')' && argvars[0].v_type == VAR_STRING
3411 		&& !dynamic_feature(argvars[0].vval.v_string))
3412 	{
3413 	    typval_T	*tv = &ppconst->pp_tv[ppconst->pp_used];
3414 
3415 	    *arg = s + 1;
3416 	    argvars[1].v_type = VAR_UNKNOWN;
3417 	    tv->v_type = VAR_NUMBER;
3418 	    tv->vval.v_number = 0;
3419 	    f_has(argvars, tv);
3420 	    clear_tv(&argvars[0]);
3421 	    ++ppconst->pp_used;
3422 	    return OK;
3423 	}
3424 	clear_tv(&argvars[0]);
3425     }
3426 
3427     if (generate_ppconst(cctx, ppconst) == FAIL)
3428 	return FAIL;
3429 
3430     if (varlen >= sizeof(namebuf))
3431     {
3432 	semsg(_(e_name_too_long_str), name);
3433 	return FAIL;
3434     }
3435     vim_strncpy(namebuf, *arg, varlen);
3436     name = fname_trans_sid(namebuf, fname_buf, &tofree, &error);
3437 
3438     // We handle the "skip" argument of searchpair() and searchpairpos()
3439     // differently.
3440     is_searchpair = (varlen == 6 && STRNCMP(*arg, "search", 6) == 0)
3441 	         || (varlen == 9 && STRNCMP(*arg, "searchpos", 9) == 0)
3442 	        || (varlen == 10 && STRNCMP(*arg, "searchpair", 10) == 0)
3443 	        || (varlen == 13 && STRNCMP(*arg, "searchpairpos", 13) == 0);
3444 
3445     *arg = skipwhite(*arg + varlen + 1);
3446     if (compile_arguments(arg, cctx, &argcount, is_searchpair) == FAIL)
3447 	goto theend;
3448 
3449     is_autoload = vim_strchr(name, AUTOLOAD_CHAR) != NULL;
3450     if (ASCII_ISLOWER(*name) && name[1] != ':' && !is_autoload)
3451     {
3452 	int	    idx;
3453 
3454 	// builtin function
3455 	idx = find_internal_func(name);
3456 	if (idx >= 0)
3457 	{
3458 	    if (STRCMP(name, "flatten") == 0)
3459 	    {
3460 		emsg(_(e_cannot_use_flatten_in_vim9_script));
3461 		goto theend;
3462 	    }
3463 
3464 	    if (STRCMP(name, "add") == 0 && argcount == 2)
3465 	    {
3466 		garray_T    *stack = &cctx->ctx_type_stack;
3467 		type_T	    *type = ((type_T **)stack->ga_data)[
3468 							    stack->ga_len - 2];
3469 
3470 		// add() can be compiled to instructions if we know the type
3471 		if (type->tt_type == VAR_LIST)
3472 		{
3473 		    // inline "add(list, item)" so that the type can be checked
3474 		    res = generate_LISTAPPEND(cctx);
3475 		    idx = -1;
3476 		}
3477 		else if (type->tt_type == VAR_BLOB)
3478 		{
3479 		    // inline "add(blob, nr)" so that the type can be checked
3480 		    res = generate_BLOBAPPEND(cctx);
3481 		    idx = -1;
3482 		}
3483 	    }
3484 
3485 	    if (idx >= 0)
3486 		res = generate_BCALL(cctx, idx, argcount, argcount_init == 1);
3487 	}
3488 	else
3489 	    semsg(_(e_unknownfunc), namebuf);
3490 	goto theend;
3491     }
3492 
3493     // An argument or local variable can be a function reference, this
3494     // overrules a function name.
3495     if (lookup_local(namebuf, varlen, NULL, cctx) == FAIL
3496 	    && arg_exists(namebuf, varlen, NULL, NULL, NULL, cctx) != OK)
3497     {
3498 	// If we can find the function by name generate the right call.
3499 	// Skip global functions here, a local funcref takes precedence.
3500 	ufunc = find_func(name, FALSE, cctx);
3501 	if (ufunc != NULL && !func_is_global(ufunc))
3502 	{
3503 	    res = generate_CALL(cctx, ufunc, argcount);
3504 	    goto theend;
3505 	}
3506     }
3507 
3508     // If the name is a variable, load it and use PCALL.
3509     // Not for g:Func(), we don't know if it is a variable or not.
3510     // Not for eome#Func(), it will be loaded later.
3511     p = namebuf;
3512     if (STRNCMP(namebuf, "g:", 2) != 0 && !is_autoload
3513 	    && compile_load(&p, namebuf + varlen, cctx, FALSE, FALSE) == OK)
3514     {
3515 	garray_T    *stack = &cctx->ctx_type_stack;
3516 	type_T	    *type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
3517 
3518 	res = generate_PCALL(cctx, argcount, namebuf, type, FALSE);
3519 	goto theend;
3520     }
3521 
3522     // If we can find a global function by name generate the right call.
3523     if (ufunc != NULL)
3524     {
3525 	res = generate_CALL(cctx, ufunc, argcount);
3526 	goto theend;
3527     }
3528 
3529     // A global function may be defined only later.  Need to figure out at
3530     // runtime.  Also handles a FuncRef at runtime.
3531     if (STRNCMP(namebuf, "g:", 2) == 0 || is_autoload)
3532 	res = generate_UCALL(cctx, name, argcount);
3533     else
3534 	semsg(_(e_unknownfunc), namebuf);
3535 
3536 theend:
3537     vim_free(tofree);
3538     return res;
3539 }
3540 
3541 // like NAMESPACE_CHAR but with 'a' and 'l'.
3542 #define VIM9_NAMESPACE_CHAR	(char_u *)"bgstvw"
3543 
3544 /*
3545  * Find the end of a variable or function name.  Unlike find_name_end() this
3546  * does not recognize magic braces.
3547  * When "use_namespace" is TRUE recognize "b:", "s:", etc.
3548  * Return a pointer to just after the name.  Equal to "arg" if there is no
3549  * valid name.
3550  */
3551     char_u *
3552 to_name_end(char_u *arg, int use_namespace)
3553 {
3554     char_u	*p;
3555 
3556     // Quick check for valid starting character.
3557     if (!eval_isnamec1(*arg))
3558 	return arg;
3559 
3560     for (p = arg + 1; *p != NUL && eval_isnamec(*p); MB_PTR_ADV(p))
3561 	// Include a namespace such as "s:var" and "v:var".  But "n:" is not
3562 	// and can be used in slice "[n:]".
3563 	if (*p == ':' && (p != arg + 1
3564 			     || !use_namespace
3565 			     || vim_strchr(VIM9_NAMESPACE_CHAR, *arg) == NULL))
3566 	    break;
3567     return p;
3568 }
3569 
3570 /*
3571  * Like to_name_end() but also skip over a list or dict constant.
3572  * Also accept "<SNR>123_Func".
3573  * This intentionally does not handle line continuation.
3574  */
3575     char_u *
3576 to_name_const_end(char_u *arg)
3577 {
3578     char_u	*p = arg;
3579     typval_T	rettv;
3580 
3581     if (STRNCMP(p, "<SNR>", 5) == 0)
3582 	p = skipdigits(p + 5);
3583     p = to_name_end(p, TRUE);
3584     if (p == arg && *arg == '[')
3585     {
3586 
3587 	// Can be "[1, 2, 3]->Func()".
3588 	if (eval_list(&p, &rettv, NULL, FALSE) == FAIL)
3589 	    p = arg;
3590     }
3591     return p;
3592 }
3593 
3594 /*
3595  * parse a list: [expr, expr]
3596  * "*arg" points to the '['.
3597  * ppconst->pp_is_const is set if all items are a constant.
3598  */
3599     static int
3600 compile_list(char_u **arg, cctx_T *cctx, ppconst_T *ppconst)
3601 {
3602     char_u	*p = skipwhite(*arg + 1);
3603     char_u	*whitep = *arg + 1;
3604     int		count = 0;
3605     int		is_const;
3606     int		is_all_const = TRUE;	// reset when non-const encountered
3607 
3608     for (;;)
3609     {
3610 	if (may_get_next_line(whitep, &p, cctx) == FAIL)
3611 	{
3612 	    semsg(_(e_list_end), *arg);
3613 	    return FAIL;
3614 	}
3615 	if (*p == ',')
3616 	{
3617 	    semsg(_(e_no_white_space_allowed_before_str_str), ",", p);
3618 	    return FAIL;
3619 	}
3620 	if (*p == ']')
3621 	{
3622 	    ++p;
3623 	    break;
3624 	}
3625 	if (compile_expr0_ext(&p, cctx, &is_const) == FAIL)
3626 	    return FAIL;
3627 	if (!is_const)
3628 	    is_all_const = FALSE;
3629 	++count;
3630 	if (*p == ',')
3631 	{
3632 	    ++p;
3633 	    if (*p != ']' && !IS_WHITE_OR_NUL(*p))
3634 	    {
3635 		semsg(_(e_white_space_required_after_str_str), ",", p - 1);
3636 		return FAIL;
3637 	    }
3638 	}
3639 	whitep = p;
3640 	p = skipwhite(p);
3641     }
3642     *arg = p;
3643 
3644     ppconst->pp_is_const = is_all_const;
3645     return generate_NEWLIST(cctx, count);
3646 }
3647 
3648 /*
3649  * Parse a lambda: "(arg, arg) => expr"
3650  * "*arg" points to the '('.
3651  * Returns OK/FAIL when a lambda is recognized, NOTDONE if it's not a lambda.
3652  */
3653     static int
3654 compile_lambda(char_u **arg, cctx_T *cctx)
3655 {
3656     int		r;
3657     typval_T	rettv;
3658     ufunc_T	*ufunc;
3659     evalarg_T	evalarg;
3660 
3661     CLEAR_FIELD(evalarg);
3662     evalarg.eval_flags = EVAL_EVALUATE;
3663     evalarg.eval_cctx = cctx;
3664 
3665     // Get the funcref in "rettv".
3666     r = get_lambda_tv(arg, &rettv, TRUE, &evalarg);
3667     if (r != OK)
3668     {
3669 	clear_evalarg(&evalarg, NULL);
3670 	return r;
3671     }
3672 
3673     // "rettv" will now be a partial referencing the function.
3674     ufunc = rettv.vval.v_partial->pt_func;
3675     ++ufunc->uf_refcount;
3676     clear_tv(&rettv);
3677 
3678     // Compile it here to get the return type.  The return type is optional,
3679     // when it's missing use t_unknown.  This is recognized in
3680     // compile_return().
3681     if (ufunc->uf_ret_type->tt_type == VAR_VOID)
3682 	ufunc->uf_ret_type = &t_unknown;
3683     compile_def_function(ufunc, FALSE, cctx->ctx_compile_type, cctx);
3684 
3685 #ifdef FEAT_PROFILE
3686     // When the outer function is compiled for profiling, the lambda may be
3687     // called without profiling.  Compile it here in the right context.
3688     if (cctx->ctx_compile_type == CT_PROFILE)
3689 	compile_def_function(ufunc, FALSE, CT_NONE, cctx);
3690 #endif
3691 
3692     // evalarg.eval_tofree_cmdline may have a copy of the last line and "*arg"
3693     // points into it.  Point to the original line to avoid a dangling pointer.
3694     if (evalarg.eval_tofree_cmdline != NULL)
3695     {
3696 	size_t	off = *arg - evalarg.eval_tofree_cmdline;
3697 
3698 	*arg = ((char_u **)cctx->ctx_ufunc->uf_lines.ga_data)[cctx->ctx_lnum]
3699 									 + off;
3700     }
3701 
3702     clear_evalarg(&evalarg, NULL);
3703 
3704     if (ufunc->uf_def_status == UF_COMPILED)
3705     {
3706 	// The return type will now be known.
3707 	set_function_type(ufunc);
3708 
3709 	// The function reference count will be 1.  When the ISN_FUNCREF
3710 	// instruction is deleted the reference count is decremented and the
3711 	// function is freed.
3712 	return generate_FUNCREF(cctx, ufunc);
3713     }
3714 
3715     func_ptr_unref(ufunc);
3716     return FAIL;
3717 }
3718 
3719 /*
3720  * Get a lambda and compile it.  Uses Vim9 syntax.
3721  */
3722     int
3723 get_lambda_tv_and_compile(
3724 	char_u	    **arg,
3725 	typval_T    *rettv,
3726 	int	    types_optional,
3727 	evalarg_T   *evalarg)
3728 {
3729     int		r;
3730     ufunc_T	*ufunc;
3731     int		save_sc_version = current_sctx.sc_version;
3732 
3733     // Get the funcref in "rettv".
3734     current_sctx.sc_version = SCRIPT_VERSION_VIM9;
3735     r = get_lambda_tv(arg, rettv, types_optional, evalarg);
3736     current_sctx.sc_version = save_sc_version;
3737     if (r != OK)
3738 	return r;
3739 
3740     // "rettv" will now be a partial referencing the function.
3741     ufunc = rettv->vval.v_partial->pt_func;
3742 
3743     // Compile it here to get the return type.  The return type is optional,
3744     // when it's missing use t_unknown.  This is recognized in
3745     // compile_return().
3746     if (ufunc->uf_ret_type == NULL || ufunc->uf_ret_type->tt_type == VAR_VOID)
3747 	ufunc->uf_ret_type = &t_unknown;
3748     compile_def_function(ufunc, FALSE, CT_NONE, NULL);
3749 
3750     if (ufunc->uf_def_status == UF_COMPILED)
3751     {
3752 	// The return type will now be known.
3753 	set_function_type(ufunc);
3754 	return OK;
3755     }
3756     clear_tv(rettv);
3757     return FAIL;
3758 }
3759 
3760 /*
3761  * parse a dict: {key: val, [key]: val}
3762  * "*arg" points to the '{'.
3763  * ppconst->pp_is_const is set if all item values are a constant.
3764  */
3765     static int
3766 compile_dict(char_u **arg, cctx_T *cctx, ppconst_T *ppconst)
3767 {
3768     garray_T	*instr = &cctx->ctx_instr;
3769     int		count = 0;
3770     dict_T	*d = dict_alloc();
3771     dictitem_T	*item;
3772     char_u	*whitep = *arg + 1;
3773     char_u	*p;
3774     int		is_const;
3775     int		is_all_const = TRUE;	// reset when non-const encountered
3776 
3777     if (d == NULL)
3778 	return FAIL;
3779     if (generate_ppconst(cctx, ppconst) == FAIL)
3780 	return FAIL;
3781     for (;;)
3782     {
3783 	char_u	    *key = NULL;
3784 
3785 	if (may_get_next_line(whitep, arg, cctx) == FAIL)
3786 	{
3787 	    *arg = NULL;
3788 	    goto failret;
3789 	}
3790 
3791 	if (**arg == '}')
3792 	    break;
3793 
3794 	if (**arg == '[')
3795 	{
3796 	    isn_T	*isn;
3797 
3798 	    // {[expr]: value} uses an evaluated key.
3799 	    *arg = skipwhite(*arg + 1);
3800 	    if (compile_expr0(arg, cctx) == FAIL)
3801 		return FAIL;
3802 	    isn = ((isn_T *)instr->ga_data) + instr->ga_len - 1;
3803 	    if (isn->isn_type == ISN_PUSHNR)
3804 	    {
3805 		char buf[NUMBUFLEN];
3806 
3807 		// Convert to string at compile time.
3808 		vim_snprintf(buf, NUMBUFLEN, "%lld", isn->isn_arg.number);
3809 		isn->isn_type = ISN_PUSHS;
3810 		isn->isn_arg.string = vim_strsave((char_u *)buf);
3811 	    }
3812 	    if (isn->isn_type == ISN_PUSHS)
3813 		key = isn->isn_arg.string;
3814 	    else if (may_generate_2STRING(-1, FALSE, cctx) == FAIL)
3815 		return FAIL;
3816 	    *arg = skipwhite(*arg);
3817 	    if (**arg != ']')
3818 	    {
3819 		emsg(_(e_missing_matching_bracket_after_dict_key));
3820 		return FAIL;
3821 	    }
3822 	    ++*arg;
3823 	}
3824 	else
3825 	{
3826 	    // {"name": value},
3827 	    // {'name': value},
3828 	    // {name: value} use "name" as a literal key
3829 	    key = get_literal_key(arg);
3830 	    if (key == NULL)
3831 		return FAIL;
3832 	    if (generate_PUSHS(cctx, key) == FAIL)
3833 		return FAIL;
3834 	}
3835 
3836 	// Check for duplicate keys, if using string keys.
3837 	if (key != NULL)
3838 	{
3839 	    item = dict_find(d, key, -1);
3840 	    if (item != NULL)
3841 	    {
3842 		semsg(_(e_duplicate_key), key);
3843 		goto failret;
3844 	    }
3845 	    item = dictitem_alloc(key);
3846 	    if (item != NULL)
3847 	    {
3848 		item->di_tv.v_type = VAR_UNKNOWN;
3849 		item->di_tv.v_lock = 0;
3850 		if (dict_add(d, item) == FAIL)
3851 		    dictitem_free(item);
3852 	    }
3853 	}
3854 
3855 	if (**arg != ':')
3856 	{
3857 	    if (*skipwhite(*arg) == ':')
3858 		semsg(_(e_no_white_space_allowed_before_str_str), ":", *arg);
3859 	    else
3860 		semsg(_(e_missing_dict_colon), *arg);
3861 	    return FAIL;
3862 	}
3863 	whitep = *arg + 1;
3864 	if (!IS_WHITE_OR_NUL(*whitep))
3865 	{
3866 	    semsg(_(e_white_space_required_after_str_str), ":", *arg);
3867 	    return FAIL;
3868 	}
3869 
3870 	if (may_get_next_line(whitep, arg, cctx) == FAIL)
3871 	{
3872 	    *arg = NULL;
3873 	    goto failret;
3874 	}
3875 
3876 	if (compile_expr0_ext(arg, cctx, &is_const) == FAIL)
3877 	    return FAIL;
3878 	if (!is_const)
3879 	    is_all_const = FALSE;
3880 	++count;
3881 
3882 	whitep = *arg;
3883 	if (may_get_next_line(whitep, arg, cctx) == FAIL)
3884 	{
3885 	    *arg = NULL;
3886 	    goto failret;
3887 	}
3888 	if (**arg == '}')
3889 	    break;
3890 	if (**arg != ',')
3891 	{
3892 	    semsg(_(e_missing_dict_comma), *arg);
3893 	    goto failret;
3894 	}
3895 	if (IS_WHITE_OR_NUL(*whitep))
3896 	{
3897 	    semsg(_(e_no_white_space_allowed_before_str_str), ",", whitep);
3898 	    return FAIL;
3899 	}
3900 	whitep = *arg + 1;
3901 	if (!IS_WHITE_OR_NUL(*whitep))
3902 	{
3903 	    semsg(_(e_white_space_required_after_str_str), ",", *arg);
3904 	    return FAIL;
3905 	}
3906 	*arg = skipwhite(whitep);
3907     }
3908 
3909     *arg = *arg + 1;
3910 
3911     // Allow for following comment, after at least one space.
3912     p = skipwhite(*arg);
3913     if (VIM_ISWHITE(**arg) && vim9_comment_start(p))
3914 	*arg += STRLEN(*arg);
3915 
3916     dict_unref(d);
3917     ppconst->pp_is_const = is_all_const;
3918     return generate_NEWDICT(cctx, count);
3919 
3920 failret:
3921     if (*arg == NULL)
3922     {
3923 	semsg(_(e_missing_dict_end), _("[end of lines]"));
3924 	*arg = (char_u *)"";
3925     }
3926     dict_unref(d);
3927     return FAIL;
3928 }
3929 
3930 /*
3931  * Compile "&option".
3932  */
3933     static int
3934 compile_get_option(char_u **arg, cctx_T *cctx)
3935 {
3936     typval_T	rettv;
3937     char_u	*start = *arg;
3938     int		ret;
3939 
3940     // parse the option and get the current value to get the type.
3941     rettv.v_type = VAR_UNKNOWN;
3942     ret = eval_option(arg, &rettv, TRUE);
3943     if (ret == OK)
3944     {
3945 	// include the '&' in the name, eval_option() expects it.
3946 	char_u	*name = vim_strnsave(start, *arg - start);
3947 	type_T	*type = rettv.v_type == VAR_BOOL ? &t_bool
3948 			  : rettv.v_type == VAR_NUMBER ? &t_number : &t_string;
3949 
3950 	ret = generate_LOAD(cctx, ISN_LOADOPT, 0, name, type);
3951 	vim_free(name);
3952     }
3953     clear_tv(&rettv);
3954 
3955     return ret;
3956 }
3957 
3958 /*
3959  * Compile "$VAR".
3960  */
3961     static int
3962 compile_get_env(char_u **arg, cctx_T *cctx)
3963 {
3964     char_u	*start = *arg;
3965     int		len;
3966     int		ret;
3967     char_u	*name;
3968 
3969     ++*arg;
3970     len = get_env_len(arg);
3971     if (len == 0)
3972     {
3973 	semsg(_(e_syntax_error_at_str), start - 1);
3974 	return FAIL;
3975     }
3976 
3977     // include the '$' in the name, eval_env_var() expects it.
3978     name = vim_strnsave(start, len + 1);
3979     ret = generate_LOAD(cctx, ISN_LOADENV, 0, name, &t_string);
3980     vim_free(name);
3981     return ret;
3982 }
3983 
3984 /*
3985  * Compile "@r".
3986  */
3987     static int
3988 compile_get_register(char_u **arg, cctx_T *cctx)
3989 {
3990     int		ret;
3991 
3992     ++*arg;
3993     if (**arg == NUL)
3994     {
3995 	semsg(_(e_syntax_error_at_str), *arg - 1);
3996 	return FAIL;
3997     }
3998     if (!valid_yank_reg(**arg, FALSE))
3999     {
4000 	emsg_invreg(**arg);
4001 	return FAIL;
4002     }
4003     ret = generate_LOAD(cctx, ISN_LOADREG, **arg, NULL, &t_string);
4004     ++*arg;
4005     return ret;
4006 }
4007 
4008 /*
4009  * Apply leading '!', '-' and '+' to constant "rettv".
4010  * When "numeric_only" is TRUE do not apply '!'.
4011  */
4012     static int
4013 apply_leader(typval_T *rettv, int numeric_only, char_u *start, char_u **end)
4014 {
4015     char_u *p = *end;
4016 
4017     // this works from end to start
4018     while (p > start)
4019     {
4020 	--p;
4021 	if (*p == '-' || *p == '+')
4022 	{
4023 	    // only '-' has an effect, for '+' we only check the type
4024 #ifdef FEAT_FLOAT
4025 	    if (rettv->v_type == VAR_FLOAT)
4026 	    {
4027 		if (*p == '-')
4028 		    rettv->vval.v_float = -rettv->vval.v_float;
4029 	    }
4030 	    else
4031 #endif
4032 	    {
4033 		varnumber_T	val;
4034 		int		error = FALSE;
4035 
4036 		// tv_get_number_chk() accepts a string, but we don't want that
4037 		// here
4038 		if (check_not_string(rettv) == FAIL)
4039 		    return FAIL;
4040 		val = tv_get_number_chk(rettv, &error);
4041 		clear_tv(rettv);
4042 		if (error)
4043 		    return FAIL;
4044 		if (*p == '-')
4045 		    val = -val;
4046 		rettv->v_type = VAR_NUMBER;
4047 		rettv->vval.v_number = val;
4048 	    }
4049 	}
4050 	else if (numeric_only)
4051 	{
4052 	    ++p;
4053 	    break;
4054 	}
4055 	else if (*p == '!')
4056 	{
4057 	    int v = tv2bool(rettv);
4058 
4059 	    // '!' is permissive in the type.
4060 	    clear_tv(rettv);
4061 	    rettv->v_type = VAR_BOOL;
4062 	    rettv->vval.v_number = v ? VVAL_FALSE : VVAL_TRUE;
4063 	}
4064     }
4065     *end = p;
4066     return OK;
4067 }
4068 
4069 /*
4070  * Recognize v: variables that are constants and set "rettv".
4071  */
4072     static void
4073 get_vim_constant(char_u **arg, typval_T *rettv)
4074 {
4075     if (STRNCMP(*arg, "v:true", 6) == 0)
4076     {
4077 	rettv->v_type = VAR_BOOL;
4078 	rettv->vval.v_number = VVAL_TRUE;
4079 	*arg += 6;
4080     }
4081     else if (STRNCMP(*arg, "v:false", 7) == 0)
4082     {
4083 	rettv->v_type = VAR_BOOL;
4084 	rettv->vval.v_number = VVAL_FALSE;
4085 	*arg += 7;
4086     }
4087     else if (STRNCMP(*arg, "v:null", 6) == 0)
4088     {
4089 	rettv->v_type = VAR_SPECIAL;
4090 	rettv->vval.v_number = VVAL_NULL;
4091 	*arg += 6;
4092     }
4093     else if (STRNCMP(*arg, "v:none", 6) == 0)
4094     {
4095 	rettv->v_type = VAR_SPECIAL;
4096 	rettv->vval.v_number = VVAL_NONE;
4097 	*arg += 6;
4098     }
4099 }
4100 
4101     exprtype_T
4102 get_compare_type(char_u *p, int *len, int *type_is)
4103 {
4104     exprtype_T	type = EXPR_UNKNOWN;
4105     int		i;
4106 
4107     switch (p[0])
4108     {
4109 	case '=':   if (p[1] == '=')
4110 			type = EXPR_EQUAL;
4111 		    else if (p[1] == '~')
4112 			type = EXPR_MATCH;
4113 		    break;
4114 	case '!':   if (p[1] == '=')
4115 			type = EXPR_NEQUAL;
4116 		    else if (p[1] == '~')
4117 			type = EXPR_NOMATCH;
4118 		    break;
4119 	case '>':   if (p[1] != '=')
4120 		    {
4121 			type = EXPR_GREATER;
4122 			*len = 1;
4123 		    }
4124 		    else
4125 			type = EXPR_GEQUAL;
4126 		    break;
4127 	case '<':   if (p[1] != '=')
4128 		    {
4129 			type = EXPR_SMALLER;
4130 			*len = 1;
4131 		    }
4132 		    else
4133 			type = EXPR_SEQUAL;
4134 		    break;
4135 	case 'i':   if (p[1] == 's')
4136 		    {
4137 			// "is" and "isnot"; but not a prefix of a name
4138 			if (p[2] == 'n' && p[3] == 'o' && p[4] == 't')
4139 			    *len = 5;
4140 			i = p[*len];
4141 			if (!isalnum(i) && i != '_')
4142 			{
4143 			    type = *len == 2 ? EXPR_IS : EXPR_ISNOT;
4144 			    *type_is = TRUE;
4145 			}
4146 		    }
4147 		    break;
4148     }
4149     return type;
4150 }
4151 
4152 /*
4153  * Skip over an expression, ignoring most errors.
4154  */
4155     static void
4156 skip_expr_cctx(char_u **arg, cctx_T *cctx)
4157 {
4158     evalarg_T	evalarg;
4159 
4160     CLEAR_FIELD(evalarg);
4161     evalarg.eval_cctx = cctx;
4162     skip_expr(arg, &evalarg);
4163 }
4164 
4165 /*
4166  * Compile code to apply '-', '+' and '!'.
4167  * When "numeric_only" is TRUE do not apply '!'.
4168  */
4169     static int
4170 compile_leader(cctx_T *cctx, int numeric_only, char_u *start, char_u **end)
4171 {
4172     char_u	*p = *end;
4173 
4174     // this works from end to start
4175     while (p > start)
4176     {
4177 	--p;
4178 	while (VIM_ISWHITE(*p))
4179 	    --p;
4180 	if (*p == '-' || *p == '+')
4181 	{
4182 	    int	    negate = *p == '-';
4183 	    isn_T   *isn;
4184 
4185 	    // TODO: check type
4186 	    while (p > start && (p[-1] == '-' || p[-1] == '+'))
4187 	    {
4188 		--p;
4189 		if (*p == '-')
4190 		    negate = !negate;
4191 	    }
4192 	    // only '-' has an effect, for '+' we only check the type
4193 	    if (negate)
4194 		isn = generate_instr(cctx, ISN_NEGATENR);
4195 	    else
4196 		isn = generate_instr(cctx, ISN_CHECKNR);
4197 	    if (isn == NULL)
4198 		return FAIL;
4199 	}
4200 	else if (numeric_only)
4201 	{
4202 	    ++p;
4203 	    break;
4204 	}
4205 	else
4206 	{
4207 	    int  invert = *p == '!';
4208 
4209 	    while (p > start && (p[-1] == '!' || VIM_ISWHITE(p[-1])))
4210 	    {
4211 		if (p[-1] == '!')
4212 		    invert = !invert;
4213 		--p;
4214 	    }
4215 	    if (generate_2BOOL(cctx, invert, -1) == FAIL)
4216 		return FAIL;
4217 	}
4218     }
4219     *end = p;
4220     return OK;
4221 }
4222 
4223 /*
4224  * Compile "(expression)": recursive!
4225  * Return FAIL/OK.
4226  */
4227     static int
4228 compile_parenthesis(char_u **arg, cctx_T *cctx, ppconst_T *ppconst)
4229 {
4230     int	    ret;
4231     char_u  *p = *arg + 1;
4232 
4233     if (may_get_next_line_error(p, arg, cctx) == FAIL)
4234 	return FAIL;
4235     if (ppconst->pp_used <= PPSIZE - 10)
4236     {
4237 	ret = compile_expr1(arg, cctx, ppconst);
4238     }
4239     else
4240     {
4241 	// Not enough space in ppconst, flush constants.
4242 	if (generate_ppconst(cctx, ppconst) == FAIL)
4243 	    return FAIL;
4244 	ret = compile_expr0(arg, cctx);
4245     }
4246     if (may_get_next_line_error(*arg, arg, cctx) == FAIL)
4247 	return FAIL;
4248     if (**arg == ')')
4249 	++*arg;
4250     else if (ret == OK)
4251     {
4252 	emsg(_(e_missing_close));
4253 	ret = FAIL;
4254     }
4255     return ret;
4256 }
4257 
4258 /*
4259  * Compile whatever comes after "name" or "name()".
4260  * Advances "*arg" only when something was recognized.
4261  */
4262     static int
4263 compile_subscript(
4264 	char_u **arg,
4265 	cctx_T *cctx,
4266 	char_u *start_leader,
4267 	char_u **end_leader,
4268 	ppconst_T *ppconst)
4269 {
4270     char_u	*name_start = *end_leader;
4271 
4272     for (;;)
4273     {
4274 	char_u *p = skipwhite(*arg);
4275 
4276 	if (*p == NUL || (VIM_ISWHITE(**arg) && vim9_comment_start(p)))
4277 	{
4278 	    char_u *next = peek_next_line_from_context(cctx);
4279 
4280 	    // If a following line starts with "->{" or "->X" advance to that
4281 	    // line, so that a line break before "->" is allowed.
4282 	    // Also if a following line starts with ".x".
4283 	    if (next != NULL &&
4284 		    ((next[0] == '-' && next[1] == '>'
4285 				 && (next[2] == '{'
4286 				       || ASCII_ISALPHA(*skipwhite(next + 2))))
4287 		    || (next[0] == '.' && eval_isdictc(next[1]))))
4288 	    {
4289 		next = next_line_from_context(cctx, TRUE);
4290 		if (next == NULL)
4291 		    return FAIL;
4292 		*arg = next;
4293 		p = skipwhite(*arg);
4294 	    }
4295 	}
4296 
4297 	// Do not skip over white space to find the "(", "execute 'x' (expr)"
4298 	// is not a function call.
4299 	if (**arg == '(')
4300 	{
4301 	    garray_T    *stack = &cctx->ctx_type_stack;
4302 	    type_T	*type;
4303 	    int		argcount = 0;
4304 
4305 	    if (generate_ppconst(cctx, ppconst) == FAIL)
4306 		return FAIL;
4307 	    ppconst->pp_is_const = FALSE;
4308 
4309 	    // funcref(arg)
4310 	    type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
4311 
4312 	    *arg = skipwhite(p + 1);
4313 	    if (compile_arguments(arg, cctx, &argcount, FALSE) == FAIL)
4314 		return FAIL;
4315 	    if (generate_PCALL(cctx, argcount, name_start, type, TRUE) == FAIL)
4316 		return FAIL;
4317 	}
4318 	else if (*p == '-' && p[1] == '>')
4319 	{
4320 	    char_u *pstart = p;
4321 
4322 	    if (generate_ppconst(cctx, ppconst) == FAIL)
4323 		return FAIL;
4324 	    ppconst->pp_is_const = FALSE;
4325 
4326 	    // something->method()
4327 	    // Apply the '!', '-' and '+' first:
4328 	    //   -1.0->func() works like (-1.0)->func()
4329 	    if (compile_leader(cctx, TRUE, start_leader, end_leader) == FAIL)
4330 		return FAIL;
4331 
4332 	    p += 2;
4333 	    *arg = skipwhite(p);
4334 	    // No line break supported right after "->".
4335 	    if (**arg == '(')
4336 	    {
4337 		int	    argcount = 1;
4338 		garray_T    *stack = &cctx->ctx_type_stack;
4339 		int	    type_idx_start = stack->ga_len;
4340 		type_T	    *type;
4341 		int	    expr_isn_start = cctx->ctx_instr.ga_len;
4342 		int	    expr_isn_end;
4343 		int	    arg_isn_count;
4344 
4345 		// Funcref call:  list->(Refs[2])(arg)
4346 		// or lambda:	  list->((arg) => expr)(arg)
4347 		//
4348 		// Fist compile the function expression.
4349 		if (compile_parenthesis(arg, cctx, ppconst) == FAIL)
4350 		    return FAIL;
4351 
4352 		// Remember the next instruction index, where the instructions
4353 		// for arguments are being written.
4354 		expr_isn_end = cctx->ctx_instr.ga_len;
4355 
4356 		// Compile the arguments.
4357 		if (**arg != '(')
4358 		{
4359 		    if (*skipwhite(*arg) == '(')
4360 			emsg(_(e_nowhitespace));
4361 		    else
4362 			semsg(_(e_missing_paren), *arg);
4363 		    return FAIL;
4364 		}
4365 		*arg = skipwhite(*arg + 1);
4366 		if (compile_arguments(arg, cctx, &argcount, FALSE) == FAIL)
4367 		    return FAIL;
4368 
4369 		// Move the instructions for the arguments to before the
4370 		// instructions of the expression and move the type of the
4371 		// expression after the argument types.  This is what ISN_PCALL
4372 		// expects.
4373 		stack = &cctx->ctx_type_stack;
4374 		arg_isn_count = cctx->ctx_instr.ga_len - expr_isn_end;
4375 		if (arg_isn_count > 0)
4376 		{
4377 		    int	    expr_isn_count = expr_isn_end - expr_isn_start;
4378 		    isn_T   *isn = ALLOC_MULT(isn_T, expr_isn_count);
4379 
4380 		    if (isn == NULL)
4381 			return FAIL;
4382 		    mch_memmove(isn, ((isn_T *)cctx->ctx_instr.ga_data)
4383 							      + expr_isn_start,
4384 					       sizeof(isn_T) * expr_isn_count);
4385 		    mch_memmove(((isn_T *)cctx->ctx_instr.ga_data)
4386 							      + expr_isn_start,
4387 			     ((isn_T *)cctx->ctx_instr.ga_data) + expr_isn_end,
4388 						sizeof(isn_T) * arg_isn_count);
4389 		    mch_memmove(((isn_T *)cctx->ctx_instr.ga_data)
4390 					      + expr_isn_start + arg_isn_count,
4391 					  isn, sizeof(isn_T) * expr_isn_count);
4392 		    vim_free(isn);
4393 
4394 		    type = ((type_T **)stack->ga_data)[type_idx_start];
4395 		    mch_memmove(((type_T **)stack->ga_data) + type_idx_start,
4396 			      ((type_T **)stack->ga_data) + type_idx_start + 1,
4397 			      sizeof(type_T *)
4398 				       * (stack->ga_len - type_idx_start - 1));
4399 		    ((type_T **)stack->ga_data)[stack->ga_len - 1] = type;
4400 		}
4401 
4402 		type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
4403 		if (generate_PCALL(cctx, argcount, p - 2, type, FALSE) == FAIL)
4404 		    return FAIL;
4405 	    }
4406 	    else
4407 	    {
4408 		// method call:  list->method()
4409 		p = *arg;
4410 		if (!eval_isnamec1(*p))
4411 		{
4412 		    semsg(_(e_trailing_arg), pstart);
4413 		    return FAIL;
4414 		}
4415 		if (ASCII_ISALPHA(*p) && p[1] == ':')
4416 		    p += 2;
4417 		for ( ; eval_isnamec(*p); ++p)
4418 		    ;
4419 		if (*p != '(')
4420 		{
4421 		    semsg(_(e_missing_paren), *arg);
4422 		    return FAIL;
4423 		}
4424 		if (compile_call(arg, p - *arg, cctx, ppconst, 1) == FAIL)
4425 		    return FAIL;
4426 	    }
4427 	}
4428 	else if (**arg == '[')
4429 	{
4430 	    int		is_slice = FALSE;
4431 
4432 	    // list index: list[123]
4433 	    // dict member: dict[key]
4434 	    // string index: text[123]
4435 	    // blob index: blob[123]
4436 	    // TODO: more arguments
4437 	    // TODO: recognize list or dict at runtime
4438 	    if (generate_ppconst(cctx, ppconst) == FAIL)
4439 		return FAIL;
4440 	    ppconst->pp_is_const = FALSE;
4441 
4442 	    ++p;
4443 	    if (may_get_next_line_error(p, arg, cctx) == FAIL)
4444 		return FAIL;
4445 	    if (**arg == ':')
4446 	    {
4447 		// missing first index is equal to zero
4448 		generate_PUSHNR(cctx, 0);
4449 	    }
4450 	    else
4451 	    {
4452 		if (compile_expr0(arg, cctx) == FAIL)
4453 		    return FAIL;
4454 		if (**arg == ':')
4455 		{
4456 		    semsg(_(e_white_space_required_before_and_after_str_at_str),
4457 								    ":", *arg);
4458 		    return FAIL;
4459 		}
4460 		if (may_get_next_line_error(*arg, arg, cctx) == FAIL)
4461 		    return FAIL;
4462 		*arg = skipwhite(*arg);
4463 	    }
4464 	    if (**arg == ':')
4465 	    {
4466 		is_slice = TRUE;
4467 		++*arg;
4468 		if (!IS_WHITE_OR_NUL(**arg) && **arg != ']')
4469 		{
4470 		    semsg(_(e_white_space_required_before_and_after_str_at_str),
4471 								    ":", *arg);
4472 		    return FAIL;
4473 		}
4474 		if (may_get_next_line_error(*arg, arg, cctx) == FAIL)
4475 		    return FAIL;
4476 		if (**arg == ']')
4477 		    // missing second index is equal to end of string
4478 		    generate_PUSHNR(cctx, -1);
4479 		else
4480 		{
4481 		    if (compile_expr0(arg, cctx) == FAIL)
4482 			return FAIL;
4483 		    if (may_get_next_line_error(*arg, arg, cctx) == FAIL)
4484 			return FAIL;
4485 		    *arg = skipwhite(*arg);
4486 		}
4487 	    }
4488 
4489 	    if (**arg != ']')
4490 	    {
4491 		emsg(_(e_missbrac));
4492 		return FAIL;
4493 	    }
4494 	    *arg = *arg + 1;
4495 
4496 	    if (compile_member(is_slice, cctx) == FAIL)
4497 		return FAIL;
4498 	}
4499 	else if (*p == '.' && p[1] != '.')
4500 	{
4501 	    // dictionary member: dict.name
4502 	    if (generate_ppconst(cctx, ppconst) == FAIL)
4503 		return FAIL;
4504 	    ppconst->pp_is_const = FALSE;
4505 
4506 	    *arg = p + 1;
4507 	    if (IS_WHITE_OR_NUL(**arg))
4508 	    {
4509 		emsg(_(e_missing_name_after_dot));
4510 		return FAIL;
4511 	    }
4512 	    p = *arg;
4513 	    if (eval_isdictc(*p))
4514 		while (eval_isnamec(*p))
4515 		    MB_PTR_ADV(p);
4516 	    if (p == *arg)
4517 	    {
4518 		semsg(_(e_syntax_error_at_str), *arg);
4519 		return FAIL;
4520 	    }
4521 	    if (generate_STRINGMEMBER(cctx, *arg, p - *arg) == FAIL)
4522 		return FAIL;
4523 	    *arg = p;
4524 	}
4525 	else
4526 	    break;
4527     }
4528 
4529     // TODO - see handle_subscript():
4530     // Turn "dict.Func" into a partial for "Func" bound to "dict".
4531     // Don't do this when "Func" is already a partial that was bound
4532     // explicitly (pt_auto is FALSE).
4533 
4534     return OK;
4535 }
4536 
4537 /*
4538  * Compile an expression at "*arg" and add instructions to "cctx->ctx_instr".
4539  * "arg" is advanced until after the expression, skipping white space.
4540  *
4541  * If the value is a constant "ppconst->pp_used" will be non-zero.
4542  * Before instructions are generated, any values in "ppconst" will generated.
4543  *
4544  * This is the compiling equivalent of eval1(), eval2(), etc.
4545  */
4546 
4547 /*
4548  *  number		number constant
4549  *  0zFFFFFFFF		Blob constant
4550  *  "string"		string constant
4551  *  'string'		literal string constant
4552  *  &option-name	option value
4553  *  @r			register contents
4554  *  identifier		variable value
4555  *  function()		function call
4556  *  $VAR		environment variable
4557  *  (expression)	nested expression
4558  *  [expr, expr]	List
4559  *  {key: val, [key]: val}   Dictionary
4560  *
4561  *  Also handle:
4562  *  ! in front		logical NOT
4563  *  - in front		unary minus
4564  *  + in front		unary plus (ignored)
4565  *  trailing (arg)	funcref/partial call
4566  *  trailing []		subscript in String or List
4567  *  trailing .name	entry in Dictionary
4568  *  trailing ->name()	method call
4569  */
4570     static int
4571 compile_expr7(
4572 	char_u **arg,
4573 	cctx_T *cctx,
4574 	ppconst_T *ppconst)
4575 {
4576     char_u	*start_leader, *end_leader;
4577     int		ret = OK;
4578     typval_T	*rettv = &ppconst->pp_tv[ppconst->pp_used];
4579     int		used_before = ppconst->pp_used;
4580 
4581     ppconst->pp_is_const = FALSE;
4582 
4583     /*
4584      * Skip '!', '-' and '+' characters.  They are handled later.
4585      */
4586     start_leader = *arg;
4587     if (eval_leader(arg, TRUE) == FAIL)
4588 	return FAIL;
4589     end_leader = *arg;
4590 
4591     rettv->v_type = VAR_UNKNOWN;
4592     switch (**arg)
4593     {
4594 	/*
4595 	 * Number constant.
4596 	 */
4597 	case '0':	// also for blob starting with 0z
4598 	case '1':
4599 	case '2':
4600 	case '3':
4601 	case '4':
4602 	case '5':
4603 	case '6':
4604 	case '7':
4605 	case '8':
4606 	case '9':
4607 	case '.':   if (eval_number(arg, rettv, TRUE, FALSE) == FAIL)
4608 			return FAIL;
4609 		    // Apply "-" and "+" just before the number now, right to
4610 		    // left.  Matters especially when "->" follows.  Stops at
4611 		    // '!'.
4612 		    if (apply_leader(rettv, TRUE,
4613 					    start_leader, &end_leader) == FAIL)
4614 		    {
4615 			clear_tv(rettv);
4616 			return FAIL;
4617 		    }
4618 		    break;
4619 
4620 	/*
4621 	 * String constant: "string".
4622 	 */
4623 	case '"':   if (eval_string(arg, rettv, TRUE) == FAIL)
4624 			return FAIL;
4625 		    break;
4626 
4627 	/*
4628 	 * Literal string constant: 'str''ing'.
4629 	 */
4630 	case '\'':  if (eval_lit_string(arg, rettv, TRUE) == FAIL)
4631 			return FAIL;
4632 		    break;
4633 
4634 	/*
4635 	 * Constant Vim variable.
4636 	 */
4637 	case 'v':   get_vim_constant(arg, rettv);
4638 		    ret = NOTDONE;
4639 		    break;
4640 
4641 	/*
4642 	 * "true" constant
4643 	 */
4644 	case 't':   if (STRNCMP(*arg, "true", 4) == 0
4645 						   && !eval_isnamec((*arg)[4]))
4646 		    {
4647 			*arg += 4;
4648 			rettv->v_type = VAR_BOOL;
4649 			rettv->vval.v_number = VVAL_TRUE;
4650 		    }
4651 		    else
4652 			ret = NOTDONE;
4653 		    break;
4654 
4655 	/*
4656 	 * "false" constant
4657 	 */
4658 	case 'f':   if (STRNCMP(*arg, "false", 5) == 0
4659 						   && !eval_isnamec((*arg)[5]))
4660 		    {
4661 			*arg += 5;
4662 			rettv->v_type = VAR_BOOL;
4663 			rettv->vval.v_number = VVAL_FALSE;
4664 		    }
4665 		    else
4666 			ret = NOTDONE;
4667 		    break;
4668 
4669 	/*
4670 	 * "null" constant
4671 	 */
4672 	case 'n':   if (STRNCMP(*arg, "null", 4) == 0
4673 						   && !eval_isnamec((*arg)[4]))
4674 		    {
4675 			*arg += 4;
4676 			rettv->v_type = VAR_SPECIAL;
4677 			rettv->vval.v_number = VVAL_NULL;
4678 		    }
4679 		    else
4680 			ret = NOTDONE;
4681 		    break;
4682 
4683 	/*
4684 	 * List: [expr, expr]
4685 	 */
4686 	case '[':   if (generate_ppconst(cctx, ppconst) == FAIL)
4687 			return FAIL;
4688 		    ret = compile_list(arg, cctx, ppconst);
4689 		    break;
4690 
4691 	/*
4692 	 * Dictionary: {'key': val, 'key': val}
4693 	 */
4694 	case '{':   if (generate_ppconst(cctx, ppconst) == FAIL)
4695 			return FAIL;
4696 		    ret = compile_dict(arg, cctx, ppconst);
4697 		    break;
4698 
4699 	/*
4700 	 * Option value: &name
4701 	 */
4702 	case '&':	if (generate_ppconst(cctx, ppconst) == FAIL)
4703 			    return FAIL;
4704 			ret = compile_get_option(arg, cctx);
4705 			break;
4706 
4707 	/*
4708 	 * Environment variable: $VAR.
4709 	 */
4710 	case '$':	if (generate_ppconst(cctx, ppconst) == FAIL)
4711 			    return FAIL;
4712 			ret = compile_get_env(arg, cctx);
4713 			break;
4714 
4715 	/*
4716 	 * Register contents: @r.
4717 	 */
4718 	case '@':	if (generate_ppconst(cctx, ppconst) == FAIL)
4719 			    return FAIL;
4720 			ret = compile_get_register(arg, cctx);
4721 			break;
4722 	/*
4723 	 * nested expression: (expression).
4724 	 * lambda: (arg, arg) => expr
4725 	 * funcref: (arg, arg) => { statement }
4726 	 */
4727 	case '(':   // if compile_lambda returns NOTDONE then it must be (expr)
4728 		    ret = compile_lambda(arg, cctx);
4729 		    if (ret == NOTDONE)
4730 			ret = compile_parenthesis(arg, cctx, ppconst);
4731 		    break;
4732 
4733 	default:    ret = NOTDONE;
4734 		    break;
4735     }
4736     if (ret == FAIL)
4737 	return FAIL;
4738 
4739     if (rettv->v_type != VAR_UNKNOWN && used_before == ppconst->pp_used)
4740     {
4741 	if (cctx->ctx_skip == SKIP_YES)
4742 	    clear_tv(rettv);
4743 	else
4744 	    // A constant expression can possibly be handled compile time,
4745 	    // return the value instead of generating code.
4746 	    ++ppconst->pp_used;
4747     }
4748     else if (ret == NOTDONE)
4749     {
4750 	char_u	    *p;
4751 	int	    r;
4752 
4753 	if (!eval_isnamec1(**arg))
4754 	{
4755 	    if (!vim9_bad_comment(*arg))
4756 	    {
4757 		if (ends_excmd(*skipwhite(*arg)))
4758 		    semsg(_(e_empty_expression_str), *arg);
4759 		else
4760 		    semsg(_(e_name_expected_str), *arg);
4761 	    }
4762 	    return FAIL;
4763 	}
4764 
4765 	// "name" or "name()"
4766 	p = to_name_end(*arg, TRUE);
4767 	if (p - *arg == (size_t)1 && **arg == '_')
4768 	{
4769 	    emsg(_(e_cannot_use_underscore_here));
4770 	    return FAIL;
4771 	}
4772 
4773 	if (*p == '(')
4774 	{
4775 	    r = compile_call(arg, p - *arg, cctx, ppconst, 0);
4776 	}
4777 	else
4778 	{
4779 	    if (generate_ppconst(cctx, ppconst) == FAIL)
4780 		return FAIL;
4781 	    r = compile_load(arg, p, cctx, TRUE, TRUE);
4782 	}
4783 	if (r == FAIL)
4784 	    return FAIL;
4785     }
4786 
4787     // Handle following "[]", ".member", etc.
4788     // Then deal with prefixed '-', '+' and '!', if not done already.
4789     if (compile_subscript(arg, cctx, start_leader, &end_leader,
4790 							     ppconst) == FAIL)
4791 	return FAIL;
4792     if (ppconst->pp_used > 0)
4793     {
4794 	// apply the '!', '-' and '+' before the constant
4795 	rettv = &ppconst->pp_tv[ppconst->pp_used - 1];
4796 	if (apply_leader(rettv, FALSE, start_leader, &end_leader) == FAIL)
4797 	    return FAIL;
4798 	return OK;
4799     }
4800     if (compile_leader(cctx, FALSE, start_leader, &end_leader) == FAIL)
4801 	return FAIL;
4802     return OK;
4803 }
4804 
4805 /*
4806  * Give the "white on both sides" error, taking the operator from "p[len]".
4807  */
4808     void
4809 error_white_both(char_u *op, int len)
4810 {
4811     char_u	buf[10];
4812 
4813     vim_strncpy(buf, op, len);
4814     semsg(_(e_white_space_required_before_and_after_str_at_str), buf, op);
4815 }
4816 
4817 /*
4818  * <type>expr7: runtime type check / conversion
4819  */
4820     static int
4821 compile_expr7t(char_u **arg, cctx_T *cctx, ppconst_T *ppconst)
4822 {
4823     type_T *want_type = NULL;
4824 
4825     // Recognize <type>
4826     if (**arg == '<' && eval_isnamec1((*arg)[1]))
4827     {
4828 	++*arg;
4829 	want_type = parse_type(arg, cctx->ctx_type_list, TRUE);
4830 	if (want_type == NULL)
4831 	    return FAIL;
4832 
4833 	if (**arg != '>')
4834 	{
4835 	    if (*skipwhite(*arg) == '>')
4836 		semsg(_(e_no_white_space_allowed_before_str_str), ">", *arg);
4837 	    else
4838 		emsg(_(e_missing_gt));
4839 	    return FAIL;
4840 	}
4841 	++*arg;
4842 	if (may_get_next_line_error(*arg, arg, cctx) == FAIL)
4843 	    return FAIL;
4844     }
4845 
4846     if (compile_expr7(arg, cctx, ppconst) == FAIL)
4847 	return FAIL;
4848 
4849     if (want_type != NULL)
4850     {
4851 	garray_T    *stack = &cctx->ctx_type_stack;
4852 	type_T	    *actual;
4853 	where_T	    where = WHERE_INIT;
4854 
4855 	generate_ppconst(cctx, ppconst);
4856 	actual = ((type_T **)stack->ga_data)[stack->ga_len - 1];
4857 	if (check_type(want_type, actual, FALSE, where) == FAIL)
4858 	{
4859 	    if (need_type(actual, want_type, -1, 0, cctx, FALSE, FALSE) == FAIL)
4860 		return FAIL;
4861 	}
4862     }
4863 
4864     return OK;
4865 }
4866 
4867 /*
4868  *	*	number multiplication
4869  *	/	number division
4870  *	%	number modulo
4871  */
4872     static int
4873 compile_expr6(char_u **arg, cctx_T *cctx, ppconst_T *ppconst)
4874 {
4875     char_u	*op;
4876     char_u	*next;
4877     int		ppconst_used = ppconst->pp_used;
4878 
4879     // get the first expression
4880     if (compile_expr7t(arg, cctx, ppconst) == FAIL)
4881 	return FAIL;
4882 
4883     /*
4884      * Repeat computing, until no "*", "/" or "%" is following.
4885      */
4886     for (;;)
4887     {
4888 	op = may_peek_next_line(cctx, *arg, &next);
4889 	if (*op != '*' && *op != '/' && *op != '%')
4890 	    break;
4891 	if (next != NULL)
4892 	{
4893 	    *arg = next_line_from_context(cctx, TRUE);
4894 	    op = skipwhite(*arg);
4895 	}
4896 
4897 	if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(op[1]))
4898 	{
4899 	    error_white_both(op, 1);
4900 	    return FAIL;
4901 	}
4902 	if (may_get_next_line_error(op + 1, arg, cctx) == FAIL)
4903 	    return FAIL;
4904 
4905 	// get the second expression
4906 	if (compile_expr7t(arg, cctx, ppconst) == FAIL)
4907 	    return FAIL;
4908 
4909 	if (ppconst->pp_used == ppconst_used + 2
4910 		&& ppconst->pp_tv[ppconst_used].v_type == VAR_NUMBER
4911 		&& ppconst->pp_tv[ppconst_used + 1].v_type == VAR_NUMBER)
4912 	{
4913 	    typval_T	    *tv1 = &ppconst->pp_tv[ppconst_used];
4914 	    typval_T	    *tv2 = &ppconst->pp_tv[ppconst_used + 1];
4915 	    varnumber_T	    res = 0;
4916 	    int		    failed = FALSE;
4917 
4918 	    // both are numbers: compute the result
4919 	    switch (*op)
4920 	    {
4921 		case '*': res = tv1->vval.v_number * tv2->vval.v_number;
4922 			  break;
4923 		case '/': res = num_divide(tv1->vval.v_number,
4924 						  tv2->vval.v_number, &failed);
4925 			  break;
4926 		case '%': res = num_modulus(tv1->vval.v_number,
4927 						  tv2->vval.v_number, &failed);
4928 			  break;
4929 	    }
4930 	    if (failed)
4931 		return FAIL;
4932 	    tv1->vval.v_number = res;
4933 	    --ppconst->pp_used;
4934 	}
4935 	else
4936 	{
4937 	    generate_ppconst(cctx, ppconst);
4938 	    generate_two_op(cctx, op);
4939 	}
4940     }
4941 
4942     return OK;
4943 }
4944 
4945 /*
4946  *      +	number addition or list/blobl concatenation
4947  *      -	number subtraction
4948  *      ..	string concatenation
4949  */
4950     static int
4951 compile_expr5(char_u **arg, cctx_T *cctx, ppconst_T *ppconst)
4952 {
4953     char_u	*op;
4954     char_u	*next;
4955     int		oplen;
4956     int		ppconst_used = ppconst->pp_used;
4957 
4958     // get the first variable
4959     if (compile_expr6(arg, cctx, ppconst) == FAIL)
4960 	return FAIL;
4961 
4962     /*
4963      * Repeat computing, until no "+", "-" or ".." is following.
4964      */
4965     for (;;)
4966     {
4967 	op = may_peek_next_line(cctx, *arg, &next);
4968 	if (*op != '+' && *op != '-' && !(*op == '.' && *(op + 1) == '.'))
4969 	    break;
4970 	if (op[0] == op[1] && *op != '.' && next)
4971 	    // Finding "++" or "--" on the next line is a separate command.
4972 	    // But ".." is concatenation.
4973 	    break;
4974 	oplen = (*op == '.' ? 2 : 1);
4975 	if (next != NULL)
4976 	{
4977 	    *arg = next_line_from_context(cctx, TRUE);
4978 	    op = skipwhite(*arg);
4979 	}
4980 
4981 	if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(op[oplen]))
4982 	{
4983 	    error_white_both(op, oplen);
4984 	    return FAIL;
4985 	}
4986 
4987 	if (may_get_next_line_error(op + oplen, arg, cctx) == FAIL)
4988 	    return FAIL;
4989 
4990 	// get the second expression
4991 	if (compile_expr6(arg, cctx, ppconst) == FAIL)
4992 	    return FAIL;
4993 
4994 	if (ppconst->pp_used == ppconst_used + 2
4995 		&& (*op == '.'
4996 		    ? (ppconst->pp_tv[ppconst_used].v_type == VAR_STRING
4997 		    && ppconst->pp_tv[ppconst_used + 1].v_type == VAR_STRING)
4998 		    : (ppconst->pp_tv[ppconst_used].v_type == VAR_NUMBER
4999 		    && ppconst->pp_tv[ppconst_used + 1].v_type == VAR_NUMBER)))
5000 	{
5001 	    typval_T *tv1 = &ppconst->pp_tv[ppconst_used];
5002 	    typval_T *tv2 = &ppconst->pp_tv[ppconst_used + 1];
5003 
5004 	    // concat/subtract/add constant numbers
5005 	    if (*op == '+')
5006 		tv1->vval.v_number = tv1->vval.v_number + tv2->vval.v_number;
5007 	    else if (*op == '-')
5008 		tv1->vval.v_number = tv1->vval.v_number - tv2->vval.v_number;
5009 	    else
5010 	    {
5011 		// concatenate constant strings
5012 		char_u *s1 = tv1->vval.v_string;
5013 		char_u *s2 = tv2->vval.v_string;
5014 		size_t len1 = STRLEN(s1);
5015 
5016 		tv1->vval.v_string = alloc((int)(len1 + STRLEN(s2) + 1));
5017 		if (tv1->vval.v_string == NULL)
5018 		{
5019 		    clear_ppconst(ppconst);
5020 		    return FAIL;
5021 		}
5022 		mch_memmove(tv1->vval.v_string, s1, len1);
5023 		STRCPY(tv1->vval.v_string + len1, s2);
5024 		vim_free(s1);
5025 		vim_free(s2);
5026 	    }
5027 	    --ppconst->pp_used;
5028 	}
5029 	else
5030 	{
5031 	    generate_ppconst(cctx, ppconst);
5032 	    ppconst->pp_is_const = FALSE;
5033 	    if (*op == '.')
5034 	    {
5035 		if (may_generate_2STRING(-2, FALSE, cctx) == FAIL
5036 			|| may_generate_2STRING(-1, FALSE, cctx) == FAIL)
5037 		    return FAIL;
5038 		generate_instr_drop(cctx, ISN_CONCAT, 1);
5039 	    }
5040 	    else
5041 		generate_two_op(cctx, op);
5042 	}
5043     }
5044 
5045     return OK;
5046 }
5047 
5048 /*
5049  * expr5a == expr5b
5050  * expr5a =~ expr5b
5051  * expr5a != expr5b
5052  * expr5a !~ expr5b
5053  * expr5a > expr5b
5054  * expr5a >= expr5b
5055  * expr5a < expr5b
5056  * expr5a <= expr5b
5057  * expr5a is expr5b
5058  * expr5a isnot expr5b
5059  *
5060  * Produces instructions:
5061  *	EVAL expr5a		Push result of "expr5a"
5062  *	EVAL expr5b		Push result of "expr5b"
5063  *	COMPARE			one of the compare instructions
5064  */
5065     static int
5066 compile_expr4(char_u **arg, cctx_T *cctx, ppconst_T *ppconst)
5067 {
5068     exprtype_T	type = EXPR_UNKNOWN;
5069     char_u	*p;
5070     char_u	*next;
5071     int		len = 2;
5072     int		type_is = FALSE;
5073     int		ppconst_used = ppconst->pp_used;
5074 
5075     // get the first variable
5076     if (compile_expr5(arg, cctx, ppconst) == FAIL)
5077 	return FAIL;
5078 
5079     p = may_peek_next_line(cctx, *arg, &next);
5080     type = get_compare_type(p, &len, &type_is);
5081 
5082     /*
5083      * If there is a comparative operator, use it.
5084      */
5085     if (type != EXPR_UNKNOWN)
5086     {
5087 	int ic = FALSE;  // Default: do not ignore case
5088 
5089 	if (next != NULL)
5090 	{
5091 	    *arg = next_line_from_context(cctx, TRUE);
5092 	    p = skipwhite(*arg);
5093 	}
5094 	if (type_is && (p[len] == '?' || p[len] == '#'))
5095 	{
5096 	    semsg(_(e_invalid_expression_str), *arg);
5097 	    return FAIL;
5098 	}
5099 	// extra question mark appended: ignore case
5100 	if (p[len] == '?')
5101 	{
5102 	    ic = TRUE;
5103 	    ++len;
5104 	}
5105 	// extra '#' appended: match case (ignored)
5106 	else if (p[len] == '#')
5107 	    ++len;
5108 	// nothing appended: match case
5109 
5110 	if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[len]))
5111 	{
5112 	    error_white_both(p, len);
5113 	    return FAIL;
5114 	}
5115 
5116 	// get the second variable
5117 	if (may_get_next_line_error(p + len, arg, cctx) == FAIL)
5118 	    return FAIL;
5119 
5120 	if (compile_expr5(arg, cctx, ppconst) == FAIL)
5121 	    return FAIL;
5122 
5123 	if (ppconst->pp_used == ppconst_used + 2)
5124 	{
5125 	    typval_T *	tv1 = &ppconst->pp_tv[ppconst->pp_used - 2];
5126 	    typval_T	*tv2 = &ppconst->pp_tv[ppconst->pp_used - 1];
5127 	    int		ret;
5128 
5129 	    // Both sides are a constant, compute the result now.
5130 	    // First check for a valid combination of types, this is more
5131 	    // strict than typval_compare().
5132 	    if (check_compare_types(type, tv1, tv2) == FAIL)
5133 		ret = FAIL;
5134 	    else
5135 	    {
5136 		ret = typval_compare(tv1, tv2, type, ic);
5137 		tv1->v_type = VAR_BOOL;
5138 		tv1->vval.v_number = tv1->vval.v_number
5139 						      ? VVAL_TRUE : VVAL_FALSE;
5140 		clear_tv(tv2);
5141 		--ppconst->pp_used;
5142 	    }
5143 	    return ret;
5144 	}
5145 
5146 	generate_ppconst(cctx, ppconst);
5147 	return generate_COMPARE(cctx, type, ic);
5148     }
5149 
5150     return OK;
5151 }
5152 
5153 static int compile_expr3(char_u **arg,  cctx_T *cctx, ppconst_T *ppconst);
5154 
5155 /*
5156  * Compile || or &&.
5157  */
5158     static int
5159 compile_and_or(
5160 	char_u **arg,
5161 	cctx_T	*cctx,
5162 	char	*op,
5163 	ppconst_T *ppconst,
5164 	int	ppconst_used UNUSED)
5165 {
5166     char_u	*next;
5167     char_u	*p = may_peek_next_line(cctx, *arg, &next);
5168     int		opchar = *op;
5169 
5170     if (p[0] == opchar && p[1] == opchar)
5171     {
5172 	garray_T	*instr = &cctx->ctx_instr;
5173 	garray_T	end_ga;
5174 
5175 	/*
5176 	 * Repeat until there is no following "||" or "&&"
5177 	 */
5178 	ga_init2(&end_ga, sizeof(int), 10);
5179 	while (p[0] == opchar && p[1] == opchar)
5180 	{
5181 	    long	start_lnum = SOURCING_LNUM;
5182 	    long	save_sourcing_lnum;
5183 	    int		start_ctx_lnum = cctx->ctx_lnum;
5184 	    int		save_lnum;
5185 	    int		status;
5186 
5187 	    if (next != NULL)
5188 	    {
5189 		*arg = next_line_from_context(cctx, TRUE);
5190 		p = skipwhite(*arg);
5191 	    }
5192 
5193 	    if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[2]))
5194 	    {
5195 		semsg(_(e_white_space_required_before_and_after_str_at_str),
5196 									op, p);
5197 		return FAIL;
5198 	    }
5199 
5200 	    save_sourcing_lnum = SOURCING_LNUM;
5201 	    SOURCING_LNUM = start_lnum;
5202 	    save_lnum = cctx->ctx_lnum;
5203 	    cctx->ctx_lnum = start_ctx_lnum;
5204 
5205 	    status = check_ppconst_bool(ppconst);
5206 	    if (status != FAIL)
5207 	    {
5208 		// TODO: use ppconst if the value is a constant
5209 		generate_ppconst(cctx, ppconst);
5210 
5211 		// Every part must evaluate to a bool.
5212 		status = bool_on_stack(cctx);
5213 		if (status != FAIL)
5214 		    status = ga_grow(&end_ga, 1);
5215 	    }
5216 	    cctx->ctx_lnum = save_lnum;
5217 	    if (status == FAIL)
5218 	    {
5219 		ga_clear(&end_ga);
5220 		return FAIL;
5221 	    }
5222 
5223 	    *(((int *)end_ga.ga_data) + end_ga.ga_len) = instr->ga_len;
5224 	    ++end_ga.ga_len;
5225 	    generate_JUMP(cctx, opchar == '|'
5226 				 ?  JUMP_IF_COND_TRUE : JUMP_IF_COND_FALSE, 0);
5227 
5228 	    // eval the next expression
5229 	    SOURCING_LNUM = save_sourcing_lnum;
5230 	    if (may_get_next_line_error(p + 2, arg, cctx) == FAIL)
5231 	    {
5232 		ga_clear(&end_ga);
5233 		return FAIL;
5234 	    }
5235 
5236 	    if ((opchar == '|' ? compile_expr3(arg, cctx, ppconst)
5237 				  : compile_expr4(arg, cctx, ppconst)) == FAIL)
5238 	    {
5239 		ga_clear(&end_ga);
5240 		return FAIL;
5241 	    }
5242 
5243 	    p = may_peek_next_line(cctx, *arg, &next);
5244 	}
5245 
5246 	if (check_ppconst_bool(ppconst) == FAIL)
5247 	{
5248 	    ga_clear(&end_ga);
5249 	    return FAIL;
5250 	}
5251 	generate_ppconst(cctx, ppconst);
5252 
5253 	// Every part must evaluate to a bool.
5254 	if (bool_on_stack(cctx) == FAIL)
5255 	{
5256 	    ga_clear(&end_ga);
5257 	    return FAIL;
5258 	}
5259 
5260 	// Fill in the end label in all jumps.
5261 	while (end_ga.ga_len > 0)
5262 	{
5263 	    isn_T	*isn;
5264 
5265 	    --end_ga.ga_len;
5266 	    isn = ((isn_T *)instr->ga_data)
5267 				  + *(((int *)end_ga.ga_data) + end_ga.ga_len);
5268 	    isn->isn_arg.jump.jump_where = instr->ga_len;
5269 	}
5270 	ga_clear(&end_ga);
5271     }
5272 
5273     return OK;
5274 }
5275 
5276 /*
5277  * expr4a && expr4a && expr4a	    logical AND
5278  *
5279  * Produces instructions:
5280  *	EVAL expr4a		Push result of "expr4a"
5281  *	COND2BOOL		convert to bool if needed
5282  *	JUMP_IF_COND_FALSE end
5283  *	EVAL expr4b		Push result of "expr4b"
5284  *	JUMP_IF_COND_FALSE end
5285  *	EVAL expr4c		Push result of "expr4c"
5286  * end:
5287  */
5288     static int
5289 compile_expr3(char_u **arg, cctx_T *cctx, ppconst_T *ppconst)
5290 {
5291     int		ppconst_used = ppconst->pp_used;
5292 
5293     // get the first variable
5294     if (compile_expr4(arg, cctx, ppconst) == FAIL)
5295 	return FAIL;
5296 
5297     // || and && work almost the same
5298     return compile_and_or(arg, cctx, "&&", ppconst, ppconst_used);
5299 }
5300 
5301 /*
5302  * expr3a || expr3b || expr3c	    logical OR
5303  *
5304  * Produces instructions:
5305  *	EVAL expr3a		Push result of "expr3a"
5306  *	COND2BOOL		convert to bool if needed
5307  *	JUMP_IF_COND_TRUE end
5308  *	EVAL expr3b		Push result of "expr3b"
5309  *	JUMP_IF_COND_TRUE end
5310  *	EVAL expr3c		Push result of "expr3c"
5311  * end:
5312  */
5313     static int
5314 compile_expr2(char_u **arg, cctx_T *cctx, ppconst_T *ppconst)
5315 {
5316     int		ppconst_used = ppconst->pp_used;
5317 
5318     // eval the first expression
5319     if (compile_expr3(arg, cctx, ppconst) == FAIL)
5320 	return FAIL;
5321 
5322     // || and && work almost the same
5323     return compile_and_or(arg, cctx, "||", ppconst, ppconst_used);
5324 }
5325 
5326 /*
5327  * Toplevel expression: expr2 ? expr1a : expr1b
5328  * Produces instructions:
5329  *	EVAL expr2		Push result of "expr2"
5330  *      JUMP_IF_FALSE alt	jump if false
5331  *      EVAL expr1a
5332  *      JUMP_ALWAYS end
5333  * alt:	EVAL expr1b
5334  * end:
5335  *
5336  * Toplevel expression: expr2 ?? expr1
5337  * Produces instructions:
5338  *	EVAL expr2		    Push result of "expr2"
5339  *      JUMP_AND_KEEP_IF_TRUE end   jump if true
5340  *      EVAL expr1
5341  * end:
5342  */
5343     static int
5344 compile_expr1(char_u **arg, cctx_T *cctx, ppconst_T *ppconst)
5345 {
5346     char_u	*p;
5347     int		ppconst_used = ppconst->pp_used;
5348     char_u	*next;
5349 
5350     // Ignore all kinds of errors when not producing code.
5351     if (cctx->ctx_skip == SKIP_YES)
5352     {
5353 	skip_expr_cctx(arg, cctx);
5354 	return OK;
5355     }
5356 
5357     // Evaluate the first expression.
5358     if (compile_expr2(arg, cctx, ppconst) == FAIL)
5359 	return FAIL;
5360 
5361     p = may_peek_next_line(cctx, *arg, &next);
5362     if (*p == '?')
5363     {
5364 	int		op_falsy = p[1] == '?';
5365 	garray_T	*instr = &cctx->ctx_instr;
5366 	garray_T	*stack = &cctx->ctx_type_stack;
5367 	int		alt_idx = instr->ga_len;
5368 	int		end_idx = 0;
5369 	isn_T		*isn;
5370 	type_T		*type1 = NULL;
5371 	int		has_const_expr = FALSE;
5372 	int		const_value = FALSE;
5373 	int		save_skip = cctx->ctx_skip;
5374 
5375 	if (next != NULL)
5376 	{
5377 	    *arg = next_line_from_context(cctx, TRUE);
5378 	    p = skipwhite(*arg);
5379 	}
5380 
5381 	if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[1 + op_falsy]))
5382 	{
5383 	    semsg(_(e_white_space_required_before_and_after_str_at_str),
5384 						     op_falsy ? "??" : "?", p);
5385 	    return FAIL;
5386 	}
5387 
5388 	if (ppconst->pp_used == ppconst_used + 1)
5389 	{
5390 	    // the condition is a constant, we know whether the ? or the :
5391 	    // expression is to be evaluated.
5392 	    has_const_expr = TRUE;
5393 	    if (op_falsy)
5394 		const_value = tv2bool(&ppconst->pp_tv[ppconst_used]);
5395 	    else
5396 	    {
5397 		int error = FALSE;
5398 
5399 		const_value = tv_get_bool_chk(&ppconst->pp_tv[ppconst_used],
5400 								       &error);
5401 		if (error)
5402 		    return FAIL;
5403 	    }
5404 	    cctx->ctx_skip = save_skip == SKIP_YES ||
5405 		 (op_falsy ? const_value : !const_value) ? SKIP_YES : SKIP_NOT;
5406 
5407 	    if (op_falsy && cctx->ctx_skip == SKIP_YES)
5408 		// "left ?? right" and "left" is truthy: produce "left"
5409 		generate_ppconst(cctx, ppconst);
5410 	    else
5411 	    {
5412 		clear_tv(&ppconst->pp_tv[ppconst_used]);
5413 		--ppconst->pp_used;
5414 	    }
5415 	}
5416 	else
5417 	{
5418 	    generate_ppconst(cctx, ppconst);
5419 	    if (op_falsy)
5420 		end_idx = instr->ga_len;
5421 	    generate_JUMP(cctx, op_falsy
5422 				   ? JUMP_AND_KEEP_IF_TRUE : JUMP_IF_FALSE, 0);
5423 	    if (op_falsy)
5424 		type1 = ((type_T **)stack->ga_data)[stack->ga_len];
5425 	}
5426 
5427 	// evaluate the second expression; any type is accepted
5428 	if (may_get_next_line_error(p + 1 + op_falsy, arg, cctx) == FAIL)
5429 	    return FAIL;
5430 	if (compile_expr1(arg, cctx, ppconst) == FAIL)
5431 	    return FAIL;
5432 
5433 	if (!has_const_expr)
5434 	{
5435 	    generate_ppconst(cctx, ppconst);
5436 
5437 	    if (!op_falsy)
5438 	    {
5439 		// remember the type and drop it
5440 		--stack->ga_len;
5441 		type1 = ((type_T **)stack->ga_data)[stack->ga_len];
5442 
5443 		end_idx = instr->ga_len;
5444 		generate_JUMP(cctx, JUMP_ALWAYS, 0);
5445 
5446 		// jump here from JUMP_IF_FALSE
5447 		isn = ((isn_T *)instr->ga_data) + alt_idx;
5448 		isn->isn_arg.jump.jump_where = instr->ga_len;
5449 	    }
5450 	}
5451 
5452 	if (!op_falsy)
5453 	{
5454 	    // Check for the ":".
5455 	    p = may_peek_next_line(cctx, *arg, &next);
5456 	    if (*p != ':')
5457 	    {
5458 		emsg(_(e_missing_colon));
5459 		return FAIL;
5460 	    }
5461 	    if (next != NULL)
5462 	    {
5463 		*arg = next_line_from_context(cctx, TRUE);
5464 		p = skipwhite(*arg);
5465 	    }
5466 
5467 	    if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[1]))
5468 	    {
5469 		semsg(_(e_white_space_required_before_and_after_str_at_str),
5470 								       ":", p);
5471 		return FAIL;
5472 	    }
5473 
5474 	    // evaluate the third expression
5475 	    if (has_const_expr)
5476 		cctx->ctx_skip = save_skip == SKIP_YES || const_value
5477 							 ? SKIP_YES : SKIP_NOT;
5478 	    if (may_get_next_line_error(p + 1, arg, cctx) == FAIL)
5479 		return FAIL;
5480 	    if (compile_expr1(arg, cctx, ppconst) == FAIL)
5481 		return FAIL;
5482 	}
5483 
5484 	if (!has_const_expr)
5485 	{
5486 	    type_T	**typep;
5487 
5488 	    generate_ppconst(cctx, ppconst);
5489 
5490 	    // If the types differ, the result has a more generic type.
5491 	    typep = ((type_T **)stack->ga_data) + stack->ga_len - 1;
5492 	    common_type(type1, *typep, typep, cctx->ctx_type_list);
5493 
5494 	    // jump here from JUMP_ALWAYS or JUMP_AND_KEEP_IF_TRUE
5495 	    isn = ((isn_T *)instr->ga_data) + end_idx;
5496 	    isn->isn_arg.jump.jump_where = instr->ga_len;
5497 	}
5498 
5499 	cctx->ctx_skip = save_skip;
5500     }
5501     return OK;
5502 }
5503 
5504 /*
5505  * Toplevel expression.
5506  * Sets "is_const" (if not NULL) to indicate the value is a constant.
5507  * Returns OK or FAIL.
5508  */
5509     static int
5510 compile_expr0_ext(char_u **arg,  cctx_T *cctx, int *is_const)
5511 {
5512     ppconst_T	ppconst;
5513 
5514     CLEAR_FIELD(ppconst);
5515     if (compile_expr1(arg, cctx, &ppconst) == FAIL)
5516     {
5517 	clear_ppconst(&ppconst);
5518 	return FAIL;
5519     }
5520     if (is_const != NULL)
5521 	*is_const = ppconst.pp_used > 0 || ppconst.pp_is_const;
5522     if (generate_ppconst(cctx, &ppconst) == FAIL)
5523 	return FAIL;
5524     return OK;
5525 }
5526 
5527 /*
5528  * Toplevel expression.
5529  */
5530     static int
5531 compile_expr0(char_u **arg,  cctx_T *cctx)
5532 {
5533     return compile_expr0_ext(arg, cctx, NULL);
5534 }
5535 
5536 /*
5537  * Compile "return [expr]".
5538  * When "legacy" is TRUE evaluate [expr] with legacy syntax
5539  */
5540     static char_u *
5541 compile_return(char_u *arg, int check_return_type, int legacy, cctx_T *cctx)
5542 {
5543     char_u	*p = arg;
5544     garray_T	*stack = &cctx->ctx_type_stack;
5545     type_T	*stack_type;
5546 
5547     if (*p != NUL && *p != '|' && *p != '\n')
5548     {
5549 	if (legacy)
5550 	{
5551 	    int save_flags = cmdmod.cmod_flags;
5552 
5553 	    generate_LEGACY_EVAL(cctx, p);
5554 	    if (need_type(&t_any, cctx->ctx_ufunc->uf_ret_type, -1,
5555 						0, cctx, FALSE, FALSE) == FAIL)
5556 		return NULL;
5557 	    cmdmod.cmod_flags |= CMOD_LEGACY;
5558 	    (void)skip_expr(&p, NULL);
5559 	    cmdmod.cmod_flags = save_flags;
5560 	}
5561 	else
5562 	{
5563 	    // compile return argument into instructions
5564 	    if (compile_expr0(&p, cctx) == FAIL)
5565 		return NULL;
5566 	}
5567 
5568 	if (cctx->ctx_skip != SKIP_YES)
5569 	{
5570 	    // "check_return_type" with uf_ret_type set to &t_unknown is used
5571 	    // for an inline function without a specified return type.  Set the
5572 	    // return type here.
5573 	    stack_type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
5574 	    if ((check_return_type && (cctx->ctx_ufunc->uf_ret_type == NULL
5575 				|| cctx->ctx_ufunc->uf_ret_type == &t_unknown
5576 				|| cctx->ctx_ufunc->uf_ret_type == &t_any))
5577 		    || (!check_return_type
5578 				&& cctx->ctx_ufunc->uf_ret_type == &t_unknown))
5579 	    {
5580 		cctx->ctx_ufunc->uf_ret_type = stack_type;
5581 	    }
5582 	    else
5583 	    {
5584 		if (cctx->ctx_ufunc->uf_ret_type->tt_type == VAR_VOID
5585 			&& stack_type->tt_type != VAR_VOID
5586 			&& stack_type->tt_type != VAR_UNKNOWN)
5587 		{
5588 		    emsg(_(e_returning_value_in_function_without_return_type));
5589 		    return NULL;
5590 		}
5591 		if (need_type(stack_type, cctx->ctx_ufunc->uf_ret_type, -1,
5592 						0, cctx, FALSE, FALSE) == FAIL)
5593 		    return NULL;
5594 	    }
5595 	}
5596     }
5597     else
5598     {
5599 	// "check_return_type" cannot be TRUE, only used for a lambda which
5600 	// always has an argument.
5601 	if (cctx->ctx_ufunc->uf_ret_type->tt_type != VAR_VOID
5602 		&& cctx->ctx_ufunc->uf_ret_type->tt_type != VAR_UNKNOWN)
5603 	{
5604 	    emsg(_(e_missing_return_value));
5605 	    return NULL;
5606 	}
5607 
5608 	// No argument, return zero.
5609 	generate_PUSHNR(cctx, 0);
5610     }
5611 
5612     // Undo any command modifiers.
5613     generate_undo_cmdmods(cctx);
5614 
5615     if (cctx->ctx_skip != SKIP_YES && generate_instr(cctx, ISN_RETURN) == NULL)
5616 	return NULL;
5617 
5618     // "return val | endif" is possible
5619     return skipwhite(p);
5620 }
5621 
5622 /*
5623  * Get a line from the compilation context, compatible with exarg_T getline().
5624  * Return a pointer to the line in allocated memory.
5625  * Return NULL for end-of-file or some error.
5626  */
5627     static char_u *
5628 exarg_getline(
5629 	int c UNUSED,
5630 	void *cookie,
5631 	int indent UNUSED,
5632 	getline_opt_T options UNUSED)
5633 {
5634     cctx_T  *cctx = (cctx_T *)cookie;
5635     char_u  *p;
5636 
5637     for (;;)
5638     {
5639 	if (cctx->ctx_lnum >= cctx->ctx_ufunc->uf_lines.ga_len - 1)
5640 	    return NULL;
5641 	++cctx->ctx_lnum;
5642 	p = ((char_u **)cctx->ctx_ufunc->uf_lines.ga_data)[cctx->ctx_lnum];
5643 	// Comment lines result in NULL pointers, skip them.
5644 	if (p != NULL)
5645 	    return vim_strsave(p);
5646     }
5647 }
5648 
5649     void
5650 fill_exarg_from_cctx(exarg_T *eap, cctx_T *cctx)
5651 {
5652     eap->getline = exarg_getline;
5653     eap->cookie = cctx;
5654 }
5655 
5656 /*
5657  * Compile a nested :def command.
5658  */
5659     static char_u *
5660 compile_nested_function(exarg_T *eap, cctx_T *cctx)
5661 {
5662     int		is_global = *eap->arg == 'g' && eap->arg[1] == ':';
5663     char_u	*name_start = eap->arg;
5664     char_u	*name_end = to_name_end(eap->arg, TRUE);
5665     char_u	*lambda_name;
5666     ufunc_T	*ufunc;
5667     int		r = FAIL;
5668     compiletype_T   compile_type;
5669 
5670     if (eap->forceit)
5671     {
5672 	emsg(_(e_cannot_use_bang_with_nested_def));
5673 	return NULL;
5674     }
5675 
5676     if (*name_start == '/')
5677     {
5678 	name_end = skip_regexp(name_start + 1, '/', TRUE);
5679 	if (*name_end == '/')
5680 	    ++name_end;
5681 	eap->nextcmd = check_nextcmd(name_end);
5682     }
5683     if (name_end == name_start || *skipwhite(name_end) != '(')
5684     {
5685 	if (!ends_excmd2(name_start, name_end))
5686 	{
5687 	    semsg(_(e_invalid_command_str), eap->cmd);
5688 	    return NULL;
5689 	}
5690 
5691 	// "def" or "def Name": list functions
5692 	if (generate_DEF(cctx, name_start, name_end - name_start) == FAIL)
5693 	    return NULL;
5694 	return eap->nextcmd == NULL ? (char_u *)"" : eap->nextcmd;
5695     }
5696 
5697     // Only g:Func() can use a namespace.
5698     if (name_start[1] == ':' && !is_global)
5699     {
5700 	semsg(_(e_namespace_not_supported_str), name_start);
5701 	return NULL;
5702     }
5703     if (check_defined(name_start, name_end - name_start, cctx, FALSE) == FAIL)
5704 	return NULL;
5705 
5706     eap->arg = name_end;
5707     fill_exarg_from_cctx(eap, cctx);
5708 
5709     eap->forceit = FALSE;
5710     lambda_name = vim_strsave(get_lambda_name());
5711     if (lambda_name == NULL)
5712 	return NULL;
5713     ufunc = define_function(eap, lambda_name);
5714 
5715     if (ufunc == NULL)
5716     {
5717 	r = eap->skip ? OK : FAIL;
5718 	goto theend;
5719     }
5720 
5721     // copy over the block scope IDs before compiling
5722     if (!is_global && cctx->ctx_ufunc->uf_block_depth > 0)
5723     {
5724 	int block_depth = cctx->ctx_ufunc->uf_block_depth;
5725 
5726 	ufunc->uf_block_ids = ALLOC_MULT(int, block_depth);
5727 	if (ufunc->uf_block_ids != NULL)
5728 	{
5729 	    mch_memmove(ufunc->uf_block_ids, cctx->ctx_ufunc->uf_block_ids,
5730 						    sizeof(int) * block_depth);
5731 	    ufunc->uf_block_depth = block_depth;
5732 	}
5733     }
5734 
5735     compile_type = COMPILE_TYPE(ufunc);
5736 #ifdef FEAT_PROFILE
5737     // If the outer function is profiled, also compile the nested function for
5738     // profiling.
5739     if (cctx->ctx_compile_type == CT_PROFILE)
5740 	compile_type = CT_PROFILE;
5741 #endif
5742     if (func_needs_compiling(ufunc, compile_type)
5743 	    && compile_def_function(ufunc, TRUE, compile_type, cctx) == FAIL)
5744     {
5745 	func_ptr_unref(ufunc);
5746 	goto theend;
5747     }
5748 
5749 #ifdef FEAT_PROFILE
5750     // When the outer function is compiled for profiling, the nested function
5751     // may be called without profiling.  Compile it here in the right context.
5752     if (compile_type == CT_PROFILE && func_needs_compiling(ufunc, CT_NONE))
5753 	compile_def_function(ufunc, FALSE, CT_NONE, cctx);
5754 #endif
5755 
5756     if (is_global)
5757     {
5758 	char_u *func_name = vim_strnsave(name_start + 2,
5759 						    name_end - name_start - 2);
5760 
5761 	if (func_name == NULL)
5762 	    r = FAIL;
5763 	else
5764 	{
5765 	    r = generate_NEWFUNC(cctx, lambda_name, func_name);
5766 	    lambda_name = NULL;
5767 	}
5768     }
5769     else
5770     {
5771 	// Define a local variable for the function reference.
5772 	lvar_T	*lvar = reserve_local(cctx, name_start, name_end - name_start,
5773 						    TRUE, ufunc->uf_func_type);
5774 
5775 	if (lvar == NULL)
5776 	    goto theend;
5777 	if (generate_FUNCREF(cctx, ufunc) == FAIL)
5778 	    goto theend;
5779 	r = generate_STORE(cctx, ISN_STORE, lvar->lv_idx, NULL);
5780     }
5781     // TODO: warning for trailing text?
5782 
5783 theend:
5784     vim_free(lambda_name);
5785     return r == FAIL ? NULL : (char_u *)"";
5786 }
5787 
5788 /*
5789  * Return the length of an assignment operator, or zero if there isn't one.
5790  */
5791     int
5792 assignment_len(char_u *p, int *heredoc)
5793 {
5794     if (*p == '=')
5795     {
5796 	if (p[1] == '<' && p[2] == '<')
5797 	{
5798 	    *heredoc = TRUE;
5799 	    return 3;
5800 	}
5801 	return 1;
5802     }
5803     if (vim_strchr((char_u *)"+-*/%", *p) != NULL && p[1] == '=')
5804 	return 2;
5805     if (STRNCMP(p, "..=", 3) == 0)
5806 	return 3;
5807     return 0;
5808 }
5809 
5810 /*
5811  * Generate the load instruction for "name".
5812  */
5813     static void
5814 generate_loadvar(
5815 	cctx_T		*cctx,
5816 	assign_dest_T	dest,
5817 	char_u		*name,
5818 	lvar_T		*lvar,
5819 	type_T		*type)
5820 {
5821     switch (dest)
5822     {
5823 	case dest_option:
5824 	    // TODO: check the option exists
5825 	    generate_LOAD(cctx, ISN_LOADOPT, 0, name, type);
5826 	    break;
5827 	case dest_global:
5828 	    if (vim_strchr(name, AUTOLOAD_CHAR) == NULL)
5829 		generate_LOAD(cctx, ISN_LOADG, 0, name + 2, type);
5830 	    else
5831 		generate_LOAD(cctx, ISN_LOADAUTO, 0, name, type);
5832 	    break;
5833 	case dest_buffer:
5834 	    generate_LOAD(cctx, ISN_LOADB, 0, name + 2, type);
5835 	    break;
5836 	case dest_window:
5837 	    generate_LOAD(cctx, ISN_LOADW, 0, name + 2, type);
5838 	    break;
5839 	case dest_tab:
5840 	    generate_LOAD(cctx, ISN_LOADT, 0, name + 2, type);
5841 	    break;
5842 	case dest_script:
5843 	    compile_load_scriptvar(cctx,
5844 		    name + (name[1] == ':' ? 2 : 0), NULL, NULL, TRUE);
5845 	    break;
5846 	case dest_env:
5847 	    // Include $ in the name here
5848 	    generate_LOAD(cctx, ISN_LOADENV, 0, name, type);
5849 	    break;
5850 	case dest_reg:
5851 	    generate_LOAD(cctx, ISN_LOADREG, name[1], NULL, &t_string);
5852 	    break;
5853 	case dest_vimvar:
5854 	    generate_LOADV(cctx, name + 2, TRUE);
5855 	    break;
5856 	case dest_local:
5857 	    if (lvar->lv_from_outer > 0)
5858 		generate_LOADOUTER(cctx, lvar->lv_idx, lvar->lv_from_outer,
5859 									 type);
5860 	    else
5861 		generate_LOAD(cctx, ISN_LOAD, lvar->lv_idx, NULL, type);
5862 	    break;
5863 	case dest_expr:
5864 	    // list or dict value should already be on the stack.
5865 	    break;
5866     }
5867 }
5868 
5869 /*
5870  * Skip over "[expr]" or ".member".
5871  * Does not check for any errors.
5872  */
5873     static char_u *
5874 skip_index(char_u *start)
5875 {
5876     char_u *p = start;
5877 
5878     if (*p == '[')
5879     {
5880 	p = skipwhite(p + 1);
5881 	(void)skip_expr(&p, NULL);
5882 	p = skipwhite(p);
5883 	if (*p == ']')
5884 	    return p + 1;
5885 	return p;
5886     }
5887     // if (*p == '.')
5888     return to_name_end(p + 1, TRUE);
5889 }
5890 
5891     void
5892 vim9_declare_error(char_u *name)
5893 {
5894     char *scope = "";
5895 
5896     switch (*name)
5897     {
5898 	case 'g': scope = _("global"); break;
5899 	case 'b': scope = _("buffer"); break;
5900 	case 'w': scope = _("window"); break;
5901 	case 't': scope = _("tab"); break;
5902 	case 'v': scope = "v:"; break;
5903 	case '$': semsg(_(e_cannot_declare_an_environment_variable), name);
5904 		  return;
5905 	case '&': semsg(_(e_cannot_declare_an_option), name);
5906 		  return;
5907 	case '@': semsg(_(e_cannot_declare_a_register_str), name);
5908 		  return;
5909 	default: return;
5910     }
5911     semsg(_(e_cannot_declare_a_scope_variable), scope, name);
5912 }
5913 
5914 /*
5915  * For one assignment figure out the type of destination.  Return it in "dest".
5916  * When not recognized "dest" is not set.
5917  * For an option "opt_flags" is set.
5918  * For a v:var "vimvaridx" is set.
5919  * "type" is set to the destination type if known, unchanted otherwise.
5920  * Return FAIL if an error message was given.
5921  */
5922     static int
5923 get_var_dest(
5924 	char_u		*name,
5925 	assign_dest_T	*dest,
5926 	int		cmdidx,
5927 	int		*opt_flags,
5928 	int		*vimvaridx,
5929 	type_T		**type,
5930 	cctx_T		*cctx)
5931 {
5932     char_u *p;
5933 
5934     if (*name == '&')
5935     {
5936 	int		cc;
5937 	long		numval;
5938 	getoption_T	opt_type;
5939 
5940 	*dest = dest_option;
5941 	if (cmdidx == CMD_final || cmdidx == CMD_const)
5942 	{
5943 	    emsg(_(e_const_option));
5944 	    return FAIL;
5945 	}
5946 	p = name;
5947 	p = find_option_end(&p, opt_flags);
5948 	if (p == NULL)
5949 	{
5950 	    // cannot happen?
5951 	    emsg(_(e_unexpected_characters_in_assignment));
5952 	    return FAIL;
5953 	}
5954 	cc = *p;
5955 	*p = NUL;
5956 	opt_type = get_option_value(skip_option_env_lead(name),
5957 						    &numval, NULL, *opt_flags);
5958 	*p = cc;
5959 	switch (opt_type)
5960 	{
5961 	    case gov_unknown:
5962 		    semsg(_(e_unknown_option), name);
5963 		    return FAIL;
5964 	    case gov_string:
5965 	    case gov_hidden_string:
5966 		    *type = &t_string;
5967 		    break;
5968 	    case gov_bool:
5969 	    case gov_hidden_bool:
5970 		    *type = &t_bool;
5971 		    break;
5972 	    case gov_number:
5973 	    case gov_hidden_number:
5974 		    *type = &t_number;
5975 		    break;
5976 	}
5977     }
5978     else if (*name == '$')
5979     {
5980 	*dest = dest_env;
5981 	*type = &t_string;
5982     }
5983     else if (*name == '@')
5984     {
5985 	if (name[1] != '@'
5986 			&& (!valid_yank_reg(name[1], FALSE) || name[1] == '.'))
5987 	{
5988 	    emsg_invreg(name[1]);
5989 	    return FAIL;
5990 	}
5991 	*dest = dest_reg;
5992 	*type = name[1] == '#' ? &t_number_or_string : &t_string;
5993     }
5994     else if (STRNCMP(name, "g:", 2) == 0)
5995     {
5996 	*dest = dest_global;
5997     }
5998     else if (STRNCMP(name, "b:", 2) == 0)
5999     {
6000 	*dest = dest_buffer;
6001     }
6002     else if (STRNCMP(name, "w:", 2) == 0)
6003     {
6004 	*dest = dest_window;
6005     }
6006     else if (STRNCMP(name, "t:", 2) == 0)
6007     {
6008 	*dest = dest_tab;
6009     }
6010     else if (STRNCMP(name, "v:", 2) == 0)
6011     {
6012 	typval_T	*vtv;
6013 	int		di_flags;
6014 
6015 	*vimvaridx = find_vim_var(name + 2, &di_flags);
6016 	if (*vimvaridx < 0)
6017 	{
6018 	    semsg(_(e_variable_not_found_str), name);
6019 	    return FAIL;
6020 	}
6021 	// We use the current value of "sandbox" here, is that OK?
6022 	if (var_check_ro(di_flags, name, FALSE))
6023 	    return FAIL;
6024 	*dest = dest_vimvar;
6025 	vtv = get_vim_var_tv(*vimvaridx);
6026 	*type = typval2type_vimvar(vtv, cctx->ctx_type_list);
6027     }
6028     return OK;
6029 }
6030 
6031 /*
6032  * Generate a STORE instruction for "dest", not being "dest_local".
6033  * Return FAIL when out of memory.
6034  */
6035     static int
6036 generate_store_var(
6037 	cctx_T		*cctx,
6038 	assign_dest_T	dest,
6039 	int		opt_flags,
6040 	int		vimvaridx,
6041 	int		scriptvar_idx,
6042 	int		scriptvar_sid,
6043 	type_T		*type,
6044 	char_u		*name)
6045 {
6046     switch (dest)
6047     {
6048 	case dest_option:
6049 	    return generate_STOREOPT(cctx, skip_option_env_lead(name),
6050 								    opt_flags);
6051 	case dest_global:
6052 	    // include g: with the name, easier to execute that way
6053 	    return generate_STORE(cctx, vim_strchr(name, AUTOLOAD_CHAR) == NULL
6054 					? ISN_STOREG : ISN_STOREAUTO, 0, name);
6055 	case dest_buffer:
6056 	    // include b: with the name, easier to execute that way
6057 	    return generate_STORE(cctx, ISN_STOREB, 0, name);
6058 	case dest_window:
6059 	    // include w: with the name, easier to execute that way
6060 	    return generate_STORE(cctx, ISN_STOREW, 0, name);
6061 	case dest_tab:
6062 	    // include t: with the name, easier to execute that way
6063 	    return generate_STORE(cctx, ISN_STORET, 0, name);
6064 	case dest_env:
6065 	    return generate_STORE(cctx, ISN_STOREENV, 0, name + 1);
6066 	case dest_reg:
6067 	    return generate_STORE(cctx, ISN_STOREREG,
6068 					 name[1] == '@' ? '"' : name[1], NULL);
6069 	case dest_vimvar:
6070 	    return generate_STORE(cctx, ISN_STOREV, vimvaridx, NULL);
6071 	case dest_script:
6072 	    if (scriptvar_idx < 0)
6073 		// "s:" may be included in the name.
6074 		return generate_OLDSCRIPT(cctx, ISN_STORES, name,
6075 							  scriptvar_sid, type);
6076 	    return generate_VIM9SCRIPT(cctx, ISN_STORESCRIPT,
6077 					   scriptvar_sid, scriptvar_idx, type);
6078 	case dest_local:
6079 	case dest_expr:
6080 	    // cannot happen
6081 	    break;
6082     }
6083     return FAIL;
6084 }
6085 
6086     static int
6087 generate_store_lhs(cctx_T *cctx, lhs_T *lhs, int instr_count)
6088 {
6089     if (lhs->lhs_dest != dest_local)
6090 	return generate_store_var(cctx, lhs->lhs_dest,
6091 			    lhs->lhs_opt_flags, lhs->lhs_vimvaridx,
6092 			    lhs->lhs_scriptvar_idx, lhs->lhs_scriptvar_sid,
6093 			    lhs->lhs_type, lhs->lhs_name);
6094 
6095     if (lhs->lhs_lvar != NULL)
6096     {
6097 	garray_T	*instr = &cctx->ctx_instr;
6098 	isn_T		*isn = ((isn_T *)instr->ga_data) + instr->ga_len - 1;
6099 
6100 	// optimization: turn "var = 123" from ISN_PUSHNR + ISN_STORE into
6101 	// ISN_STORENR
6102 	if (lhs->lhs_lvar->lv_from_outer == 0
6103 		&& instr->ga_len == instr_count + 1
6104 		&& isn->isn_type == ISN_PUSHNR)
6105 	{
6106 	    varnumber_T val = isn->isn_arg.number;
6107 	    garray_T    *stack = &cctx->ctx_type_stack;
6108 
6109 	    isn->isn_type = ISN_STORENR;
6110 	    isn->isn_arg.storenr.stnr_idx = lhs->lhs_lvar->lv_idx;
6111 	    isn->isn_arg.storenr.stnr_val = val;
6112 	    if (stack->ga_len > 0)
6113 		--stack->ga_len;
6114 	}
6115 	else if (lhs->lhs_lvar->lv_from_outer > 0)
6116 	    generate_STOREOUTER(cctx, lhs->lhs_lvar->lv_idx,
6117 						 lhs->lhs_lvar->lv_from_outer);
6118 	else
6119 	    generate_STORE(cctx, ISN_STORE, lhs->lhs_lvar->lv_idx, NULL);
6120     }
6121     return OK;
6122 }
6123 
6124     static int
6125 is_decl_command(int cmdidx)
6126 {
6127     return cmdidx == CMD_let || cmdidx == CMD_var
6128 				 || cmdidx == CMD_final || cmdidx == CMD_const;
6129 }
6130 
6131 /*
6132  * Figure out the LHS type and other properties for an assignment or one item
6133  * of ":unlet" with an index.
6134  * Returns OK or FAIL.
6135  */
6136     static int
6137 compile_lhs(
6138 	char_u	*var_start,
6139 	lhs_T	*lhs,
6140 	int	cmdidx,
6141 	int	heredoc,
6142 	int	oplen,
6143 	cctx_T	*cctx)
6144 {
6145     char_u	*var_end;
6146     int		is_decl = is_decl_command(cmdidx);
6147 
6148     CLEAR_POINTER(lhs);
6149     lhs->lhs_dest = dest_local;
6150     lhs->lhs_vimvaridx = -1;
6151     lhs->lhs_scriptvar_idx = -1;
6152 
6153     // "dest_end" is the end of the destination, including "[expr]" or
6154     // ".name".
6155     // "var_end" is the end of the variable/option/etc. name.
6156     lhs->lhs_dest_end = skip_var_one(var_start, FALSE);
6157     if (*var_start == '@')
6158 	var_end = var_start + 2;
6159     else
6160     {
6161 	// skip over the leading "&", "&l:", "&g:" and "$"
6162 	var_end = skip_option_env_lead(var_start);
6163 	var_end = to_name_end(var_end, TRUE);
6164     }
6165 
6166     // "a: type" is declaring variable "a" with a type, not dict "a:".
6167     if (is_decl && lhs->lhs_dest_end == var_start + 2
6168 					       && lhs->lhs_dest_end[-1] == ':')
6169 	--lhs->lhs_dest_end;
6170     if (is_decl && var_end == var_start + 2 && var_end[-1] == ':')
6171 	--var_end;
6172 
6173     // compute the length of the destination without "[expr]" or ".name"
6174     lhs->lhs_varlen = var_end - var_start;
6175     lhs->lhs_varlen_total = lhs->lhs_varlen;
6176     lhs->lhs_name = vim_strnsave(var_start, lhs->lhs_varlen);
6177     if (lhs->lhs_name == NULL)
6178 	return FAIL;
6179 
6180     if (lhs->lhs_dest_end > var_start + lhs->lhs_varlen)
6181 	// Something follows after the variable: "var[idx]" or "var.key".
6182 	lhs->lhs_has_index = TRUE;
6183 
6184     if (heredoc)
6185 	lhs->lhs_type = &t_list_string;
6186     else
6187 	lhs->lhs_type = &t_any;
6188 
6189     if (cctx->ctx_skip != SKIP_YES)
6190     {
6191 	int	    declare_error = FALSE;
6192 
6193 	if (get_var_dest(lhs->lhs_name, &lhs->lhs_dest, cmdidx,
6194 				      &lhs->lhs_opt_flags, &lhs->lhs_vimvaridx,
6195 						 &lhs->lhs_type, cctx) == FAIL)
6196 	    return FAIL;
6197 	if (lhs->lhs_dest != dest_local
6198 				 && cmdidx != CMD_const && cmdidx != CMD_final)
6199 	{
6200 	    // Specific kind of variable recognized.
6201 	    declare_error = is_decl;
6202 	}
6203 	else
6204 	{
6205 	    // No specific kind of variable recognized, just a name.
6206 	    if (check_reserved_name(lhs->lhs_name) == FAIL)
6207 		return FAIL;
6208 
6209 	    if (lookup_local(var_start, lhs->lhs_varlen,
6210 					     &lhs->lhs_local_lvar, cctx) == OK)
6211 		lhs->lhs_lvar = &lhs->lhs_local_lvar;
6212 	    else
6213 	    {
6214 		CLEAR_FIELD(lhs->lhs_arg_lvar);
6215 		if (arg_exists(var_start, lhs->lhs_varlen,
6216 			 &lhs->lhs_arg_lvar.lv_idx, &lhs->lhs_arg_lvar.lv_type,
6217 			    &lhs->lhs_arg_lvar.lv_from_outer, cctx) == OK)
6218 		{
6219 		    if (is_decl)
6220 		    {
6221 			semsg(_(e_str_is_used_as_argument), lhs->lhs_name);
6222 			return FAIL;
6223 		    }
6224 		    lhs->lhs_lvar = &lhs->lhs_arg_lvar;
6225 		}
6226 	    }
6227 	    if (lhs->lhs_lvar != NULL)
6228 	    {
6229 		if (is_decl)
6230 		{
6231 		    semsg(_(e_variable_already_declared), lhs->lhs_name);
6232 		    return FAIL;
6233 		}
6234 	    }
6235 	    else
6236 	    {
6237 		int script_namespace = lhs->lhs_varlen > 1
6238 				       && STRNCMP(var_start, "s:", 2) == 0;
6239 		int script_var = (script_namespace
6240 			? script_var_exists(var_start + 2, lhs->lhs_varlen - 2,
6241 									  cctx)
6242 			  : script_var_exists(var_start, lhs->lhs_varlen,
6243 								  cctx)) == OK;
6244 		imported_T  *import =
6245 			       find_imported(var_start, lhs->lhs_varlen, cctx);
6246 
6247 		if (script_namespace || script_var || import != NULL)
6248 		{
6249 		    char_u	*rawname = lhs->lhs_name
6250 					   + (lhs->lhs_name[1] == ':' ? 2 : 0);
6251 
6252 		    if (is_decl)
6253 		    {
6254 			if (script_namespace)
6255 			    semsg(_(e_cannot_declare_script_variable_in_function),
6256 								lhs->lhs_name);
6257 			else
6258 			    semsg(_(e_variable_already_declared_in_script_str),
6259 								lhs->lhs_name);
6260 			return FAIL;
6261 		    }
6262 		    else if (cctx->ctx_ufunc->uf_script_ctx_version
6263 							 == SCRIPT_VERSION_VIM9
6264 				    && script_namespace
6265 				    && !script_var && import == NULL)
6266 		    {
6267 			semsg(_(e_unknown_variable_str), lhs->lhs_name);
6268 			return FAIL;
6269 		    }
6270 
6271 		    lhs->lhs_dest = dest_script;
6272 
6273 		    // existing script-local variables should have a type
6274 		    lhs->lhs_scriptvar_sid = current_sctx.sc_sid;
6275 		    if (import != NULL)
6276 			lhs->lhs_scriptvar_sid = import->imp_sid;
6277 		    if (SCRIPT_ID_VALID(lhs->lhs_scriptvar_sid))
6278 		    {
6279 			// Check writable only when no index follows.
6280 			lhs->lhs_scriptvar_idx = get_script_item_idx(
6281 					       lhs->lhs_scriptvar_sid, rawname,
6282 			      lhs->lhs_has_index ? ASSIGN_FINAL : ASSIGN_CONST,
6283 									 cctx);
6284 			if (lhs->lhs_scriptvar_idx >= 0)
6285 			{
6286 			    scriptitem_T *si = SCRIPT_ITEM(
6287 						       lhs->lhs_scriptvar_sid);
6288 			    svar_T	 *sv =
6289 					    ((svar_T *)si->sn_var_vals.ga_data)
6290 						      + lhs->lhs_scriptvar_idx;
6291 			    lhs->lhs_type = sv->sv_type;
6292 			}
6293 		    }
6294 		}
6295 		else if (check_defined(var_start, lhs->lhs_varlen, cctx, FALSE)
6296 								       == FAIL)
6297 		    return FAIL;
6298 	    }
6299 	}
6300 
6301 	if (declare_error)
6302 	{
6303 	    vim9_declare_error(lhs->lhs_name);
6304 	    return FAIL;
6305 	}
6306     }
6307 
6308     // handle "a:name" as a name, not index "name" on "a"
6309     if (lhs->lhs_varlen > 1 || var_start[lhs->lhs_varlen] != ':')
6310 	var_end = lhs->lhs_dest_end;
6311 
6312     if (lhs->lhs_dest != dest_option)
6313     {
6314 	if (is_decl && *var_end == ':')
6315 	{
6316 	    char_u *p;
6317 
6318 	    // parse optional type: "let var: type = expr"
6319 	    if (!VIM_ISWHITE(var_end[1]))
6320 	    {
6321 		semsg(_(e_white_space_required_after_str_str), ":", var_end);
6322 		return FAIL;
6323 	    }
6324 	    p = skipwhite(var_end + 1);
6325 	    lhs->lhs_type = parse_type(&p, cctx->ctx_type_list, TRUE);
6326 	    if (lhs->lhs_type == NULL)
6327 		return FAIL;
6328 	    lhs->lhs_has_type = TRUE;
6329 	}
6330 	else if (lhs->lhs_lvar != NULL)
6331 	    lhs->lhs_type = lhs->lhs_lvar->lv_type;
6332     }
6333 
6334     if (oplen == 3 && !heredoc
6335 		   && lhs->lhs_dest != dest_global
6336 		   && !lhs->lhs_has_index
6337 		   && lhs->lhs_type->tt_type != VAR_STRING
6338 		   && lhs->lhs_type->tt_type != VAR_ANY)
6339     {
6340 	emsg(_(e_can_only_concatenate_to_string));
6341 	return FAIL;
6342     }
6343 
6344     if (lhs->lhs_lvar == NULL && lhs->lhs_dest == dest_local
6345 						 && cctx->ctx_skip != SKIP_YES)
6346     {
6347 	if (oplen > 1 && !heredoc)
6348 	{
6349 	    // +=, /=, etc. require an existing variable
6350 	    semsg(_(e_cannot_use_operator_on_new_variable), lhs->lhs_name);
6351 	    return FAIL;
6352 	}
6353 	if (!is_decl)
6354 	{
6355 	    semsg(_(e_unknown_variable_str), lhs->lhs_name);
6356 	    return FAIL;
6357 	}
6358 
6359 	// Check the name is valid for a funcref.
6360 	if ((lhs->lhs_type->tt_type == VAR_FUNC
6361 				      || lhs->lhs_type->tt_type == VAR_PARTIAL)
6362 		&& var_wrong_func_name(lhs->lhs_name, TRUE))
6363 	    return FAIL;
6364 
6365 	// New local variable.
6366 	lhs->lhs_lvar = reserve_local(cctx, var_start, lhs->lhs_varlen,
6367 		    cmdidx == CMD_final || cmdidx == CMD_const, lhs->lhs_type);
6368 	if (lhs->lhs_lvar == NULL)
6369 	    return FAIL;
6370 	lhs->lhs_new_local = TRUE;
6371     }
6372 
6373     lhs->lhs_member_type = lhs->lhs_type;
6374     if (lhs->lhs_has_index)
6375     {
6376 	// Something follows after the variable: "var[idx]" or "var.key".
6377 	// TODO: should we also handle "->func()" here?
6378 	if (is_decl)
6379 	{
6380 	    emsg(_(e_cannot_use_index_when_declaring_variable));
6381 	    return FAIL;
6382 	}
6383 
6384 	if (var_start[lhs->lhs_varlen] == '['
6385 					  || var_start[lhs->lhs_varlen] == '.')
6386 	{
6387 	    char_u	*after = var_start + lhs->lhs_varlen;
6388 	    char_u	*p;
6389 
6390 	    // Only the last index is used below, if there are others
6391 	    // before it generate code for the expression.  Thus for
6392 	    // "ll[1][2]" the expression is "ll[1]" and "[2]" is the index.
6393 	    for (;;)
6394 	    {
6395 		p = skip_index(after);
6396 		if (*p != '[' && *p != '.')
6397 		{
6398 		    lhs->lhs_varlen_total = p - var_start;
6399 		    break;
6400 		}
6401 		after = p;
6402 	    }
6403 	    if (after > var_start + lhs->lhs_varlen)
6404 	    {
6405 		lhs->lhs_varlen = after - var_start;
6406 		lhs->lhs_dest = dest_expr;
6407 		// We don't know the type before evaluating the expression,
6408 		// use "any" until then.
6409 		lhs->lhs_type = &t_any;
6410 	    }
6411 
6412 	    if (lhs->lhs_type->tt_member == NULL)
6413 		lhs->lhs_member_type = &t_any;
6414 	    else
6415 		lhs->lhs_member_type = lhs->lhs_type->tt_member;
6416 	}
6417 	else
6418 	{
6419 	    semsg("Not supported yet: %s", var_start);
6420 	    return FAIL;
6421 	}
6422     }
6423     return OK;
6424 }
6425 
6426 /*
6427  * Figure out the LHS and check a few errors.
6428  */
6429     static int
6430 compile_assign_lhs(
6431 	char_u	*var_start,
6432 	lhs_T	*lhs,
6433 	int	cmdidx,
6434 	int	is_decl,
6435 	int	heredoc,
6436 	int	oplen,
6437 	cctx_T	*cctx)
6438 {
6439     if (compile_lhs(var_start, lhs, cmdidx, heredoc, oplen, cctx) == FAIL)
6440 	return FAIL;
6441 
6442     if (!lhs->lhs_has_index && lhs->lhs_lvar == &lhs->lhs_arg_lvar)
6443     {
6444 	semsg(_(e_cannot_assign_to_argument), lhs->lhs_name);
6445 	return FAIL;
6446     }
6447     if (!is_decl && lhs->lhs_lvar != NULL
6448 			   && lhs->lhs_lvar->lv_const && !lhs->lhs_has_index)
6449     {
6450 	semsg(_(e_cannot_assign_to_constant), lhs->lhs_name);
6451 	return FAIL;
6452     }
6453     return OK;
6454 }
6455 
6456 /*
6457  * For an assignment with an index, compile the "idx" in "var[idx]" or "key" in
6458  * "var.key".
6459  */
6460     static int
6461 compile_assign_index(
6462 	char_u	*var_start,
6463 	lhs_T	*lhs,
6464 	int	*range,
6465 	cctx_T	*cctx)
6466 {
6467     size_t	varlen = lhs->lhs_varlen;
6468     char_u	*p;
6469     int		r = OK;
6470     int		need_white_before = TRUE;
6471     int		empty_second;
6472 
6473     p = var_start + varlen;
6474     if (*p == '[')
6475     {
6476 	p = skipwhite(p + 1);
6477 	if (*p == ':')
6478 	{
6479 	    // empty first index, push zero
6480 	    r = generate_PUSHNR(cctx, 0);
6481 	    need_white_before = FALSE;
6482 	}
6483 	else
6484 	    r = compile_expr0(&p, cctx);
6485 
6486 	if (r == OK && *skipwhite(p) == ':')
6487 	{
6488 	    // unlet var[idx : idx]
6489 	    // blob[idx : idx] = value
6490 	    *range = TRUE;
6491 	    p = skipwhite(p);
6492 	    empty_second = *skipwhite(p + 1) == ']';
6493 	    if ((need_white_before && !IS_WHITE_OR_NUL(p[-1]))
6494 		    || (!empty_second && !IS_WHITE_OR_NUL(p[1])))
6495 	    {
6496 		semsg(_(e_white_space_required_before_and_after_str_at_str),
6497 								      ":", p);
6498 		return FAIL;
6499 	    }
6500 	    p = skipwhite(p + 1);
6501 	    if (*p == ']')
6502 		// empty second index, push "none"
6503 		r = generate_PUSHSPEC(cctx, VVAL_NONE);
6504 	    else
6505 		r = compile_expr0(&p, cctx);
6506 	}
6507 
6508 	if (r == OK && *skipwhite(p) != ']')
6509 	{
6510 	    // this should not happen
6511 	    emsg(_(e_missbrac));
6512 	    r = FAIL;
6513 	}
6514     }
6515     else // if (*p == '.')
6516     {
6517 	char_u *key_end = to_name_end(p + 1, TRUE);
6518 	char_u *key = vim_strnsave(p + 1, key_end - p - 1);
6519 
6520 	r = generate_PUSHS(cctx, key);
6521     }
6522     return r;
6523 }
6524 
6525 /*
6526  * For a LHS with an index, load the variable to be indexed.
6527  */
6528     static int
6529 compile_load_lhs(
6530 	lhs_T	*lhs,
6531 	char_u	*var_start,
6532 	type_T	*rhs_type,
6533 	cctx_T	*cctx)
6534 {
6535     if (lhs->lhs_dest == dest_expr)
6536     {
6537 	size_t	    varlen = lhs->lhs_varlen;
6538 	int	    c = var_start[varlen];
6539 	char_u	    *p = var_start;
6540 	garray_T    *stack = &cctx->ctx_type_stack;
6541 
6542 	// Evaluate "ll[expr]" of "ll[expr][idx]"
6543 	var_start[varlen] = NUL;
6544 	if (compile_expr0(&p, cctx) == OK && p != var_start + varlen)
6545 	{
6546 	    // this should not happen
6547 	    emsg(_(e_missbrac));
6548 	    var_start[varlen] = c;
6549 	    return FAIL;
6550 	}
6551 	var_start[varlen] = c;
6552 
6553 	lhs->lhs_type = stack->ga_len == 0 ? &t_void
6554 			      : ((type_T **)stack->ga_data)[stack->ga_len - 1];
6555 	// now we can properly check the type
6556 	if (rhs_type != NULL && lhs->lhs_type->tt_member != NULL
6557 		&& rhs_type != &t_void
6558 		&& need_type(rhs_type, lhs->lhs_type->tt_member, -2, 0, cctx,
6559 							 FALSE, FALSE) == FAIL)
6560 	    return FAIL;
6561     }
6562     else
6563 	generate_loadvar(cctx, lhs->lhs_dest, lhs->lhs_name,
6564 						 lhs->lhs_lvar, lhs->lhs_type);
6565     return OK;
6566 }
6567 
6568 /*
6569  * Produce code for loading "lhs" and also take care of an index.
6570  * Return OK/FAIL.
6571  */
6572     static int
6573 compile_load_lhs_with_index(lhs_T *lhs, char_u *var_start, cctx_T *cctx)
6574 {
6575     compile_load_lhs(lhs, var_start, NULL, cctx);
6576 
6577     if (lhs->lhs_has_index)
6578     {
6579 	int range = FALSE;
6580 
6581 	// Get member from list or dict.  First compile the
6582 	// index value.
6583 	if (compile_assign_index(var_start, lhs, &range, cctx) == FAIL)
6584 	    return FAIL;
6585 	if (range)
6586 	{
6587 	    semsg(_(e_cannot_use_range_with_assignment_operator_str),
6588 								    var_start);
6589 	    return FAIL;
6590 	}
6591 
6592 	// Get the member.
6593 	if (compile_member(FALSE, cctx) == FAIL)
6594 	    return FAIL;
6595     }
6596     return OK;
6597 }
6598 
6599 /*
6600  * Assignment to a list or dict member, or ":unlet" for the item, using the
6601  * information in "lhs".
6602  * Returns OK or FAIL.
6603  */
6604     static int
6605 compile_assign_unlet(
6606 	char_u	*var_start,
6607 	lhs_T	*lhs,
6608 	int	is_assign,
6609 	type_T	*rhs_type,
6610 	cctx_T	*cctx)
6611 {
6612     vartype_T	dest_type;
6613     garray_T    *stack = &cctx->ctx_type_stack;
6614     int		range = FALSE;
6615 
6616     if (compile_assign_index(var_start, lhs, &range, cctx) == FAIL)
6617 	return FAIL;
6618     if (is_assign && range && lhs->lhs_type != &t_blob
6619 						    && lhs->lhs_type != &t_any)
6620     {
6621 	semsg(_(e_cannot_use_range_with_assignment_str), var_start);
6622 	return FAIL;
6623     }
6624 
6625     if (lhs->lhs_type == &t_any)
6626     {
6627 	// Index on variable of unknown type: check at runtime.
6628 	dest_type = VAR_ANY;
6629     }
6630     else
6631     {
6632 	dest_type = lhs->lhs_type->tt_type;
6633 	if (dest_type == VAR_DICT && range)
6634 	{
6635 	    emsg(e_cannot_use_range_with_dictionary);
6636 	    return FAIL;
6637 	}
6638 	if (dest_type == VAR_DICT
6639 			      && may_generate_2STRING(-1, FALSE, cctx) == FAIL)
6640 	    return FAIL;
6641 	if (dest_type == VAR_LIST || dest_type == VAR_BLOB)
6642 	{
6643 	    type_T *type;
6644 
6645 	    if (range)
6646 	    {
6647 		type = ((type_T **)stack->ga_data)[stack->ga_len - 2];
6648 		if (need_type(type, &t_number,
6649 					    -1, 0, cctx, FALSE, FALSE) == FAIL)
6650 		return FAIL;
6651 	    }
6652 	    type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
6653 	    if ((dest_type != VAR_BLOB && type != &t_special)
6654 		    && need_type(type, &t_number,
6655 					    -1, 0, cctx, FALSE, FALSE) == FAIL)
6656 		return FAIL;
6657 	}
6658     }
6659 
6660     // Load the dict or list.  On the stack we then have:
6661     // - value (for assignment, not for :unlet)
6662     // - index
6663     // - for [a : b] second index
6664     // - variable
6665     if (compile_load_lhs(lhs, var_start, rhs_type, cctx) == FAIL)
6666 	return FAIL;
6667 
6668     if (dest_type == VAR_LIST || dest_type == VAR_DICT
6669 			      || dest_type == VAR_BLOB || dest_type == VAR_ANY)
6670     {
6671 	if (is_assign)
6672 	{
6673 	    if (range)
6674 	    {
6675 		if (generate_instr_drop(cctx, ISN_STORERANGE, 4) == NULL)
6676 		    return FAIL;
6677 	    }
6678 	    else
6679 	    {
6680 		isn_T	*isn = generate_instr_drop(cctx, ISN_STOREINDEX, 3);
6681 
6682 		if (isn == NULL)
6683 		    return FAIL;
6684 		isn->isn_arg.vartype = dest_type;
6685 	    }
6686 	}
6687 	else if (range)
6688 	{
6689 	    if (generate_instr_drop(cctx, ISN_UNLETRANGE, 3) == NULL)
6690 		return FAIL;
6691 	}
6692 	else
6693 	{
6694 	    if (generate_instr_drop(cctx, ISN_UNLETINDEX, 2) == NULL)
6695 		return FAIL;
6696 	}
6697     }
6698     else
6699     {
6700 	emsg(_(e_indexable_type_required));
6701 	return FAIL;
6702     }
6703 
6704     return OK;
6705 }
6706 
6707 /*
6708  * Compile declaration and assignment:
6709  * "let name"
6710  * "var name = expr"
6711  * "final name = expr"
6712  * "const name = expr"
6713  * "name = expr"
6714  * "arg" points to "name".
6715  * "++arg" and "--arg"
6716  * Return NULL for an error.
6717  * Return "arg" if it does not look like a variable list.
6718  */
6719     static char_u *
6720 compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
6721 {
6722     char_u	*var_start;
6723     char_u	*p;
6724     char_u	*end = arg;
6725     char_u	*ret = NULL;
6726     int		var_count = 0;
6727     int		var_idx;
6728     int		semicolon = 0;
6729     int		did_generate_slice = FALSE;
6730     garray_T	*instr = &cctx->ctx_instr;
6731     garray_T    *stack = &cctx->ctx_type_stack;
6732     char_u	*op;
6733     int		oplen = 0;
6734     int		heredoc = FALSE;
6735     int		incdec = FALSE;
6736     type_T	*rhs_type = &t_any;
6737     char_u	*sp;
6738     int		is_decl = is_decl_command(cmdidx);
6739     lhs_T	lhs;
6740     long	start_lnum = SOURCING_LNUM;
6741 
6742     // Skip over the "var" or "[var, var]" to get to any "=".
6743     p = skip_var_list(arg, TRUE, &var_count, &semicolon, TRUE);
6744     if (p == NULL)
6745 	return *arg == '[' ? arg : NULL;
6746 
6747     if (var_count > 0 && is_decl)
6748     {
6749 	// TODO: should we allow this, and figure out type inference from list
6750 	// members?
6751 	emsg(_(e_cannot_use_list_for_declaration));
6752 	return NULL;
6753     }
6754     lhs.lhs_name = NULL;
6755 
6756     sp = p;
6757     p = skipwhite(p);
6758     op = p;
6759     oplen = assignment_len(p, &heredoc);
6760 
6761     if (var_count > 0 && oplen == 0)
6762 	// can be something like "[1, 2]->func()"
6763 	return arg;
6764 
6765     if (oplen > 0 && (!VIM_ISWHITE(*sp) || !IS_WHITE_OR_NUL(op[oplen])))
6766     {
6767 	error_white_both(op, oplen);
6768 	return NULL;
6769     }
6770     if (eap->cmdidx == CMD_increment || eap->cmdidx == CMD_decrement)
6771     {
6772 	if (VIM_ISWHITE(eap->cmd[2]))
6773 	{
6774 	    semsg(_(e_no_white_space_allowed_after_str_str),
6775 			 eap->cmdidx == CMD_increment ? "++" : "--", eap->cmd);
6776 	    return NULL;
6777 	}
6778 	op = (char_u *)(eap->cmdidx == CMD_increment ? "+=" : "-=");
6779 	oplen = 2;
6780 	incdec = TRUE;
6781     }
6782 
6783     if (heredoc)
6784     {
6785 	list_T	   *l;
6786 	listitem_T *li;
6787 
6788 	// [let] varname =<< [trim] {end}
6789 	eap->getline = exarg_getline;
6790 	eap->cookie = cctx;
6791 	l = heredoc_get(eap, op + 3, FALSE);
6792 	if (l == NULL)
6793 	    return NULL;
6794 
6795 	if (cctx->ctx_skip != SKIP_YES)
6796 	{
6797 	    // Push each line and the create the list.
6798 	    FOR_ALL_LIST_ITEMS(l, li)
6799 	    {
6800 		generate_PUSHS(cctx, li->li_tv.vval.v_string);
6801 		li->li_tv.vval.v_string = NULL;
6802 	    }
6803 	    generate_NEWLIST(cctx, l->lv_len);
6804 	}
6805 	list_free(l);
6806 	p += STRLEN(p);
6807 	end = p;
6808     }
6809     else if (var_count > 0)
6810     {
6811 	char_u *wp;
6812 
6813 	// for "[var, var] = expr" evaluate the expression here, loop over the
6814 	// list of variables below.
6815 	// A line break may follow the "=".
6816 
6817 	wp = op + oplen;
6818 	if (may_get_next_line_error(wp, &p, cctx) == FAIL)
6819 	    return FAIL;
6820 	if (compile_expr0(&p, cctx) == FAIL)
6821 	    return NULL;
6822 	end = p;
6823 
6824 	if (cctx->ctx_skip != SKIP_YES)
6825 	{
6826 	    type_T	*stacktype;
6827 
6828 	    stacktype = stack->ga_len == 0 ? &t_void
6829 			      : ((type_T **)stack->ga_data)[stack->ga_len - 1];
6830 	    if (stacktype->tt_type == VAR_VOID)
6831 	    {
6832 		emsg(_(e_cannot_use_void_value));
6833 		goto theend;
6834 	    }
6835 	    if (need_type(stacktype, &t_list_any, -1, 0, cctx,
6836 							 FALSE, FALSE) == FAIL)
6837 		goto theend;
6838 	    // TODO: check the length of a constant list here
6839 	    generate_CHECKLEN(cctx, semicolon ? var_count - 1 : var_count,
6840 								    semicolon);
6841 	    if (stacktype->tt_member != NULL)
6842 		rhs_type = stacktype->tt_member;
6843 	}
6844     }
6845 
6846     /*
6847      * Loop over variables in "[var, var] = expr".
6848      * For "var = expr" and "let var: type" this is done only once.
6849      */
6850     if (var_count > 0)
6851 	var_start = skipwhite(arg + 1);  // skip over the "["
6852     else
6853 	var_start = arg;
6854     for (var_idx = 0; var_idx == 0 || var_idx < var_count; var_idx++)
6855     {
6856 	int	instr_count = -1;
6857 	int	save_lnum;
6858 
6859 	if (var_start[0] == '_' && !eval_isnamec(var_start[1]))
6860 	{
6861 	    // Ignore underscore in "[a, _, b] = list".
6862 	    if (var_count > 0)
6863 	    {
6864 		var_start = skipwhite(var_start + 2);
6865 		continue;
6866 	    }
6867 	    emsg(_(e_cannot_use_underscore_here));
6868 	    goto theend;
6869 	}
6870 	vim_free(lhs.lhs_name);
6871 
6872 	/*
6873 	 * Figure out the LHS type and other properties.
6874 	 */
6875 	if (compile_assign_lhs(var_start, &lhs, cmdidx,
6876 					is_decl, heredoc, oplen, cctx) == FAIL)
6877 	    goto theend;
6878 	if (heredoc)
6879 	{
6880 	    SOURCING_LNUM = start_lnum;
6881 	    if (lhs.lhs_has_type
6882 		    && need_type(&t_list_string, lhs.lhs_type,
6883 					    -1, 0, cctx, FALSE, FALSE) == FAIL)
6884 		goto theend;
6885 	}
6886 	else
6887 	{
6888 	    if (cctx->ctx_skip == SKIP_YES)
6889 	    {
6890 		if (oplen > 0 && var_count == 0)
6891 		{
6892 		    // skip over the "=" and the expression
6893 		    p = skipwhite(op + oplen);
6894 		    (void)compile_expr0(&p, cctx);
6895 		}
6896 	    }
6897 	    else if (oplen > 0)
6898 	    {
6899 		int	is_const = FALSE;
6900 		char_u	*wp;
6901 
6902 		// for "+=", "*=", "..=" etc. first load the current value
6903 		if (*op != '='
6904 			&& compile_load_lhs_with_index(&lhs, var_start,
6905 								 cctx) == FAIL)
6906 		    goto theend;
6907 
6908 		// For "var = expr" evaluate the expression.
6909 		if (var_count == 0)
6910 		{
6911 		    int	r;
6912 
6913 		    // Compile the expression.
6914 		    instr_count = instr->ga_len;
6915 		    if (incdec)
6916 		    {
6917 			r = generate_PUSHNR(cctx, 1);
6918 		    }
6919 		    else
6920 		    {
6921 			// Temporarily hide the new local variable here, it is
6922 			// not available to this expression.
6923 			if (lhs.lhs_new_local)
6924 			    --cctx->ctx_locals.ga_len;
6925 			wp = op + oplen;
6926 			if (may_get_next_line_error(wp, &p, cctx) == FAIL)
6927 			{
6928 			    if (lhs.lhs_new_local)
6929 				++cctx->ctx_locals.ga_len;
6930 			    goto theend;
6931 			}
6932 			r = compile_expr0_ext(&p, cctx, &is_const);
6933 			if (lhs.lhs_new_local)
6934 			    ++cctx->ctx_locals.ga_len;
6935 			if (r == FAIL)
6936 			    goto theend;
6937 		    }
6938 		}
6939 		else if (semicolon && var_idx == var_count - 1)
6940 		{
6941 		    // For "[var; var] = expr" get the rest of the list
6942 		    did_generate_slice = TRUE;
6943 		    if (generate_SLICE(cctx, var_count - 1) == FAIL)
6944 			goto theend;
6945 		}
6946 		else
6947 		{
6948 		    // For "[var, var] = expr" get the "var_idx" item from the
6949 		    // list.
6950 		    if (generate_GETITEM(cctx, var_idx, *op != '=') == FAIL)
6951 			goto theend;
6952 		}
6953 
6954 		rhs_type = stack->ga_len == 0 ? &t_void
6955 			      : ((type_T **)stack->ga_data)[stack->ga_len - 1];
6956 		if (lhs.lhs_lvar != NULL && (is_decl || !lhs.lhs_has_type))
6957 		{
6958 		    if ((rhs_type->tt_type == VAR_FUNC
6959 				|| rhs_type->tt_type == VAR_PARTIAL)
6960 			    && !lhs.lhs_has_index
6961 			    && var_wrong_func_name(lhs.lhs_name, TRUE))
6962 			goto theend;
6963 
6964 		    if (lhs.lhs_new_local && !lhs.lhs_has_type)
6965 		    {
6966 			if (rhs_type->tt_type == VAR_VOID)
6967 			{
6968 			    emsg(_(e_cannot_use_void_value));
6969 			    goto theend;
6970 			}
6971 			else
6972 			{
6973 			    // An empty list or dict has a &t_unknown member,
6974 			    // for a variable that implies &t_any.
6975 			    if (rhs_type == &t_list_empty)
6976 				lhs.lhs_lvar->lv_type = &t_list_any;
6977 			    else if (rhs_type == &t_dict_empty)
6978 				lhs.lhs_lvar->lv_type = &t_dict_any;
6979 			    else if (rhs_type == &t_unknown)
6980 				lhs.lhs_lvar->lv_type = &t_any;
6981 			    else
6982 				lhs.lhs_lvar->lv_type = rhs_type;
6983 			}
6984 		    }
6985 		    else if (*op == '=')
6986 		    {
6987 			type_T *use_type = lhs.lhs_lvar->lv_type;
6988 
6989 			// Without operator check type here, otherwise below.
6990 			// Use the line number of the assignment.
6991 			SOURCING_LNUM = start_lnum;
6992 			if (lhs.lhs_has_index)
6993 			    use_type = lhs.lhs_member_type;
6994 			if (need_type(rhs_type, use_type, -1, 0, cctx,
6995 						      FALSE, is_const) == FAIL)
6996 			    goto theend;
6997 		    }
6998 		}
6999 		else
7000 		{
7001 		    type_T *lhs_type = lhs.lhs_member_type;
7002 
7003 		    // Special case: assigning to @# can use a number or a
7004 		    // string.
7005 		    if (lhs_type == &t_number_or_string
7006 					    && rhs_type->tt_type == VAR_NUMBER)
7007 			lhs_type = &t_number;
7008 		    if (*p != '=' && need_type(rhs_type, lhs_type,
7009 					    -1, 0, cctx, FALSE, FALSE) == FAIL)
7010 		    goto theend;
7011 		}
7012 	    }
7013 	    else if (cmdidx == CMD_final)
7014 	    {
7015 		emsg(_(e_final_requires_a_value));
7016 		goto theend;
7017 	    }
7018 	    else if (cmdidx == CMD_const)
7019 	    {
7020 		emsg(_(e_const_requires_a_value));
7021 		goto theend;
7022 	    }
7023 	    else if (!lhs.lhs_has_type || lhs.lhs_dest == dest_option)
7024 	    {
7025 		emsg(_(e_type_or_initialization_required));
7026 		goto theend;
7027 	    }
7028 	    else
7029 	    {
7030 		// variables are always initialized
7031 		if (ga_grow(instr, 1) == FAIL)
7032 		    goto theend;
7033 		switch (lhs.lhs_member_type->tt_type)
7034 		{
7035 		    case VAR_BOOL:
7036 			generate_PUSHBOOL(cctx, VVAL_FALSE);
7037 			break;
7038 		    case VAR_FLOAT:
7039 #ifdef FEAT_FLOAT
7040 			generate_PUSHF(cctx, 0.0);
7041 #endif
7042 			break;
7043 		    case VAR_STRING:
7044 			generate_PUSHS(cctx, NULL);
7045 			break;
7046 		    case VAR_BLOB:
7047 			generate_PUSHBLOB(cctx, blob_alloc());
7048 			break;
7049 		    case VAR_FUNC:
7050 			generate_PUSHFUNC(cctx, NULL, &t_func_void);
7051 			break;
7052 		    case VAR_LIST:
7053 			generate_NEWLIST(cctx, 0);
7054 			break;
7055 		    case VAR_DICT:
7056 			generate_NEWDICT(cctx, 0);
7057 			break;
7058 		    case VAR_JOB:
7059 			generate_PUSHJOB(cctx, NULL);
7060 			break;
7061 		    case VAR_CHANNEL:
7062 			generate_PUSHCHANNEL(cctx, NULL);
7063 			break;
7064 		    case VAR_NUMBER:
7065 		    case VAR_UNKNOWN:
7066 		    case VAR_ANY:
7067 		    case VAR_PARTIAL:
7068 		    case VAR_VOID:
7069 		    case VAR_INSTR:
7070 		    case VAR_SPECIAL:  // cannot happen
7071 			generate_PUSHNR(cctx, 0);
7072 			break;
7073 		}
7074 	    }
7075 	    if (var_count == 0)
7076 		end = p;
7077 	}
7078 
7079 	// no need to parse more when skipping
7080 	if (cctx->ctx_skip == SKIP_YES)
7081 	    break;
7082 
7083 	if (oplen > 0 && *op != '=')
7084 	{
7085 	    type_T	    *expected;
7086 	    type_T	    *stacktype;
7087 
7088 	    if (*op == '.')
7089 		expected = &t_string;
7090 	    else
7091 		expected = lhs.lhs_member_type;
7092 	    stacktype = ((type_T **)stack->ga_data)[stack->ga_len - 1];
7093 	    if (
7094 #ifdef FEAT_FLOAT
7095 		// If variable is float operation with number is OK.
7096 		!(expected == &t_float && stacktype == &t_number) &&
7097 #endif
7098 		    need_type(stacktype, expected, -1, 0, cctx,
7099 							 FALSE, FALSE) == FAIL)
7100 		goto theend;
7101 
7102 	    if (*op == '.')
7103 	    {
7104 		if (generate_instr_drop(cctx, ISN_CONCAT, 1) == NULL)
7105 		    goto theend;
7106 	    }
7107 	    else if (*op == '+')
7108 	    {
7109 		if (generate_add_instr(cctx,
7110 			    operator_type(lhs.lhs_member_type, stacktype),
7111 				       lhs.lhs_member_type, stacktype) == FAIL)
7112 		    goto theend;
7113 	    }
7114 	    else if (generate_two_op(cctx, op) == FAIL)
7115 		goto theend;
7116 	}
7117 
7118 	// Use the line number of the assignment for store instruction.
7119 	save_lnum = cctx->ctx_lnum;
7120 	cctx->ctx_lnum = start_lnum - 1;
7121 
7122 	if (lhs.lhs_has_index)
7123 	{
7124 	    // Use the info in "lhs" to store the value at the index in the
7125 	    // list or dict.
7126 	    if (compile_assign_unlet(var_start, &lhs, TRUE, rhs_type, cctx)
7127 								       == FAIL)
7128 	    {
7129 		cctx->ctx_lnum = save_lnum;
7130 		goto theend;
7131 	    }
7132 	}
7133 	else
7134 	{
7135 	    if (is_decl && cmdidx == CMD_const && (lhs.lhs_dest == dest_script
7136 						|| lhs.lhs_dest == dest_global
7137 						|| lhs.lhs_dest == dest_local))
7138 		// ":const var": lock the value, but not referenced variables
7139 		generate_LOCKCONST(cctx);
7140 
7141 	    if (is_decl
7142 		    && (lhs.lhs_type->tt_type == VAR_DICT
7143 					  || lhs.lhs_type->tt_type == VAR_LIST)
7144 		    && lhs.lhs_type->tt_member != NULL
7145 		    && lhs.lhs_type->tt_member != &t_any
7146 		    && lhs.lhs_type->tt_member != &t_unknown)
7147 		// Set the type in the list or dict, so that it can be checked,
7148 		// also in legacy script.
7149 		generate_SETTYPE(cctx, lhs.lhs_type);
7150 
7151 	    if (generate_store_lhs(cctx, &lhs, instr_count) == FAIL)
7152 	    {
7153 		cctx->ctx_lnum = save_lnum;
7154 		goto theend;
7155 	    }
7156 	}
7157 	cctx->ctx_lnum = save_lnum;
7158 
7159 	if (var_idx + 1 < var_count)
7160 	    var_start = skipwhite(lhs.lhs_dest_end + 1);
7161     }
7162 
7163     // For "[var, var] = expr" drop the "expr" value.
7164     // Also for "[var, var; _] = expr".
7165     if (var_count > 0 && (!semicolon || !did_generate_slice))
7166     {
7167 	if (generate_instr_drop(cctx, ISN_DROP, 1) == NULL)
7168 	    goto theend;
7169     }
7170 
7171     ret = skipwhite(end);
7172 
7173 theend:
7174     vim_free(lhs.lhs_name);
7175     return ret;
7176 }
7177 
7178 /*
7179  * Check for an assignment at "eap->cmd", compile it if found.
7180  * Return NOTDONE if there is none, FAIL for failure, OK if done.
7181  */
7182     static int
7183 may_compile_assignment(exarg_T *eap, char_u **line, cctx_T *cctx)
7184 {
7185     char_u  *pskip;
7186     char_u  *p;
7187 
7188     // Assuming the command starts with a variable or function name,
7189     // find what follows.
7190     // Skip over "var.member", "var[idx]" and the like.
7191     // Also "&opt = val", "$ENV = val" and "@r = val".
7192     pskip = (*eap->cmd == '&' || *eap->cmd == '$' || *eap->cmd == '@')
7193 						 ? eap->cmd + 1 : eap->cmd;
7194     p = to_name_end(pskip, TRUE);
7195     if (p > eap->cmd && *p != NUL)
7196     {
7197 	char_u *var_end;
7198 	int	oplen;
7199 	int	heredoc;
7200 
7201 	if (eap->cmd[0] == '@')
7202 	    var_end = eap->cmd + 2;
7203 	else
7204 	    var_end = find_name_end(pskip, NULL, NULL,
7205 					FNE_CHECK_START | FNE_INCL_BR);
7206 	oplen = assignment_len(skipwhite(var_end), &heredoc);
7207 	if (oplen > 0)
7208 	{
7209 	    size_t len = p - eap->cmd;
7210 
7211 	    // Recognize an assignment if we recognize the variable
7212 	    // name:
7213 	    // "g:var = expr"
7214 	    // "local = expr"  where "local" is a local var.
7215 	    // "script = expr"  where "script" is a script-local var.
7216 	    // "import = expr"  where "import" is an imported var
7217 	    // "&opt = expr"
7218 	    // "$ENV = expr"
7219 	    // "@r = expr"
7220 	    if (*eap->cmd == '&'
7221 		    || *eap->cmd == '$'
7222 		    || *eap->cmd == '@'
7223 		    || ((len) > 2 && eap->cmd[1] == ':')
7224 		    || variable_exists(eap->cmd, len, cctx))
7225 	    {
7226 		*line = compile_assignment(eap->cmd, eap, CMD_SIZE, cctx);
7227 		if (*line == NULL || *line == eap->cmd)
7228 		    return FAIL;
7229 		return OK;
7230 	    }
7231 	}
7232     }
7233 
7234     if (*eap->cmd == '[')
7235     {
7236 	// [var, var] = expr
7237 	*line = compile_assignment(eap->cmd, eap, CMD_SIZE, cctx);
7238 	if (*line == NULL)
7239 	    return FAIL;
7240 	if (*line != eap->cmd)
7241 	    return OK;
7242     }
7243     return NOTDONE;
7244 }
7245 
7246 /*
7247  * Check if "name" can be "unlet".
7248  */
7249     int
7250 check_vim9_unlet(char_u *name)
7251 {
7252     if (name[1] != ':' || vim_strchr((char_u *)"gwtb", *name) == NULL)
7253     {
7254 	// "unlet s:var" is allowed in legacy script.
7255 	if (*name == 's' && !script_is_vim9())
7256 	    return OK;
7257 	semsg(_(e_cannot_unlet_str), name);
7258 	return FAIL;
7259     }
7260     return OK;
7261 }
7262 
7263 /*
7264  * Callback passed to ex_unletlock().
7265  */
7266     static int
7267 compile_unlet(
7268     lval_T  *lvp,
7269     char_u  *name_end,
7270     exarg_T *eap,
7271     int	    deep UNUSED,
7272     void    *coookie)
7273 {
7274     cctx_T	*cctx = coookie;
7275     char_u	*p = lvp->ll_name;
7276     int		cc = *name_end;
7277     int		ret = OK;
7278 
7279     if (cctx->ctx_skip == SKIP_YES)
7280 	return OK;
7281 
7282     *name_end = NUL;
7283     if (*p == '$')
7284     {
7285 	// :unlet $ENV_VAR
7286 	ret = generate_UNLET(cctx, ISN_UNLETENV, p + 1, eap->forceit);
7287     }
7288     else if (vim_strchr(p, '.') != NULL || vim_strchr(p, '[') != NULL)
7289     {
7290 	lhs_T	    lhs;
7291 
7292 	// This is similar to assigning: lookup the list/dict, compile the
7293 	// idx/key.  Then instead of storing the value unlet the item.
7294 	// unlet {list}[idx]
7295 	// unlet {dict}[key]  dict.key
7296 	//
7297 	// Figure out the LHS type and other properties.
7298 	//
7299 	ret = compile_lhs(p, &lhs, CMD_unlet, FALSE, 0, cctx);
7300 
7301 	// : unlet an indexed item
7302 	if (!lhs.lhs_has_index)
7303 	{
7304 	    iemsg("called compile_lhs() without an index");
7305 	    ret = FAIL;
7306 	}
7307 	else
7308 	{
7309 	    // Use the info in "lhs" to unlet the item at the index in the
7310 	    // list or dict.
7311 	    ret = compile_assign_unlet(p, &lhs, FALSE, &t_void, cctx);
7312 	}
7313 
7314 	vim_free(lhs.lhs_name);
7315     }
7316     else if (check_vim9_unlet(p) == FAIL)
7317     {
7318 	ret = FAIL;
7319     }
7320     else
7321     {
7322 	// Normal name.  Only supports g:, w:, t: and b: namespaces.
7323 	ret = generate_UNLET(cctx, ISN_UNLET, p, eap->forceit);
7324     }
7325 
7326     *name_end = cc;
7327     return ret;
7328 }
7329 
7330 /*
7331  * Callback passed to ex_unletlock().
7332  */
7333     static int
7334 compile_lock_unlock(
7335     lval_T  *lvp,
7336     char_u  *name_end,
7337     exarg_T *eap,
7338     int	    deep UNUSED,
7339     void    *coookie)
7340 {
7341     cctx_T	*cctx = coookie;
7342     int		cc = *name_end;
7343     char_u	*p = lvp->ll_name;
7344     int		ret = OK;
7345     size_t	len;
7346     char_u	*buf;
7347 
7348     if (cctx->ctx_skip == SKIP_YES)
7349 	return OK;
7350 
7351     // Cannot use :lockvar and :unlockvar on local variables.
7352     if (p[1] != ':')
7353     {
7354 	char_u *end = skip_var_one(p, FALSE);
7355 
7356 	if (lookup_local(p, end - p, NULL, cctx) == OK)
7357 	{
7358 	    emsg(_(e_cannot_lock_unlock_local_variable));
7359 	    return FAIL;
7360 	}
7361     }
7362 
7363     // Checking is done at runtime.
7364     *name_end = NUL;
7365     len = name_end - p + 20;
7366     buf = alloc(len);
7367     if (buf == NULL)
7368 	ret = FAIL;
7369     else
7370     {
7371 	vim_snprintf((char *)buf, len, "%s %s",
7372 		eap->cmdidx == CMD_lockvar ? "lockvar" : "unlockvar",
7373 		p);
7374 	ret = generate_EXEC(cctx, buf);
7375 
7376 	vim_free(buf);
7377 	*name_end = cc;
7378     }
7379     return ret;
7380 }
7381 
7382 /*
7383  * compile "unlet var", "lock var" and "unlock var"
7384  * "arg" points to "var".
7385  */
7386     static char_u *
7387 compile_unletlock(char_u *arg, exarg_T *eap, cctx_T *cctx)
7388 {
7389     ex_unletlock(eap, arg, 0, GLV_NO_AUTOLOAD | GLV_COMPILING,
7390 	    eap->cmdidx == CMD_unlet ? compile_unlet : compile_lock_unlock,
7391 	    cctx);
7392     return eap->nextcmd == NULL ? (char_u *)"" : eap->nextcmd;
7393 }
7394 
7395 /*
7396  * generate a jump to the ":endif"/":endfor"/":endwhile"/":finally"/":endtry".
7397  */
7398     static int
7399 compile_jump_to_end(endlabel_T **el, jumpwhen_T when, cctx_T *cctx)
7400 {
7401     garray_T	*instr = &cctx->ctx_instr;
7402     endlabel_T  *endlabel = ALLOC_CLEAR_ONE(endlabel_T);
7403 
7404     if (endlabel == NULL)
7405 	return FAIL;
7406     endlabel->el_next = *el;
7407     *el = endlabel;
7408     endlabel->el_end_label = instr->ga_len;
7409 
7410     generate_JUMP(cctx, when, 0);
7411     return OK;
7412 }
7413 
7414     static void
7415 compile_fill_jump_to_end(endlabel_T **el, int jump_where, cctx_T *cctx)
7416 {
7417     garray_T	*instr = &cctx->ctx_instr;
7418 
7419     while (*el != NULL)
7420     {
7421 	endlabel_T  *cur = (*el);
7422 	isn_T	    *isn;
7423 
7424 	isn = ((isn_T *)instr->ga_data) + cur->el_end_label;
7425 	isn->isn_arg.jump.jump_where = jump_where;
7426 	*el = cur->el_next;
7427 	vim_free(cur);
7428     }
7429 }
7430 
7431     static void
7432 compile_free_jump_to_end(endlabel_T **el)
7433 {
7434     while (*el != NULL)
7435     {
7436 	endlabel_T  *cur = (*el);
7437 
7438 	*el = cur->el_next;
7439 	vim_free(cur);
7440     }
7441 }
7442 
7443 /*
7444  * Create a new scope and set up the generic items.
7445  */
7446     static scope_T *
7447 new_scope(cctx_T *cctx, scopetype_T type)
7448 {
7449     scope_T *scope = ALLOC_CLEAR_ONE(scope_T);
7450 
7451     if (scope == NULL)
7452 	return NULL;
7453     scope->se_outer = cctx->ctx_scope;
7454     cctx->ctx_scope = scope;
7455     scope->se_type = type;
7456     scope->se_local_count = cctx->ctx_locals.ga_len;
7457     return scope;
7458 }
7459 
7460 /*
7461  * Free the current scope and go back to the outer scope.
7462  */
7463     static void
7464 drop_scope(cctx_T *cctx)
7465 {
7466     scope_T *scope = cctx->ctx_scope;
7467 
7468     if (scope == NULL)
7469     {
7470 	iemsg("calling drop_scope() without a scope");
7471 	return;
7472     }
7473     cctx->ctx_scope = scope->se_outer;
7474     switch (scope->se_type)
7475     {
7476 	case IF_SCOPE:
7477 	    compile_free_jump_to_end(&scope->se_u.se_if.is_end_label); break;
7478 	case FOR_SCOPE:
7479 	    compile_free_jump_to_end(&scope->se_u.se_for.fs_end_label); break;
7480 	case WHILE_SCOPE:
7481 	    compile_free_jump_to_end(&scope->se_u.se_while.ws_end_label); break;
7482 	case TRY_SCOPE:
7483 	    compile_free_jump_to_end(&scope->se_u.se_try.ts_end_label); break;
7484 	case NO_SCOPE:
7485 	case BLOCK_SCOPE:
7486 	    break;
7487     }
7488     vim_free(scope);
7489 }
7490 
7491 /*
7492  * compile "if expr"
7493  *
7494  * "if expr" Produces instructions:
7495  *	EVAL expr		Push result of "expr"
7496  *	JUMP_IF_FALSE end
7497  *	... body ...
7498  * end:
7499  *
7500  * "if expr | else" Produces instructions:
7501  *	EVAL expr		Push result of "expr"
7502  *	JUMP_IF_FALSE else
7503  *	... body ...
7504  *	JUMP_ALWAYS end
7505  * else:
7506  *	... body ...
7507  * end:
7508  *
7509  * "if expr1 | elseif expr2 | else" Produces instructions:
7510  *	EVAL expr		Push result of "expr"
7511  *	JUMP_IF_FALSE elseif
7512  *	... body ...
7513  *	JUMP_ALWAYS end
7514  * elseif:
7515  *	EVAL expr		Push result of "expr"
7516  *	JUMP_IF_FALSE else
7517  *	... body ...
7518  *	JUMP_ALWAYS end
7519  * else:
7520  *	... body ...
7521  * end:
7522  */
7523     static char_u *
7524 compile_if(char_u *arg, cctx_T *cctx)
7525 {
7526     char_u	*p = arg;
7527     garray_T	*instr = &cctx->ctx_instr;
7528     int		instr_count = instr->ga_len;
7529     scope_T	*scope;
7530     skip_T	skip_save = cctx->ctx_skip;
7531     ppconst_T	ppconst;
7532 
7533     CLEAR_FIELD(ppconst);
7534     if (compile_expr1(&p, cctx, &ppconst) == FAIL)
7535     {
7536 	clear_ppconst(&ppconst);
7537 	return NULL;
7538     }
7539     if (!ends_excmd2(arg, skipwhite(p)))
7540     {
7541 	semsg(_(e_trailing_arg), p);
7542 	return NULL;
7543     }
7544     if (cctx->ctx_skip == SKIP_YES)
7545 	clear_ppconst(&ppconst);
7546     else if (instr->ga_len == instr_count && ppconst.pp_used == 1)
7547     {
7548 	int error = FALSE;
7549 	int v;
7550 
7551 	// The expression results in a constant.
7552 	v = tv_get_bool_chk(&ppconst.pp_tv[0], &error);
7553 	clear_ppconst(&ppconst);
7554 	if (error)
7555 	    return NULL;
7556 	cctx->ctx_skip = v ? SKIP_NOT : SKIP_YES;
7557     }
7558     else
7559     {
7560 	// Not a constant, generate instructions for the expression.
7561 	cctx->ctx_skip = SKIP_UNKNOWN;
7562 	if (generate_ppconst(cctx, &ppconst) == FAIL)
7563 	    return NULL;
7564 	if (bool_on_stack(cctx) == FAIL)
7565 	    return NULL;
7566     }
7567 
7568     // CMDMOD_REV must come before the jump
7569     generate_undo_cmdmods(cctx);
7570 
7571     scope = new_scope(cctx, IF_SCOPE);
7572     if (scope == NULL)
7573 	return NULL;
7574     scope->se_skip_save = skip_save;
7575     // "is_had_return" will be reset if any block does not end in :return
7576     scope->se_u.se_if.is_had_return = TRUE;
7577 
7578     if (cctx->ctx_skip == SKIP_UNKNOWN)
7579     {
7580 	// "where" is set when ":elseif", "else" or ":endif" is found
7581 	scope->se_u.se_if.is_if_label = instr->ga_len;
7582 	generate_JUMP(cctx, JUMP_IF_FALSE, 0);
7583     }
7584     else
7585 	scope->se_u.se_if.is_if_label = -1;
7586 
7587 #ifdef FEAT_PROFILE
7588     if (cctx->ctx_compile_type == CT_PROFILE && cctx->ctx_skip == SKIP_YES
7589 						      && skip_save != SKIP_YES)
7590     {
7591 	// generated a profile start, need to generate a profile end, since it
7592 	// won't be done after returning
7593 	cctx->ctx_skip = SKIP_NOT;
7594 	generate_instr(cctx, ISN_PROF_END);
7595 	cctx->ctx_skip = SKIP_YES;
7596     }
7597 #endif
7598 
7599     return p;
7600 }
7601 
7602     static char_u *
7603 compile_elseif(char_u *arg, cctx_T *cctx)
7604 {
7605     char_u	*p = arg;
7606     garray_T	*instr = &cctx->ctx_instr;
7607     int		instr_count = instr->ga_len;
7608     isn_T	*isn;
7609     scope_T	*scope = cctx->ctx_scope;
7610     ppconst_T	ppconst;
7611     skip_T	save_skip = cctx->ctx_skip;
7612 
7613     if (scope == NULL || scope->se_type != IF_SCOPE)
7614     {
7615 	emsg(_(e_elseif_without_if));
7616 	return NULL;
7617     }
7618     unwind_locals(cctx, scope->se_local_count);
7619     if (!cctx->ctx_had_return)
7620 	scope->se_u.se_if.is_had_return = FALSE;
7621 
7622     if (cctx->ctx_skip == SKIP_NOT)
7623     {
7624 	// previous block was executed, this one and following will not
7625 	cctx->ctx_skip = SKIP_YES;
7626 	scope->se_u.se_if.is_seen_skip_not = TRUE;
7627     }
7628     if (scope->se_u.se_if.is_seen_skip_not)
7629     {
7630 	// A previous block was executed, skip over expression and bail out.
7631 	// Do not count the "elseif" for profiling and cmdmod
7632 	instr->ga_len = current_instr_idx(cctx);
7633 
7634 	skip_expr_cctx(&p, cctx);
7635 	return p;
7636     }
7637 
7638     if (cctx->ctx_skip == SKIP_UNKNOWN)
7639     {
7640 	int moved_cmdmod = FALSE;
7641 
7642 	// Move any CMDMOD instruction to after the jump
7643 	if (((isn_T *)instr->ga_data)[instr->ga_len - 1].isn_type == ISN_CMDMOD)
7644 	{
7645 	    if (ga_grow(instr, 1) == FAIL)
7646 		return NULL;
7647 	    ((isn_T *)instr->ga_data)[instr->ga_len] =
7648 				  ((isn_T *)instr->ga_data)[instr->ga_len - 1];
7649 	    --instr->ga_len;
7650 	    moved_cmdmod = TRUE;
7651 	}
7652 
7653 	if (compile_jump_to_end(&scope->se_u.se_if.is_end_label,
7654 						    JUMP_ALWAYS, cctx) == FAIL)
7655 	    return NULL;
7656 	// previous "if" or "elseif" jumps here
7657 	isn = ((isn_T *)instr->ga_data) + scope->se_u.se_if.is_if_label;
7658 	isn->isn_arg.jump.jump_where = instr->ga_len;
7659 	if (moved_cmdmod)
7660 	    ++instr->ga_len;
7661     }
7662 
7663     // compile "expr"; if we know it evaluates to FALSE skip the block
7664     CLEAR_FIELD(ppconst);
7665     if (cctx->ctx_skip == SKIP_YES)
7666     {
7667 	cctx->ctx_skip = SKIP_UNKNOWN;
7668 #ifdef FEAT_PROFILE
7669 	if (cctx->ctx_compile_type == CT_PROFILE)
7670 	{
7671 	    // the previous block was skipped, need to profile this line
7672 	    generate_instr(cctx, ISN_PROF_START);
7673 	    instr_count = instr->ga_len;
7674 	}
7675 #endif
7676 	if (cctx->ctx_compile_type == CT_DEBUG)
7677 	{
7678 	    // the previous block was skipped, may want to debug this line
7679 	    generate_instr_debug(cctx);
7680 	    instr_count = instr->ga_len;
7681 	}
7682     }
7683     if (compile_expr1(&p, cctx, &ppconst) == FAIL)
7684     {
7685 	clear_ppconst(&ppconst);
7686 	return NULL;
7687     }
7688     cctx->ctx_skip = save_skip;
7689     if (!ends_excmd2(arg, skipwhite(p)))
7690     {
7691 	semsg(_(e_trailing_arg), p);
7692 	return NULL;
7693     }
7694     if (scope->se_skip_save == SKIP_YES)
7695 	clear_ppconst(&ppconst);
7696     else if (instr->ga_len == instr_count && ppconst.pp_used == 1)
7697     {
7698 	int error = FALSE;
7699 	int v;
7700 
7701 	// The expression results in a constant.
7702 	// TODO: how about nesting?
7703 	v = tv_get_bool_chk(&ppconst.pp_tv[0], &error);
7704 	if (error)
7705 	    return NULL;
7706 	cctx->ctx_skip = v ? SKIP_NOT : SKIP_YES;
7707 	clear_ppconst(&ppconst);
7708 	scope->se_u.se_if.is_if_label = -1;
7709     }
7710     else
7711     {
7712 	// Not a constant, generate instructions for the expression.
7713 	cctx->ctx_skip = SKIP_UNKNOWN;
7714 	if (generate_ppconst(cctx, &ppconst) == FAIL)
7715 	    return NULL;
7716 	if (bool_on_stack(cctx) == FAIL)
7717 	    return NULL;
7718 
7719 	// CMDMOD_REV must come before the jump
7720 	generate_undo_cmdmods(cctx);
7721 
7722 	// "where" is set when ":elseif", "else" or ":endif" is found
7723 	scope->se_u.se_if.is_if_label = instr->ga_len;
7724 	generate_JUMP(cctx, JUMP_IF_FALSE, 0);
7725     }
7726 
7727     return p;
7728 }
7729 
7730     static char_u *
7731 compile_else(char_u *arg, cctx_T *cctx)
7732 {
7733     char_u	*p = arg;
7734     garray_T	*instr = &cctx->ctx_instr;
7735     isn_T	*isn;
7736     scope_T	*scope = cctx->ctx_scope;
7737 
7738     if (scope == NULL || scope->se_type != IF_SCOPE)
7739     {
7740 	emsg(_(e_else_without_if));
7741 	return NULL;
7742     }
7743     unwind_locals(cctx, scope->se_local_count);
7744     if (!cctx->ctx_had_return)
7745 	scope->se_u.se_if.is_had_return = FALSE;
7746     scope->se_u.se_if.is_seen_else = TRUE;
7747 
7748 #ifdef FEAT_PROFILE
7749     if (cctx->ctx_compile_type == CT_PROFILE)
7750     {
7751 	if (cctx->ctx_skip == SKIP_NOT
7752 		&& ((isn_T *)instr->ga_data)[instr->ga_len - 1]
7753 						   .isn_type == ISN_PROF_START)
7754 	    // the previous block was executed, do not count "else" for
7755 	    // profiling
7756 	    --instr->ga_len;
7757 	if (cctx->ctx_skip == SKIP_YES && !scope->se_u.se_if.is_seen_skip_not)
7758 	{
7759 	    // the previous block was not executed, this one will, do count the
7760 	    // "else" for profiling
7761 	    cctx->ctx_skip = SKIP_NOT;
7762 	    generate_instr(cctx, ISN_PROF_END);
7763 	    generate_instr(cctx, ISN_PROF_START);
7764 	    cctx->ctx_skip = SKIP_YES;
7765 	}
7766     }
7767 #endif
7768 
7769     if (!scope->se_u.se_if.is_seen_skip_not && scope->se_skip_save != SKIP_YES)
7770     {
7771 	// jump from previous block to the end, unless the else block is empty
7772 	if (cctx->ctx_skip == SKIP_UNKNOWN)
7773 	{
7774 	    if (!cctx->ctx_had_return
7775 		    && compile_jump_to_end(&scope->se_u.se_if.is_end_label,
7776 						    JUMP_ALWAYS, cctx) == FAIL)
7777 		return NULL;
7778 	}
7779 
7780 	if (cctx->ctx_skip == SKIP_UNKNOWN)
7781 	{
7782 	    if (scope->se_u.se_if.is_if_label >= 0)
7783 	    {
7784 		// previous "if" or "elseif" jumps here
7785 		isn = ((isn_T *)instr->ga_data) + scope->se_u.se_if.is_if_label;
7786 		isn->isn_arg.jump.jump_where = instr->ga_len;
7787 		scope->se_u.se_if.is_if_label = -1;
7788 	    }
7789 	}
7790 
7791 	if (cctx->ctx_skip != SKIP_UNKNOWN)
7792 	    cctx->ctx_skip = cctx->ctx_skip == SKIP_YES ? SKIP_NOT : SKIP_YES;
7793     }
7794 
7795     return p;
7796 }
7797 
7798     static char_u *
7799 compile_endif(char_u *arg, cctx_T *cctx)
7800 {
7801     scope_T	*scope = cctx->ctx_scope;
7802     ifscope_T	*ifscope;
7803     garray_T	*instr = &cctx->ctx_instr;
7804     isn_T	*isn;
7805 
7806     if (misplaced_cmdmod(cctx))
7807 	return NULL;
7808 
7809     if (scope == NULL || scope->se_type != IF_SCOPE)
7810     {
7811 	emsg(_(e_endif_without_if));
7812 	return NULL;
7813     }
7814     ifscope = &scope->se_u.se_if;
7815     unwind_locals(cctx, scope->se_local_count);
7816     if (!cctx->ctx_had_return)
7817 	ifscope->is_had_return = FALSE;
7818 
7819     if (scope->se_u.se_if.is_if_label >= 0)
7820     {
7821 	// previous "if" or "elseif" jumps here
7822 	isn = ((isn_T *)instr->ga_data) + scope->se_u.se_if.is_if_label;
7823 	isn->isn_arg.jump.jump_where = instr->ga_len;
7824     }
7825     // Fill in the "end" label in jumps at the end of the blocks.
7826     compile_fill_jump_to_end(&ifscope->is_end_label, instr->ga_len, cctx);
7827 
7828 #ifdef FEAT_PROFILE
7829     // even when skipping we count the endif as executed, unless the block it's
7830     // in is skipped
7831     if (cctx->ctx_compile_type == CT_PROFILE && cctx->ctx_skip == SKIP_YES
7832 					    && scope->se_skip_save != SKIP_YES)
7833     {
7834 	cctx->ctx_skip = SKIP_NOT;
7835 	generate_instr(cctx, ISN_PROF_START);
7836     }
7837 #endif
7838     cctx->ctx_skip = scope->se_skip_save;
7839 
7840     // If all the blocks end in :return and there is an :else then the
7841     // had_return flag is set.
7842     cctx->ctx_had_return = ifscope->is_had_return && ifscope->is_seen_else;
7843 
7844     drop_scope(cctx);
7845     return arg;
7846 }
7847 
7848 /*
7849  * Compile "for var in expr":
7850  *
7851  * Produces instructions:
7852  *       PUSHNR -1
7853  *       STORE loop-idx		Set index to -1
7854  *       EVAL expr		result of "expr" on top of stack
7855  * top:  FOR loop-idx, end	Increment index, use list on bottom of stack
7856  *				- if beyond end, jump to "end"
7857  *				- otherwise get item from list and push it
7858  *       STORE var		Store item in "var"
7859  *       ... body ...
7860  *       JUMP top		Jump back to repeat
7861  * end:	 DROP			Drop the result of "expr"
7862  *
7863  * Compile "for [var1, var2] in expr" - as above, but instead of "STORE var":
7864  *	 UNPACK 2		Split item in 2
7865  *       STORE var1		Store item in "var1"
7866  *       STORE var2		Store item in "var2"
7867  */
7868     static char_u *
7869 compile_for(char_u *arg_start, cctx_T *cctx)
7870 {
7871     char_u	*arg;
7872     char_u	*arg_end;
7873     char_u	*name = NULL;
7874     char_u	*p;
7875     char_u	*wp;
7876     int		var_count = 0;
7877     int		var_list = FALSE;
7878     int		semicolon = FALSE;
7879     size_t	varlen;
7880     garray_T	*stack = &cctx->ctx_type_stack;
7881     garray_T	*instr = &cctx->ctx_instr;
7882     scope_T	*scope;
7883     lvar_T	*loop_lvar;	// loop iteration variable
7884     lvar_T	*var_lvar;	// variable for "var"
7885     type_T	*vartype;
7886     type_T	*item_type = &t_any;
7887     int		idx;
7888     int		prev_lnum = cctx->ctx_prev_lnum;
7889 
7890     p = skip_var_list(arg_start, TRUE, &var_count, &semicolon, FALSE);
7891     if (p == NULL)
7892 	return NULL;
7893     if (var_count == 0)
7894 	var_count = 1;
7895     else
7896 	var_list = TRUE;  // can also be a list of one variable
7897 
7898     // consume "in"
7899     wp = p;
7900     if (may_get_next_line_error(wp, &p, cctx) == FAIL)
7901 	return NULL;
7902     if (STRNCMP(p, "in", 2) != 0 || !IS_WHITE_OR_NUL(p[2]))
7903     {
7904 	if (*p == ':' && wp != p)
7905 	    semsg(_(e_no_white_space_allowed_before_colon_str), p);
7906 	else
7907 	    emsg(_(e_missing_in));
7908 	return NULL;
7909     }
7910     wp = p + 2;
7911     if (may_get_next_line_error(wp, &p, cctx) == FAIL)
7912 	return NULL;
7913 
7914     // Remove the already generated ISN_DEBUG, it is written below the ISN_FOR
7915     // instruction.
7916     if (cctx->ctx_compile_type == CT_DEBUG && instr->ga_len > 0
7917 	    && ((isn_T *)instr->ga_data)[instr->ga_len - 1]
7918 							.isn_type == ISN_DEBUG)
7919     {
7920 	--instr->ga_len;
7921 	prev_lnum = ((isn_T *)instr->ga_data)[instr->ga_len]
7922 						 .isn_arg.debug.dbg_break_lnum;
7923     }
7924 
7925     scope = new_scope(cctx, FOR_SCOPE);
7926     if (scope == NULL)
7927 	return NULL;
7928 
7929     // Reserve a variable to store the loop iteration counter and initialize it
7930     // to -1.
7931     loop_lvar = reserve_local(cctx, (char_u *)"", 0, FALSE, &t_number);
7932     if (loop_lvar == NULL)
7933     {
7934 	// out of memory
7935 	drop_scope(cctx);
7936 	return NULL;
7937     }
7938     generate_STORENR(cctx, loop_lvar->lv_idx, -1);
7939 
7940     // compile "expr", it remains on the stack until "endfor"
7941     arg = p;
7942     if (compile_expr0(&arg, cctx) == FAIL)
7943     {
7944 	drop_scope(cctx);
7945 	return NULL;
7946     }
7947     arg_end = arg;
7948 
7949     // If we know the type of "var" and it is a not a supported type we can
7950     // give an error now.
7951     vartype = ((type_T **)stack->ga_data)[stack->ga_len - 1];
7952     if (vartype->tt_type != VAR_LIST && vartype->tt_type != VAR_STRING
7953 		&& vartype->tt_type != VAR_BLOB && vartype->tt_type != VAR_ANY)
7954     {
7955 	semsg(_(e_for_loop_on_str_not_supported),
7956 					       vartype_name(vartype->tt_type));
7957 	drop_scope(cctx);
7958 	return NULL;
7959     }
7960 
7961     if (vartype->tt_type == VAR_STRING)
7962 	item_type = &t_string;
7963     else if (vartype->tt_type == VAR_BLOB)
7964 	item_type = &t_number;
7965     else if (vartype->tt_type == VAR_LIST
7966 				     && vartype->tt_member->tt_type != VAR_ANY)
7967     {
7968 	if (!var_list)
7969 	    item_type = vartype->tt_member;
7970 	else if (vartype->tt_member->tt_type == VAR_LIST
7971 		      && vartype->tt_member->tt_member->tt_type != VAR_ANY)
7972 	    // TODO: should get the type for each lhs
7973 	    item_type = vartype->tt_member->tt_member;
7974     }
7975 
7976     // CMDMOD_REV must come before the FOR instruction.
7977     generate_undo_cmdmods(cctx);
7978 
7979     // "for_end" is set when ":endfor" is found
7980     scope->se_u.se_for.fs_top_label = current_instr_idx(cctx);
7981 
7982     generate_FOR(cctx, loop_lvar->lv_idx);
7983 
7984     arg = arg_start;
7985     if (var_list)
7986     {
7987 	generate_UNPACK(cctx, var_count, semicolon);
7988 	arg = skipwhite(arg + 1);	// skip white after '['
7989 
7990 	// the list item is replaced by a number of items
7991 	if (ga_grow(stack, var_count - 1) == FAIL)
7992 	{
7993 	    drop_scope(cctx);
7994 	    return NULL;
7995 	}
7996 	--stack->ga_len;
7997 	for (idx = 0; idx < var_count; ++idx)
7998 	{
7999 	    ((type_T **)stack->ga_data)[stack->ga_len] =
8000 				(semicolon && idx == 0) ? vartype : item_type;
8001 	    ++stack->ga_len;
8002 	}
8003     }
8004 
8005     for (idx = 0; idx < var_count; ++idx)
8006     {
8007 	assign_dest_T	dest = dest_local;
8008 	int		opt_flags = 0;
8009 	int		vimvaridx = -1;
8010 	type_T		*type = &t_any;
8011 	type_T		*lhs_type = &t_any;
8012 	where_T		where = WHERE_INIT;
8013 
8014 	p = skip_var_one(arg, FALSE);
8015 	varlen = p - arg;
8016 	name = vim_strnsave(arg, varlen);
8017 	if (name == NULL)
8018 	    goto failed;
8019 	if (*p == ':')
8020 	{
8021 	    p = skipwhite(p + 1);
8022 	    lhs_type = parse_type(&p, cctx->ctx_type_list, TRUE);
8023 	}
8024 
8025 	// TODO: script var not supported?
8026 	if (get_var_dest(name, &dest, CMD_for, &opt_flags,
8027 					      &vimvaridx, &type, cctx) == FAIL)
8028 	    goto failed;
8029 	if (dest != dest_local)
8030 	{
8031 	    if (generate_store_var(cctx, dest, opt_flags, vimvaridx,
8032 						     0, 0, type, name) == FAIL)
8033 		goto failed;
8034 	}
8035 	else if (varlen == 1 && *arg == '_')
8036 	{
8037 	    // Assigning to "_": drop the value.
8038 	    if (generate_instr_drop(cctx, ISN_DROP, 1) == NULL)
8039 		goto failed;
8040 	}
8041 	else
8042 	{
8043 	    if (lookup_local(arg, varlen, NULL, cctx) == OK)
8044 	    {
8045 		semsg(_(e_variable_already_declared), arg);
8046 		goto failed;
8047 	    }
8048 
8049 	    if (STRNCMP(name, "s:", 2) == 0)
8050 	    {
8051 		semsg(_(e_cannot_declare_script_variable_in_function), name);
8052 		goto failed;
8053 	    }
8054 
8055 	    // Reserve a variable to store "var".
8056 	    where.wt_index = var_list ? idx + 1 : 0;
8057 	    where.wt_variable = TRUE;
8058 	    if (lhs_type == &t_any)
8059 		lhs_type = item_type;
8060 	    else if (item_type != &t_unknown
8061 			&& (item_type == &t_any
8062 			  ? need_type(item_type, lhs_type,
8063 						     -1, 0, cctx, FALSE, FALSE)
8064 			  : check_type(lhs_type, item_type, TRUE, where))
8065 			== FAIL)
8066 		goto failed;
8067 	    var_lvar = reserve_local(cctx, arg, varlen, TRUE, lhs_type);
8068 	    if (var_lvar == NULL)
8069 		// out of memory or used as an argument
8070 		goto failed;
8071 
8072 	    if (semicolon && idx == var_count - 1)
8073 		var_lvar->lv_type = vartype;
8074 	    else
8075 		var_lvar->lv_type = item_type;
8076 	    generate_STORE(cctx, ISN_STORE, var_lvar->lv_idx, NULL);
8077 	}
8078 
8079 	if (*p == ',' || *p == ';')
8080 	    ++p;
8081 	arg = skipwhite(p);
8082 	vim_free(name);
8083     }
8084 
8085     if (cctx->ctx_compile_type == CT_DEBUG)
8086     {
8087 	int save_prev_lnum = cctx->ctx_prev_lnum;
8088 
8089 	// Add ISN_DEBUG here, so that the loop variables can be inspected.
8090 	// Use the prev_lnum from the ISN_DEBUG instruction removed above.
8091 	cctx->ctx_prev_lnum = prev_lnum;
8092 	generate_instr_debug(cctx);
8093 	cctx->ctx_prev_lnum = save_prev_lnum;
8094     }
8095 
8096     return arg_end;
8097 
8098 failed:
8099     vim_free(name);
8100     drop_scope(cctx);
8101     return NULL;
8102 }
8103 
8104 /*
8105  * compile "endfor"
8106  */
8107     static char_u *
8108 compile_endfor(char_u *arg, cctx_T *cctx)
8109 {
8110     garray_T	*instr = &cctx->ctx_instr;
8111     scope_T	*scope = cctx->ctx_scope;
8112     forscope_T	*forscope;
8113     isn_T	*isn;
8114 
8115     if (misplaced_cmdmod(cctx))
8116 	return NULL;
8117 
8118     if (scope == NULL || scope->se_type != FOR_SCOPE)
8119     {
8120 	emsg(_(e_for));
8121 	return NULL;
8122     }
8123     forscope = &scope->se_u.se_for;
8124     cctx->ctx_scope = scope->se_outer;
8125     unwind_locals(cctx, scope->se_local_count);
8126 
8127     // At end of ":for" scope jump back to the FOR instruction.
8128     generate_JUMP(cctx, JUMP_ALWAYS, forscope->fs_top_label);
8129 
8130     // Fill in the "end" label in the FOR statement so it can jump here.
8131     isn = ((isn_T *)instr->ga_data) + forscope->fs_top_label;
8132     isn->isn_arg.forloop.for_end = instr->ga_len;
8133 
8134     // Fill in the "end" label any BREAK statements
8135     compile_fill_jump_to_end(&forscope->fs_end_label, instr->ga_len, cctx);
8136 
8137     // Below the ":for" scope drop the "expr" list from the stack.
8138     if (generate_instr_drop(cctx, ISN_DROP, 1) == NULL)
8139 	return NULL;
8140 
8141     vim_free(scope);
8142 
8143     return arg;
8144 }
8145 
8146 /*
8147  * compile "while expr"
8148  *
8149  * Produces instructions:
8150  * top:  EVAL expr		Push result of "expr"
8151  *       JUMP_IF_FALSE end	jump if false
8152  *       ... body ...
8153  *       JUMP top		Jump back to repeat
8154  * end:
8155  *
8156  */
8157     static char_u *
8158 compile_while(char_u *arg, cctx_T *cctx)
8159 {
8160     char_u	*p = arg;
8161     scope_T	*scope;
8162 
8163     scope = new_scope(cctx, WHILE_SCOPE);
8164     if (scope == NULL)
8165 	return NULL;
8166 
8167     // "endwhile" jumps back here, one before when profiling or using cmdmods
8168     scope->se_u.se_while.ws_top_label = current_instr_idx(cctx);
8169 
8170     // compile "expr"
8171     if (compile_expr0(&p, cctx) == FAIL)
8172 	return NULL;
8173     if (!ends_excmd2(arg, skipwhite(p)))
8174     {
8175 	semsg(_(e_trailing_arg), p);
8176 	return NULL;
8177     }
8178 
8179     if (bool_on_stack(cctx) == FAIL)
8180 	return FAIL;
8181 
8182     // CMDMOD_REV must come before the jump
8183     generate_undo_cmdmods(cctx);
8184 
8185     // "while_end" is set when ":endwhile" is found
8186     if (compile_jump_to_end(&scope->se_u.se_while.ws_end_label,
8187 						  JUMP_IF_FALSE, cctx) == FAIL)
8188 	return FAIL;
8189 
8190     return p;
8191 }
8192 
8193 /*
8194  * compile "endwhile"
8195  */
8196     static char_u *
8197 compile_endwhile(char_u *arg, cctx_T *cctx)
8198 {
8199     scope_T	*scope = cctx->ctx_scope;
8200     garray_T	*instr = &cctx->ctx_instr;
8201 
8202     if (misplaced_cmdmod(cctx))
8203 	return NULL;
8204     if (scope == NULL || scope->se_type != WHILE_SCOPE)
8205     {
8206 	emsg(_(e_while));
8207 	return NULL;
8208     }
8209     cctx->ctx_scope = scope->se_outer;
8210     unwind_locals(cctx, scope->se_local_count);
8211 
8212 #ifdef FEAT_PROFILE
8213     // count the endwhile before jumping
8214     may_generate_prof_end(cctx, cctx->ctx_lnum);
8215 #endif
8216 
8217     // At end of ":for" scope jump back to the FOR instruction.
8218     generate_JUMP(cctx, JUMP_ALWAYS, scope->se_u.se_while.ws_top_label);
8219 
8220     // Fill in the "end" label in the WHILE statement so it can jump here.
8221     // And in any jumps for ":break"
8222     compile_fill_jump_to_end(&scope->se_u.se_while.ws_end_label,
8223 							  instr->ga_len, cctx);
8224 
8225     vim_free(scope);
8226 
8227     return arg;
8228 }
8229 
8230 /*
8231  * compile "continue"
8232  */
8233     static char_u *
8234 compile_continue(char_u *arg, cctx_T *cctx)
8235 {
8236     scope_T	*scope = cctx->ctx_scope;
8237     int		try_scopes = 0;
8238     int		loop_label;
8239 
8240     for (;;)
8241     {
8242 	if (scope == NULL)
8243 	{
8244 	    emsg(_(e_continue));
8245 	    return NULL;
8246 	}
8247 	if (scope->se_type == FOR_SCOPE)
8248 	{
8249 	    loop_label = scope->se_u.se_for.fs_top_label;
8250 	    break;
8251 	}
8252 	if (scope->se_type == WHILE_SCOPE)
8253 	{
8254 	    loop_label = scope->se_u.se_while.ws_top_label;
8255 	    break;
8256 	}
8257 	if (scope->se_type == TRY_SCOPE)
8258 	    ++try_scopes;
8259 	scope = scope->se_outer;
8260     }
8261 
8262     if (try_scopes > 0)
8263 	// Inside one or more try/catch blocks we first need to jump to the
8264 	// "finally" or "endtry" to cleanup.
8265 	generate_TRYCONT(cctx, try_scopes, loop_label);
8266     else
8267 	// Jump back to the FOR or WHILE instruction.
8268 	generate_JUMP(cctx, JUMP_ALWAYS, loop_label);
8269 
8270     return arg;
8271 }
8272 
8273 /*
8274  * compile "break"
8275  */
8276     static char_u *
8277 compile_break(char_u *arg, cctx_T *cctx)
8278 {
8279     scope_T	*scope = cctx->ctx_scope;
8280     endlabel_T	**el;
8281 
8282     for (;;)
8283     {
8284 	if (scope == NULL)
8285 	{
8286 	    emsg(_(e_break));
8287 	    return NULL;
8288 	}
8289 	if (scope->se_type == FOR_SCOPE || scope->se_type == WHILE_SCOPE)
8290 	    break;
8291 	scope = scope->se_outer;
8292     }
8293 
8294     // Jump to the end of the FOR or WHILE loop.
8295     if (scope->se_type == FOR_SCOPE)
8296 	el = &scope->se_u.se_for.fs_end_label;
8297     else
8298 	el = &scope->se_u.se_while.ws_end_label;
8299     if (compile_jump_to_end(el, JUMP_ALWAYS, cctx) == FAIL)
8300 	return FAIL;
8301 
8302     return arg;
8303 }
8304 
8305 /*
8306  * compile "{" start of block
8307  */
8308     static char_u *
8309 compile_block(char_u *arg, cctx_T *cctx)
8310 {
8311     if (new_scope(cctx, BLOCK_SCOPE) == NULL)
8312 	return NULL;
8313     return skipwhite(arg + 1);
8314 }
8315 
8316 /*
8317  * compile end of block: drop one scope
8318  */
8319     static void
8320 compile_endblock(cctx_T *cctx)
8321 {
8322     scope_T	*scope = cctx->ctx_scope;
8323 
8324     cctx->ctx_scope = scope->se_outer;
8325     unwind_locals(cctx, scope->se_local_count);
8326     vim_free(scope);
8327 }
8328 
8329 /*
8330  * compile "try"
8331  * Creates a new scope for the try-endtry, pointing to the first catch and
8332  * finally.
8333  * Creates another scope for the "try" block itself.
8334  * TRY instruction sets up exception handling at runtime.
8335  *
8336  *	"try"
8337  *	    TRY -> catch1, -> finally  push trystack entry
8338  *	    ... try block
8339  *	"throw {exception}"
8340  *	    EVAL {exception}
8341  *	    THROW		create exception
8342  *	    ... try block
8343  *	" catch {expr}"
8344  *	    JUMP -> finally
8345  * catch1:  PUSH exception
8346  *	    EVAL {expr}
8347  *	    MATCH
8348  *	    JUMP nomatch -> catch2
8349  *	    CATCH   remove exception
8350  *	    ... catch block
8351  *	" catch"
8352  *	    JUMP -> finally
8353  * catch2:  CATCH   remove exception
8354  *	    ... catch block
8355  *	" finally"
8356  * finally:
8357  *	    ... finally block
8358  *	" endtry"
8359  *	    ENDTRY  pop trystack entry, may rethrow
8360  */
8361     static char_u *
8362 compile_try(char_u *arg, cctx_T *cctx)
8363 {
8364     garray_T	*instr = &cctx->ctx_instr;
8365     scope_T	*try_scope;
8366     scope_T	*scope;
8367 
8368     if (misplaced_cmdmod(cctx))
8369 	return NULL;
8370 
8371     // scope that holds the jumps that go to catch/finally/endtry
8372     try_scope = new_scope(cctx, TRY_SCOPE);
8373     if (try_scope == NULL)
8374 	return NULL;
8375 
8376     if (cctx->ctx_skip != SKIP_YES)
8377     {
8378 	isn_T	*isn;
8379 
8380 	// "try_catch" is set when the first ":catch" is found or when no catch
8381 	// is found and ":finally" is found.
8382 	// "try_finally" is set when ":finally" is found
8383 	// "try_endtry" is set when ":endtry" is found
8384 	try_scope->se_u.se_try.ts_try_label = instr->ga_len;
8385 	if ((isn = generate_instr(cctx, ISN_TRY)) == NULL)
8386 	    return NULL;
8387 	isn->isn_arg.try.try_ref = ALLOC_CLEAR_ONE(tryref_T);
8388 	if (isn->isn_arg.try.try_ref == NULL)
8389 	    return NULL;
8390     }
8391 
8392     // scope for the try block itself
8393     scope = new_scope(cctx, BLOCK_SCOPE);
8394     if (scope == NULL)
8395 	return NULL;
8396 
8397     return arg;
8398 }
8399 
8400 /*
8401  * compile "catch {expr}"
8402  */
8403     static char_u *
8404 compile_catch(char_u *arg, cctx_T *cctx UNUSED)
8405 {
8406     scope_T	*scope = cctx->ctx_scope;
8407     garray_T	*instr = &cctx->ctx_instr;
8408     char_u	*p;
8409     isn_T	*isn;
8410 
8411     if (misplaced_cmdmod(cctx))
8412 	return NULL;
8413 
8414     // end block scope from :try or :catch
8415     if (scope != NULL && scope->se_type == BLOCK_SCOPE)
8416 	compile_endblock(cctx);
8417     scope = cctx->ctx_scope;
8418 
8419     // Error if not in a :try scope
8420     if (scope == NULL || scope->se_type != TRY_SCOPE)
8421     {
8422 	emsg(_(e_catch));
8423 	return NULL;
8424     }
8425 
8426     if (scope->se_u.se_try.ts_caught_all)
8427     {
8428 	emsg(_(e_catch_unreachable_after_catch_all));
8429 	return NULL;
8430     }
8431 
8432     if (cctx->ctx_skip != SKIP_YES)
8433     {
8434 #ifdef FEAT_PROFILE
8435 	// the profile-start should be after the jump
8436 	if (cctx->ctx_compile_type == CT_PROFILE
8437 		&& instr->ga_len > 0
8438 		&& ((isn_T *)instr->ga_data)[instr->ga_len - 1]
8439 						   .isn_type == ISN_PROF_START)
8440 	    --instr->ga_len;
8441 #endif
8442 	// Jump from end of previous block to :finally or :endtry
8443 	if (compile_jump_to_end(&scope->se_u.se_try.ts_end_label,
8444 						    JUMP_ALWAYS, cctx) == FAIL)
8445 	    return NULL;
8446 
8447 	// End :try or :catch scope: set value in ISN_TRY instruction
8448 	isn = ((isn_T *)instr->ga_data) + scope->se_u.se_try.ts_try_label;
8449 	if (isn->isn_arg.try.try_ref->try_catch == 0)
8450 	    isn->isn_arg.try.try_ref->try_catch = instr->ga_len;
8451 	if (scope->se_u.se_try.ts_catch_label != 0)
8452 	{
8453 	    // Previous catch without match jumps here
8454 	    isn = ((isn_T *)instr->ga_data) + scope->se_u.se_try.ts_catch_label;
8455 	    isn->isn_arg.jump.jump_where = instr->ga_len;
8456 	}
8457 #ifdef FEAT_PROFILE
8458 	if (cctx->ctx_compile_type == CT_PROFILE)
8459 	{
8460 	    // a "throw" that jumps here needs to be counted
8461 	    generate_instr(cctx, ISN_PROF_END);
8462 	    // the "catch" is also counted
8463 	    generate_instr(cctx, ISN_PROF_START);
8464 	}
8465 #endif
8466 	if (cctx->ctx_compile_type == CT_DEBUG)
8467 	    generate_instr_debug(cctx);
8468     }
8469 
8470     p = skipwhite(arg);
8471     if (ends_excmd2(arg, p))
8472     {
8473 	scope->se_u.se_try.ts_caught_all = TRUE;
8474 	scope->se_u.se_try.ts_catch_label = 0;
8475     }
8476     else
8477     {
8478 	char_u *end;
8479 	char_u *pat;
8480 	char_u *tofree = NULL;
8481 	int	dropped = 0;
8482 	int	len;
8483 
8484 	// Push v:exception, push {expr} and MATCH
8485 	generate_instr_type(cctx, ISN_PUSHEXC, &t_string);
8486 
8487 	end = skip_regexp_ex(p + 1, *p, TRUE, &tofree, &dropped, NULL);
8488 	if (*end != *p)
8489 	{
8490 	    semsg(_(e_separator_mismatch_str), p);
8491 	    vim_free(tofree);
8492 	    return FAIL;
8493 	}
8494 	if (tofree == NULL)
8495 	    len = (int)(end - (p + 1));
8496 	else
8497 	    len = (int)(end - tofree);
8498 	pat = vim_strnsave(tofree == NULL ? p + 1 : tofree, len);
8499 	vim_free(tofree);
8500 	p += len + 2 + dropped;
8501 	if (pat == NULL)
8502 	    return FAIL;
8503 	if (generate_PUSHS(cctx, pat) == FAIL)
8504 	    return FAIL;
8505 
8506 	if (generate_COMPARE(cctx, EXPR_MATCH, FALSE) == FAIL)
8507 	    return NULL;
8508 
8509 	scope->se_u.se_try.ts_catch_label = instr->ga_len;
8510 	if (generate_JUMP(cctx, JUMP_IF_FALSE, 0) == FAIL)
8511 	    return NULL;
8512     }
8513 
8514     if (cctx->ctx_skip != SKIP_YES && generate_instr(cctx, ISN_CATCH) == NULL)
8515 	return NULL;
8516 
8517     if (new_scope(cctx, BLOCK_SCOPE) == NULL)
8518 	return NULL;
8519     return p;
8520 }
8521 
8522     static char_u *
8523 compile_finally(char_u *arg, cctx_T *cctx)
8524 {
8525     scope_T	*scope = cctx->ctx_scope;
8526     garray_T	*instr = &cctx->ctx_instr;
8527     isn_T	*isn;
8528     int		this_instr;
8529 
8530     if (misplaced_cmdmod(cctx))
8531 	return NULL;
8532 
8533     // end block scope from :try or :catch
8534     if (scope != NULL && scope->se_type == BLOCK_SCOPE)
8535 	compile_endblock(cctx);
8536     scope = cctx->ctx_scope;
8537 
8538     // Error if not in a :try scope
8539     if (scope == NULL || scope->se_type != TRY_SCOPE)
8540     {
8541 	emsg(_(e_finally));
8542 	return NULL;
8543     }
8544 
8545     // End :catch or :finally scope: set value in ISN_TRY instruction
8546     isn = ((isn_T *)instr->ga_data) + scope->se_u.se_try.ts_try_label;
8547     if (isn->isn_arg.try.try_ref->try_finally != 0)
8548     {
8549 	emsg(_(e_finally_dup));
8550 	return NULL;
8551     }
8552 
8553     this_instr = instr->ga_len;
8554 #ifdef FEAT_PROFILE
8555     if (cctx->ctx_compile_type == CT_PROFILE
8556 	    && ((isn_T *)instr->ga_data)[this_instr - 1]
8557 						   .isn_type == ISN_PROF_START)
8558     {
8559 	// jump to the profile start of the "finally"
8560 	--this_instr;
8561 
8562 	// jump to the profile end above it
8563 	if (this_instr > 0 && ((isn_T *)instr->ga_data)[this_instr - 1]
8564 						     .isn_type == ISN_PROF_END)
8565 	    --this_instr;
8566     }
8567 #endif
8568 
8569     // Fill in the "end" label in jumps at the end of the blocks.
8570     compile_fill_jump_to_end(&scope->se_u.se_try.ts_end_label,
8571 							     this_instr, cctx);
8572 
8573     // If there is no :catch then an exception jumps to :finally.
8574     if (isn->isn_arg.try.try_ref->try_catch == 0)
8575 	isn->isn_arg.try.try_ref->try_catch = this_instr;
8576     isn->isn_arg.try.try_ref->try_finally = this_instr;
8577     if (scope->se_u.se_try.ts_catch_label != 0)
8578     {
8579 	// Previous catch without match jumps here
8580 	isn = ((isn_T *)instr->ga_data) + scope->se_u.se_try.ts_catch_label;
8581 	isn->isn_arg.jump.jump_where = this_instr;
8582 	scope->se_u.se_try.ts_catch_label = 0;
8583     }
8584     if (generate_instr(cctx, ISN_FINALLY) == NULL)
8585 	return NULL;
8586 
8587     // TODO: set index in ts_finally_label jumps
8588 
8589     return arg;
8590 }
8591 
8592     static char_u *
8593 compile_endtry(char_u *arg, cctx_T *cctx)
8594 {
8595     scope_T	*scope = cctx->ctx_scope;
8596     garray_T	*instr = &cctx->ctx_instr;
8597     isn_T	*try_isn;
8598 
8599     if (misplaced_cmdmod(cctx))
8600 	return NULL;
8601 
8602     // end block scope from :catch or :finally
8603     if (scope != NULL && scope->se_type == BLOCK_SCOPE)
8604 	compile_endblock(cctx);
8605     scope = cctx->ctx_scope;
8606 
8607     // Error if not in a :try scope
8608     if (scope == NULL || scope->se_type != TRY_SCOPE)
8609     {
8610 	if (scope == NULL)
8611 	    emsg(_(e_no_endtry));
8612 	else if (scope->se_type == WHILE_SCOPE)
8613 	    emsg(_(e_endwhile));
8614 	else if (scope->se_type == FOR_SCOPE)
8615 	    emsg(_(e_endfor));
8616 	else
8617 	    emsg(_(e_endif));
8618 	return NULL;
8619     }
8620 
8621     try_isn = ((isn_T *)instr->ga_data) + scope->se_u.se_try.ts_try_label;
8622     if (cctx->ctx_skip != SKIP_YES)
8623     {
8624 	if (try_isn->isn_arg.try.try_ref->try_catch == 0
8625 				      && try_isn->isn_arg.try.try_ref->try_finally == 0)
8626 	{
8627 	    emsg(_(e_missing_catch_or_finally));
8628 	    return NULL;
8629 	}
8630 
8631 #ifdef FEAT_PROFILE
8632 	if (cctx->ctx_compile_type == CT_PROFILE
8633 		&& ((isn_T *)instr->ga_data)[instr->ga_len - 1]
8634 						.isn_type == ISN_PROF_START)
8635 	    // move the profile start after "endtry" so that it's not counted when
8636 	    // the exception is rethrown.
8637 	    --instr->ga_len;
8638 #endif
8639 
8640 	// Fill in the "end" label in jumps at the end of the blocks, if not
8641 	// done by ":finally".
8642 	compile_fill_jump_to_end(&scope->se_u.se_try.ts_end_label,
8643 							  instr->ga_len, cctx);
8644 
8645 	if (scope->se_u.se_try.ts_catch_label != 0)
8646 	{
8647 	    // Last catch without match jumps here
8648 	    isn_T *isn = ((isn_T *)instr->ga_data)
8649 					   + scope->se_u.se_try.ts_catch_label;
8650 	    isn->isn_arg.jump.jump_where = instr->ga_len;
8651 	}
8652     }
8653 
8654     compile_endblock(cctx);
8655 
8656     if (cctx->ctx_skip != SKIP_YES)
8657     {
8658 	// End :catch or :finally scope: set instruction index in ISN_TRY
8659 	// instruction
8660 	try_isn->isn_arg.try.try_ref->try_endtry = instr->ga_len;
8661 	if (cctx->ctx_skip != SKIP_YES
8662 				   && generate_instr(cctx, ISN_ENDTRY) == NULL)
8663 	    return NULL;
8664 #ifdef FEAT_PROFILE
8665 	if (cctx->ctx_compile_type == CT_PROFILE)
8666 	    generate_instr(cctx, ISN_PROF_START);
8667 #endif
8668     }
8669     return arg;
8670 }
8671 
8672 /*
8673  * compile "throw {expr}"
8674  */
8675     static char_u *
8676 compile_throw(char_u *arg, cctx_T *cctx UNUSED)
8677 {
8678     char_u *p = skipwhite(arg);
8679 
8680     if (compile_expr0(&p, cctx) == FAIL)
8681 	return NULL;
8682     if (cctx->ctx_skip == SKIP_YES)
8683 	return p;
8684     if (may_generate_2STRING(-1, FALSE, cctx) == FAIL)
8685 	return NULL;
8686     if (generate_instr_drop(cctx, ISN_THROW, 1) == NULL)
8687 	return NULL;
8688 
8689     return p;
8690 }
8691 
8692     static char_u *
8693 compile_eval(char_u *arg, cctx_T *cctx)
8694 {
8695     char_u	*p = arg;
8696     int		name_only;
8697     char_u	*alias;
8698     long	lnum = SOURCING_LNUM;
8699 
8700     // find_ex_command() will consider a variable name an expression, assuming
8701     // that something follows on the next line.  Check that something actually
8702     // follows, otherwise it's probably a misplaced command.
8703     get_name_len(&p, &alias, FALSE, FALSE);
8704     name_only = ends_excmd2(arg, skipwhite(p));
8705     vim_free(alias);
8706 
8707     p = arg;
8708     if (compile_expr0(&p, cctx) == FAIL)
8709 	return NULL;
8710 
8711     if (name_only && lnum == SOURCING_LNUM)
8712     {
8713 	semsg(_(e_expression_without_effect_str), arg);
8714 	return NULL;
8715     }
8716 
8717     // drop the result
8718     generate_instr_drop(cctx, ISN_DROP, 1);
8719 
8720     return skipwhite(p);
8721 }
8722 
8723 /*
8724  * compile "echo expr"
8725  * compile "echomsg expr"
8726  * compile "echoerr expr"
8727  * compile "execute expr"
8728  */
8729     static char_u *
8730 compile_mult_expr(char_u *arg, int cmdidx, cctx_T *cctx)
8731 {
8732     char_u	*p = arg;
8733     char_u	*prev = arg;
8734     char_u	*expr_start;
8735     int		count = 0;
8736     int		start_ctx_lnum = cctx->ctx_lnum;
8737     garray_T	*stack = &cctx->ctx_type_stack;
8738     type_T	*type;
8739 
8740     for (;;)
8741     {
8742 	if (ends_excmd2(prev, p))
8743 	    break;
8744 	expr_start = p;
8745 	if (compile_expr0(&p, cctx) == FAIL)
8746 	    return NULL;
8747 
8748 	if (cctx->ctx_skip != SKIP_YES)
8749 	{
8750 	    // check for non-void type
8751 	    type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
8752 	    if (type->tt_type == VAR_VOID)
8753 	    {
8754 		semsg(_(e_expression_does_not_result_in_value_str), expr_start);
8755 		return NULL;
8756 	    }
8757 	}
8758 
8759 	++count;
8760 	prev = p;
8761 	p = skipwhite(p);
8762     }
8763 
8764     if (count > 0)
8765     {
8766 	long save_lnum = cctx->ctx_lnum;
8767 
8768 	// Use the line number where the command started.
8769 	cctx->ctx_lnum = start_ctx_lnum;
8770 
8771 	if (cmdidx == CMD_echo || cmdidx == CMD_echon)
8772 	    generate_ECHO(cctx, cmdidx == CMD_echo, count);
8773 	else if (cmdidx == CMD_execute)
8774 	    generate_MULT_EXPR(cctx, ISN_EXECUTE, count);
8775 	else if (cmdidx == CMD_echomsg)
8776 	    generate_MULT_EXPR(cctx, ISN_ECHOMSG, count);
8777 	else
8778 	    generate_MULT_EXPR(cctx, ISN_ECHOERR, count);
8779 
8780 	cctx->ctx_lnum = save_lnum;
8781     }
8782     return p;
8783 }
8784 
8785 /*
8786  * If "eap" has a range that is not a constant generate an ISN_RANGE
8787  * instruction to compute it and return OK.
8788  * Otherwise return FAIL, the caller must deal with any range.
8789  */
8790     static int
8791 compile_variable_range(exarg_T *eap, cctx_T *cctx)
8792 {
8793     char_u *range_end = skip_range(eap->cmd, TRUE, NULL);
8794     char_u *p = skipdigits(eap->cmd);
8795 
8796     if (p == range_end)
8797 	return FAIL;
8798     return generate_RANGE(cctx, vim_strnsave(eap->cmd, range_end - eap->cmd));
8799 }
8800 
8801 /*
8802  * :put r
8803  * :put ={expr}
8804  */
8805     static char_u *
8806 compile_put(char_u *arg, exarg_T *eap, cctx_T *cctx)
8807 {
8808     char_u	*line = arg;
8809     linenr_T	lnum;
8810     char	*errormsg;
8811     int		above = eap->forceit;
8812 
8813     eap->regname = *line;
8814 
8815     if (eap->regname == '=')
8816     {
8817 	char_u *p = line + 1;
8818 
8819 	if (compile_expr0(&p, cctx) == FAIL)
8820 	    return NULL;
8821 	line = p;
8822     }
8823     else if (eap->regname != NUL)
8824 	++line;
8825 
8826     if (compile_variable_range(eap, cctx) == OK)
8827     {
8828 	lnum = above ? LNUM_VARIABLE_RANGE_ABOVE : LNUM_VARIABLE_RANGE;
8829     }
8830     else
8831     {
8832 	// Either no range or a number.
8833 	// "errormsg" will not be set because the range is ADDR_LINES.
8834 	if (parse_cmd_address(eap, &errormsg, FALSE) == FAIL)
8835 	    // cannot happen
8836 	    return NULL;
8837 	if (eap->addr_count == 0)
8838 	    lnum = -1;
8839 	else
8840 	    lnum = eap->line2;
8841 	if (above)
8842 	    --lnum;
8843     }
8844 
8845     generate_PUT(cctx, eap->regname, lnum);
8846     return line;
8847 }
8848 
8849 /*
8850  * A command that is not compiled, execute with legacy code.
8851  */
8852     static char_u *
8853 compile_exec(char_u *line, exarg_T *eap, cctx_T *cctx)
8854 {
8855     char_u	*p;
8856     int		has_expr = FALSE;
8857     char_u	*nextcmd = (char_u *)"";
8858 
8859     if (cctx->ctx_skip == SKIP_YES)
8860 	goto theend;
8861 
8862     // If there was a prececing command modifier, drop it and include it in the
8863     // EXEC command.
8864     if (cctx->ctx_has_cmdmod)
8865     {
8866 	garray_T	*instr = &cctx->ctx_instr;
8867 	isn_T		*isn = ((isn_T *)instr->ga_data) + instr->ga_len - 1;
8868 
8869 	if (isn->isn_type == ISN_CMDMOD)
8870 	{
8871 	    vim_regfree(isn->isn_arg.cmdmod.cf_cmdmod
8872 					       ->cmod_filter_regmatch.regprog);
8873 	    vim_free(isn->isn_arg.cmdmod.cf_cmdmod);
8874 	    --instr->ga_len;
8875 	    cctx->ctx_has_cmdmod = FALSE;
8876 	}
8877     }
8878 
8879     if (eap->cmdidx >= 0 && eap->cmdidx < CMD_SIZE)
8880     {
8881 	long	argt = eap->argt;
8882 	int	usefilter = FALSE;
8883 
8884 	has_expr = argt & (EX_XFILE | EX_EXPAND);
8885 
8886 	// If the command can be followed by a bar, find the bar and truncate
8887 	// it, so that the following command can be compiled.
8888 	// The '|' is overwritten with a NUL, it is put back below.
8889 	if ((eap->cmdidx == CMD_write || eap->cmdidx == CMD_read)
8890 							   && *eap->arg == '!')
8891 	    // :w !filter or :r !filter or :r! filter
8892 	    usefilter = TRUE;
8893 	if ((argt & EX_TRLBAR) && !usefilter)
8894 	{
8895 	    eap->argt = argt;
8896 	    separate_nextcmd(eap);
8897 	    if (eap->nextcmd != NULL)
8898 		nextcmd = eap->nextcmd;
8899 	}
8900 	else if (eap->cmdidx == CMD_wincmd)
8901 	{
8902 	    p = eap->arg;
8903 	    if (*p != NUL)
8904 		++p;
8905 	    if (*p == 'g' || *p == Ctrl_G)
8906 		++p;
8907 	    p = skipwhite(p);
8908 	    if (*p == '|')
8909 	    {
8910 		*p = NUL;
8911 		nextcmd = p + 1;
8912 	    }
8913 	}
8914     }
8915 
8916     if (eap->cmdidx == CMD_syntax && STRNCMP(eap->arg, "include ", 8) == 0)
8917     {
8918 	// expand filename in "syntax include [@group] filename"
8919 	has_expr = TRUE;
8920 	eap->arg = skipwhite(eap->arg + 7);
8921 	if (*eap->arg == '@')
8922 	    eap->arg = skiptowhite(eap->arg);
8923     }
8924 
8925     if ((eap->cmdidx == CMD_global || eap->cmdidx == CMD_vglobal)
8926 						       && STRLEN(eap->arg) > 4)
8927     {
8928 	int delim = *eap->arg;
8929 
8930 	p = skip_regexp_ex(eap->arg + 1, delim, TRUE, NULL, NULL, NULL);
8931 	if (*p == delim)
8932 	{
8933 	    eap->arg = p + 1;
8934 	    has_expr = TRUE;
8935 	}
8936     }
8937 
8938     if (eap->cmdidx == CMD_folddoopen || eap->cmdidx == CMD_folddoclosed)
8939     {
8940 	// TODO: should only expand when appropriate for the command
8941 	eap->arg = skiptowhite(eap->arg);
8942 	has_expr = TRUE;
8943     }
8944 
8945     if (has_expr && (p = (char_u *)strstr((char *)eap->arg, "`=")) != NULL)
8946     {
8947 	int	count = 0;
8948 	char_u	*start = skipwhite(line);
8949 
8950 	// :cmd xxx`=expr1`yyy`=expr2`zzz
8951 	// PUSHS ":cmd xxx"
8952 	// eval expr1
8953 	// PUSHS "yyy"
8954 	// eval expr2
8955 	// PUSHS "zzz"
8956 	// EXECCONCAT 5
8957 	for (;;)
8958 	{
8959 	    if (p > start)
8960 	    {
8961 		generate_PUSHS(cctx, vim_strnsave(start, p - start));
8962 		++count;
8963 	    }
8964 	    p += 2;
8965 	    if (compile_expr0(&p, cctx) == FAIL)
8966 		return NULL;
8967 	    may_generate_2STRING(-1, TRUE, cctx);
8968 	    ++count;
8969 	    p = skipwhite(p);
8970 	    if (*p != '`')
8971 	    {
8972 		emsg(_(e_missing_backtick));
8973 		return NULL;
8974 	    }
8975 	    start = p + 1;
8976 
8977 	    p = (char_u *)strstr((char *)start, "`=");
8978 	    if (p == NULL)
8979 	    {
8980 		if (*skipwhite(start) != NUL)
8981 		{
8982 		    generate_PUSHS(cctx, vim_strsave(start));
8983 		    ++count;
8984 		}
8985 		break;
8986 	    }
8987 	}
8988 	generate_EXECCONCAT(cctx, count);
8989     }
8990     else
8991 	generate_EXEC(cctx, line);
8992 
8993 theend:
8994     if (*nextcmd != NUL)
8995     {
8996 	// the parser expects a pointer to the bar, put it back
8997 	--nextcmd;
8998 	*nextcmd = '|';
8999     }
9000 
9001     return nextcmd;
9002 }
9003 
9004 /*
9005  * A script command with heredoc, e.g.
9006  *	ruby << EOF
9007  *	   command
9008  *	EOF
9009  * Has been turned into one long line with NL characters by
9010  * get_function_body():
9011  *	ruby << EOF<NL>   command<NL>EOF
9012  */
9013     static char_u *
9014 compile_script(char_u *line, cctx_T *cctx)
9015 {
9016     if (cctx->ctx_skip != SKIP_YES)
9017     {
9018 	isn_T	*isn;
9019 
9020 	if ((isn = generate_instr(cctx, ISN_EXEC_SPLIT)) == NULL)
9021 	    return NULL;
9022 	isn->isn_arg.string = vim_strsave(line);
9023     }
9024     return (char_u *)"";
9025 }
9026 
9027 
9028 /*
9029  * :s/pat/repl/
9030  */
9031     static char_u *
9032 compile_substitute(char_u *arg, exarg_T *eap, cctx_T *cctx)
9033 {
9034     char_u  *cmd = eap->arg;
9035     char_u  *expr = (char_u *)strstr((char *)cmd, "\\=");
9036 
9037     if (expr != NULL)
9038     {
9039 	int delimiter = *cmd++;
9040 
9041 	// There is a \=expr, find it in the substitute part.
9042 	cmd = skip_regexp_ex(cmd, delimiter, magic_isset(), NULL, NULL, NULL);
9043 	if (cmd[0] == delimiter && cmd[1] == '\\' && cmd[2] == '=')
9044 	{
9045 	    garray_T	save_ga = cctx->ctx_instr;
9046 	    char_u	*end;
9047 	    int		expr_res;
9048 	    int		trailing_error;
9049 	    int		instr_count;
9050 	    isn_T	*instr;
9051 	    isn_T	*isn;
9052 
9053 	    cmd += 3;
9054 	    end = skip_substitute(cmd, delimiter);
9055 
9056 	    // Temporarily reset the list of instructions so that the jump
9057 	    // labels are correct.
9058 	    cctx->ctx_instr.ga_len = 0;
9059 	    cctx->ctx_instr.ga_maxlen = 0;
9060 	    cctx->ctx_instr.ga_data = NULL;
9061 	    expr_res = compile_expr0(&cmd, cctx);
9062 	    if (end[-1] == NUL)
9063 		end[-1] = delimiter;
9064 	    cmd = skipwhite(cmd);
9065 	    trailing_error = *cmd != delimiter && *cmd != NUL;
9066 
9067 	    if (expr_res == FAIL || trailing_error
9068 				       || ga_grow(&cctx->ctx_instr, 1) == FAIL)
9069 	    {
9070 		if (trailing_error)
9071 		    semsg(_(e_trailing_arg), cmd);
9072 		clear_instr_ga(&cctx->ctx_instr);
9073 		cctx->ctx_instr = save_ga;
9074 		return NULL;
9075 	    }
9076 
9077 	    // Move the generated instructions into the ISN_SUBSTITUTE
9078 	    // instructions, then restore the list of instructions before
9079 	    // adding the ISN_SUBSTITUTE instruction.
9080 	    instr_count = cctx->ctx_instr.ga_len;
9081 	    instr = cctx->ctx_instr.ga_data;
9082 	    instr[instr_count].isn_type = ISN_FINISH;
9083 
9084 	    cctx->ctx_instr = save_ga;
9085 	    if ((isn = generate_instr(cctx, ISN_SUBSTITUTE)) == NULL)
9086 	    {
9087 		int idx;
9088 
9089 		for (idx = 0; idx < instr_count; ++idx)
9090 		    delete_instr(instr + idx);
9091 		vim_free(instr);
9092 		return NULL;
9093 	    }
9094 	    isn->isn_arg.subs.subs_cmd = vim_strsave(arg);
9095 	    isn->isn_arg.subs.subs_instr = instr;
9096 
9097 	    // skip over flags
9098 	    if (*end == '&')
9099 		++end;
9100 	    while (ASCII_ISALPHA(*end) || *end == '#')
9101 		++end;
9102 	    return end;
9103 	}
9104     }
9105 
9106     return compile_exec(arg, eap, cctx);
9107 }
9108 
9109     static char_u *
9110 compile_redir(char_u *line, exarg_T *eap, cctx_T *cctx)
9111 {
9112     char_u *arg = eap->arg;
9113     lhs_T	*lhs = &cctx->ctx_redir_lhs;
9114 
9115     if (lhs->lhs_name != NULL)
9116     {
9117 	if (STRNCMP(arg, "END", 3) == 0)
9118 	{
9119 	    if (lhs->lhs_append)
9120 	    {
9121 		// First load the current variable value.
9122 		if (compile_load_lhs_with_index(lhs, lhs->lhs_whole,
9123 								 cctx) == FAIL)
9124 		    return NULL;
9125 	    }
9126 
9127 	    // Gets the redirected text and put it on the stack, then store it
9128 	    // in the variable.
9129 	    generate_instr_type(cctx, ISN_REDIREND, &t_string);
9130 
9131 	    if (lhs->lhs_append)
9132 		generate_instr_drop(cctx, ISN_CONCAT, 1);
9133 
9134 	    if (lhs->lhs_has_index)
9135 	    {
9136 		// Use the info in "lhs" to store the value at the index in the
9137 		// list or dict.
9138 		if (compile_assign_unlet(lhs->lhs_whole, lhs, TRUE,
9139 						      &t_string, cctx) == FAIL)
9140 		    return NULL;
9141 	    }
9142 	    else if (generate_store_lhs(cctx, lhs, -1) == FAIL)
9143 		return NULL;
9144 
9145 	    VIM_CLEAR(lhs->lhs_name);
9146 	    VIM_CLEAR(lhs->lhs_whole);
9147 	    return arg + 3;
9148 	}
9149 	emsg(_(e_cannot_nest_redir));
9150 	return NULL;
9151     }
9152 
9153     if (arg[0] == '=' && arg[1] == '>')
9154     {
9155 	int	    append = FALSE;
9156 
9157 	// redirect to a variable is compiled
9158 	arg += 2;
9159 	if (*arg == '>')
9160 	{
9161 	    ++arg;
9162 	    append = TRUE;
9163 	}
9164 	arg = skipwhite(arg);
9165 
9166 	if (compile_assign_lhs(arg, lhs, CMD_redir,
9167 						FALSE, FALSE, 1, cctx) == FAIL)
9168 	    return NULL;
9169 	generate_instr(cctx, ISN_REDIRSTART);
9170 	lhs->lhs_append = append;
9171 	if (lhs->lhs_has_index)
9172 	{
9173 	    lhs->lhs_whole = vim_strnsave(arg, lhs->lhs_varlen_total);
9174 	    if (lhs->lhs_whole == NULL)
9175 		return NULL;
9176 	}
9177 
9178 	return arg + lhs->lhs_varlen_total;
9179     }
9180 
9181     // other redirects are handled like at script level
9182     return compile_exec(line, eap, cctx);
9183 }
9184 
9185 #ifdef FEAT_QUICKFIX
9186     static char_u *
9187 compile_cexpr(char_u *line, exarg_T *eap, cctx_T *cctx)
9188 {
9189     isn_T	*isn;
9190     char_u	*p;
9191 
9192     isn = generate_instr(cctx, ISN_CEXPR_AUCMD);
9193     if (isn == NULL)
9194 	return NULL;
9195     isn->isn_arg.number = eap->cmdidx;
9196 
9197     p = eap->arg;
9198     if (compile_expr0(&p, cctx) == FAIL)
9199 	return NULL;
9200 
9201     isn = generate_instr(cctx, ISN_CEXPR_CORE);
9202     if (isn == NULL)
9203 	return NULL;
9204     isn->isn_arg.cexpr.cexpr_ref = ALLOC_ONE(cexprref_T);
9205     if (isn->isn_arg.cexpr.cexpr_ref == NULL)
9206 	return NULL;
9207     isn->isn_arg.cexpr.cexpr_ref->cer_cmdidx = eap->cmdidx;
9208     isn->isn_arg.cexpr.cexpr_ref->cer_forceit = eap->forceit;
9209     isn->isn_arg.cexpr.cexpr_ref->cer_cmdline = vim_strsave(skipwhite(line));
9210 
9211     return p;
9212 }
9213 #endif
9214 
9215 /*
9216  * Add a function to the list of :def functions.
9217  * This sets "ufunc->uf_dfunc_idx" but the function isn't compiled yet.
9218  */
9219     static int
9220 add_def_function(ufunc_T *ufunc)
9221 {
9222     dfunc_T *dfunc;
9223 
9224     if (def_functions.ga_len == 0)
9225     {
9226 	// The first position is not used, so that a zero uf_dfunc_idx means it
9227 	// wasn't set.
9228 	if (ga_grow(&def_functions, 1) == FAIL)
9229 	    return FAIL;
9230 	++def_functions.ga_len;
9231     }
9232 
9233     // Add the function to "def_functions".
9234     if (ga_grow(&def_functions, 1) == FAIL)
9235 	return FAIL;
9236     dfunc = ((dfunc_T *)def_functions.ga_data) + def_functions.ga_len;
9237     CLEAR_POINTER(dfunc);
9238     dfunc->df_idx = def_functions.ga_len;
9239     ufunc->uf_dfunc_idx = dfunc->df_idx;
9240     dfunc->df_ufunc = ufunc;
9241     dfunc->df_name = vim_strsave(ufunc->uf_name);
9242     ga_init2(&dfunc->df_var_names, sizeof(char_u *), 10);
9243     ++dfunc->df_refcount;
9244     ++def_functions.ga_len;
9245     return OK;
9246 }
9247 
9248 /*
9249  * After ex_function() has collected all the function lines: parse and compile
9250  * the lines into instructions.
9251  * Adds the function to "def_functions".
9252  * When "check_return_type" is set then set ufunc->uf_ret_type to the type of
9253  * the return statement (used for lambda).  When uf_ret_type is already set
9254  * then check that it matches.
9255  * When "profiling" is true add ISN_PROF_START instructions.
9256  * "outer_cctx" is set for a nested function.
9257  * This can be used recursively through compile_lambda(), which may reallocate
9258  * "def_functions".
9259  * Returns OK or FAIL.
9260  */
9261     int
9262 compile_def_function(
9263 	ufunc_T		*ufunc,
9264 	int		check_return_type,
9265 	compiletype_T   compile_type,
9266 	cctx_T		*outer_cctx)
9267 {
9268     char_u	*line = NULL;
9269     char_u	*line_to_free = NULL;
9270     char_u	*p;
9271     char	*errormsg = NULL;	// error message
9272     cctx_T	cctx;
9273     garray_T	*instr;
9274     int		did_emsg_before = did_emsg;
9275     int		did_emsg_silent_before = did_emsg_silent;
9276     int		ret = FAIL;
9277     sctx_T	save_current_sctx = current_sctx;
9278     int		save_estack_compiling = estack_compiling;
9279     int		save_cmod_flags = cmdmod.cmod_flags;
9280     int		do_estack_push;
9281     int		new_def_function = FALSE;
9282 #ifdef FEAT_PROFILE
9283     int		prof_lnum = -1;
9284 #endif
9285     int		debug_lnum = -1;
9286 
9287     // When using a function that was compiled before: Free old instructions.
9288     // The index is reused.  Otherwise add a new entry in "def_functions".
9289     if (ufunc->uf_dfunc_idx > 0)
9290     {
9291 	dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data)
9292 							 + ufunc->uf_dfunc_idx;
9293 	isn_T	*instr_dest = NULL;
9294 
9295 	switch (compile_type)
9296 	{
9297 	    case CT_PROFILE:
9298 #ifdef FEAT_PROFILE
9299 			    instr_dest = dfunc->df_instr_prof; break;
9300 #endif
9301 	    case CT_NONE:   instr_dest = dfunc->df_instr; break;
9302 	    case CT_DEBUG:  instr_dest = dfunc->df_instr_debug; break;
9303 	}
9304 	if (instr_dest != NULL)
9305 	    // Was compiled in this mode before: Free old instructions.
9306 	    delete_def_function_contents(dfunc, FALSE);
9307 	ga_clear_strings(&dfunc->df_var_names);
9308     }
9309     else
9310     {
9311 	if (add_def_function(ufunc) == FAIL)
9312 	    return FAIL;
9313 	new_def_function = TRUE;
9314     }
9315 
9316     ufunc->uf_def_status = UF_COMPILING;
9317 
9318     CLEAR_FIELD(cctx);
9319 
9320     cctx.ctx_compile_type = compile_type;
9321     cctx.ctx_ufunc = ufunc;
9322     cctx.ctx_lnum = -1;
9323     cctx.ctx_outer = outer_cctx;
9324     ga_init2(&cctx.ctx_locals, sizeof(lvar_T), 10);
9325     ga_init2(&cctx.ctx_type_stack, sizeof(type_T *), 50);
9326     ga_init2(&cctx.ctx_imports, sizeof(imported_T), 10);
9327     cctx.ctx_type_list = &ufunc->uf_type_list;
9328     ga_init2(&cctx.ctx_instr, sizeof(isn_T), 50);
9329     instr = &cctx.ctx_instr;
9330 
9331     // Set the context to the function, it may be compiled when called from
9332     // another script.  Set the script version to the most modern one.
9333     // The line number will be set in next_line_from_context().
9334     current_sctx = ufunc->uf_script_ctx;
9335     current_sctx.sc_version = SCRIPT_VERSION_VIM9;
9336 
9337     // Don't use the flag from ":legacy" here.
9338     cmdmod.cmod_flags &= ~CMOD_LEGACY;
9339 
9340     // Make sure error messages are OK.
9341     do_estack_push = !estack_top_is_ufunc(ufunc, 1);
9342     if (do_estack_push)
9343 	estack_push_ufunc(ufunc, 1);
9344     estack_compiling = TRUE;
9345 
9346     if (ufunc->uf_def_args.ga_len > 0)
9347     {
9348 	int	count = ufunc->uf_def_args.ga_len;
9349 	int	first_def_arg = ufunc->uf_args.ga_len - count;
9350 	int	i;
9351 	char_u	*arg;
9352 	int	off = STACK_FRAME_SIZE + (ufunc->uf_va_name != NULL ? 1 : 0);
9353 	int	did_set_arg_type = FALSE;
9354 
9355 	// Produce instructions for the default values of optional arguments.
9356 	SOURCING_LNUM = 0;  // line number unknown
9357 	for (i = 0; i < count; ++i)
9358 	{
9359 	    garray_T	*stack = &cctx.ctx_type_stack;
9360 	    type_T	*val_type;
9361 	    int		arg_idx = first_def_arg + i;
9362 	    where_T	where = WHERE_INIT;
9363 	    int		r;
9364 	    int		jump_instr_idx = instr->ga_len;
9365 	    isn_T	*isn;
9366 
9367 	    // Use a JUMP_IF_ARG_SET instruction to skip if the value was given.
9368 	    if (generate_JUMP_IF_ARG_SET(&cctx, i - count - off) == FAIL)
9369 		goto erret;
9370 
9371 	    // Make sure later arguments are not found.
9372 	    ufunc->uf_args_visible = arg_idx;
9373 
9374 	    arg = ((char_u **)(ufunc->uf_def_args.ga_data))[i];
9375 	    r = compile_expr0(&arg, &cctx);
9376 
9377 	    if (r == FAIL)
9378 		goto erret;
9379 
9380 	    // If no type specified use the type of the default value.
9381 	    // Otherwise check that the default value type matches the
9382 	    // specified type.
9383 	    val_type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
9384 	    where.wt_index = arg_idx + 1;
9385 	    if (ufunc->uf_arg_types[arg_idx] == &t_unknown)
9386 	    {
9387 		did_set_arg_type = TRUE;
9388 		ufunc->uf_arg_types[arg_idx] = val_type;
9389 	    }
9390 	    else if (check_type(ufunc->uf_arg_types[arg_idx], val_type,
9391 							  TRUE, where) == FAIL)
9392 		goto erret;
9393 
9394 	    if (generate_STORE(&cctx, ISN_STORE, i - count - off, NULL) == FAIL)
9395 		goto erret;
9396 
9397 	    // set instruction index in JUMP_IF_ARG_SET to here
9398 	    isn = ((isn_T *)instr->ga_data) + jump_instr_idx;
9399 	    isn->isn_arg.jumparg.jump_where = instr->ga_len;
9400 	}
9401 
9402 	if (did_set_arg_type)
9403 	    set_function_type(ufunc);
9404     }
9405     ufunc->uf_args_visible = ufunc->uf_args.ga_len;
9406 
9407     /*
9408      * Loop over all the lines of the function and generate instructions.
9409      */
9410     for (;;)
9411     {
9412 	exarg_T	    ea;
9413 	int	    starts_with_colon = FALSE;
9414 	char_u	    *cmd;
9415 	cmdmod_T    local_cmdmod;
9416 
9417 	// Bail out on the first error to avoid a flood of errors and report
9418 	// the right line number when inside try/catch.
9419 	if (did_emsg_before != did_emsg)
9420 	    goto erret;
9421 
9422 	if (line != NULL && *line == '|')
9423 	    // the line continues after a '|'
9424 	    ++line;
9425 	else if (line != NULL && *skipwhite(line) != NUL
9426 		&& !(*line == '#' && (line == cctx.ctx_line_start
9427 						    || VIM_ISWHITE(line[-1]))))
9428 	{
9429 	    semsg(_(e_trailing_arg), line);
9430 	    goto erret;
9431 	}
9432 	else if (line != NULL && vim9_bad_comment(skipwhite(line)))
9433 	    goto erret;
9434 	else
9435 	{
9436 	    line = next_line_from_context(&cctx, FALSE);
9437 	    if (cctx.ctx_lnum >= ufunc->uf_lines.ga_len)
9438 	    {
9439 		// beyond the last line
9440 #ifdef FEAT_PROFILE
9441 		if (cctx.ctx_skip != SKIP_YES)
9442 		    may_generate_prof_end(&cctx, prof_lnum);
9443 #endif
9444 		break;
9445 	    }
9446 	    // Make a copy, splitting off nextcmd and removing trailing spaces
9447 	    // may change it.
9448 	    if (line != NULL)
9449 	    {
9450 		line = vim_strsave(line);
9451 		vim_free(line_to_free);
9452 		line_to_free = line;
9453 	    }
9454 	}
9455 
9456 	CLEAR_FIELD(ea);
9457 	ea.cmdlinep = &line;
9458 	ea.cmd = skipwhite(line);
9459 
9460 	if (*ea.cmd == '#')
9461 	{
9462 	    // "#" starts a comment
9463 	    line = (char_u *)"";
9464 	    continue;
9465 	}
9466 
9467 #ifdef FEAT_PROFILE
9468 	if (cctx.ctx_compile_type == CT_PROFILE && cctx.ctx_lnum != prof_lnum
9469 						  && cctx.ctx_skip != SKIP_YES)
9470 	{
9471 	    may_generate_prof_end(&cctx, prof_lnum);
9472 
9473 	    prof_lnum = cctx.ctx_lnum;
9474 	    generate_instr(&cctx, ISN_PROF_START);
9475 	}
9476 #endif
9477 	if (cctx.ctx_compile_type == CT_DEBUG && cctx.ctx_lnum != debug_lnum
9478 						  && cctx.ctx_skip != SKIP_YES)
9479 	{
9480 	    debug_lnum = cctx.ctx_lnum;
9481 	    generate_instr_debug(&cctx);
9482 	}
9483 	cctx.ctx_prev_lnum = cctx.ctx_lnum + 1;
9484 
9485 	// Some things can be recognized by the first character.
9486 	switch (*ea.cmd)
9487 	{
9488 	    case '}':
9489 		{
9490 		    // "}" ends a block scope
9491 		    scopetype_T stype = cctx.ctx_scope == NULL
9492 					  ? NO_SCOPE : cctx.ctx_scope->se_type;
9493 
9494 		    if (stype == BLOCK_SCOPE)
9495 		    {
9496 			compile_endblock(&cctx);
9497 			line = ea.cmd;
9498 		    }
9499 		    else
9500 		    {
9501 			emsg(_(e_using_rcurly_outside_if_block_scope));
9502 			goto erret;
9503 		    }
9504 		    if (line != NULL)
9505 			line = skipwhite(ea.cmd + 1);
9506 		    continue;
9507 		}
9508 
9509 	    case '{':
9510 		// "{" starts a block scope
9511 		// "{'a': 1}->func() is something else
9512 		if (ends_excmd(*skipwhite(ea.cmd + 1)))
9513 		{
9514 		    line = compile_block(ea.cmd, &cctx);
9515 		    continue;
9516 		}
9517 		break;
9518 	}
9519 
9520 	/*
9521 	 * COMMAND MODIFIERS
9522 	 */
9523 	cctx.ctx_has_cmdmod = FALSE;
9524 	if (parse_command_modifiers(&ea, &errormsg, &local_cmdmod, FALSE)
9525 								       == FAIL)
9526 	{
9527 	    if (errormsg != NULL)
9528 		goto erret;
9529 	    // empty line or comment
9530 	    line = (char_u *)"";
9531 	    continue;
9532 	}
9533 	generate_cmdmods(&cctx, &local_cmdmod);
9534 	undo_cmdmod(&local_cmdmod);
9535 
9536 	// Check if there was a colon after the last command modifier or before
9537 	// the current position.
9538 	for (p = ea.cmd; p >= line; --p)
9539 	{
9540 	    if (*p == ':')
9541 		starts_with_colon = TRUE;
9542 	    if (p < ea.cmd && !VIM_ISWHITE(*p))
9543 		break;
9544 	}
9545 
9546 	// Skip ":call" to get to the function name, unless using :legacy
9547 	p = ea.cmd;
9548 	if (!(local_cmdmod.cmod_flags & CMOD_LEGACY))
9549 	{
9550 	    if (checkforcmd(&ea.cmd, "call", 3))
9551 	    {
9552 		if (*ea.cmd == '(')
9553 		    // not for "call()"
9554 		    ea.cmd = p;
9555 		else
9556 		    ea.cmd = skipwhite(ea.cmd);
9557 	    }
9558 
9559 	    if (!starts_with_colon)
9560 	    {
9561 		int	    assign;
9562 
9563 		// Check for assignment after command modifiers.
9564 		assign = may_compile_assignment(&ea, &line, &cctx);
9565 		if (assign == OK)
9566 		    goto nextline;
9567 		if (assign == FAIL)
9568 		    goto erret;
9569 	    }
9570 	}
9571 
9572 	/*
9573 	 * COMMAND after range
9574 	 * 'text'->func() should not be confused with 'a mark
9575 	 * "++nr" and "--nr" are eval commands
9576 	 */
9577 	cmd = ea.cmd;
9578 	if (!(local_cmdmod.cmod_flags & CMOD_LEGACY)
9579 		&& (starts_with_colon || !(*cmd == '\''
9580 		       || (cmd[0] == cmd[1] && (*cmd == '+' || *cmd == '-')))))
9581 	{
9582 	    ea.cmd = skip_range(ea.cmd, TRUE, NULL);
9583 	    if (ea.cmd > cmd)
9584 	    {
9585 		if (!starts_with_colon)
9586 		{
9587 		    semsg(_(e_colon_required_before_range_str), cmd);
9588 		    goto erret;
9589 		}
9590 		ea.addr_count = 1;
9591 		if (ends_excmd2(line, ea.cmd))
9592 		{
9593 		    // A range without a command: jump to the line.
9594 		    // TODO: compile to a more efficient command, possibly
9595 		    // calling parse_cmd_address().
9596 		    ea.cmdidx = CMD_SIZE;
9597 		    line = compile_exec(line, &ea, &cctx);
9598 		    goto nextline;
9599 		}
9600 	    }
9601 	}
9602 	p = find_ex_command(&ea, NULL,
9603 		starts_with_colon || (local_cmdmod.cmod_flags & CMOD_LEGACY)
9604 						  ? NULL : item_exists, &cctx);
9605 
9606 	if (p == NULL)
9607 	{
9608 	    if (cctx.ctx_skip != SKIP_YES)
9609 		emsg(_(e_ambiguous_use_of_user_defined_command));
9610 	    goto erret;
9611 	}
9612 
9613 	// When using ":legacy cmd" always use compile_exec().
9614 	if (local_cmdmod.cmod_flags & CMOD_LEGACY)
9615 	{
9616 	    char_u *start = ea.cmd;
9617 
9618 	    switch (ea.cmdidx)
9619 	    {
9620 		case CMD_if:
9621 		case CMD_elseif:
9622 		case CMD_else:
9623 		case CMD_endif:
9624 		case CMD_for:
9625 		case CMD_endfor:
9626 		case CMD_continue:
9627 		case CMD_break:
9628 		case CMD_while:
9629 		case CMD_endwhile:
9630 		case CMD_try:
9631 		case CMD_catch:
9632 		case CMD_finally:
9633 		case CMD_endtry:
9634 			semsg(_(e_cannot_use_legacy_with_command_str), ea.cmd);
9635 			goto erret;
9636 		default: break;
9637 	    }
9638 
9639 	    // ":legacy return expr" needs to be handled differently.
9640 	    if (checkforcmd(&start, "return", 4))
9641 		ea.cmdidx = CMD_return;
9642 	    else
9643 		ea.cmdidx = CMD_legacy;
9644 	}
9645 
9646 	if (p == ea.cmd && ea.cmdidx != CMD_SIZE)
9647 	{
9648 	    if (cctx.ctx_skip == SKIP_YES)
9649 	    {
9650 		line += STRLEN(line);
9651 		goto nextline;
9652 	    }
9653 
9654 	    // Expression or function call.
9655 	    if (ea.cmdidx != CMD_eval)
9656 	    {
9657 		// CMD_var cannot happen, compile_assignment() above would be
9658 		// used.  Most likely an assignment to a non-existing variable.
9659 		semsg(_(e_command_not_recognized_str), ea.cmd);
9660 		goto erret;
9661 	    }
9662 	}
9663 
9664 	if (cctx.ctx_had_return
9665 		&& ea.cmdidx != CMD_elseif
9666 		&& ea.cmdidx != CMD_else
9667 		&& ea.cmdidx != CMD_endif
9668 		&& ea.cmdidx != CMD_endfor
9669 		&& ea.cmdidx != CMD_endwhile
9670 		&& ea.cmdidx != CMD_catch
9671 		&& ea.cmdidx != CMD_finally
9672 		&& ea.cmdidx != CMD_endtry)
9673 	{
9674 	    emsg(_(e_unreachable_code_after_return));
9675 	    goto erret;
9676 	}
9677 
9678 	p = skipwhite(p);
9679 	if (ea.cmdidx != CMD_SIZE
9680 			    && ea.cmdidx != CMD_write && ea.cmdidx != CMD_read)
9681 	{
9682 	    if (ea.cmdidx >= 0)
9683 		ea.argt = excmd_get_argt(ea.cmdidx);
9684 	    if ((ea.argt & EX_BANG) && *p == '!')
9685 	    {
9686 		ea.forceit = TRUE;
9687 		p = skipwhite(p + 1);
9688 	    }
9689 	}
9690 
9691 	switch (ea.cmdidx)
9692 	{
9693 	    case CMD_def:
9694 		    ea.arg = p;
9695 		    line = compile_nested_function(&ea, &cctx);
9696 		    break;
9697 
9698 	    case CMD_function:
9699 		    // TODO: should we allow this, e.g. to declare a global
9700 		    // function?
9701 		    emsg(_(e_cannot_use_function_inside_def));
9702 		    goto erret;
9703 
9704 	    case CMD_return:
9705 		    line = compile_return(p, check_return_type,
9706 				 local_cmdmod.cmod_flags & CMOD_LEGACY, &cctx);
9707 		    cctx.ctx_had_return = TRUE;
9708 		    break;
9709 
9710 	    case CMD_let:
9711 		    emsg(_(e_cannot_use_let_in_vim9_script));
9712 		    break;
9713 	    case CMD_var:
9714 	    case CMD_final:
9715 	    case CMD_const:
9716 	    case CMD_increment:
9717 	    case CMD_decrement:
9718 		    line = compile_assignment(p, &ea, ea.cmdidx, &cctx);
9719 		    if (line == p)
9720 			line = NULL;
9721 		    break;
9722 
9723 	    case CMD_unlet:
9724 	    case CMD_unlockvar:
9725 	    case CMD_lockvar:
9726 		    line = compile_unletlock(p, &ea, &cctx);
9727 		    break;
9728 
9729 	    case CMD_import:
9730 		    emsg(_(e_import_can_only_be_used_in_script));
9731 		    line = NULL;
9732 		    break;
9733 
9734 	    case CMD_if:
9735 		    line = compile_if(p, &cctx);
9736 		    break;
9737 	    case CMD_elseif:
9738 		    line = compile_elseif(p, &cctx);
9739 		    cctx.ctx_had_return = FALSE;
9740 		    break;
9741 	    case CMD_else:
9742 		    line = compile_else(p, &cctx);
9743 		    cctx.ctx_had_return = FALSE;
9744 		    break;
9745 	    case CMD_endif:
9746 		    line = compile_endif(p, &cctx);
9747 		    break;
9748 
9749 	    case CMD_while:
9750 		    line = compile_while(p, &cctx);
9751 		    break;
9752 	    case CMD_endwhile:
9753 		    line = compile_endwhile(p, &cctx);
9754 		    cctx.ctx_had_return = FALSE;
9755 		    break;
9756 
9757 	    case CMD_for:
9758 		    line = compile_for(p, &cctx);
9759 		    break;
9760 	    case CMD_endfor:
9761 		    line = compile_endfor(p, &cctx);
9762 		    cctx.ctx_had_return = FALSE;
9763 		    break;
9764 	    case CMD_continue:
9765 		    line = compile_continue(p, &cctx);
9766 		    break;
9767 	    case CMD_break:
9768 		    line = compile_break(p, &cctx);
9769 		    break;
9770 
9771 	    case CMD_try:
9772 		    line = compile_try(p, &cctx);
9773 		    break;
9774 	    case CMD_catch:
9775 		    line = compile_catch(p, &cctx);
9776 		    cctx.ctx_had_return = FALSE;
9777 		    break;
9778 	    case CMD_finally:
9779 		    line = compile_finally(p, &cctx);
9780 		    cctx.ctx_had_return = FALSE;
9781 		    break;
9782 	    case CMD_endtry:
9783 		    line = compile_endtry(p, &cctx);
9784 		    cctx.ctx_had_return = FALSE;
9785 		    break;
9786 	    case CMD_throw:
9787 		    line = compile_throw(p, &cctx);
9788 		    break;
9789 
9790 	    case CMD_eval:
9791 		    line = compile_eval(p, &cctx);
9792 		    break;
9793 
9794 	    case CMD_echo:
9795 	    case CMD_echon:
9796 	    case CMD_execute:
9797 	    case CMD_echomsg:
9798 	    case CMD_echoerr:
9799 		    line = compile_mult_expr(p, ea.cmdidx, &cctx);
9800 		    break;
9801 
9802 	    case CMD_put:
9803 		    ea.cmd = cmd;
9804 		    line = compile_put(p, &ea, &cctx);
9805 		    break;
9806 
9807 	    case CMD_substitute:
9808 		    if (cctx.ctx_skip == SKIP_YES)
9809 			line = (char_u *)"";
9810 		    else
9811 		    {
9812 			ea.arg = p;
9813 			line = compile_substitute(line, &ea, &cctx);
9814 		    }
9815 		    break;
9816 
9817 	    case CMD_redir:
9818 		    ea.arg = p;
9819 		    line = compile_redir(line, &ea, &cctx);
9820 		    break;
9821 
9822 	    case CMD_cexpr:
9823 	    case CMD_lexpr:
9824 	    case CMD_caddexpr:
9825 	    case CMD_laddexpr:
9826 	    case CMD_cgetexpr:
9827 	    case CMD_lgetexpr:
9828 #ifdef FEAT_QUICKFIX
9829 		    ea.arg = p;
9830 		    line = compile_cexpr(line, &ea, &cctx);
9831 #else
9832 		    ex_ni(&ea);
9833 		    line = NULL;
9834 #endif
9835 		    break;
9836 
9837 	    // TODO: any other commands with an expression argument?
9838 
9839 	    case CMD_append:
9840 	    case CMD_change:
9841 	    case CMD_insert:
9842 	    case CMD_k:
9843 	    case CMD_t:
9844 	    case CMD_xit:
9845 		    not_in_vim9(&ea);
9846 		    goto erret;
9847 
9848 	    case CMD_SIZE:
9849 		    if (cctx.ctx_skip != SKIP_YES)
9850 		    {
9851 			semsg(_(e_invalid_command_str), ea.cmd);
9852 			goto erret;
9853 		    }
9854 		    // We don't check for a next command here.
9855 		    line = (char_u *)"";
9856 		    break;
9857 
9858 	    case CMD_lua:
9859 	    case CMD_mzscheme:
9860 	    case CMD_perl:
9861 	    case CMD_py3:
9862 	    case CMD_python3:
9863 	    case CMD_python:
9864 	    case CMD_pythonx:
9865 	    case CMD_ruby:
9866 	    case CMD_tcl:
9867 		    ea.arg = p;
9868 		    if (vim_strchr(line, '\n') == NULL)
9869 			line = compile_exec(line, &ea, &cctx);
9870 		    else
9871 			// heredoc lines have been concatenated with NL
9872 			// characters in get_function_body()
9873 			line = compile_script(line, &cctx);
9874 		    break;
9875 
9876 	    default:
9877 		    // Not recognized, execute with do_cmdline_cmd().
9878 		    ea.arg = p;
9879 		    line = compile_exec(line, &ea, &cctx);
9880 		    break;
9881 	}
9882 nextline:
9883 	if (line == NULL)
9884 	    goto erret;
9885 	line = skipwhite(line);
9886 
9887 	// Undo any command modifiers.
9888 	generate_undo_cmdmods(&cctx);
9889 
9890 	if (cctx.ctx_type_stack.ga_len < 0)
9891 	{
9892 	    iemsg("Type stack underflow");
9893 	    goto erret;
9894 	}
9895     }
9896 
9897     if (cctx.ctx_scope != NULL)
9898     {
9899 	if (cctx.ctx_scope->se_type == IF_SCOPE)
9900 	    emsg(_(e_endif));
9901 	else if (cctx.ctx_scope->se_type == WHILE_SCOPE)
9902 	    emsg(_(e_endwhile));
9903 	else if (cctx.ctx_scope->se_type == FOR_SCOPE)
9904 	    emsg(_(e_endfor));
9905 	else
9906 	    emsg(_(e_missing_rcurly));
9907 	goto erret;
9908     }
9909 
9910     if (!cctx.ctx_had_return)
9911     {
9912 	if (ufunc->uf_ret_type->tt_type == VAR_UNKNOWN)
9913 	    ufunc->uf_ret_type = &t_void;
9914 	else if (ufunc->uf_ret_type->tt_type != VAR_VOID)
9915 	{
9916 	    emsg(_(e_missing_return_statement));
9917 	    goto erret;
9918 	}
9919 
9920 	// Return void if there is no return at the end.
9921 	generate_instr(&cctx, ISN_RETURN_VOID);
9922     }
9923 
9924     // When compiled with ":silent!" and there was an error don't consider the
9925     // function compiled.
9926     if (emsg_silent == 0 || did_emsg_silent == did_emsg_silent_before)
9927     {
9928 	dfunc_T	*dfunc = ((dfunc_T *)def_functions.ga_data)
9929 							 + ufunc->uf_dfunc_idx;
9930 	dfunc->df_deleted = FALSE;
9931 	dfunc->df_script_seq = current_sctx.sc_seq;
9932 #ifdef FEAT_PROFILE
9933 	if (cctx.ctx_compile_type == CT_PROFILE)
9934 	{
9935 	    dfunc->df_instr_prof = instr->ga_data;
9936 	    dfunc->df_instr_prof_count = instr->ga_len;
9937 	}
9938 	else
9939 #endif
9940 	if (cctx.ctx_compile_type == CT_DEBUG)
9941 	{
9942 	    dfunc->df_instr_debug = instr->ga_data;
9943 	    dfunc->df_instr_debug_count = instr->ga_len;
9944 	}
9945 	else
9946 	{
9947 	    dfunc->df_instr = instr->ga_data;
9948 	    dfunc->df_instr_count = instr->ga_len;
9949 	}
9950 	dfunc->df_varcount = dfunc->df_var_names.ga_len;
9951 	dfunc->df_has_closure = cctx.ctx_has_closure;
9952 	if (cctx.ctx_outer_used)
9953 	    ufunc->uf_flags |= FC_CLOSURE;
9954 	ufunc->uf_def_status = UF_COMPILED;
9955     }
9956 
9957     ret = OK;
9958 
9959 erret:
9960     if (ufunc->uf_def_status == UF_COMPILING)
9961     {
9962 	dfunc_T	*dfunc = ((dfunc_T *)def_functions.ga_data)
9963 							 + ufunc->uf_dfunc_idx;
9964 
9965 	// Compiling aborted, free the generated instructions.
9966 	clear_instr_ga(instr);
9967 	VIM_CLEAR(dfunc->df_name);
9968 	ga_clear_strings(&dfunc->df_var_names);
9969 
9970 	// If using the last entry in the table and it was added above, we
9971 	// might as well remove it.
9972 	if (!dfunc->df_deleted && new_def_function
9973 			    && ufunc->uf_dfunc_idx == def_functions.ga_len - 1)
9974 	{
9975 	    --def_functions.ga_len;
9976 	    ufunc->uf_dfunc_idx = 0;
9977 	}
9978 	ufunc->uf_def_status = UF_COMPILE_ERROR;
9979 
9980 	while (cctx.ctx_scope != NULL)
9981 	    drop_scope(&cctx);
9982 
9983 	if (errormsg != NULL)
9984 	    emsg(errormsg);
9985 	else if (did_emsg == did_emsg_before)
9986 	    emsg(_(e_compiling_def_function_failed));
9987     }
9988 
9989     if (cctx.ctx_redir_lhs.lhs_name != NULL)
9990     {
9991 	if (ret == OK)
9992 	{
9993 	    emsg(_(e_missing_redir_end));
9994 	    ret = FAIL;
9995 	}
9996 	vim_free(cctx.ctx_redir_lhs.lhs_name);
9997 	vim_free(cctx.ctx_redir_lhs.lhs_whole);
9998     }
9999 
10000     current_sctx = save_current_sctx;
10001     estack_compiling = save_estack_compiling;
10002     cmdmod.cmod_flags =	save_cmod_flags;
10003     if (do_estack_push)
10004 	estack_pop();
10005 
10006     vim_free(line_to_free);
10007     free_imported(&cctx);
10008     free_locals(&cctx);
10009     ga_clear(&cctx.ctx_type_stack);
10010     return ret;
10011 }
10012 
10013     void
10014 set_function_type(ufunc_T *ufunc)
10015 {
10016     int varargs = ufunc->uf_va_name != NULL;
10017     int argcount = ufunc->uf_args.ga_len;
10018 
10019     // Create a type for the function, with the return type and any
10020     // argument types.
10021     // A vararg is included in uf_args.ga_len but not in uf_arg_types.
10022     // The type is included in "tt_args".
10023     if (argcount > 0 || varargs)
10024     {
10025 	if (ufunc->uf_type_list.ga_itemsize == 0)
10026 	    ga_init2(&ufunc->uf_type_list, sizeof(type_T *), 10);
10027 	ufunc->uf_func_type = alloc_func_type(ufunc->uf_ret_type,
10028 					   argcount, &ufunc->uf_type_list);
10029 	// Add argument types to the function type.
10030 	if (func_type_add_arg_types(ufunc->uf_func_type,
10031 				    argcount + varargs,
10032 				    &ufunc->uf_type_list) == FAIL)
10033 	    return;
10034 	ufunc->uf_func_type->tt_argcount = argcount + varargs;
10035 	ufunc->uf_func_type->tt_min_argcount =
10036 				      argcount - ufunc->uf_def_args.ga_len;
10037 	if (ufunc->uf_arg_types == NULL)
10038 	{
10039 	    int i;
10040 
10041 	    // lambda does not have argument types.
10042 	    for (i = 0; i < argcount; ++i)
10043 		ufunc->uf_func_type->tt_args[i] = &t_any;
10044 	}
10045 	else
10046 	    mch_memmove(ufunc->uf_func_type->tt_args,
10047 			 ufunc->uf_arg_types, sizeof(type_T *) * argcount);
10048 	if (varargs)
10049 	{
10050 	    ufunc->uf_func_type->tt_args[argcount] =
10051 		   ufunc->uf_va_type == NULL ? &t_list_any : ufunc->uf_va_type;
10052 	    ufunc->uf_func_type->tt_flags = TTFLAG_VARARGS;
10053 	}
10054     }
10055     else
10056 	// No arguments, can use a predefined type.
10057 	ufunc->uf_func_type = get_func_type(ufunc->uf_ret_type,
10058 					   argcount, &ufunc->uf_type_list);
10059 }
10060 
10061 
10062 /*
10063  * Delete an instruction, free what it contains.
10064  */
10065     void
10066 delete_instr(isn_T *isn)
10067 {
10068     switch (isn->isn_type)
10069     {
10070 	case ISN_DEF:
10071 	case ISN_EXEC:
10072 	case ISN_EXEC_SPLIT:
10073 	case ISN_LEGACY_EVAL:
10074 	case ISN_LOADAUTO:
10075 	case ISN_LOADB:
10076 	case ISN_LOADENV:
10077 	case ISN_LOADG:
10078 	case ISN_LOADOPT:
10079 	case ISN_LOADT:
10080 	case ISN_LOADW:
10081 	case ISN_PUSHEXC:
10082 	case ISN_PUSHFUNC:
10083 	case ISN_PUSHS:
10084 	case ISN_RANGE:
10085 	case ISN_STOREAUTO:
10086 	case ISN_STOREB:
10087 	case ISN_STOREENV:
10088 	case ISN_STOREG:
10089 	case ISN_STORET:
10090 	case ISN_STOREW:
10091 	case ISN_STRINGMEMBER:
10092 	    vim_free(isn->isn_arg.string);
10093 	    break;
10094 
10095 	case ISN_SUBSTITUTE:
10096 	    {
10097 		int	idx;
10098 		isn_T	*list = isn->isn_arg.subs.subs_instr;
10099 
10100 		vim_free(isn->isn_arg.subs.subs_cmd);
10101 		for (idx = 0; list[idx].isn_type != ISN_FINISH; ++idx)
10102 		    delete_instr(list + idx);
10103 		vim_free(list);
10104 	    }
10105 	    break;
10106 
10107 	case ISN_INSTR:
10108 	    {
10109 		int	idx;
10110 		isn_T	*list = isn->isn_arg.instr;
10111 
10112 		for (idx = 0; list[idx].isn_type != ISN_FINISH; ++idx)
10113 		    delete_instr(list + idx);
10114 		vim_free(list);
10115 	    }
10116 	    break;
10117 
10118 	case ISN_LOADS:
10119 	case ISN_STORES:
10120 	    vim_free(isn->isn_arg.loadstore.ls_name);
10121 	    break;
10122 
10123 	case ISN_UNLET:
10124 	case ISN_UNLETENV:
10125 	    vim_free(isn->isn_arg.unlet.ul_name);
10126 	    break;
10127 
10128 	case ISN_STOREOPT:
10129 	    vim_free(isn->isn_arg.storeopt.so_name);
10130 	    break;
10131 
10132 	case ISN_PUSHBLOB:   // push blob isn_arg.blob
10133 	    blob_unref(isn->isn_arg.blob);
10134 	    break;
10135 
10136 	case ISN_PUSHJOB:
10137 #ifdef FEAT_JOB_CHANNEL
10138 	    job_unref(isn->isn_arg.job);
10139 #endif
10140 	    break;
10141 
10142 	case ISN_PUSHCHANNEL:
10143 #ifdef FEAT_JOB_CHANNEL
10144 	    channel_unref(isn->isn_arg.channel);
10145 #endif
10146 	    break;
10147 
10148 	case ISN_UCALL:
10149 	    vim_free(isn->isn_arg.ufunc.cuf_name);
10150 	    break;
10151 
10152 	case ISN_FUNCREF:
10153 	    {
10154 		dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data)
10155 					       + isn->isn_arg.funcref.fr_func;
10156 		ufunc_T *ufunc = dfunc->df_ufunc;
10157 
10158 		if (ufunc != NULL && func_name_refcount(ufunc->uf_name))
10159 		    func_ptr_unref(ufunc);
10160 	    }
10161 	    break;
10162 
10163 	case ISN_DCALL:
10164 	    {
10165 		dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data)
10166 					       + isn->isn_arg.dfunc.cdf_idx;
10167 
10168 		if (dfunc->df_ufunc != NULL
10169 			       && func_name_refcount(dfunc->df_ufunc->uf_name))
10170 		    func_ptr_unref(dfunc->df_ufunc);
10171 	    }
10172 	    break;
10173 
10174 	case ISN_NEWFUNC:
10175 	    {
10176 		char_u  *lambda = isn->isn_arg.newfunc.nf_lambda;
10177 		ufunc_T *ufunc = find_func_even_dead(lambda, TRUE, NULL);
10178 
10179 		if (ufunc != NULL)
10180 		{
10181 		    unlink_def_function(ufunc);
10182 		    func_ptr_unref(ufunc);
10183 		}
10184 
10185 		vim_free(lambda);
10186 		vim_free(isn->isn_arg.newfunc.nf_global);
10187 	    }
10188 	    break;
10189 
10190 	case ISN_CHECKTYPE:
10191 	case ISN_SETTYPE:
10192 	    free_type(isn->isn_arg.type.ct_type);
10193 	    break;
10194 
10195 	case ISN_CMDMOD:
10196 	    vim_regfree(isn->isn_arg.cmdmod.cf_cmdmod
10197 					       ->cmod_filter_regmatch.regprog);
10198 	    vim_free(isn->isn_arg.cmdmod.cf_cmdmod);
10199 	    break;
10200 
10201 	case ISN_LOADSCRIPT:
10202 	case ISN_STORESCRIPT:
10203 	    vim_free(isn->isn_arg.script.scriptref);
10204 	    break;
10205 
10206 	case ISN_TRY:
10207 	    vim_free(isn->isn_arg.try.try_ref);
10208 	    break;
10209 
10210 	case ISN_CEXPR_CORE:
10211 	    vim_free(isn->isn_arg.cexpr.cexpr_ref->cer_cmdline);
10212 	    vim_free(isn->isn_arg.cexpr.cexpr_ref);
10213 	    break;
10214 
10215 	case ISN_2BOOL:
10216 	case ISN_2STRING:
10217 	case ISN_2STRING_ANY:
10218 	case ISN_ADDBLOB:
10219 	case ISN_ADDLIST:
10220 	case ISN_ANYINDEX:
10221 	case ISN_ANYSLICE:
10222 	case ISN_BCALL:
10223 	case ISN_BLOBAPPEND:
10224 	case ISN_BLOBINDEX:
10225 	case ISN_BLOBSLICE:
10226 	case ISN_CATCH:
10227 	case ISN_CEXPR_AUCMD:
10228 	case ISN_CHECKLEN:
10229 	case ISN_CHECKNR:
10230 	case ISN_CMDMOD_REV:
10231 	case ISN_COMPAREANY:
10232 	case ISN_COMPAREBLOB:
10233 	case ISN_COMPAREBOOL:
10234 	case ISN_COMPAREDICT:
10235 	case ISN_COMPAREFLOAT:
10236 	case ISN_COMPAREFUNC:
10237 	case ISN_COMPARELIST:
10238 	case ISN_COMPARENR:
10239 	case ISN_COMPARESPECIAL:
10240 	case ISN_COMPARESTRING:
10241 	case ISN_CONCAT:
10242 	case ISN_COND2BOOL:
10243 	case ISN_DEBUG:
10244 	case ISN_DROP:
10245 	case ISN_ECHO:
10246 	case ISN_ECHOERR:
10247 	case ISN_ECHOMSG:
10248 	case ISN_ENDTRY:
10249 	case ISN_EXECCONCAT:
10250 	case ISN_EXECUTE:
10251 	case ISN_FINALLY:
10252 	case ISN_FINISH:
10253 	case ISN_FOR:
10254 	case ISN_GETITEM:
10255 	case ISN_JUMP:
10256 	case ISN_JUMP_IF_ARG_SET:
10257 	case ISN_LISTAPPEND:
10258 	case ISN_LISTINDEX:
10259 	case ISN_LISTSLICE:
10260 	case ISN_LOAD:
10261 	case ISN_LOADBDICT:
10262 	case ISN_LOADGDICT:
10263 	case ISN_LOADOUTER:
10264 	case ISN_LOADREG:
10265 	case ISN_LOADTDICT:
10266 	case ISN_LOADV:
10267 	case ISN_LOADWDICT:
10268 	case ISN_LOCKCONST:
10269 	case ISN_MEMBER:
10270 	case ISN_NEGATENR:
10271 	case ISN_NEWDICT:
10272 	case ISN_NEWLIST:
10273 	case ISN_OPANY:
10274 	case ISN_OPFLOAT:
10275 	case ISN_OPNR:
10276 	case ISN_PCALL:
10277 	case ISN_PCALL_END:
10278 	case ISN_PROF_END:
10279 	case ISN_PROF_START:
10280 	case ISN_PUSHBOOL:
10281 	case ISN_PUSHF:
10282 	case ISN_PUSHNR:
10283 	case ISN_PUSHSPEC:
10284 	case ISN_PUT:
10285 	case ISN_REDIREND:
10286 	case ISN_REDIRSTART:
10287 	case ISN_RETURN:
10288 	case ISN_RETURN_VOID:
10289 	case ISN_SHUFFLE:
10290 	case ISN_SLICE:
10291 	case ISN_STORE:
10292 	case ISN_STOREINDEX:
10293 	case ISN_STORENR:
10294 	case ISN_STOREOUTER:
10295 	case ISN_STORERANGE:
10296 	case ISN_STOREREG:
10297 	case ISN_STOREV:
10298 	case ISN_STRINDEX:
10299 	case ISN_STRSLICE:
10300 	case ISN_THROW:
10301 	case ISN_TRYCONT:
10302 	case ISN_UNLETINDEX:
10303 	case ISN_UNLETRANGE:
10304 	case ISN_UNPACK:
10305 	    // nothing allocated
10306 	    break;
10307     }
10308 }
10309 
10310 /*
10311  * Free all instructions for "dfunc" except df_name.
10312  */
10313     static void
10314 delete_def_function_contents(dfunc_T *dfunc, int mark_deleted)
10315 {
10316     int idx;
10317 
10318     ga_clear(&dfunc->df_def_args_isn);
10319     ga_clear_strings(&dfunc->df_var_names);
10320 
10321     if (dfunc->df_instr != NULL)
10322     {
10323 	for (idx = 0; idx < dfunc->df_instr_count; ++idx)
10324 	    delete_instr(dfunc->df_instr + idx);
10325 	VIM_CLEAR(dfunc->df_instr);
10326 	dfunc->df_instr = NULL;
10327     }
10328     if (dfunc->df_instr_debug != NULL)
10329     {
10330 	for (idx = 0; idx < dfunc->df_instr_debug_count; ++idx)
10331 	    delete_instr(dfunc->df_instr_debug + idx);
10332 	VIM_CLEAR(dfunc->df_instr_debug);
10333 	dfunc->df_instr_debug = NULL;
10334     }
10335 #ifdef FEAT_PROFILE
10336     if (dfunc->df_instr_prof != NULL)
10337     {
10338 	for (idx = 0; idx < dfunc->df_instr_prof_count; ++idx)
10339 	    delete_instr(dfunc->df_instr_prof + idx);
10340 	VIM_CLEAR(dfunc->df_instr_prof);
10341 	dfunc->df_instr_prof = NULL;
10342     }
10343 #endif
10344 
10345     if (mark_deleted)
10346 	dfunc->df_deleted = TRUE;
10347     if (dfunc->df_ufunc != NULL)
10348 	dfunc->df_ufunc->uf_def_status = UF_NOT_COMPILED;
10349 }
10350 
10351 /*
10352  * When a user function is deleted, clear the contents of any associated def
10353  * function, unless another user function still uses it.
10354  * The position in def_functions can be re-used.
10355  */
10356     void
10357 unlink_def_function(ufunc_T *ufunc)
10358 {
10359     if (ufunc->uf_dfunc_idx > 0)
10360     {
10361 	dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data)
10362 							 + ufunc->uf_dfunc_idx;
10363 
10364 	if (--dfunc->df_refcount <= 0)
10365 	    delete_def_function_contents(dfunc, TRUE);
10366 	ufunc->uf_def_status = UF_NOT_COMPILED;
10367 	ufunc->uf_dfunc_idx = 0;
10368 	if (dfunc->df_ufunc == ufunc)
10369 	    dfunc->df_ufunc = NULL;
10370     }
10371 }
10372 
10373 /*
10374  * Used when a user function refers to an existing dfunc.
10375  */
10376     void
10377 link_def_function(ufunc_T *ufunc)
10378 {
10379     if (ufunc->uf_dfunc_idx > 0)
10380     {
10381 	dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data)
10382 							 + ufunc->uf_dfunc_idx;
10383 
10384 	++dfunc->df_refcount;
10385     }
10386 }
10387 
10388 #if defined(EXITFREE) || defined(PROTO)
10389 /*
10390  * Free all functions defined with ":def".
10391  */
10392     void
10393 free_def_functions(void)
10394 {
10395     int idx;
10396 
10397     for (idx = 0; idx < def_functions.ga_len; ++idx)
10398     {
10399 	dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data) + idx;
10400 
10401 	delete_def_function_contents(dfunc, TRUE);
10402 	vim_free(dfunc->df_name);
10403     }
10404 
10405     ga_clear(&def_functions);
10406 }
10407 #endif
10408 
10409 
10410 #endif // FEAT_EVAL
10411