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