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, isntype_T isntype, char_u *line) 2266 { 2267 isn_T *isn; 2268 2269 RETURN_OK_IF_SKIP(cctx); 2270 if ((isn = generate_instr(cctx, isntype)) == 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 garray_T *stack = &cctx->ctx_type_stack; 4216 type_T *type; 4217 4218 type = ((type_T **)stack->ga_data)[stack->ga_len - 1]; 4219 if (need_type(type, &t_number, -1, 0, cctx, FALSE, FALSE) == FAIL) 4220 return FAIL; 4221 4222 while (p > start && (p[-1] == '-' || p[-1] == '+')) 4223 { 4224 --p; 4225 if (*p == '-') 4226 negate = !negate; 4227 } 4228 // only '-' has an effect, for '+' we only check the type 4229 if (negate) 4230 { 4231 isn = generate_instr(cctx, ISN_NEGATENR); 4232 if (isn == NULL) 4233 return FAIL; 4234 } 4235 } 4236 else if (numeric_only) 4237 { 4238 ++p; 4239 break; 4240 } 4241 else 4242 { 4243 int invert = *p == '!'; 4244 4245 while (p > start && (p[-1] == '!' || VIM_ISWHITE(p[-1]))) 4246 { 4247 if (p[-1] == '!') 4248 invert = !invert; 4249 --p; 4250 } 4251 if (generate_2BOOL(cctx, invert, -1) == FAIL) 4252 return FAIL; 4253 } 4254 } 4255 *end = p; 4256 return OK; 4257 } 4258 4259 /* 4260 * Compile "(expression)": recursive! 4261 * Return FAIL/OK. 4262 */ 4263 static int 4264 compile_parenthesis(char_u **arg, cctx_T *cctx, ppconst_T *ppconst) 4265 { 4266 int ret; 4267 char_u *p = *arg + 1; 4268 4269 if (may_get_next_line_error(p, arg, cctx) == FAIL) 4270 return FAIL; 4271 if (ppconst->pp_used <= PPSIZE - 10) 4272 { 4273 ret = compile_expr1(arg, cctx, ppconst); 4274 } 4275 else 4276 { 4277 // Not enough space in ppconst, flush constants. 4278 if (generate_ppconst(cctx, ppconst) == FAIL) 4279 return FAIL; 4280 ret = compile_expr0(arg, cctx); 4281 } 4282 if (may_get_next_line_error(*arg, arg, cctx) == FAIL) 4283 return FAIL; 4284 if (**arg == ')') 4285 ++*arg; 4286 else if (ret == OK) 4287 { 4288 emsg(_(e_missing_close)); 4289 ret = FAIL; 4290 } 4291 return ret; 4292 } 4293 4294 /* 4295 * Compile whatever comes after "name" or "name()". 4296 * Advances "*arg" only when something was recognized. 4297 */ 4298 static int 4299 compile_subscript( 4300 char_u **arg, 4301 cctx_T *cctx, 4302 char_u *start_leader, 4303 char_u **end_leader, 4304 ppconst_T *ppconst) 4305 { 4306 char_u *name_start = *end_leader; 4307 4308 for (;;) 4309 { 4310 char_u *p = skipwhite(*arg); 4311 4312 if (*p == NUL || (VIM_ISWHITE(**arg) && vim9_comment_start(p))) 4313 { 4314 char_u *next = peek_next_line_from_context(cctx); 4315 4316 // If a following line starts with "->{" or "->X" advance to that 4317 // line, so that a line break before "->" is allowed. 4318 // Also if a following line starts with ".x". 4319 if (next != NULL && 4320 ((next[0] == '-' && next[1] == '>' 4321 && (next[2] == '{' 4322 || ASCII_ISALPHA(*skipwhite(next + 2)))) 4323 || (next[0] == '.' && eval_isdictc(next[1])))) 4324 { 4325 next = next_line_from_context(cctx, TRUE); 4326 if (next == NULL) 4327 return FAIL; 4328 *arg = next; 4329 p = skipwhite(*arg); 4330 } 4331 } 4332 4333 // Do not skip over white space to find the "(", "execute 'x' (expr)" 4334 // is not a function call. 4335 if (**arg == '(') 4336 { 4337 garray_T *stack = &cctx->ctx_type_stack; 4338 type_T *type; 4339 int argcount = 0; 4340 4341 if (generate_ppconst(cctx, ppconst) == FAIL) 4342 return FAIL; 4343 ppconst->pp_is_const = FALSE; 4344 4345 // funcref(arg) 4346 type = ((type_T **)stack->ga_data)[stack->ga_len - 1]; 4347 4348 *arg = skipwhite(p + 1); 4349 if (compile_arguments(arg, cctx, &argcount, FALSE) == FAIL) 4350 return FAIL; 4351 if (generate_PCALL(cctx, argcount, name_start, type, TRUE) == FAIL) 4352 return FAIL; 4353 } 4354 else if (*p == '-' && p[1] == '>') 4355 { 4356 char_u *pstart = p; 4357 4358 if (generate_ppconst(cctx, ppconst) == FAIL) 4359 return FAIL; 4360 ppconst->pp_is_const = FALSE; 4361 4362 // something->method() 4363 // Apply the '!', '-' and '+' first: 4364 // -1.0->func() works like (-1.0)->func() 4365 if (compile_leader(cctx, TRUE, start_leader, end_leader) == FAIL) 4366 return FAIL; 4367 4368 p += 2; 4369 *arg = skipwhite(p); 4370 // No line break supported right after "->". 4371 if (**arg == '(') 4372 { 4373 int argcount = 1; 4374 garray_T *stack = &cctx->ctx_type_stack; 4375 int type_idx_start = stack->ga_len; 4376 type_T *type; 4377 int expr_isn_start = cctx->ctx_instr.ga_len; 4378 int expr_isn_end; 4379 int arg_isn_count; 4380 4381 // Funcref call: list->(Refs[2])(arg) 4382 // or lambda: list->((arg) => expr)(arg) 4383 // 4384 // Fist compile the function expression. 4385 if (compile_parenthesis(arg, cctx, ppconst) == FAIL) 4386 return FAIL; 4387 4388 // Remember the next instruction index, where the instructions 4389 // for arguments are being written. 4390 expr_isn_end = cctx->ctx_instr.ga_len; 4391 4392 // Compile the arguments. 4393 if (**arg != '(') 4394 { 4395 if (*skipwhite(*arg) == '(') 4396 emsg(_(e_nowhitespace)); 4397 else 4398 semsg(_(e_missing_paren), *arg); 4399 return FAIL; 4400 } 4401 *arg = skipwhite(*arg + 1); 4402 if (compile_arguments(arg, cctx, &argcount, FALSE) == FAIL) 4403 return FAIL; 4404 4405 // Move the instructions for the arguments to before the 4406 // instructions of the expression and move the type of the 4407 // expression after the argument types. This is what ISN_PCALL 4408 // expects. 4409 stack = &cctx->ctx_type_stack; 4410 arg_isn_count = cctx->ctx_instr.ga_len - expr_isn_end; 4411 if (arg_isn_count > 0) 4412 { 4413 int expr_isn_count = expr_isn_end - expr_isn_start; 4414 isn_T *isn = ALLOC_MULT(isn_T, expr_isn_count); 4415 4416 if (isn == NULL) 4417 return FAIL; 4418 mch_memmove(isn, ((isn_T *)cctx->ctx_instr.ga_data) 4419 + expr_isn_start, 4420 sizeof(isn_T) * expr_isn_count); 4421 mch_memmove(((isn_T *)cctx->ctx_instr.ga_data) 4422 + expr_isn_start, 4423 ((isn_T *)cctx->ctx_instr.ga_data) + expr_isn_end, 4424 sizeof(isn_T) * arg_isn_count); 4425 mch_memmove(((isn_T *)cctx->ctx_instr.ga_data) 4426 + expr_isn_start + arg_isn_count, 4427 isn, sizeof(isn_T) * expr_isn_count); 4428 vim_free(isn); 4429 4430 type = ((type_T **)stack->ga_data)[type_idx_start]; 4431 mch_memmove(((type_T **)stack->ga_data) + type_idx_start, 4432 ((type_T **)stack->ga_data) + type_idx_start + 1, 4433 sizeof(type_T *) 4434 * (stack->ga_len - type_idx_start - 1)); 4435 ((type_T **)stack->ga_data)[stack->ga_len - 1] = type; 4436 } 4437 4438 type = ((type_T **)stack->ga_data)[stack->ga_len - 1]; 4439 if (generate_PCALL(cctx, argcount, p - 2, type, FALSE) == FAIL) 4440 return FAIL; 4441 } 4442 else 4443 { 4444 // method call: list->method() 4445 p = *arg; 4446 if (!eval_isnamec1(*p)) 4447 { 4448 semsg(_(e_trailing_arg), pstart); 4449 return FAIL; 4450 } 4451 if (ASCII_ISALPHA(*p) && p[1] == ':') 4452 p += 2; 4453 for ( ; eval_isnamec(*p); ++p) 4454 ; 4455 if (*p != '(') 4456 { 4457 semsg(_(e_missing_paren), *arg); 4458 return FAIL; 4459 } 4460 if (compile_call(arg, p - *arg, cctx, ppconst, 1) == FAIL) 4461 return FAIL; 4462 } 4463 } 4464 else if (**arg == '[') 4465 { 4466 int is_slice = FALSE; 4467 4468 // list index: list[123] 4469 // dict member: dict[key] 4470 // string index: text[123] 4471 // blob index: blob[123] 4472 // TODO: more arguments 4473 // TODO: recognize list or dict at runtime 4474 if (generate_ppconst(cctx, ppconst) == FAIL) 4475 return FAIL; 4476 ppconst->pp_is_const = FALSE; 4477 4478 ++p; 4479 if (may_get_next_line_error(p, arg, cctx) == FAIL) 4480 return FAIL; 4481 if (**arg == ':') 4482 { 4483 // missing first index is equal to zero 4484 generate_PUSHNR(cctx, 0); 4485 } 4486 else 4487 { 4488 if (compile_expr0(arg, cctx) == FAIL) 4489 return FAIL; 4490 if (**arg == ':') 4491 { 4492 semsg(_(e_white_space_required_before_and_after_str_at_str), 4493 ":", *arg); 4494 return FAIL; 4495 } 4496 if (may_get_next_line_error(*arg, arg, cctx) == FAIL) 4497 return FAIL; 4498 *arg = skipwhite(*arg); 4499 } 4500 if (**arg == ':') 4501 { 4502 is_slice = TRUE; 4503 ++*arg; 4504 if (!IS_WHITE_OR_NUL(**arg) && **arg != ']') 4505 { 4506 semsg(_(e_white_space_required_before_and_after_str_at_str), 4507 ":", *arg); 4508 return FAIL; 4509 } 4510 if (may_get_next_line_error(*arg, arg, cctx) == FAIL) 4511 return FAIL; 4512 if (**arg == ']') 4513 // missing second index is equal to end of string 4514 generate_PUSHNR(cctx, -1); 4515 else 4516 { 4517 if (compile_expr0(arg, cctx) == FAIL) 4518 return FAIL; 4519 if (may_get_next_line_error(*arg, arg, cctx) == FAIL) 4520 return FAIL; 4521 *arg = skipwhite(*arg); 4522 } 4523 } 4524 4525 if (**arg != ']') 4526 { 4527 emsg(_(e_missbrac)); 4528 return FAIL; 4529 } 4530 *arg = *arg + 1; 4531 4532 if (compile_member(is_slice, cctx) == FAIL) 4533 return FAIL; 4534 } 4535 else if (*p == '.' && p[1] != '.') 4536 { 4537 // dictionary member: dict.name 4538 if (generate_ppconst(cctx, ppconst) == FAIL) 4539 return FAIL; 4540 ppconst->pp_is_const = FALSE; 4541 4542 *arg = p + 1; 4543 if (IS_WHITE_OR_NUL(**arg)) 4544 { 4545 emsg(_(e_missing_name_after_dot)); 4546 return FAIL; 4547 } 4548 p = *arg; 4549 if (eval_isdictc(*p)) 4550 while (eval_isnamec(*p)) 4551 MB_PTR_ADV(p); 4552 if (p == *arg) 4553 { 4554 semsg(_(e_syntax_error_at_str), *arg); 4555 return FAIL; 4556 } 4557 if (generate_STRINGMEMBER(cctx, *arg, p - *arg) == FAIL) 4558 return FAIL; 4559 *arg = p; 4560 } 4561 else 4562 break; 4563 } 4564 4565 // TODO - see handle_subscript(): 4566 // Turn "dict.Func" into a partial for "Func" bound to "dict". 4567 // Don't do this when "Func" is already a partial that was bound 4568 // explicitly (pt_auto is FALSE). 4569 4570 return OK; 4571 } 4572 4573 /* 4574 * Compile an expression at "*arg" and add instructions to "cctx->ctx_instr". 4575 * "arg" is advanced until after the expression, skipping white space. 4576 * 4577 * If the value is a constant "ppconst->pp_used" will be non-zero. 4578 * Before instructions are generated, any values in "ppconst" will generated. 4579 * 4580 * This is the compiling equivalent of eval1(), eval2(), etc. 4581 */ 4582 4583 /* 4584 * number number constant 4585 * 0zFFFFFFFF Blob constant 4586 * "string" string constant 4587 * 'string' literal string constant 4588 * &option-name option value 4589 * @r register contents 4590 * identifier variable value 4591 * function() function call 4592 * $VAR environment variable 4593 * (expression) nested expression 4594 * [expr, expr] List 4595 * {key: val, [key]: val} Dictionary 4596 * 4597 * Also handle: 4598 * ! in front logical NOT 4599 * - in front unary minus 4600 * + in front unary plus (ignored) 4601 * trailing (arg) funcref/partial call 4602 * trailing [] subscript in String or List 4603 * trailing .name entry in Dictionary 4604 * trailing ->name() method call 4605 */ 4606 static int 4607 compile_expr7( 4608 char_u **arg, 4609 cctx_T *cctx, 4610 ppconst_T *ppconst) 4611 { 4612 char_u *start_leader, *end_leader; 4613 int ret = OK; 4614 typval_T *rettv = &ppconst->pp_tv[ppconst->pp_used]; 4615 int used_before = ppconst->pp_used; 4616 4617 ppconst->pp_is_const = FALSE; 4618 4619 /* 4620 * Skip '!', '-' and '+' characters. They are handled later. 4621 */ 4622 start_leader = *arg; 4623 if (eval_leader(arg, TRUE) == FAIL) 4624 return FAIL; 4625 end_leader = *arg; 4626 4627 rettv->v_type = VAR_UNKNOWN; 4628 switch (**arg) 4629 { 4630 /* 4631 * Number constant. 4632 */ 4633 case '0': // also for blob starting with 0z 4634 case '1': 4635 case '2': 4636 case '3': 4637 case '4': 4638 case '5': 4639 case '6': 4640 case '7': 4641 case '8': 4642 case '9': 4643 case '.': if (eval_number(arg, rettv, TRUE, FALSE) == FAIL) 4644 return FAIL; 4645 // Apply "-" and "+" just before the number now, right to 4646 // left. Matters especially when "->" follows. Stops at 4647 // '!'. 4648 if (apply_leader(rettv, TRUE, 4649 start_leader, &end_leader) == FAIL) 4650 { 4651 clear_tv(rettv); 4652 return FAIL; 4653 } 4654 break; 4655 4656 /* 4657 * String constant: "string". 4658 */ 4659 case '"': if (eval_string(arg, rettv, TRUE) == FAIL) 4660 return FAIL; 4661 break; 4662 4663 /* 4664 * Literal string constant: 'str''ing'. 4665 */ 4666 case '\'': if (eval_lit_string(arg, rettv, TRUE) == FAIL) 4667 return FAIL; 4668 break; 4669 4670 /* 4671 * Constant Vim variable. 4672 */ 4673 case 'v': get_vim_constant(arg, rettv); 4674 ret = NOTDONE; 4675 break; 4676 4677 /* 4678 * "true" constant 4679 */ 4680 case 't': if (STRNCMP(*arg, "true", 4) == 0 4681 && !eval_isnamec((*arg)[4])) 4682 { 4683 *arg += 4; 4684 rettv->v_type = VAR_BOOL; 4685 rettv->vval.v_number = VVAL_TRUE; 4686 } 4687 else 4688 ret = NOTDONE; 4689 break; 4690 4691 /* 4692 * "false" constant 4693 */ 4694 case 'f': if (STRNCMP(*arg, "false", 5) == 0 4695 && !eval_isnamec((*arg)[5])) 4696 { 4697 *arg += 5; 4698 rettv->v_type = VAR_BOOL; 4699 rettv->vval.v_number = VVAL_FALSE; 4700 } 4701 else 4702 ret = NOTDONE; 4703 break; 4704 4705 /* 4706 * "null" constant 4707 */ 4708 case 'n': if (STRNCMP(*arg, "null", 4) == 0 4709 && !eval_isnamec((*arg)[4])) 4710 { 4711 *arg += 4; 4712 rettv->v_type = VAR_SPECIAL; 4713 rettv->vval.v_number = VVAL_NULL; 4714 } 4715 else 4716 ret = NOTDONE; 4717 break; 4718 4719 /* 4720 * List: [expr, expr] 4721 */ 4722 case '[': if (generate_ppconst(cctx, ppconst) == FAIL) 4723 return FAIL; 4724 ret = compile_list(arg, cctx, ppconst); 4725 break; 4726 4727 /* 4728 * Dictionary: {'key': val, 'key': val} 4729 */ 4730 case '{': if (generate_ppconst(cctx, ppconst) == FAIL) 4731 return FAIL; 4732 ret = compile_dict(arg, cctx, ppconst); 4733 break; 4734 4735 /* 4736 * Option value: &name 4737 */ 4738 case '&': if (generate_ppconst(cctx, ppconst) == FAIL) 4739 return FAIL; 4740 ret = compile_get_option(arg, cctx); 4741 break; 4742 4743 /* 4744 * Environment variable: $VAR. 4745 */ 4746 case '$': if (generate_ppconst(cctx, ppconst) == FAIL) 4747 return FAIL; 4748 ret = compile_get_env(arg, cctx); 4749 break; 4750 4751 /* 4752 * Register contents: @r. 4753 */ 4754 case '@': if (generate_ppconst(cctx, ppconst) == FAIL) 4755 return FAIL; 4756 ret = compile_get_register(arg, cctx); 4757 break; 4758 /* 4759 * nested expression: (expression). 4760 * lambda: (arg, arg) => expr 4761 * funcref: (arg, arg) => { statement } 4762 */ 4763 case '(': // if compile_lambda returns NOTDONE then it must be (expr) 4764 ret = compile_lambda(arg, cctx); 4765 if (ret == NOTDONE) 4766 ret = compile_parenthesis(arg, cctx, ppconst); 4767 break; 4768 4769 default: ret = NOTDONE; 4770 break; 4771 } 4772 if (ret == FAIL) 4773 return FAIL; 4774 4775 if (rettv->v_type != VAR_UNKNOWN && used_before == ppconst->pp_used) 4776 { 4777 if (cctx->ctx_skip == SKIP_YES) 4778 clear_tv(rettv); 4779 else 4780 // A constant expression can possibly be handled compile time, 4781 // return the value instead of generating code. 4782 ++ppconst->pp_used; 4783 } 4784 else if (ret == NOTDONE) 4785 { 4786 char_u *p; 4787 int r; 4788 4789 if (!eval_isnamec1(**arg)) 4790 { 4791 if (!vim9_bad_comment(*arg)) 4792 { 4793 if (ends_excmd(*skipwhite(*arg))) 4794 semsg(_(e_empty_expression_str), *arg); 4795 else 4796 semsg(_(e_name_expected_str), *arg); 4797 } 4798 return FAIL; 4799 } 4800 4801 // "name" or "name()" 4802 p = to_name_end(*arg, TRUE); 4803 if (p - *arg == (size_t)1 && **arg == '_') 4804 { 4805 emsg(_(e_cannot_use_underscore_here)); 4806 return FAIL; 4807 } 4808 4809 if (*p == '(') 4810 { 4811 r = compile_call(arg, p - *arg, cctx, ppconst, 0); 4812 } 4813 else 4814 { 4815 if (generate_ppconst(cctx, ppconst) == FAIL) 4816 return FAIL; 4817 r = compile_load(arg, p, cctx, TRUE, TRUE); 4818 } 4819 if (r == FAIL) 4820 return FAIL; 4821 } 4822 4823 // Handle following "[]", ".member", etc. 4824 // Then deal with prefixed '-', '+' and '!', if not done already. 4825 if (compile_subscript(arg, cctx, start_leader, &end_leader, 4826 ppconst) == FAIL) 4827 return FAIL; 4828 if (ppconst->pp_used > 0) 4829 { 4830 // apply the '!', '-' and '+' before the constant 4831 rettv = &ppconst->pp_tv[ppconst->pp_used - 1]; 4832 if (apply_leader(rettv, FALSE, start_leader, &end_leader) == FAIL) 4833 return FAIL; 4834 return OK; 4835 } 4836 if (compile_leader(cctx, FALSE, start_leader, &end_leader) == FAIL) 4837 return FAIL; 4838 return OK; 4839 } 4840 4841 /* 4842 * Give the "white on both sides" error, taking the operator from "p[len]". 4843 */ 4844 void 4845 error_white_both(char_u *op, int len) 4846 { 4847 char_u buf[10]; 4848 4849 vim_strncpy(buf, op, len); 4850 semsg(_(e_white_space_required_before_and_after_str_at_str), buf, op); 4851 } 4852 4853 /* 4854 * <type>expr7: runtime type check / conversion 4855 */ 4856 static int 4857 compile_expr7t(char_u **arg, cctx_T *cctx, ppconst_T *ppconst) 4858 { 4859 type_T *want_type = NULL; 4860 4861 // Recognize <type> 4862 if (**arg == '<' && eval_isnamec1((*arg)[1])) 4863 { 4864 ++*arg; 4865 want_type = parse_type(arg, cctx->ctx_type_list, TRUE); 4866 if (want_type == NULL) 4867 return FAIL; 4868 4869 if (**arg != '>') 4870 { 4871 if (*skipwhite(*arg) == '>') 4872 semsg(_(e_no_white_space_allowed_before_str_str), ">", *arg); 4873 else 4874 emsg(_(e_missing_gt)); 4875 return FAIL; 4876 } 4877 ++*arg; 4878 if (may_get_next_line_error(*arg, arg, cctx) == FAIL) 4879 return FAIL; 4880 } 4881 4882 if (compile_expr7(arg, cctx, ppconst) == FAIL) 4883 return FAIL; 4884 4885 if (want_type != NULL) 4886 { 4887 garray_T *stack = &cctx->ctx_type_stack; 4888 type_T *actual; 4889 where_T where = WHERE_INIT; 4890 4891 generate_ppconst(cctx, ppconst); 4892 actual = ((type_T **)stack->ga_data)[stack->ga_len - 1]; 4893 if (check_type(want_type, actual, FALSE, where) == FAIL) 4894 { 4895 if (need_type(actual, want_type, -1, 0, cctx, FALSE, FALSE) == FAIL) 4896 return FAIL; 4897 } 4898 } 4899 4900 return OK; 4901 } 4902 4903 /* 4904 * * number multiplication 4905 * / number division 4906 * % number modulo 4907 */ 4908 static int 4909 compile_expr6(char_u **arg, cctx_T *cctx, ppconst_T *ppconst) 4910 { 4911 char_u *op; 4912 char_u *next; 4913 int ppconst_used = ppconst->pp_used; 4914 4915 // get the first expression 4916 if (compile_expr7t(arg, cctx, ppconst) == FAIL) 4917 return FAIL; 4918 4919 /* 4920 * Repeat computing, until no "*", "/" or "%" is following. 4921 */ 4922 for (;;) 4923 { 4924 op = may_peek_next_line(cctx, *arg, &next); 4925 if (*op != '*' && *op != '/' && *op != '%') 4926 break; 4927 if (next != NULL) 4928 { 4929 *arg = next_line_from_context(cctx, TRUE); 4930 op = skipwhite(*arg); 4931 } 4932 4933 if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(op[1])) 4934 { 4935 error_white_both(op, 1); 4936 return FAIL; 4937 } 4938 if (may_get_next_line_error(op + 1, arg, cctx) == FAIL) 4939 return FAIL; 4940 4941 // get the second expression 4942 if (compile_expr7t(arg, cctx, ppconst) == FAIL) 4943 return FAIL; 4944 4945 if (ppconst->pp_used == ppconst_used + 2 4946 && ppconst->pp_tv[ppconst_used].v_type == VAR_NUMBER 4947 && ppconst->pp_tv[ppconst_used + 1].v_type == VAR_NUMBER) 4948 { 4949 typval_T *tv1 = &ppconst->pp_tv[ppconst_used]; 4950 typval_T *tv2 = &ppconst->pp_tv[ppconst_used + 1]; 4951 varnumber_T res = 0; 4952 int failed = FALSE; 4953 4954 // both are numbers: compute the result 4955 switch (*op) 4956 { 4957 case '*': res = tv1->vval.v_number * tv2->vval.v_number; 4958 break; 4959 case '/': res = num_divide(tv1->vval.v_number, 4960 tv2->vval.v_number, &failed); 4961 break; 4962 case '%': res = num_modulus(tv1->vval.v_number, 4963 tv2->vval.v_number, &failed); 4964 break; 4965 } 4966 if (failed) 4967 return FAIL; 4968 tv1->vval.v_number = res; 4969 --ppconst->pp_used; 4970 } 4971 else 4972 { 4973 generate_ppconst(cctx, ppconst); 4974 generate_two_op(cctx, op); 4975 } 4976 } 4977 4978 return OK; 4979 } 4980 4981 /* 4982 * + number addition or list/blobl concatenation 4983 * - number subtraction 4984 * .. string concatenation 4985 */ 4986 static int 4987 compile_expr5(char_u **arg, cctx_T *cctx, ppconst_T *ppconst) 4988 { 4989 char_u *op; 4990 char_u *next; 4991 int oplen; 4992 int ppconst_used = ppconst->pp_used; 4993 4994 // get the first variable 4995 if (compile_expr6(arg, cctx, ppconst) == FAIL) 4996 return FAIL; 4997 4998 /* 4999 * Repeat computing, until no "+", "-" or ".." is following. 5000 */ 5001 for (;;) 5002 { 5003 op = may_peek_next_line(cctx, *arg, &next); 5004 if (*op != '+' && *op != '-' && !(*op == '.' && *(op + 1) == '.')) 5005 break; 5006 if (op[0] == op[1] && *op != '.' && next) 5007 // Finding "++" or "--" on the next line is a separate command. 5008 // But ".." is concatenation. 5009 break; 5010 oplen = (*op == '.' ? 2 : 1); 5011 if (next != NULL) 5012 { 5013 *arg = next_line_from_context(cctx, TRUE); 5014 op = skipwhite(*arg); 5015 } 5016 5017 if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(op[oplen])) 5018 { 5019 error_white_both(op, oplen); 5020 return FAIL; 5021 } 5022 5023 if (may_get_next_line_error(op + oplen, arg, cctx) == FAIL) 5024 return FAIL; 5025 5026 // get the second expression 5027 if (compile_expr6(arg, cctx, ppconst) == FAIL) 5028 return FAIL; 5029 5030 if (ppconst->pp_used == ppconst_used + 2 5031 && (*op == '.' 5032 ? (ppconst->pp_tv[ppconst_used].v_type == VAR_STRING 5033 && ppconst->pp_tv[ppconst_used + 1].v_type == VAR_STRING) 5034 : (ppconst->pp_tv[ppconst_used].v_type == VAR_NUMBER 5035 && ppconst->pp_tv[ppconst_used + 1].v_type == VAR_NUMBER))) 5036 { 5037 typval_T *tv1 = &ppconst->pp_tv[ppconst_used]; 5038 typval_T *tv2 = &ppconst->pp_tv[ppconst_used + 1]; 5039 5040 // concat/subtract/add constant numbers 5041 if (*op == '+') 5042 tv1->vval.v_number = tv1->vval.v_number + tv2->vval.v_number; 5043 else if (*op == '-') 5044 tv1->vval.v_number = tv1->vval.v_number - tv2->vval.v_number; 5045 else 5046 { 5047 // concatenate constant strings 5048 char_u *s1 = tv1->vval.v_string; 5049 char_u *s2 = tv2->vval.v_string; 5050 size_t len1 = STRLEN(s1); 5051 5052 tv1->vval.v_string = alloc((int)(len1 + STRLEN(s2) + 1)); 5053 if (tv1->vval.v_string == NULL) 5054 { 5055 clear_ppconst(ppconst); 5056 return FAIL; 5057 } 5058 mch_memmove(tv1->vval.v_string, s1, len1); 5059 STRCPY(tv1->vval.v_string + len1, s2); 5060 vim_free(s1); 5061 vim_free(s2); 5062 } 5063 --ppconst->pp_used; 5064 } 5065 else 5066 { 5067 generate_ppconst(cctx, ppconst); 5068 ppconst->pp_is_const = FALSE; 5069 if (*op == '.') 5070 { 5071 if (may_generate_2STRING(-2, FALSE, cctx) == FAIL 5072 || may_generate_2STRING(-1, FALSE, cctx) == FAIL) 5073 return FAIL; 5074 generate_instr_drop(cctx, ISN_CONCAT, 1); 5075 } 5076 else 5077 generate_two_op(cctx, op); 5078 } 5079 } 5080 5081 return OK; 5082 } 5083 5084 /* 5085 * expr5a == expr5b 5086 * expr5a =~ expr5b 5087 * expr5a != expr5b 5088 * expr5a !~ expr5b 5089 * expr5a > expr5b 5090 * expr5a >= expr5b 5091 * expr5a < expr5b 5092 * expr5a <= expr5b 5093 * expr5a is expr5b 5094 * expr5a isnot expr5b 5095 * 5096 * Produces instructions: 5097 * EVAL expr5a Push result of "expr5a" 5098 * EVAL expr5b Push result of "expr5b" 5099 * COMPARE one of the compare instructions 5100 */ 5101 static int 5102 compile_expr4(char_u **arg, cctx_T *cctx, ppconst_T *ppconst) 5103 { 5104 exprtype_T type = EXPR_UNKNOWN; 5105 char_u *p; 5106 char_u *next; 5107 int len = 2; 5108 int type_is = FALSE; 5109 int ppconst_used = ppconst->pp_used; 5110 5111 // get the first variable 5112 if (compile_expr5(arg, cctx, ppconst) == FAIL) 5113 return FAIL; 5114 5115 p = may_peek_next_line(cctx, *arg, &next); 5116 type = get_compare_type(p, &len, &type_is); 5117 5118 /* 5119 * If there is a comparative operator, use it. 5120 */ 5121 if (type != EXPR_UNKNOWN) 5122 { 5123 int ic = FALSE; // Default: do not ignore case 5124 5125 if (next != NULL) 5126 { 5127 *arg = next_line_from_context(cctx, TRUE); 5128 p = skipwhite(*arg); 5129 } 5130 if (type_is && (p[len] == '?' || p[len] == '#')) 5131 { 5132 semsg(_(e_invalid_expression_str), *arg); 5133 return FAIL; 5134 } 5135 // extra question mark appended: ignore case 5136 if (p[len] == '?') 5137 { 5138 ic = TRUE; 5139 ++len; 5140 } 5141 // extra '#' appended: match case (ignored) 5142 else if (p[len] == '#') 5143 ++len; 5144 // nothing appended: match case 5145 5146 if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[len])) 5147 { 5148 error_white_both(p, len); 5149 return FAIL; 5150 } 5151 5152 // get the second variable 5153 if (may_get_next_line_error(p + len, arg, cctx) == FAIL) 5154 return FAIL; 5155 5156 if (compile_expr5(arg, cctx, ppconst) == FAIL) 5157 return FAIL; 5158 5159 if (ppconst->pp_used == ppconst_used + 2) 5160 { 5161 typval_T * tv1 = &ppconst->pp_tv[ppconst->pp_used - 2]; 5162 typval_T *tv2 = &ppconst->pp_tv[ppconst->pp_used - 1]; 5163 int ret; 5164 5165 // Both sides are a constant, compute the result now. 5166 // First check for a valid combination of types, this is more 5167 // strict than typval_compare(). 5168 if (check_compare_types(type, tv1, tv2) == FAIL) 5169 ret = FAIL; 5170 else 5171 { 5172 ret = typval_compare(tv1, tv2, type, ic); 5173 tv1->v_type = VAR_BOOL; 5174 tv1->vval.v_number = tv1->vval.v_number 5175 ? VVAL_TRUE : VVAL_FALSE; 5176 clear_tv(tv2); 5177 --ppconst->pp_used; 5178 } 5179 return ret; 5180 } 5181 5182 generate_ppconst(cctx, ppconst); 5183 return generate_COMPARE(cctx, type, ic); 5184 } 5185 5186 return OK; 5187 } 5188 5189 static int compile_expr3(char_u **arg, cctx_T *cctx, ppconst_T *ppconst); 5190 5191 /* 5192 * Compile || or &&. 5193 */ 5194 static int 5195 compile_and_or( 5196 char_u **arg, 5197 cctx_T *cctx, 5198 char *op, 5199 ppconst_T *ppconst, 5200 int ppconst_used UNUSED) 5201 { 5202 char_u *next; 5203 char_u *p = may_peek_next_line(cctx, *arg, &next); 5204 int opchar = *op; 5205 5206 if (p[0] == opchar && p[1] == opchar) 5207 { 5208 garray_T *instr = &cctx->ctx_instr; 5209 garray_T end_ga; 5210 5211 /* 5212 * Repeat until there is no following "||" or "&&" 5213 */ 5214 ga_init2(&end_ga, sizeof(int), 10); 5215 while (p[0] == opchar && p[1] == opchar) 5216 { 5217 long start_lnum = SOURCING_LNUM; 5218 long save_sourcing_lnum; 5219 int start_ctx_lnum = cctx->ctx_lnum; 5220 int save_lnum; 5221 int status; 5222 5223 if (next != NULL) 5224 { 5225 *arg = next_line_from_context(cctx, TRUE); 5226 p = skipwhite(*arg); 5227 } 5228 5229 if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[2])) 5230 { 5231 semsg(_(e_white_space_required_before_and_after_str_at_str), 5232 op, p); 5233 return FAIL; 5234 } 5235 5236 save_sourcing_lnum = SOURCING_LNUM; 5237 SOURCING_LNUM = start_lnum; 5238 save_lnum = cctx->ctx_lnum; 5239 cctx->ctx_lnum = start_ctx_lnum; 5240 5241 status = check_ppconst_bool(ppconst); 5242 if (status != FAIL) 5243 { 5244 // TODO: use ppconst if the value is a constant 5245 generate_ppconst(cctx, ppconst); 5246 5247 // Every part must evaluate to a bool. 5248 status = bool_on_stack(cctx); 5249 if (status != FAIL) 5250 status = ga_grow(&end_ga, 1); 5251 } 5252 cctx->ctx_lnum = save_lnum; 5253 if (status == FAIL) 5254 { 5255 ga_clear(&end_ga); 5256 return FAIL; 5257 } 5258 5259 *(((int *)end_ga.ga_data) + end_ga.ga_len) = instr->ga_len; 5260 ++end_ga.ga_len; 5261 generate_JUMP(cctx, opchar == '|' 5262 ? JUMP_IF_COND_TRUE : JUMP_IF_COND_FALSE, 0); 5263 5264 // eval the next expression 5265 SOURCING_LNUM = save_sourcing_lnum; 5266 if (may_get_next_line_error(p + 2, arg, cctx) == FAIL) 5267 { 5268 ga_clear(&end_ga); 5269 return FAIL; 5270 } 5271 5272 if ((opchar == '|' ? compile_expr3(arg, cctx, ppconst) 5273 : compile_expr4(arg, cctx, ppconst)) == FAIL) 5274 { 5275 ga_clear(&end_ga); 5276 return FAIL; 5277 } 5278 5279 p = may_peek_next_line(cctx, *arg, &next); 5280 } 5281 5282 if (check_ppconst_bool(ppconst) == FAIL) 5283 { 5284 ga_clear(&end_ga); 5285 return FAIL; 5286 } 5287 generate_ppconst(cctx, ppconst); 5288 5289 // Every part must evaluate to a bool. 5290 if (bool_on_stack(cctx) == FAIL) 5291 { 5292 ga_clear(&end_ga); 5293 return FAIL; 5294 } 5295 5296 // Fill in the end label in all jumps. 5297 while (end_ga.ga_len > 0) 5298 { 5299 isn_T *isn; 5300 5301 --end_ga.ga_len; 5302 isn = ((isn_T *)instr->ga_data) 5303 + *(((int *)end_ga.ga_data) + end_ga.ga_len); 5304 isn->isn_arg.jump.jump_where = instr->ga_len; 5305 } 5306 ga_clear(&end_ga); 5307 } 5308 5309 return OK; 5310 } 5311 5312 /* 5313 * expr4a && expr4a && expr4a logical AND 5314 * 5315 * Produces instructions: 5316 * EVAL expr4a Push result of "expr4a" 5317 * COND2BOOL convert to bool if needed 5318 * JUMP_IF_COND_FALSE end 5319 * EVAL expr4b Push result of "expr4b" 5320 * JUMP_IF_COND_FALSE end 5321 * EVAL expr4c Push result of "expr4c" 5322 * end: 5323 */ 5324 static int 5325 compile_expr3(char_u **arg, cctx_T *cctx, ppconst_T *ppconst) 5326 { 5327 int ppconst_used = ppconst->pp_used; 5328 5329 // get the first variable 5330 if (compile_expr4(arg, cctx, ppconst) == FAIL) 5331 return FAIL; 5332 5333 // || and && work almost the same 5334 return compile_and_or(arg, cctx, "&&", ppconst, ppconst_used); 5335 } 5336 5337 /* 5338 * expr3a || expr3b || expr3c logical OR 5339 * 5340 * Produces instructions: 5341 * EVAL expr3a Push result of "expr3a" 5342 * COND2BOOL convert to bool if needed 5343 * JUMP_IF_COND_TRUE end 5344 * EVAL expr3b Push result of "expr3b" 5345 * JUMP_IF_COND_TRUE end 5346 * EVAL expr3c Push result of "expr3c" 5347 * end: 5348 */ 5349 static int 5350 compile_expr2(char_u **arg, cctx_T *cctx, ppconst_T *ppconst) 5351 { 5352 int ppconst_used = ppconst->pp_used; 5353 5354 // eval the first expression 5355 if (compile_expr3(arg, cctx, ppconst) == FAIL) 5356 return FAIL; 5357 5358 // || and && work almost the same 5359 return compile_and_or(arg, cctx, "||", ppconst, ppconst_used); 5360 } 5361 5362 /* 5363 * Toplevel expression: expr2 ? expr1a : expr1b 5364 * Produces instructions: 5365 * EVAL expr2 Push result of "expr2" 5366 * JUMP_IF_FALSE alt jump if false 5367 * EVAL expr1a 5368 * JUMP_ALWAYS end 5369 * alt: EVAL expr1b 5370 * end: 5371 * 5372 * Toplevel expression: expr2 ?? expr1 5373 * Produces instructions: 5374 * EVAL expr2 Push result of "expr2" 5375 * JUMP_AND_KEEP_IF_TRUE end jump if true 5376 * EVAL expr1 5377 * end: 5378 */ 5379 static int 5380 compile_expr1(char_u **arg, cctx_T *cctx, ppconst_T *ppconst) 5381 { 5382 char_u *p; 5383 int ppconst_used = ppconst->pp_used; 5384 char_u *next; 5385 5386 // Ignore all kinds of errors when not producing code. 5387 if (cctx->ctx_skip == SKIP_YES) 5388 { 5389 skip_expr_cctx(arg, cctx); 5390 return OK; 5391 } 5392 5393 // Evaluate the first expression. 5394 if (compile_expr2(arg, cctx, ppconst) == FAIL) 5395 return FAIL; 5396 5397 p = may_peek_next_line(cctx, *arg, &next); 5398 if (*p == '?') 5399 { 5400 int op_falsy = p[1] == '?'; 5401 garray_T *instr = &cctx->ctx_instr; 5402 garray_T *stack = &cctx->ctx_type_stack; 5403 int alt_idx = instr->ga_len; 5404 int end_idx = 0; 5405 isn_T *isn; 5406 type_T *type1 = NULL; 5407 int has_const_expr = FALSE; 5408 int const_value = FALSE; 5409 int save_skip = cctx->ctx_skip; 5410 5411 if (next != NULL) 5412 { 5413 *arg = next_line_from_context(cctx, TRUE); 5414 p = skipwhite(*arg); 5415 } 5416 5417 if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[1 + op_falsy])) 5418 { 5419 semsg(_(e_white_space_required_before_and_after_str_at_str), 5420 op_falsy ? "??" : "?", p); 5421 return FAIL; 5422 } 5423 5424 if (ppconst->pp_used == ppconst_used + 1) 5425 { 5426 // the condition is a constant, we know whether the ? or the : 5427 // expression is to be evaluated. 5428 has_const_expr = TRUE; 5429 if (op_falsy) 5430 const_value = tv2bool(&ppconst->pp_tv[ppconst_used]); 5431 else 5432 { 5433 int error = FALSE; 5434 5435 const_value = tv_get_bool_chk(&ppconst->pp_tv[ppconst_used], 5436 &error); 5437 if (error) 5438 return FAIL; 5439 } 5440 cctx->ctx_skip = save_skip == SKIP_YES || 5441 (op_falsy ? const_value : !const_value) ? SKIP_YES : SKIP_NOT; 5442 5443 if (op_falsy && cctx->ctx_skip == SKIP_YES) 5444 // "left ?? right" and "left" is truthy: produce "left" 5445 generate_ppconst(cctx, ppconst); 5446 else 5447 { 5448 clear_tv(&ppconst->pp_tv[ppconst_used]); 5449 --ppconst->pp_used; 5450 } 5451 } 5452 else 5453 { 5454 generate_ppconst(cctx, ppconst); 5455 if (op_falsy) 5456 end_idx = instr->ga_len; 5457 generate_JUMP(cctx, op_falsy 5458 ? JUMP_AND_KEEP_IF_TRUE : JUMP_IF_FALSE, 0); 5459 if (op_falsy) 5460 type1 = ((type_T **)stack->ga_data)[stack->ga_len]; 5461 } 5462 5463 // evaluate the second expression; any type is accepted 5464 if (may_get_next_line_error(p + 1 + op_falsy, arg, cctx) == FAIL) 5465 return FAIL; 5466 if (compile_expr1(arg, cctx, ppconst) == FAIL) 5467 return FAIL; 5468 5469 if (!has_const_expr) 5470 { 5471 generate_ppconst(cctx, ppconst); 5472 5473 if (!op_falsy) 5474 { 5475 // remember the type and drop it 5476 --stack->ga_len; 5477 type1 = ((type_T **)stack->ga_data)[stack->ga_len]; 5478 5479 end_idx = instr->ga_len; 5480 generate_JUMP(cctx, JUMP_ALWAYS, 0); 5481 5482 // jump here from JUMP_IF_FALSE 5483 isn = ((isn_T *)instr->ga_data) + alt_idx; 5484 isn->isn_arg.jump.jump_where = instr->ga_len; 5485 } 5486 } 5487 5488 if (!op_falsy) 5489 { 5490 // Check for the ":". 5491 p = may_peek_next_line(cctx, *arg, &next); 5492 if (*p != ':') 5493 { 5494 emsg(_(e_missing_colon)); 5495 return FAIL; 5496 } 5497 if (next != NULL) 5498 { 5499 *arg = next_line_from_context(cctx, TRUE); 5500 p = skipwhite(*arg); 5501 } 5502 5503 if (!IS_WHITE_OR_NUL(**arg) || !IS_WHITE_OR_NUL(p[1])) 5504 { 5505 semsg(_(e_white_space_required_before_and_after_str_at_str), 5506 ":", p); 5507 return FAIL; 5508 } 5509 5510 // evaluate the third expression 5511 if (has_const_expr) 5512 cctx->ctx_skip = save_skip == SKIP_YES || const_value 5513 ? SKIP_YES : SKIP_NOT; 5514 if (may_get_next_line_error(p + 1, arg, cctx) == FAIL) 5515 return FAIL; 5516 if (compile_expr1(arg, cctx, ppconst) == FAIL) 5517 return FAIL; 5518 } 5519 5520 if (!has_const_expr) 5521 { 5522 type_T **typep; 5523 5524 generate_ppconst(cctx, ppconst); 5525 5526 // If the types differ, the result has a more generic type. 5527 typep = ((type_T **)stack->ga_data) + stack->ga_len - 1; 5528 common_type(type1, *typep, typep, cctx->ctx_type_list); 5529 5530 // jump here from JUMP_ALWAYS or JUMP_AND_KEEP_IF_TRUE 5531 isn = ((isn_T *)instr->ga_data) + end_idx; 5532 isn->isn_arg.jump.jump_where = instr->ga_len; 5533 } 5534 5535 cctx->ctx_skip = save_skip; 5536 } 5537 return OK; 5538 } 5539 5540 /* 5541 * Toplevel expression. 5542 * Sets "is_const" (if not NULL) to indicate the value is a constant. 5543 * Returns OK or FAIL. 5544 */ 5545 static int 5546 compile_expr0_ext(char_u **arg, cctx_T *cctx, int *is_const) 5547 { 5548 ppconst_T ppconst; 5549 5550 CLEAR_FIELD(ppconst); 5551 if (compile_expr1(arg, cctx, &ppconst) == FAIL) 5552 { 5553 clear_ppconst(&ppconst); 5554 return FAIL; 5555 } 5556 if (is_const != NULL) 5557 *is_const = ppconst.pp_used > 0 || ppconst.pp_is_const; 5558 if (generate_ppconst(cctx, &ppconst) == FAIL) 5559 return FAIL; 5560 return OK; 5561 } 5562 5563 /* 5564 * Toplevel expression. 5565 */ 5566 static int 5567 compile_expr0(char_u **arg, cctx_T *cctx) 5568 { 5569 return compile_expr0_ext(arg, cctx, NULL); 5570 } 5571 5572 /* 5573 * Compile "return [expr]". 5574 * When "legacy" is TRUE evaluate [expr] with legacy syntax 5575 */ 5576 static char_u * 5577 compile_return(char_u *arg, int check_return_type, int legacy, cctx_T *cctx) 5578 { 5579 char_u *p = arg; 5580 garray_T *stack = &cctx->ctx_type_stack; 5581 type_T *stack_type; 5582 5583 if (*p != NUL && *p != '|' && *p != '\n') 5584 { 5585 if (legacy) 5586 { 5587 int save_flags = cmdmod.cmod_flags; 5588 5589 generate_LEGACY_EVAL(cctx, p); 5590 if (need_type(&t_any, cctx->ctx_ufunc->uf_ret_type, -1, 5591 0, cctx, FALSE, FALSE) == FAIL) 5592 return NULL; 5593 cmdmod.cmod_flags |= CMOD_LEGACY; 5594 (void)skip_expr(&p, NULL); 5595 cmdmod.cmod_flags = save_flags; 5596 } 5597 else 5598 { 5599 // compile return argument into instructions 5600 if (compile_expr0(&p, cctx) == FAIL) 5601 return NULL; 5602 } 5603 5604 if (cctx->ctx_skip != SKIP_YES) 5605 { 5606 // "check_return_type" with uf_ret_type set to &t_unknown is used 5607 // for an inline function without a specified return type. Set the 5608 // return type here. 5609 stack_type = ((type_T **)stack->ga_data)[stack->ga_len - 1]; 5610 if ((check_return_type && (cctx->ctx_ufunc->uf_ret_type == NULL 5611 || cctx->ctx_ufunc->uf_ret_type == &t_unknown 5612 || cctx->ctx_ufunc->uf_ret_type == &t_any)) 5613 || (!check_return_type 5614 && cctx->ctx_ufunc->uf_ret_type == &t_unknown)) 5615 { 5616 cctx->ctx_ufunc->uf_ret_type = stack_type; 5617 } 5618 else 5619 { 5620 if (cctx->ctx_ufunc->uf_ret_type->tt_type == VAR_VOID 5621 && stack_type->tt_type != VAR_VOID 5622 && stack_type->tt_type != VAR_UNKNOWN) 5623 { 5624 emsg(_(e_returning_value_in_function_without_return_type)); 5625 return NULL; 5626 } 5627 if (need_type(stack_type, cctx->ctx_ufunc->uf_ret_type, -1, 5628 0, cctx, FALSE, FALSE) == FAIL) 5629 return NULL; 5630 } 5631 } 5632 } 5633 else 5634 { 5635 // "check_return_type" cannot be TRUE, only used for a lambda which 5636 // always has an argument. 5637 if (cctx->ctx_ufunc->uf_ret_type->tt_type != VAR_VOID 5638 && cctx->ctx_ufunc->uf_ret_type->tt_type != VAR_UNKNOWN) 5639 { 5640 emsg(_(e_missing_return_value)); 5641 return NULL; 5642 } 5643 5644 // No argument, return zero. 5645 generate_PUSHNR(cctx, 0); 5646 } 5647 5648 // Undo any command modifiers. 5649 generate_undo_cmdmods(cctx); 5650 5651 if (cctx->ctx_skip != SKIP_YES && generate_instr(cctx, ISN_RETURN) == NULL) 5652 return NULL; 5653 5654 // "return val | endif" is possible 5655 return skipwhite(p); 5656 } 5657 5658 /* 5659 * Get a line from the compilation context, compatible with exarg_T getline(). 5660 * Return a pointer to the line in allocated memory. 5661 * Return NULL for end-of-file or some error. 5662 */ 5663 static char_u * 5664 exarg_getline( 5665 int c UNUSED, 5666 void *cookie, 5667 int indent UNUSED, 5668 getline_opt_T options UNUSED) 5669 { 5670 cctx_T *cctx = (cctx_T *)cookie; 5671 char_u *p; 5672 5673 for (;;) 5674 { 5675 if (cctx->ctx_lnum >= cctx->ctx_ufunc->uf_lines.ga_len - 1) 5676 return NULL; 5677 ++cctx->ctx_lnum; 5678 p = ((char_u **)cctx->ctx_ufunc->uf_lines.ga_data)[cctx->ctx_lnum]; 5679 // Comment lines result in NULL pointers, skip them. 5680 if (p != NULL) 5681 return vim_strsave(p); 5682 } 5683 } 5684 5685 void 5686 fill_exarg_from_cctx(exarg_T *eap, cctx_T *cctx) 5687 { 5688 eap->getline = exarg_getline; 5689 eap->cookie = cctx; 5690 } 5691 5692 /* 5693 * Compile a nested :def command. 5694 */ 5695 static char_u * 5696 compile_nested_function(exarg_T *eap, cctx_T *cctx) 5697 { 5698 int is_global = *eap->arg == 'g' && eap->arg[1] == ':'; 5699 char_u *name_start = eap->arg; 5700 char_u *name_end = to_name_end(eap->arg, TRUE); 5701 char_u *lambda_name; 5702 ufunc_T *ufunc; 5703 int r = FAIL; 5704 compiletype_T compile_type; 5705 5706 if (eap->forceit) 5707 { 5708 emsg(_(e_cannot_use_bang_with_nested_def)); 5709 return NULL; 5710 } 5711 5712 if (*name_start == '/') 5713 { 5714 name_end = skip_regexp(name_start + 1, '/', TRUE); 5715 if (*name_end == '/') 5716 ++name_end; 5717 set_nextcmd(eap, name_end); 5718 } 5719 if (name_end == name_start || *skipwhite(name_end) != '(') 5720 { 5721 if (!ends_excmd2(name_start, name_end)) 5722 { 5723 semsg(_(e_invalid_command_str), eap->cmd); 5724 return NULL; 5725 } 5726 5727 // "def" or "def Name": list functions 5728 if (generate_DEF(cctx, name_start, name_end - name_start) == FAIL) 5729 return NULL; 5730 return eap->nextcmd == NULL ? (char_u *)"" : eap->nextcmd; 5731 } 5732 5733 // Only g:Func() can use a namespace. 5734 if (name_start[1] == ':' && !is_global) 5735 { 5736 semsg(_(e_namespace_not_supported_str), name_start); 5737 return NULL; 5738 } 5739 if (check_defined(name_start, name_end - name_start, cctx, FALSE) == FAIL) 5740 return NULL; 5741 5742 eap->arg = name_end; 5743 fill_exarg_from_cctx(eap, cctx); 5744 5745 eap->forceit = FALSE; 5746 lambda_name = vim_strsave(get_lambda_name()); 5747 if (lambda_name == NULL) 5748 return NULL; 5749 ufunc = define_function(eap, lambda_name); 5750 5751 if (ufunc == NULL) 5752 { 5753 r = eap->skip ? OK : FAIL; 5754 goto theend; 5755 } 5756 5757 // copy over the block scope IDs before compiling 5758 if (!is_global && cctx->ctx_ufunc->uf_block_depth > 0) 5759 { 5760 int block_depth = cctx->ctx_ufunc->uf_block_depth; 5761 5762 ufunc->uf_block_ids = ALLOC_MULT(int, block_depth); 5763 if (ufunc->uf_block_ids != NULL) 5764 { 5765 mch_memmove(ufunc->uf_block_ids, cctx->ctx_ufunc->uf_block_ids, 5766 sizeof(int) * block_depth); 5767 ufunc->uf_block_depth = block_depth; 5768 } 5769 } 5770 5771 compile_type = COMPILE_TYPE(ufunc); 5772 #ifdef FEAT_PROFILE 5773 // If the outer function is profiled, also compile the nested function for 5774 // profiling. 5775 if (cctx->ctx_compile_type == CT_PROFILE) 5776 compile_type = CT_PROFILE; 5777 #endif 5778 if (func_needs_compiling(ufunc, compile_type) 5779 && compile_def_function(ufunc, TRUE, compile_type, cctx) == FAIL) 5780 { 5781 func_ptr_unref(ufunc); 5782 goto theend; 5783 } 5784 5785 #ifdef FEAT_PROFILE 5786 // When the outer function is compiled for profiling, the nested function 5787 // may be called without profiling. Compile it here in the right context. 5788 if (compile_type == CT_PROFILE && func_needs_compiling(ufunc, CT_NONE)) 5789 compile_def_function(ufunc, FALSE, CT_NONE, cctx); 5790 #endif 5791 5792 if (is_global) 5793 { 5794 char_u *func_name = vim_strnsave(name_start + 2, 5795 name_end - name_start - 2); 5796 5797 if (func_name == NULL) 5798 r = FAIL; 5799 else 5800 { 5801 r = generate_NEWFUNC(cctx, lambda_name, func_name); 5802 lambda_name = NULL; 5803 } 5804 } 5805 else 5806 { 5807 // Define a local variable for the function reference. 5808 lvar_T *lvar = reserve_local(cctx, name_start, name_end - name_start, 5809 TRUE, ufunc->uf_func_type); 5810 5811 if (lvar == NULL) 5812 goto theend; 5813 if (generate_FUNCREF(cctx, ufunc) == FAIL) 5814 goto theend; 5815 r = generate_STORE(cctx, ISN_STORE, lvar->lv_idx, NULL); 5816 } 5817 5818 theend: 5819 vim_free(lambda_name); 5820 return r == FAIL ? NULL : (char_u *)""; 5821 } 5822 5823 /* 5824 * Return the length of an assignment operator, or zero if there isn't one. 5825 */ 5826 int 5827 assignment_len(char_u *p, int *heredoc) 5828 { 5829 if (*p == '=') 5830 { 5831 if (p[1] == '<' && p[2] == '<') 5832 { 5833 *heredoc = TRUE; 5834 return 3; 5835 } 5836 return 1; 5837 } 5838 if (vim_strchr((char_u *)"+-*/%", *p) != NULL && p[1] == '=') 5839 return 2; 5840 if (STRNCMP(p, "..=", 3) == 0) 5841 return 3; 5842 return 0; 5843 } 5844 5845 /* 5846 * Generate the load instruction for "name". 5847 */ 5848 static void 5849 generate_loadvar( 5850 cctx_T *cctx, 5851 assign_dest_T dest, 5852 char_u *name, 5853 lvar_T *lvar, 5854 type_T *type) 5855 { 5856 switch (dest) 5857 { 5858 case dest_option: 5859 generate_LOAD(cctx, ISN_LOADOPT, 0, name, type); 5860 break; 5861 case dest_global: 5862 if (vim_strchr(name, AUTOLOAD_CHAR) == NULL) 5863 generate_LOAD(cctx, ISN_LOADG, 0, name + 2, type); 5864 else 5865 generate_LOAD(cctx, ISN_LOADAUTO, 0, name, type); 5866 break; 5867 case dest_buffer: 5868 generate_LOAD(cctx, ISN_LOADB, 0, name + 2, type); 5869 break; 5870 case dest_window: 5871 generate_LOAD(cctx, ISN_LOADW, 0, name + 2, type); 5872 break; 5873 case dest_tab: 5874 generate_LOAD(cctx, ISN_LOADT, 0, name + 2, type); 5875 break; 5876 case dest_script: 5877 compile_load_scriptvar(cctx, 5878 name + (name[1] == ':' ? 2 : 0), NULL, NULL, TRUE); 5879 break; 5880 case dest_env: 5881 // Include $ in the name here 5882 generate_LOAD(cctx, ISN_LOADENV, 0, name, type); 5883 break; 5884 case dest_reg: 5885 generate_LOAD(cctx, ISN_LOADREG, name[1], NULL, &t_string); 5886 break; 5887 case dest_vimvar: 5888 generate_LOADV(cctx, name + 2, TRUE); 5889 break; 5890 case dest_local: 5891 if (lvar->lv_from_outer > 0) 5892 generate_LOADOUTER(cctx, lvar->lv_idx, lvar->lv_from_outer, 5893 type); 5894 else 5895 generate_LOAD(cctx, ISN_LOAD, lvar->lv_idx, NULL, type); 5896 break; 5897 case dest_expr: 5898 // list or dict value should already be on the stack. 5899 break; 5900 } 5901 } 5902 5903 /* 5904 * Skip over "[expr]" or ".member". 5905 * Does not check for any errors. 5906 */ 5907 static char_u * 5908 skip_index(char_u *start) 5909 { 5910 char_u *p = start; 5911 5912 if (*p == '[') 5913 { 5914 p = skipwhite(p + 1); 5915 (void)skip_expr(&p, NULL); 5916 p = skipwhite(p); 5917 if (*p == ']') 5918 return p + 1; 5919 return p; 5920 } 5921 // if (*p == '.') 5922 return to_name_end(p + 1, TRUE); 5923 } 5924 5925 void 5926 vim9_declare_error(char_u *name) 5927 { 5928 char *scope = ""; 5929 5930 switch (*name) 5931 { 5932 case 'g': scope = _("global"); break; 5933 case 'b': scope = _("buffer"); break; 5934 case 'w': scope = _("window"); break; 5935 case 't': scope = _("tab"); break; 5936 case 'v': scope = "v:"; break; 5937 case '$': semsg(_(e_cannot_declare_an_environment_variable), name); 5938 return; 5939 case '&': semsg(_(e_cannot_declare_an_option), name); 5940 return; 5941 case '@': semsg(_(e_cannot_declare_a_register_str), name); 5942 return; 5943 default: return; 5944 } 5945 semsg(_(e_cannot_declare_a_scope_variable), scope, name); 5946 } 5947 5948 /* 5949 * For one assignment figure out the type of destination. Return it in "dest". 5950 * When not recognized "dest" is not set. 5951 * For an option "opt_flags" is set. 5952 * For a v:var "vimvaridx" is set. 5953 * "type" is set to the destination type if known, unchanted otherwise. 5954 * Return FAIL if an error message was given. 5955 */ 5956 static int 5957 get_var_dest( 5958 char_u *name, 5959 assign_dest_T *dest, 5960 int cmdidx, 5961 int *opt_flags, 5962 int *vimvaridx, 5963 type_T **type, 5964 cctx_T *cctx) 5965 { 5966 char_u *p; 5967 5968 if (*name == '&') 5969 { 5970 int cc; 5971 long numval; 5972 getoption_T opt_type; 5973 5974 *dest = dest_option; 5975 if (cmdidx == CMD_final || cmdidx == CMD_const) 5976 { 5977 emsg(_(e_const_option)); 5978 return FAIL; 5979 } 5980 p = name; 5981 p = find_option_end(&p, opt_flags); 5982 if (p == NULL) 5983 { 5984 // cannot happen? 5985 emsg(_(e_unexpected_characters_in_assignment)); 5986 return FAIL; 5987 } 5988 cc = *p; 5989 *p = NUL; 5990 opt_type = get_option_value(skip_option_env_lead(name), 5991 &numval, NULL, *opt_flags); 5992 *p = cc; 5993 switch (opt_type) 5994 { 5995 case gov_unknown: 5996 semsg(_(e_unknown_option), name); 5997 return FAIL; 5998 case gov_string: 5999 case gov_hidden_string: 6000 *type = &t_string; 6001 break; 6002 case gov_bool: 6003 case gov_hidden_bool: 6004 *type = &t_bool; 6005 break; 6006 case gov_number: 6007 case gov_hidden_number: 6008 *type = &t_number; 6009 break; 6010 } 6011 } 6012 else if (*name == '$') 6013 { 6014 *dest = dest_env; 6015 *type = &t_string; 6016 } 6017 else if (*name == '@') 6018 { 6019 if (name[1] != '@' 6020 && (!valid_yank_reg(name[1], FALSE) || name[1] == '.')) 6021 { 6022 emsg_invreg(name[1]); 6023 return FAIL; 6024 } 6025 *dest = dest_reg; 6026 *type = name[1] == '#' ? &t_number_or_string : &t_string; 6027 } 6028 else if (STRNCMP(name, "g:", 2) == 0) 6029 { 6030 *dest = dest_global; 6031 } 6032 else if (STRNCMP(name, "b:", 2) == 0) 6033 { 6034 *dest = dest_buffer; 6035 } 6036 else if (STRNCMP(name, "w:", 2) == 0) 6037 { 6038 *dest = dest_window; 6039 } 6040 else if (STRNCMP(name, "t:", 2) == 0) 6041 { 6042 *dest = dest_tab; 6043 } 6044 else if (STRNCMP(name, "v:", 2) == 0) 6045 { 6046 typval_T *vtv; 6047 int di_flags; 6048 6049 *vimvaridx = find_vim_var(name + 2, &di_flags); 6050 if (*vimvaridx < 0) 6051 { 6052 semsg(_(e_variable_not_found_str), name); 6053 return FAIL; 6054 } 6055 // We use the current value of "sandbox" here, is that OK? 6056 if (var_check_ro(di_flags, name, FALSE)) 6057 return FAIL; 6058 *dest = dest_vimvar; 6059 vtv = get_vim_var_tv(*vimvaridx); 6060 *type = typval2type_vimvar(vtv, cctx->ctx_type_list); 6061 } 6062 return OK; 6063 } 6064 6065 /* 6066 * Generate a STORE instruction for "dest", not being "dest_local". 6067 * Return FAIL when out of memory. 6068 */ 6069 static int 6070 generate_store_var( 6071 cctx_T *cctx, 6072 assign_dest_T dest, 6073 int opt_flags, 6074 int vimvaridx, 6075 int scriptvar_idx, 6076 int scriptvar_sid, 6077 type_T *type, 6078 char_u *name) 6079 { 6080 switch (dest) 6081 { 6082 case dest_option: 6083 return generate_STOREOPT(cctx, skip_option_env_lead(name), 6084 opt_flags); 6085 case dest_global: 6086 // include g: with the name, easier to execute that way 6087 return generate_STORE(cctx, vim_strchr(name, AUTOLOAD_CHAR) == NULL 6088 ? ISN_STOREG : ISN_STOREAUTO, 0, name); 6089 case dest_buffer: 6090 // include b: with the name, easier to execute that way 6091 return generate_STORE(cctx, ISN_STOREB, 0, name); 6092 case dest_window: 6093 // include w: with the name, easier to execute that way 6094 return generate_STORE(cctx, ISN_STOREW, 0, name); 6095 case dest_tab: 6096 // include t: with the name, easier to execute that way 6097 return generate_STORE(cctx, ISN_STORET, 0, name); 6098 case dest_env: 6099 return generate_STORE(cctx, ISN_STOREENV, 0, name + 1); 6100 case dest_reg: 6101 return generate_STORE(cctx, ISN_STOREREG, 6102 name[1] == '@' ? '"' : name[1], NULL); 6103 case dest_vimvar: 6104 return generate_STORE(cctx, ISN_STOREV, vimvaridx, NULL); 6105 case dest_script: 6106 if (scriptvar_idx < 0) 6107 // "s:" may be included in the name. 6108 return generate_OLDSCRIPT(cctx, ISN_STORES, name, 6109 scriptvar_sid, type); 6110 return generate_VIM9SCRIPT(cctx, ISN_STORESCRIPT, 6111 scriptvar_sid, scriptvar_idx, type); 6112 case dest_local: 6113 case dest_expr: 6114 // cannot happen 6115 break; 6116 } 6117 return FAIL; 6118 } 6119 6120 static int 6121 generate_store_lhs(cctx_T *cctx, lhs_T *lhs, int instr_count) 6122 { 6123 if (lhs->lhs_dest != dest_local) 6124 return generate_store_var(cctx, lhs->lhs_dest, 6125 lhs->lhs_opt_flags, lhs->lhs_vimvaridx, 6126 lhs->lhs_scriptvar_idx, lhs->lhs_scriptvar_sid, 6127 lhs->lhs_type, lhs->lhs_name); 6128 6129 if (lhs->lhs_lvar != NULL) 6130 { 6131 garray_T *instr = &cctx->ctx_instr; 6132 isn_T *isn = ((isn_T *)instr->ga_data) + instr->ga_len - 1; 6133 6134 // optimization: turn "var = 123" from ISN_PUSHNR + ISN_STORE into 6135 // ISN_STORENR 6136 if (lhs->lhs_lvar->lv_from_outer == 0 6137 && instr->ga_len == instr_count + 1 6138 && isn->isn_type == ISN_PUSHNR) 6139 { 6140 varnumber_T val = isn->isn_arg.number; 6141 garray_T *stack = &cctx->ctx_type_stack; 6142 6143 isn->isn_type = ISN_STORENR; 6144 isn->isn_arg.storenr.stnr_idx = lhs->lhs_lvar->lv_idx; 6145 isn->isn_arg.storenr.stnr_val = val; 6146 if (stack->ga_len > 0) 6147 --stack->ga_len; 6148 } 6149 else if (lhs->lhs_lvar->lv_from_outer > 0) 6150 generate_STOREOUTER(cctx, lhs->lhs_lvar->lv_idx, 6151 lhs->lhs_lvar->lv_from_outer); 6152 else 6153 generate_STORE(cctx, ISN_STORE, lhs->lhs_lvar->lv_idx, NULL); 6154 } 6155 return OK; 6156 } 6157 6158 static int 6159 is_decl_command(int cmdidx) 6160 { 6161 return cmdidx == CMD_let || cmdidx == CMD_var 6162 || cmdidx == CMD_final || cmdidx == CMD_const; 6163 } 6164 6165 /* 6166 * Figure out the LHS type and other properties for an assignment or one item 6167 * of ":unlet" with an index. 6168 * Returns OK or FAIL. 6169 */ 6170 static int 6171 compile_lhs( 6172 char_u *var_start, 6173 lhs_T *lhs, 6174 int cmdidx, 6175 int heredoc, 6176 int oplen, 6177 cctx_T *cctx) 6178 { 6179 char_u *var_end; 6180 int is_decl = is_decl_command(cmdidx); 6181 6182 CLEAR_POINTER(lhs); 6183 lhs->lhs_dest = dest_local; 6184 lhs->lhs_vimvaridx = -1; 6185 lhs->lhs_scriptvar_idx = -1; 6186 6187 // "dest_end" is the end of the destination, including "[expr]" or 6188 // ".name". 6189 // "var_end" is the end of the variable/option/etc. name. 6190 lhs->lhs_dest_end = skip_var_one(var_start, FALSE); 6191 if (*var_start == '@') 6192 var_end = var_start + 2; 6193 else 6194 { 6195 // skip over the leading "&", "&l:", "&g:" and "$" 6196 var_end = skip_option_env_lead(var_start); 6197 var_end = to_name_end(var_end, TRUE); 6198 } 6199 6200 // "a: type" is declaring variable "a" with a type, not dict "a:". 6201 if (is_decl && lhs->lhs_dest_end == var_start + 2 6202 && lhs->lhs_dest_end[-1] == ':') 6203 --lhs->lhs_dest_end; 6204 if (is_decl && var_end == var_start + 2 && var_end[-1] == ':') 6205 --var_end; 6206 6207 // compute the length of the destination without "[expr]" or ".name" 6208 lhs->lhs_varlen = var_end - var_start; 6209 lhs->lhs_varlen_total = lhs->lhs_varlen; 6210 lhs->lhs_name = vim_strnsave(var_start, lhs->lhs_varlen); 6211 if (lhs->lhs_name == NULL) 6212 return FAIL; 6213 6214 if (lhs->lhs_dest_end > var_start + lhs->lhs_varlen) 6215 // Something follows after the variable: "var[idx]" or "var.key". 6216 lhs->lhs_has_index = TRUE; 6217 6218 if (heredoc) 6219 lhs->lhs_type = &t_list_string; 6220 else 6221 lhs->lhs_type = &t_any; 6222 6223 if (cctx->ctx_skip != SKIP_YES) 6224 { 6225 int declare_error = FALSE; 6226 6227 if (get_var_dest(lhs->lhs_name, &lhs->lhs_dest, cmdidx, 6228 &lhs->lhs_opt_flags, &lhs->lhs_vimvaridx, 6229 &lhs->lhs_type, cctx) == FAIL) 6230 return FAIL; 6231 if (lhs->lhs_dest != dest_local 6232 && cmdidx != CMD_const && cmdidx != CMD_final) 6233 { 6234 // Specific kind of variable recognized. 6235 declare_error = is_decl; 6236 } 6237 else 6238 { 6239 // No specific kind of variable recognized, just a name. 6240 if (check_reserved_name(lhs->lhs_name) == FAIL) 6241 return FAIL; 6242 6243 if (lookup_local(var_start, lhs->lhs_varlen, 6244 &lhs->lhs_local_lvar, cctx) == OK) 6245 lhs->lhs_lvar = &lhs->lhs_local_lvar; 6246 else 6247 { 6248 CLEAR_FIELD(lhs->lhs_arg_lvar); 6249 if (arg_exists(var_start, lhs->lhs_varlen, 6250 &lhs->lhs_arg_lvar.lv_idx, &lhs->lhs_arg_lvar.lv_type, 6251 &lhs->lhs_arg_lvar.lv_from_outer, cctx) == OK) 6252 { 6253 if (is_decl) 6254 { 6255 semsg(_(e_str_is_used_as_argument), lhs->lhs_name); 6256 return FAIL; 6257 } 6258 lhs->lhs_lvar = &lhs->lhs_arg_lvar; 6259 } 6260 } 6261 if (lhs->lhs_lvar != NULL) 6262 { 6263 if (is_decl) 6264 { 6265 semsg(_(e_variable_already_declared), lhs->lhs_name); 6266 return FAIL; 6267 } 6268 } 6269 else 6270 { 6271 int script_namespace = lhs->lhs_varlen > 1 6272 && STRNCMP(var_start, "s:", 2) == 0; 6273 int script_var = (script_namespace 6274 ? script_var_exists(var_start + 2, lhs->lhs_varlen - 2, 6275 cctx) 6276 : script_var_exists(var_start, lhs->lhs_varlen, 6277 cctx)) == OK; 6278 imported_T *import = 6279 find_imported(var_start, lhs->lhs_varlen, cctx); 6280 6281 if (script_namespace || script_var || import != NULL) 6282 { 6283 char_u *rawname = lhs->lhs_name 6284 + (lhs->lhs_name[1] == ':' ? 2 : 0); 6285 6286 if (is_decl) 6287 { 6288 if (script_namespace) 6289 semsg(_(e_cannot_declare_script_variable_in_function), 6290 lhs->lhs_name); 6291 else 6292 semsg(_(e_variable_already_declared_in_script_str), 6293 lhs->lhs_name); 6294 return FAIL; 6295 } 6296 else if (cctx->ctx_ufunc->uf_script_ctx_version 6297 == SCRIPT_VERSION_VIM9 6298 && script_namespace 6299 && !script_var && import == NULL) 6300 { 6301 semsg(_(e_unknown_variable_str), lhs->lhs_name); 6302 return FAIL; 6303 } 6304 6305 lhs->lhs_dest = dest_script; 6306 6307 // existing script-local variables should have a type 6308 lhs->lhs_scriptvar_sid = current_sctx.sc_sid; 6309 if (import != NULL) 6310 lhs->lhs_scriptvar_sid = import->imp_sid; 6311 if (SCRIPT_ID_VALID(lhs->lhs_scriptvar_sid)) 6312 { 6313 // Check writable only when no index follows. 6314 lhs->lhs_scriptvar_idx = get_script_item_idx( 6315 lhs->lhs_scriptvar_sid, rawname, 6316 lhs->lhs_has_index ? ASSIGN_FINAL : ASSIGN_CONST, 6317 cctx); 6318 if (lhs->lhs_scriptvar_idx >= 0) 6319 { 6320 scriptitem_T *si = SCRIPT_ITEM( 6321 lhs->lhs_scriptvar_sid); 6322 svar_T *sv = 6323 ((svar_T *)si->sn_var_vals.ga_data) 6324 + lhs->lhs_scriptvar_idx; 6325 lhs->lhs_type = sv->sv_type; 6326 } 6327 } 6328 } 6329 else if (check_defined(var_start, lhs->lhs_varlen, cctx, FALSE) 6330 == FAIL) 6331 return FAIL; 6332 } 6333 } 6334 6335 if (declare_error) 6336 { 6337 vim9_declare_error(lhs->lhs_name); 6338 return FAIL; 6339 } 6340 } 6341 6342 // handle "a:name" as a name, not index "name" on "a" 6343 if (lhs->lhs_varlen > 1 || var_start[lhs->lhs_varlen] != ':') 6344 var_end = lhs->lhs_dest_end; 6345 6346 if (lhs->lhs_dest != dest_option) 6347 { 6348 if (is_decl && *var_end == ':') 6349 { 6350 char_u *p; 6351 6352 // parse optional type: "let var: type = expr" 6353 if (!VIM_ISWHITE(var_end[1])) 6354 { 6355 semsg(_(e_white_space_required_after_str_str), ":", var_end); 6356 return FAIL; 6357 } 6358 p = skipwhite(var_end + 1); 6359 lhs->lhs_type = parse_type(&p, cctx->ctx_type_list, TRUE); 6360 if (lhs->lhs_type == NULL) 6361 return FAIL; 6362 lhs->lhs_has_type = TRUE; 6363 } 6364 else if (lhs->lhs_lvar != NULL) 6365 lhs->lhs_type = lhs->lhs_lvar->lv_type; 6366 } 6367 6368 if (oplen == 3 && !heredoc 6369 && lhs->lhs_dest != dest_global 6370 && !lhs->lhs_has_index 6371 && lhs->lhs_type->tt_type != VAR_STRING 6372 && lhs->lhs_type->tt_type != VAR_ANY) 6373 { 6374 emsg(_(e_can_only_concatenate_to_string)); 6375 return FAIL; 6376 } 6377 6378 if (lhs->lhs_lvar == NULL && lhs->lhs_dest == dest_local 6379 && cctx->ctx_skip != SKIP_YES) 6380 { 6381 if (oplen > 1 && !heredoc) 6382 { 6383 // +=, /=, etc. require an existing variable 6384 semsg(_(e_cannot_use_operator_on_new_variable), lhs->lhs_name); 6385 return FAIL; 6386 } 6387 if (!is_decl) 6388 { 6389 semsg(_(e_unknown_variable_str), lhs->lhs_name); 6390 return FAIL; 6391 } 6392 6393 // Check the name is valid for a funcref. 6394 if ((lhs->lhs_type->tt_type == VAR_FUNC 6395 || lhs->lhs_type->tt_type == VAR_PARTIAL) 6396 && var_wrong_func_name(lhs->lhs_name, TRUE)) 6397 return FAIL; 6398 6399 // New local variable. 6400 lhs->lhs_lvar = reserve_local(cctx, var_start, lhs->lhs_varlen, 6401 cmdidx == CMD_final || cmdidx == CMD_const, lhs->lhs_type); 6402 if (lhs->lhs_lvar == NULL) 6403 return FAIL; 6404 lhs->lhs_new_local = TRUE; 6405 } 6406 6407 lhs->lhs_member_type = lhs->lhs_type; 6408 if (lhs->lhs_has_index) 6409 { 6410 // Something follows after the variable: "var[idx]" or "var.key". 6411 // TODO: should we also handle "->func()" here? 6412 if (is_decl) 6413 { 6414 emsg(_(e_cannot_use_index_when_declaring_variable)); 6415 return FAIL; 6416 } 6417 6418 if (var_start[lhs->lhs_varlen] == '[' 6419 || var_start[lhs->lhs_varlen] == '.') 6420 { 6421 char_u *after = var_start + lhs->lhs_varlen; 6422 char_u *p; 6423 6424 // Only the last index is used below, if there are others 6425 // before it generate code for the expression. Thus for 6426 // "ll[1][2]" the expression is "ll[1]" and "[2]" is the index. 6427 for (;;) 6428 { 6429 p = skip_index(after); 6430 if (*p != '[' && *p != '.') 6431 { 6432 lhs->lhs_varlen_total = p - var_start; 6433 break; 6434 } 6435 after = p; 6436 } 6437 if (after > var_start + lhs->lhs_varlen) 6438 { 6439 lhs->lhs_varlen = after - var_start; 6440 lhs->lhs_dest = dest_expr; 6441 // We don't know the type before evaluating the expression, 6442 // use "any" until then. 6443 lhs->lhs_type = &t_any; 6444 } 6445 6446 if (lhs->lhs_type->tt_member == NULL) 6447 lhs->lhs_member_type = &t_any; 6448 else 6449 lhs->lhs_member_type = lhs->lhs_type->tt_member; 6450 } 6451 else 6452 { 6453 semsg("Not supported yet: %s", var_start); 6454 return FAIL; 6455 } 6456 } 6457 return OK; 6458 } 6459 6460 /* 6461 * Figure out the LHS and check a few errors. 6462 */ 6463 static int 6464 compile_assign_lhs( 6465 char_u *var_start, 6466 lhs_T *lhs, 6467 int cmdidx, 6468 int is_decl, 6469 int heredoc, 6470 int oplen, 6471 cctx_T *cctx) 6472 { 6473 if (compile_lhs(var_start, lhs, cmdidx, heredoc, oplen, cctx) == FAIL) 6474 return FAIL; 6475 6476 if (!lhs->lhs_has_index && lhs->lhs_lvar == &lhs->lhs_arg_lvar) 6477 { 6478 semsg(_(e_cannot_assign_to_argument), lhs->lhs_name); 6479 return FAIL; 6480 } 6481 if (!is_decl && lhs->lhs_lvar != NULL 6482 && lhs->lhs_lvar->lv_const && !lhs->lhs_has_index) 6483 { 6484 semsg(_(e_cannot_assign_to_constant), lhs->lhs_name); 6485 return FAIL; 6486 } 6487 return OK; 6488 } 6489 6490 /* 6491 * Return TRUE if "lhs" has a range index: "[expr : expr]". 6492 */ 6493 static int 6494 has_list_index(char_u *idx_start, cctx_T *cctx) 6495 { 6496 char_u *p = idx_start; 6497 int save_skip; 6498 6499 if (*p != '[') 6500 return FALSE; 6501 6502 p = skipwhite(p + 1); 6503 if (*p == ':') 6504 return TRUE; 6505 6506 save_skip = cctx->ctx_skip; 6507 cctx->ctx_skip = SKIP_YES; 6508 (void)compile_expr0(&p, cctx); 6509 cctx->ctx_skip = save_skip; 6510 return *skipwhite(p) == ':'; 6511 } 6512 6513 /* 6514 * For an assignment with an index, compile the "idx" in "var[idx]" or "key" in 6515 * "var.key". 6516 */ 6517 static int 6518 compile_assign_index( 6519 char_u *var_start, 6520 lhs_T *lhs, 6521 int *range, 6522 cctx_T *cctx) 6523 { 6524 size_t varlen = lhs->lhs_varlen; 6525 char_u *p; 6526 int r = OK; 6527 int need_white_before = TRUE; 6528 int empty_second; 6529 6530 p = var_start + varlen; 6531 if (*p == '[') 6532 { 6533 p = skipwhite(p + 1); 6534 if (*p == ':') 6535 { 6536 // empty first index, push zero 6537 r = generate_PUSHNR(cctx, 0); 6538 need_white_before = FALSE; 6539 } 6540 else 6541 r = compile_expr0(&p, cctx); 6542 6543 if (r == OK && *skipwhite(p) == ':') 6544 { 6545 // unlet var[idx : idx] 6546 // blob[idx : idx] = value 6547 *range = TRUE; 6548 p = skipwhite(p); 6549 empty_second = *skipwhite(p + 1) == ']'; 6550 if ((need_white_before && !IS_WHITE_OR_NUL(p[-1])) 6551 || (!empty_second && !IS_WHITE_OR_NUL(p[1]))) 6552 { 6553 semsg(_(e_white_space_required_before_and_after_str_at_str), 6554 ":", p); 6555 return FAIL; 6556 } 6557 p = skipwhite(p + 1); 6558 if (*p == ']') 6559 // empty second index, push "none" 6560 r = generate_PUSHSPEC(cctx, VVAL_NONE); 6561 else 6562 r = compile_expr0(&p, cctx); 6563 } 6564 6565 if (r == OK && *skipwhite(p) != ']') 6566 { 6567 // this should not happen 6568 emsg(_(e_missbrac)); 6569 r = FAIL; 6570 } 6571 } 6572 else // if (*p == '.') 6573 { 6574 char_u *key_end = to_name_end(p + 1, TRUE); 6575 char_u *key = vim_strnsave(p + 1, key_end - p - 1); 6576 6577 r = generate_PUSHS(cctx, &key); 6578 } 6579 return r; 6580 } 6581 6582 /* 6583 * For a LHS with an index, load the variable to be indexed. 6584 */ 6585 static int 6586 compile_load_lhs( 6587 lhs_T *lhs, 6588 char_u *var_start, 6589 type_T *rhs_type, 6590 cctx_T *cctx) 6591 { 6592 if (lhs->lhs_dest == dest_expr) 6593 { 6594 size_t varlen = lhs->lhs_varlen; 6595 int c = var_start[varlen]; 6596 int lines_len = cctx->ctx_ufunc->uf_lines.ga_len; 6597 char_u *p = var_start; 6598 garray_T *stack = &cctx->ctx_type_stack; 6599 int res; 6600 6601 // Evaluate "ll[expr]" of "ll[expr][idx]". End the line with a NUL and 6602 // limit the lines array length to avoid skipping to a following line. 6603 var_start[varlen] = NUL; 6604 cctx->ctx_ufunc->uf_lines.ga_len = cctx->ctx_lnum + 1; 6605 res = compile_expr0(&p, cctx); 6606 var_start[varlen] = c; 6607 cctx->ctx_ufunc->uf_lines.ga_len = lines_len; 6608 if (res == FAIL || p != var_start + varlen) 6609 { 6610 // this should not happen 6611 if (res != FAIL) 6612 emsg(_(e_missbrac)); 6613 return FAIL; 6614 } 6615 6616 lhs->lhs_type = stack->ga_len == 0 ? &t_void 6617 : ((type_T **)stack->ga_data)[stack->ga_len - 1]; 6618 // now we can properly check the type 6619 if (rhs_type != NULL && lhs->lhs_type->tt_member != NULL 6620 && rhs_type != &t_void 6621 && need_type(rhs_type, lhs->lhs_type->tt_member, -2, 0, cctx, 6622 FALSE, FALSE) == FAIL) 6623 return FAIL; 6624 } 6625 else 6626 generate_loadvar(cctx, lhs->lhs_dest, lhs->lhs_name, 6627 lhs->lhs_lvar, lhs->lhs_type); 6628 return OK; 6629 } 6630 6631 /* 6632 * Produce code for loading "lhs" and also take care of an index. 6633 * Return OK/FAIL. 6634 */ 6635 static int 6636 compile_load_lhs_with_index(lhs_T *lhs, char_u *var_start, cctx_T *cctx) 6637 { 6638 compile_load_lhs(lhs, var_start, NULL, cctx); 6639 6640 if (lhs->lhs_has_index) 6641 { 6642 int range = FALSE; 6643 6644 // Get member from list or dict. First compile the 6645 // index value. 6646 if (compile_assign_index(var_start, lhs, &range, cctx) == FAIL) 6647 return FAIL; 6648 if (range) 6649 { 6650 semsg(_(e_cannot_use_range_with_assignment_operator_str), 6651 var_start); 6652 return FAIL; 6653 } 6654 6655 // Get the member. 6656 if (compile_member(FALSE, cctx) == FAIL) 6657 return FAIL; 6658 } 6659 return OK; 6660 } 6661 6662 /* 6663 * Assignment to a list or dict member, or ":unlet" for the item, using the 6664 * information in "lhs". 6665 * Returns OK or FAIL. 6666 */ 6667 static int 6668 compile_assign_unlet( 6669 char_u *var_start, 6670 lhs_T *lhs, 6671 int is_assign, 6672 type_T *rhs_type, 6673 cctx_T *cctx) 6674 { 6675 vartype_T dest_type; 6676 garray_T *stack = &cctx->ctx_type_stack; 6677 int range = FALSE; 6678 6679 if (compile_assign_index(var_start, lhs, &range, cctx) == FAIL) 6680 return FAIL; 6681 if (is_assign && range 6682 && lhs->lhs_type->tt_type != VAR_LIST 6683 && lhs->lhs_type != &t_blob 6684 && lhs->lhs_type != &t_any) 6685 { 6686 semsg(_(e_cannot_use_range_with_assignment_str), var_start); 6687 return FAIL; 6688 } 6689 6690 if (lhs->lhs_type == &t_any) 6691 { 6692 // Index on variable of unknown type: check at runtime. 6693 dest_type = VAR_ANY; 6694 } 6695 else 6696 { 6697 dest_type = lhs->lhs_type->tt_type; 6698 if (dest_type == VAR_DICT && range) 6699 { 6700 emsg(e_cannot_use_range_with_dictionary); 6701 return FAIL; 6702 } 6703 if (dest_type == VAR_DICT 6704 && may_generate_2STRING(-1, FALSE, cctx) == FAIL) 6705 return FAIL; 6706 if (dest_type == VAR_LIST || dest_type == VAR_BLOB) 6707 { 6708 type_T *type; 6709 6710 if (range) 6711 { 6712 type = ((type_T **)stack->ga_data)[stack->ga_len - 2]; 6713 if (need_type(type, &t_number, 6714 -1, 0, cctx, FALSE, FALSE) == FAIL) 6715 return FAIL; 6716 } 6717 type = ((type_T **)stack->ga_data)[stack->ga_len - 1]; 6718 if ((dest_type != VAR_BLOB && type != &t_special) 6719 && need_type(type, &t_number, 6720 -1, 0, cctx, FALSE, FALSE) == FAIL) 6721 return FAIL; 6722 } 6723 } 6724 6725 // Load the dict or list. On the stack we then have: 6726 // - value (for assignment, not for :unlet) 6727 // - index 6728 // - for [a : b] second index 6729 // - variable 6730 if (compile_load_lhs(lhs, var_start, rhs_type, cctx) == FAIL) 6731 return FAIL; 6732 6733 if (dest_type == VAR_LIST || dest_type == VAR_DICT 6734 || dest_type == VAR_BLOB || dest_type == VAR_ANY) 6735 { 6736 if (is_assign) 6737 { 6738 if (range) 6739 { 6740 if (generate_instr_drop(cctx, ISN_STORERANGE, 4) == NULL) 6741 return FAIL; 6742 } 6743 else 6744 { 6745 isn_T *isn = generate_instr_drop(cctx, ISN_STOREINDEX, 3); 6746 6747 if (isn == NULL) 6748 return FAIL; 6749 isn->isn_arg.vartype = dest_type; 6750 } 6751 } 6752 else if (range) 6753 { 6754 if (generate_instr_drop(cctx, ISN_UNLETRANGE, 3) == NULL) 6755 return FAIL; 6756 } 6757 else 6758 { 6759 if (generate_instr_drop(cctx, ISN_UNLETINDEX, 2) == NULL) 6760 return FAIL; 6761 } 6762 } 6763 else 6764 { 6765 emsg(_(e_indexable_type_required)); 6766 return FAIL; 6767 } 6768 6769 return OK; 6770 } 6771 6772 /* 6773 * Compile declaration and assignment: 6774 * "let name" 6775 * "var name = expr" 6776 * "final name = expr" 6777 * "const name = expr" 6778 * "name = expr" 6779 * "arg" points to "name". 6780 * "++arg" and "--arg" 6781 * Return NULL for an error. 6782 * Return "arg" if it does not look like a variable list. 6783 */ 6784 static char_u * 6785 compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx) 6786 { 6787 char_u *var_start; 6788 char_u *p; 6789 char_u *end = arg; 6790 char_u *ret = NULL; 6791 int var_count = 0; 6792 int var_idx; 6793 int semicolon = 0; 6794 int did_generate_slice = FALSE; 6795 garray_T *instr = &cctx->ctx_instr; 6796 garray_T *stack = &cctx->ctx_type_stack; 6797 char_u *op; 6798 int oplen = 0; 6799 int heredoc = FALSE; 6800 int incdec = FALSE; 6801 type_T *rhs_type = &t_any; 6802 char_u *sp; 6803 int is_decl = is_decl_command(cmdidx); 6804 lhs_T lhs; 6805 long start_lnum = SOURCING_LNUM; 6806 6807 // Skip over the "var" or "[var, var]" to get to any "=". 6808 p = skip_var_list(arg, TRUE, &var_count, &semicolon, TRUE); 6809 if (p == NULL) 6810 return *arg == '[' ? arg : NULL; 6811 6812 if (var_count > 0 && is_decl) 6813 { 6814 // TODO: should we allow this, and figure out type inference from list 6815 // members? 6816 emsg(_(e_cannot_use_list_for_declaration)); 6817 return NULL; 6818 } 6819 lhs.lhs_name = NULL; 6820 6821 sp = p; 6822 p = skipwhite(p); 6823 op = p; 6824 oplen = assignment_len(p, &heredoc); 6825 6826 if (var_count > 0 && oplen == 0) 6827 // can be something like "[1, 2]->func()" 6828 return arg; 6829 6830 if (oplen > 0 && (!VIM_ISWHITE(*sp) || !IS_WHITE_OR_NUL(op[oplen]))) 6831 { 6832 error_white_both(op, oplen); 6833 return NULL; 6834 } 6835 if (eap->cmdidx == CMD_increment || eap->cmdidx == CMD_decrement) 6836 { 6837 if (VIM_ISWHITE(eap->cmd[2])) 6838 { 6839 semsg(_(e_no_white_space_allowed_after_str_str), 6840 eap->cmdidx == CMD_increment ? "++" : "--", eap->cmd); 6841 return NULL; 6842 } 6843 op = (char_u *)(eap->cmdidx == CMD_increment ? "+=" : "-="); 6844 oplen = 2; 6845 incdec = TRUE; 6846 } 6847 6848 if (heredoc) 6849 { 6850 list_T *l; 6851 listitem_T *li; 6852 6853 // [let] varname =<< [trim] {end} 6854 eap->getline = exarg_getline; 6855 eap->cookie = cctx; 6856 l = heredoc_get(eap, op + 3, FALSE); 6857 if (l == NULL) 6858 return NULL; 6859 6860 if (cctx->ctx_skip != SKIP_YES) 6861 { 6862 // Push each line and the create the list. 6863 FOR_ALL_LIST_ITEMS(l, li) 6864 { 6865 generate_PUSHS(cctx, &li->li_tv.vval.v_string); 6866 li->li_tv.vval.v_string = NULL; 6867 } 6868 generate_NEWLIST(cctx, l->lv_len); 6869 } 6870 list_free(l); 6871 p += STRLEN(p); 6872 end = p; 6873 } 6874 else if (var_count > 0) 6875 { 6876 char_u *wp; 6877 6878 // for "[var, var] = expr" evaluate the expression here, loop over the 6879 // list of variables below. 6880 // A line break may follow the "=". 6881 6882 wp = op + oplen; 6883 if (may_get_next_line_error(wp, &p, cctx) == FAIL) 6884 return FAIL; 6885 if (compile_expr0(&p, cctx) == FAIL) 6886 return NULL; 6887 end = p; 6888 6889 if (cctx->ctx_skip != SKIP_YES) 6890 { 6891 type_T *stacktype; 6892 6893 stacktype = stack->ga_len == 0 ? &t_void 6894 : ((type_T **)stack->ga_data)[stack->ga_len - 1]; 6895 if (stacktype->tt_type == VAR_VOID) 6896 { 6897 emsg(_(e_cannot_use_void_value)); 6898 goto theend; 6899 } 6900 if (need_type(stacktype, &t_list_any, -1, 0, cctx, 6901 FALSE, FALSE) == FAIL) 6902 goto theend; 6903 // TODO: check the length of a constant list here 6904 generate_CHECKLEN(cctx, semicolon ? var_count - 1 : var_count, 6905 semicolon); 6906 if (stacktype->tt_member != NULL) 6907 rhs_type = stacktype->tt_member; 6908 } 6909 } 6910 6911 /* 6912 * Loop over variables in "[var, var] = expr". 6913 * For "var = expr" and "let var: type" this is done only once. 6914 */ 6915 if (var_count > 0) 6916 var_start = skipwhite(arg + 1); // skip over the "[" 6917 else 6918 var_start = arg; 6919 for (var_idx = 0; var_idx == 0 || var_idx < var_count; var_idx++) 6920 { 6921 int instr_count = -1; 6922 int save_lnum; 6923 6924 if (var_start[0] == '_' && !eval_isnamec(var_start[1])) 6925 { 6926 // Ignore underscore in "[a, _, b] = list". 6927 if (var_count > 0) 6928 { 6929 var_start = skipwhite(var_start + 2); 6930 continue; 6931 } 6932 emsg(_(e_cannot_use_underscore_here)); 6933 goto theend; 6934 } 6935 vim_free(lhs.lhs_name); 6936 6937 /* 6938 * Figure out the LHS type and other properties. 6939 */ 6940 if (compile_assign_lhs(var_start, &lhs, cmdidx, 6941 is_decl, heredoc, oplen, cctx) == FAIL) 6942 goto theend; 6943 if (heredoc) 6944 { 6945 SOURCING_LNUM = start_lnum; 6946 if (lhs.lhs_has_type 6947 && need_type(&t_list_string, lhs.lhs_type, 6948 -1, 0, cctx, FALSE, FALSE) == FAIL) 6949 goto theend; 6950 } 6951 else 6952 { 6953 if (cctx->ctx_skip == SKIP_YES) 6954 { 6955 if (oplen > 0 && var_count == 0) 6956 { 6957 // skip over the "=" and the expression 6958 p = skipwhite(op + oplen); 6959 (void)compile_expr0(&p, cctx); 6960 } 6961 } 6962 else if (oplen > 0) 6963 { 6964 int is_const = FALSE; 6965 char_u *wp; 6966 6967 // for "+=", "*=", "..=" etc. first load the current value 6968 if (*op != '=' 6969 && compile_load_lhs_with_index(&lhs, var_start, 6970 cctx) == FAIL) 6971 goto theend; 6972 6973 // For "var = expr" evaluate the expression. 6974 if (var_count == 0) 6975 { 6976 int r; 6977 6978 // Compile the expression. 6979 instr_count = instr->ga_len; 6980 if (incdec) 6981 { 6982 r = generate_PUSHNR(cctx, 1); 6983 } 6984 else 6985 { 6986 // Temporarily hide the new local variable here, it is 6987 // not available to this expression. 6988 if (lhs.lhs_new_local) 6989 --cctx->ctx_locals.ga_len; 6990 wp = op + oplen; 6991 if (may_get_next_line_error(wp, &p, cctx) == FAIL) 6992 { 6993 if (lhs.lhs_new_local) 6994 ++cctx->ctx_locals.ga_len; 6995 goto theend; 6996 } 6997 r = compile_expr0_ext(&p, cctx, &is_const); 6998 if (lhs.lhs_new_local) 6999 ++cctx->ctx_locals.ga_len; 7000 if (r == FAIL) 7001 goto theend; 7002 } 7003 } 7004 else if (semicolon && var_idx == var_count - 1) 7005 { 7006 // For "[var; var] = expr" get the rest of the list 7007 did_generate_slice = TRUE; 7008 if (generate_SLICE(cctx, var_count - 1) == FAIL) 7009 goto theend; 7010 } 7011 else 7012 { 7013 // For "[var, var] = expr" get the "var_idx" item from the 7014 // list. 7015 if (generate_GETITEM(cctx, var_idx, *op != '=') == FAIL) 7016 goto theend; 7017 } 7018 7019 rhs_type = stack->ga_len == 0 ? &t_void 7020 : ((type_T **)stack->ga_data)[stack->ga_len - 1]; 7021 if (lhs.lhs_lvar != NULL && (is_decl || !lhs.lhs_has_type)) 7022 { 7023 if ((rhs_type->tt_type == VAR_FUNC 7024 || rhs_type->tt_type == VAR_PARTIAL) 7025 && !lhs.lhs_has_index 7026 && var_wrong_func_name(lhs.lhs_name, TRUE)) 7027 goto theend; 7028 7029 if (lhs.lhs_new_local && !lhs.lhs_has_type) 7030 { 7031 if (rhs_type->tt_type == VAR_VOID) 7032 { 7033 emsg(_(e_cannot_use_void_value)); 7034 goto theend; 7035 } 7036 else 7037 { 7038 // An empty list or dict has a &t_unknown member, 7039 // for a variable that implies &t_any. 7040 if (rhs_type == &t_list_empty) 7041 lhs.lhs_lvar->lv_type = &t_list_any; 7042 else if (rhs_type == &t_dict_empty) 7043 lhs.lhs_lvar->lv_type = &t_dict_any; 7044 else if (rhs_type == &t_unknown) 7045 lhs.lhs_lvar->lv_type = &t_any; 7046 else 7047 lhs.lhs_lvar->lv_type = rhs_type; 7048 } 7049 } 7050 else if (*op == '=') 7051 { 7052 type_T *use_type = lhs.lhs_lvar->lv_type; 7053 where_T where = WHERE_INIT; 7054 7055 // Without operator check type here, otherwise below. 7056 // Use the line number of the assignment. 7057 SOURCING_LNUM = start_lnum; 7058 where.wt_index = var_count > 0 ? var_idx + 1 : 0; 7059 where.wt_variable = var_count > 0; 7060 // If assigning to a list or dict member, use the 7061 // member type. Not for "list[:] =". 7062 if (lhs.lhs_has_index 7063 && !has_list_index(var_start + lhs.lhs_varlen, 7064 cctx)) 7065 use_type = lhs.lhs_member_type; 7066 if (need_type_where(rhs_type, use_type, -1, where, 7067 cctx, FALSE, is_const) == FAIL) 7068 goto theend; 7069 } 7070 } 7071 else 7072 { 7073 type_T *lhs_type = lhs.lhs_member_type; 7074 7075 // Special case: assigning to @# can use a number or a 7076 // string. 7077 // Also: can assign a number to a float. 7078 if ((lhs_type == &t_number_or_string 7079 || lhs_type == &t_float) 7080 && rhs_type->tt_type == VAR_NUMBER) 7081 lhs_type = &t_number; 7082 if (*p != '=' && need_type(rhs_type, lhs_type, 7083 -1, 0, cctx, FALSE, FALSE) == FAIL) 7084 goto theend; 7085 } 7086 } 7087 else if (cmdidx == CMD_final) 7088 { 7089 emsg(_(e_final_requires_a_value)); 7090 goto theend; 7091 } 7092 else if (cmdidx == CMD_const) 7093 { 7094 emsg(_(e_const_requires_a_value)); 7095 goto theend; 7096 } 7097 else if (!lhs.lhs_has_type || lhs.lhs_dest == dest_option) 7098 { 7099 emsg(_(e_type_or_initialization_required)); 7100 goto theend; 7101 } 7102 else 7103 { 7104 // variables are always initialized 7105 if (GA_GROW_FAILS(instr, 1)) 7106 goto theend; 7107 switch (lhs.lhs_member_type->tt_type) 7108 { 7109 case VAR_BOOL: 7110 generate_PUSHBOOL(cctx, VVAL_FALSE); 7111 break; 7112 case VAR_FLOAT: 7113 #ifdef FEAT_FLOAT 7114 generate_PUSHF(cctx, 0.0); 7115 #endif 7116 break; 7117 case VAR_STRING: 7118 generate_PUSHS(cctx, NULL); 7119 break; 7120 case VAR_BLOB: 7121 generate_PUSHBLOB(cctx, blob_alloc()); 7122 break; 7123 case VAR_FUNC: 7124 generate_PUSHFUNC(cctx, NULL, &t_func_void); 7125 break; 7126 case VAR_LIST: 7127 generate_NEWLIST(cctx, 0); 7128 break; 7129 case VAR_DICT: 7130 generate_NEWDICT(cctx, 0); 7131 break; 7132 case VAR_JOB: 7133 generate_PUSHJOB(cctx, NULL); 7134 break; 7135 case VAR_CHANNEL: 7136 generate_PUSHCHANNEL(cctx, NULL); 7137 break; 7138 case VAR_NUMBER: 7139 case VAR_UNKNOWN: 7140 case VAR_ANY: 7141 case VAR_PARTIAL: 7142 case VAR_VOID: 7143 case VAR_INSTR: 7144 case VAR_SPECIAL: // cannot happen 7145 generate_PUSHNR(cctx, 0); 7146 break; 7147 } 7148 } 7149 if (var_count == 0) 7150 end = p; 7151 } 7152 7153 // no need to parse more when skipping 7154 if (cctx->ctx_skip == SKIP_YES) 7155 break; 7156 7157 if (oplen > 0 && *op != '=') 7158 { 7159 type_T *expected; 7160 type_T *stacktype = NULL; 7161 7162 if (*op == '.') 7163 { 7164 if (may_generate_2STRING(-1, FALSE, cctx) == FAIL) 7165 goto theend; 7166 } 7167 else 7168 { 7169 expected = lhs.lhs_member_type; 7170 stacktype = ((type_T **)stack->ga_data)[stack->ga_len - 1]; 7171 if ( 7172 #ifdef FEAT_FLOAT 7173 // If variable is float operation with number is OK. 7174 !(expected == &t_float && (stacktype == &t_number 7175 || stacktype == &t_number_bool)) && 7176 #endif 7177 need_type(stacktype, expected, -1, 0, cctx, 7178 FALSE, FALSE) == FAIL) 7179 goto theend; 7180 } 7181 7182 if (*op == '.') 7183 { 7184 if (generate_instr_drop(cctx, ISN_CONCAT, 1) == NULL) 7185 goto theend; 7186 } 7187 else if (*op == '+') 7188 { 7189 if (generate_add_instr(cctx, 7190 operator_type(lhs.lhs_member_type, stacktype), 7191 lhs.lhs_member_type, stacktype) == FAIL) 7192 goto theend; 7193 } 7194 else if (generate_two_op(cctx, op) == FAIL) 7195 goto theend; 7196 } 7197 7198 // Use the line number of the assignment for store instruction. 7199 save_lnum = cctx->ctx_lnum; 7200 cctx->ctx_lnum = start_lnum - 1; 7201 7202 if (lhs.lhs_has_index) 7203 { 7204 // Use the info in "lhs" to store the value at the index in the 7205 // list or dict. 7206 if (compile_assign_unlet(var_start, &lhs, TRUE, rhs_type, cctx) 7207 == FAIL) 7208 { 7209 cctx->ctx_lnum = save_lnum; 7210 goto theend; 7211 } 7212 } 7213 else 7214 { 7215 if (is_decl && cmdidx == CMD_const && (lhs.lhs_dest == dest_script 7216 || lhs.lhs_dest == dest_global 7217 || lhs.lhs_dest == dest_local)) 7218 // ":const var": lock the value, but not referenced variables 7219 generate_LOCKCONST(cctx); 7220 7221 if (is_decl 7222 && (lhs.lhs_type->tt_type == VAR_DICT 7223 || lhs.lhs_type->tt_type == VAR_LIST) 7224 && lhs.lhs_type->tt_member != NULL 7225 && !(lhs.lhs_type->tt_member == &t_any 7226 && oplen > 0 7227 && rhs_type != NULL 7228 && rhs_type->tt_type == lhs.lhs_type->tt_type 7229 && rhs_type->tt_member != &t_unknown) 7230 && lhs.lhs_type->tt_member != &t_unknown) 7231 // Set the type in the list or dict, so that it can be checked, 7232 // also in legacy script. Not for "list<any> = val", then the 7233 // type of "val" is used. 7234 generate_SETTYPE(cctx, lhs.lhs_type); 7235 7236 if (generate_store_lhs(cctx, &lhs, instr_count) == FAIL) 7237 { 7238 cctx->ctx_lnum = save_lnum; 7239 goto theend; 7240 } 7241 } 7242 cctx->ctx_lnum = save_lnum; 7243 7244 if (var_idx + 1 < var_count) 7245 var_start = skipwhite(lhs.lhs_dest_end + 1); 7246 } 7247 7248 // For "[var, var] = expr" drop the "expr" value. 7249 // Also for "[var, var; _] = expr". 7250 if (var_count > 0 && (!semicolon || !did_generate_slice)) 7251 { 7252 if (generate_instr_drop(cctx, ISN_DROP, 1) == NULL) 7253 goto theend; 7254 } 7255 7256 ret = skipwhite(end); 7257 7258 theend: 7259 vim_free(lhs.lhs_name); 7260 return ret; 7261 } 7262 7263 /* 7264 * Check for an assignment at "eap->cmd", compile it if found. 7265 * Return NOTDONE if there is none, FAIL for failure, OK if done. 7266 */ 7267 static int 7268 may_compile_assignment(exarg_T *eap, char_u **line, cctx_T *cctx) 7269 { 7270 char_u *pskip; 7271 char_u *p; 7272 7273 // Assuming the command starts with a variable or function name, 7274 // find what follows. 7275 // Skip over "var.member", "var[idx]" and the like. 7276 // Also "&opt = val", "$ENV = val" and "@r = val". 7277 pskip = (*eap->cmd == '&' || *eap->cmd == '$' || *eap->cmd == '@') 7278 ? eap->cmd + 1 : eap->cmd; 7279 p = to_name_end(pskip, TRUE); 7280 if (p > eap->cmd && *p != NUL) 7281 { 7282 char_u *var_end; 7283 int oplen; 7284 int heredoc; 7285 7286 if (eap->cmd[0] == '@') 7287 var_end = eap->cmd + 2; 7288 else 7289 var_end = find_name_end(pskip, NULL, NULL, 7290 FNE_CHECK_START | FNE_INCL_BR); 7291 oplen = assignment_len(skipwhite(var_end), &heredoc); 7292 if (oplen > 0) 7293 { 7294 size_t len = p - eap->cmd; 7295 7296 // Recognize an assignment if we recognize the variable 7297 // name: 7298 // "g:var = expr" 7299 // "local = expr" where "local" is a local var. 7300 // "script = expr" where "script" is a script-local var. 7301 // "import = expr" where "import" is an imported var 7302 // "&opt = expr" 7303 // "$ENV = expr" 7304 // "@r = expr" 7305 if (*eap->cmd == '&' 7306 || *eap->cmd == '$' 7307 || *eap->cmd == '@' 7308 || ((len) > 2 && eap->cmd[1] == ':') 7309 || variable_exists(eap->cmd, len, cctx)) 7310 { 7311 *line = compile_assignment(eap->cmd, eap, CMD_SIZE, cctx); 7312 if (*line == NULL || *line == eap->cmd) 7313 return FAIL; 7314 return OK; 7315 } 7316 } 7317 } 7318 7319 if (*eap->cmd == '[') 7320 { 7321 // [var, var] = expr 7322 *line = compile_assignment(eap->cmd, eap, CMD_SIZE, cctx); 7323 if (*line == NULL) 7324 return FAIL; 7325 if (*line != eap->cmd) 7326 return OK; 7327 } 7328 return NOTDONE; 7329 } 7330 7331 /* 7332 * Check if "name" can be "unlet". 7333 */ 7334 int 7335 check_vim9_unlet(char_u *name) 7336 { 7337 if (name[1] != ':' || vim_strchr((char_u *)"gwtb", *name) == NULL) 7338 { 7339 // "unlet s:var" is allowed in legacy script. 7340 if (*name == 's' && !script_is_vim9()) 7341 return OK; 7342 semsg(_(e_cannot_unlet_str), name); 7343 return FAIL; 7344 } 7345 return OK; 7346 } 7347 7348 /* 7349 * Callback passed to ex_unletlock(). 7350 */ 7351 static int 7352 compile_unlet( 7353 lval_T *lvp, 7354 char_u *name_end, 7355 exarg_T *eap, 7356 int deep UNUSED, 7357 void *coookie) 7358 { 7359 cctx_T *cctx = coookie; 7360 char_u *p = lvp->ll_name; 7361 int cc = *name_end; 7362 int ret = OK; 7363 7364 if (cctx->ctx_skip == SKIP_YES) 7365 return OK; 7366 7367 *name_end = NUL; 7368 if (*p == '$') 7369 { 7370 // :unlet $ENV_VAR 7371 ret = generate_UNLET(cctx, ISN_UNLETENV, p + 1, eap->forceit); 7372 } 7373 else if (vim_strchr(p, '.') != NULL || vim_strchr(p, '[') != NULL) 7374 { 7375 lhs_T lhs; 7376 7377 // This is similar to assigning: lookup the list/dict, compile the 7378 // idx/key. Then instead of storing the value unlet the item. 7379 // unlet {list}[idx] 7380 // unlet {dict}[key] dict.key 7381 // 7382 // Figure out the LHS type and other properties. 7383 // 7384 ret = compile_lhs(p, &lhs, CMD_unlet, FALSE, 0, cctx); 7385 7386 // : unlet an indexed item 7387 if (!lhs.lhs_has_index) 7388 { 7389 iemsg("called compile_lhs() without an index"); 7390 ret = FAIL; 7391 } 7392 else 7393 { 7394 // Use the info in "lhs" to unlet the item at the index in the 7395 // list or dict. 7396 ret = compile_assign_unlet(p, &lhs, FALSE, &t_void, cctx); 7397 } 7398 7399 vim_free(lhs.lhs_name); 7400 } 7401 else if (check_vim9_unlet(p) == FAIL) 7402 { 7403 ret = FAIL; 7404 } 7405 else 7406 { 7407 // Normal name. Only supports g:, w:, t: and b: namespaces. 7408 ret = generate_UNLET(cctx, ISN_UNLET, p, eap->forceit); 7409 } 7410 7411 *name_end = cc; 7412 return ret; 7413 } 7414 7415 /* 7416 * Callback passed to ex_unletlock(). 7417 */ 7418 static int 7419 compile_lock_unlock( 7420 lval_T *lvp, 7421 char_u *name_end, 7422 exarg_T *eap, 7423 int deep UNUSED, 7424 void *coookie) 7425 { 7426 cctx_T *cctx = coookie; 7427 int cc = *name_end; 7428 char_u *p = lvp->ll_name; 7429 int ret = OK; 7430 size_t len; 7431 char_u *buf; 7432 isntype_T isn = ISN_EXEC; 7433 7434 if (cctx->ctx_skip == SKIP_YES) 7435 return OK; 7436 7437 // Cannot use :lockvar and :unlockvar on local variables. 7438 if (p[1] != ':') 7439 { 7440 char_u *end = find_name_end(p, NULL, NULL, FNE_CHECK_START); 7441 7442 if (lookup_local(p, end - p, NULL, cctx) == OK) 7443 { 7444 char_u *s = p; 7445 7446 if (*end != '.' && *end != '[') 7447 { 7448 emsg(_(e_cannot_lock_unlock_local_variable)); 7449 return FAIL; 7450 } 7451 7452 // For "d.member" put the local variable on the stack, it will be 7453 // passed to ex_lockvar() indirectly. 7454 if (compile_load(&s, end, cctx, FALSE, FALSE) == FAIL) 7455 return FAIL; 7456 isn = ISN_LOCKUNLOCK; 7457 } 7458 } 7459 7460 // Checking is done at runtime. 7461 *name_end = NUL; 7462 len = name_end - p + 20; 7463 buf = alloc(len); 7464 if (buf == NULL) 7465 ret = FAIL; 7466 else 7467 { 7468 vim_snprintf((char *)buf, len, "%s %s", 7469 eap->cmdidx == CMD_lockvar ? "lockvar" : "unlockvar", 7470 p); 7471 ret = generate_EXEC(cctx, isn, buf); 7472 7473 vim_free(buf); 7474 *name_end = cc; 7475 } 7476 return ret; 7477 } 7478 7479 /* 7480 * compile "unlet var", "lock var" and "unlock var" 7481 * "arg" points to "var". 7482 */ 7483 static char_u * 7484 compile_unletlock(char_u *arg, exarg_T *eap, cctx_T *cctx) 7485 { 7486 ex_unletlock(eap, arg, 0, GLV_NO_AUTOLOAD | GLV_COMPILING, 7487 eap->cmdidx == CMD_unlet ? compile_unlet : compile_lock_unlock, 7488 cctx); 7489 return eap->nextcmd == NULL ? (char_u *)"" : eap->nextcmd; 7490 } 7491 7492 /* 7493 * generate a jump to the ":endif"/":endfor"/":endwhile"/":finally"/":endtry". 7494 */ 7495 static int 7496 compile_jump_to_end(endlabel_T **el, jumpwhen_T when, cctx_T *cctx) 7497 { 7498 garray_T *instr = &cctx->ctx_instr; 7499 endlabel_T *endlabel = ALLOC_CLEAR_ONE(endlabel_T); 7500 7501 if (endlabel == NULL) 7502 return FAIL; 7503 endlabel->el_next = *el; 7504 *el = endlabel; 7505 endlabel->el_end_label = instr->ga_len; 7506 7507 generate_JUMP(cctx, when, 0); 7508 return OK; 7509 } 7510 7511 static void 7512 compile_fill_jump_to_end(endlabel_T **el, int jump_where, cctx_T *cctx) 7513 { 7514 garray_T *instr = &cctx->ctx_instr; 7515 7516 while (*el != NULL) 7517 { 7518 endlabel_T *cur = (*el); 7519 isn_T *isn; 7520 7521 isn = ((isn_T *)instr->ga_data) + cur->el_end_label; 7522 isn->isn_arg.jump.jump_where = jump_where; 7523 *el = cur->el_next; 7524 vim_free(cur); 7525 } 7526 } 7527 7528 static void 7529 compile_free_jump_to_end(endlabel_T **el) 7530 { 7531 while (*el != NULL) 7532 { 7533 endlabel_T *cur = (*el); 7534 7535 *el = cur->el_next; 7536 vim_free(cur); 7537 } 7538 } 7539 7540 /* 7541 * Create a new scope and set up the generic items. 7542 */ 7543 static scope_T * 7544 new_scope(cctx_T *cctx, scopetype_T type) 7545 { 7546 scope_T *scope = ALLOC_CLEAR_ONE(scope_T); 7547 7548 if (scope == NULL) 7549 return NULL; 7550 scope->se_outer = cctx->ctx_scope; 7551 cctx->ctx_scope = scope; 7552 scope->se_type = type; 7553 scope->se_local_count = cctx->ctx_locals.ga_len; 7554 return scope; 7555 } 7556 7557 /* 7558 * Free the current scope and go back to the outer scope. 7559 */ 7560 static void 7561 drop_scope(cctx_T *cctx) 7562 { 7563 scope_T *scope = cctx->ctx_scope; 7564 7565 if (scope == NULL) 7566 { 7567 iemsg("calling drop_scope() without a scope"); 7568 return; 7569 } 7570 cctx->ctx_scope = scope->se_outer; 7571 switch (scope->se_type) 7572 { 7573 case IF_SCOPE: 7574 compile_free_jump_to_end(&scope->se_u.se_if.is_end_label); break; 7575 case FOR_SCOPE: 7576 compile_free_jump_to_end(&scope->se_u.se_for.fs_end_label); break; 7577 case WHILE_SCOPE: 7578 compile_free_jump_to_end(&scope->se_u.se_while.ws_end_label); break; 7579 case TRY_SCOPE: 7580 compile_free_jump_to_end(&scope->se_u.se_try.ts_end_label); break; 7581 case NO_SCOPE: 7582 case BLOCK_SCOPE: 7583 break; 7584 } 7585 vim_free(scope); 7586 } 7587 7588 /* 7589 * compile "if expr" 7590 * 7591 * "if expr" Produces instructions: 7592 * EVAL expr Push result of "expr" 7593 * JUMP_IF_FALSE end 7594 * ... body ... 7595 * end: 7596 * 7597 * "if expr | else" Produces instructions: 7598 * EVAL expr Push result of "expr" 7599 * JUMP_IF_FALSE else 7600 * ... body ... 7601 * JUMP_ALWAYS end 7602 * else: 7603 * ... body ... 7604 * end: 7605 * 7606 * "if expr1 | elseif expr2 | else" Produces instructions: 7607 * EVAL expr Push result of "expr" 7608 * JUMP_IF_FALSE elseif 7609 * ... body ... 7610 * JUMP_ALWAYS end 7611 * elseif: 7612 * EVAL expr Push result of "expr" 7613 * JUMP_IF_FALSE else 7614 * ... body ... 7615 * JUMP_ALWAYS end 7616 * else: 7617 * ... body ... 7618 * end: 7619 */ 7620 static char_u * 7621 compile_if(char_u *arg, cctx_T *cctx) 7622 { 7623 char_u *p = arg; 7624 garray_T *instr = &cctx->ctx_instr; 7625 int instr_count = instr->ga_len; 7626 scope_T *scope; 7627 skip_T skip_save = cctx->ctx_skip; 7628 ppconst_T ppconst; 7629 7630 CLEAR_FIELD(ppconst); 7631 if (compile_expr1(&p, cctx, &ppconst) == FAIL) 7632 { 7633 clear_ppconst(&ppconst); 7634 return NULL; 7635 } 7636 if (!ends_excmd2(arg, skipwhite(p))) 7637 { 7638 semsg(_(e_trailing_arg), p); 7639 return NULL; 7640 } 7641 if (cctx->ctx_skip == SKIP_YES) 7642 clear_ppconst(&ppconst); 7643 else if (instr->ga_len == instr_count && ppconst.pp_used == 1) 7644 { 7645 int error = FALSE; 7646 int v; 7647 7648 // The expression results in a constant. 7649 v = tv_get_bool_chk(&ppconst.pp_tv[0], &error); 7650 clear_ppconst(&ppconst); 7651 if (error) 7652 return NULL; 7653 cctx->ctx_skip = v ? SKIP_NOT : SKIP_YES; 7654 } 7655 else 7656 { 7657 // Not a constant, generate instructions for the expression. 7658 cctx->ctx_skip = SKIP_UNKNOWN; 7659 if (generate_ppconst(cctx, &ppconst) == FAIL) 7660 return NULL; 7661 if (bool_on_stack(cctx) == FAIL) 7662 return NULL; 7663 } 7664 7665 // CMDMOD_REV must come before the jump 7666 generate_undo_cmdmods(cctx); 7667 7668 scope = new_scope(cctx, IF_SCOPE); 7669 if (scope == NULL) 7670 return NULL; 7671 scope->se_skip_save = skip_save; 7672 // "is_had_return" will be reset if any block does not end in :return 7673 scope->se_u.se_if.is_had_return = TRUE; 7674 7675 if (cctx->ctx_skip == SKIP_UNKNOWN) 7676 { 7677 // "where" is set when ":elseif", "else" or ":endif" is found 7678 scope->se_u.se_if.is_if_label = instr->ga_len; 7679 generate_JUMP(cctx, JUMP_IF_FALSE, 0); 7680 } 7681 else 7682 scope->se_u.se_if.is_if_label = -1; 7683 7684 #ifdef FEAT_PROFILE 7685 if (cctx->ctx_compile_type == CT_PROFILE && cctx->ctx_skip == SKIP_YES 7686 && skip_save != SKIP_YES) 7687 { 7688 // generated a profile start, need to generate a profile end, since it 7689 // won't be done after returning 7690 cctx->ctx_skip = SKIP_NOT; 7691 generate_instr(cctx, ISN_PROF_END); 7692 cctx->ctx_skip = SKIP_YES; 7693 } 7694 #endif 7695 7696 return p; 7697 } 7698 7699 static char_u * 7700 compile_elseif(char_u *arg, cctx_T *cctx) 7701 { 7702 char_u *p = arg; 7703 garray_T *instr = &cctx->ctx_instr; 7704 int instr_count = instr->ga_len; 7705 isn_T *isn; 7706 scope_T *scope = cctx->ctx_scope; 7707 ppconst_T ppconst; 7708 skip_T save_skip = cctx->ctx_skip; 7709 7710 if (scope == NULL || scope->se_type != IF_SCOPE) 7711 { 7712 emsg(_(e_elseif_without_if)); 7713 return NULL; 7714 } 7715 unwind_locals(cctx, scope->se_local_count); 7716 if (!cctx->ctx_had_return) 7717 scope->se_u.se_if.is_had_return = FALSE; 7718 7719 if (cctx->ctx_skip == SKIP_NOT) 7720 { 7721 // previous block was executed, this one and following will not 7722 cctx->ctx_skip = SKIP_YES; 7723 scope->se_u.se_if.is_seen_skip_not = TRUE; 7724 } 7725 if (scope->se_u.se_if.is_seen_skip_not) 7726 { 7727 // A previous block was executed, skip over expression and bail out. 7728 // Do not count the "elseif" for profiling and cmdmod 7729 instr->ga_len = current_instr_idx(cctx); 7730 7731 skip_expr_cctx(&p, cctx); 7732 return p; 7733 } 7734 7735 if (cctx->ctx_skip == SKIP_UNKNOWN) 7736 { 7737 int moved_cmdmod = FALSE; 7738 7739 // Move any CMDMOD instruction to after the jump 7740 if (((isn_T *)instr->ga_data)[instr->ga_len - 1].isn_type == ISN_CMDMOD) 7741 { 7742 if (GA_GROW_FAILS(instr, 1)) 7743 return NULL; 7744 ((isn_T *)instr->ga_data)[instr->ga_len] = 7745 ((isn_T *)instr->ga_data)[instr->ga_len - 1]; 7746 --instr->ga_len; 7747 moved_cmdmod = TRUE; 7748 } 7749 7750 if (compile_jump_to_end(&scope->se_u.se_if.is_end_label, 7751 JUMP_ALWAYS, cctx) == FAIL) 7752 return NULL; 7753 // previous "if" or "elseif" jumps here 7754 isn = ((isn_T *)instr->ga_data) + scope->se_u.se_if.is_if_label; 7755 isn->isn_arg.jump.jump_where = instr->ga_len; 7756 if (moved_cmdmod) 7757 ++instr->ga_len; 7758 } 7759 7760 // compile "expr"; if we know it evaluates to FALSE skip the block 7761 CLEAR_FIELD(ppconst); 7762 if (cctx->ctx_skip == SKIP_YES) 7763 { 7764 cctx->ctx_skip = SKIP_UNKNOWN; 7765 #ifdef FEAT_PROFILE 7766 if (cctx->ctx_compile_type == CT_PROFILE) 7767 { 7768 // the previous block was skipped, need to profile this line 7769 generate_instr(cctx, ISN_PROF_START); 7770 instr_count = instr->ga_len; 7771 } 7772 #endif 7773 if (cctx->ctx_compile_type == CT_DEBUG) 7774 { 7775 // the previous block was skipped, may want to debug this line 7776 generate_instr_debug(cctx); 7777 instr_count = instr->ga_len; 7778 } 7779 } 7780 if (compile_expr1(&p, cctx, &ppconst) == FAIL) 7781 { 7782 clear_ppconst(&ppconst); 7783 return NULL; 7784 } 7785 cctx->ctx_skip = save_skip; 7786 if (!ends_excmd2(arg, skipwhite(p))) 7787 { 7788 semsg(_(e_trailing_arg), p); 7789 return NULL; 7790 } 7791 if (scope->se_skip_save == SKIP_YES) 7792 clear_ppconst(&ppconst); 7793 else if (instr->ga_len == instr_count && ppconst.pp_used == 1) 7794 { 7795 int error = FALSE; 7796 int v; 7797 7798 // The expression results in a constant. 7799 // TODO: how about nesting? 7800 v = tv_get_bool_chk(&ppconst.pp_tv[0], &error); 7801 if (error) 7802 return NULL; 7803 cctx->ctx_skip = v ? SKIP_NOT : SKIP_YES; 7804 clear_ppconst(&ppconst); 7805 scope->se_u.se_if.is_if_label = -1; 7806 } 7807 else 7808 { 7809 // Not a constant, generate instructions for the expression. 7810 cctx->ctx_skip = SKIP_UNKNOWN; 7811 if (generate_ppconst(cctx, &ppconst) == FAIL) 7812 return NULL; 7813 if (bool_on_stack(cctx) == FAIL) 7814 return NULL; 7815 7816 // CMDMOD_REV must come before the jump 7817 generate_undo_cmdmods(cctx); 7818 7819 // "where" is set when ":elseif", "else" or ":endif" is found 7820 scope->se_u.se_if.is_if_label = instr->ga_len; 7821 generate_JUMP(cctx, JUMP_IF_FALSE, 0); 7822 } 7823 7824 return p; 7825 } 7826 7827 static char_u * 7828 compile_else(char_u *arg, cctx_T *cctx) 7829 { 7830 char_u *p = arg; 7831 garray_T *instr = &cctx->ctx_instr; 7832 isn_T *isn; 7833 scope_T *scope = cctx->ctx_scope; 7834 7835 if (scope == NULL || scope->se_type != IF_SCOPE) 7836 { 7837 emsg(_(e_else_without_if)); 7838 return NULL; 7839 } 7840 unwind_locals(cctx, scope->se_local_count); 7841 if (!cctx->ctx_had_return) 7842 scope->se_u.se_if.is_had_return = FALSE; 7843 scope->se_u.se_if.is_seen_else = TRUE; 7844 7845 #ifdef FEAT_PROFILE 7846 if (cctx->ctx_compile_type == CT_PROFILE) 7847 { 7848 if (cctx->ctx_skip == SKIP_NOT 7849 && ((isn_T *)instr->ga_data)[instr->ga_len - 1] 7850 .isn_type == ISN_PROF_START) 7851 // the previous block was executed, do not count "else" for 7852 // profiling 7853 --instr->ga_len; 7854 if (cctx->ctx_skip == SKIP_YES && !scope->se_u.se_if.is_seen_skip_not) 7855 { 7856 // the previous block was not executed, this one will, do count the 7857 // "else" for profiling 7858 cctx->ctx_skip = SKIP_NOT; 7859 generate_instr(cctx, ISN_PROF_END); 7860 generate_instr(cctx, ISN_PROF_START); 7861 cctx->ctx_skip = SKIP_YES; 7862 } 7863 } 7864 #endif 7865 7866 if (!scope->se_u.se_if.is_seen_skip_not && scope->se_skip_save != SKIP_YES) 7867 { 7868 // jump from previous block to the end, unless the else block is empty 7869 if (cctx->ctx_skip == SKIP_UNKNOWN) 7870 { 7871 if (!cctx->ctx_had_return 7872 && compile_jump_to_end(&scope->se_u.se_if.is_end_label, 7873 JUMP_ALWAYS, cctx) == FAIL) 7874 return NULL; 7875 } 7876 7877 if (cctx->ctx_skip == SKIP_UNKNOWN) 7878 { 7879 if (scope->se_u.se_if.is_if_label >= 0) 7880 { 7881 // previous "if" or "elseif" jumps here 7882 isn = ((isn_T *)instr->ga_data) + scope->se_u.se_if.is_if_label; 7883 isn->isn_arg.jump.jump_where = instr->ga_len; 7884 scope->se_u.se_if.is_if_label = -1; 7885 } 7886 } 7887 7888 if (cctx->ctx_skip != SKIP_UNKNOWN) 7889 cctx->ctx_skip = cctx->ctx_skip == SKIP_YES ? SKIP_NOT : SKIP_YES; 7890 } 7891 7892 return p; 7893 } 7894 7895 static char_u * 7896 compile_endif(char_u *arg, cctx_T *cctx) 7897 { 7898 scope_T *scope = cctx->ctx_scope; 7899 ifscope_T *ifscope; 7900 garray_T *instr = &cctx->ctx_instr; 7901 isn_T *isn; 7902 7903 if (misplaced_cmdmod(cctx)) 7904 return NULL; 7905 7906 if (scope == NULL || scope->se_type != IF_SCOPE) 7907 { 7908 emsg(_(e_endif_without_if)); 7909 return NULL; 7910 } 7911 ifscope = &scope->se_u.se_if; 7912 unwind_locals(cctx, scope->se_local_count); 7913 if (!cctx->ctx_had_return) 7914 ifscope->is_had_return = FALSE; 7915 7916 if (scope->se_u.se_if.is_if_label >= 0) 7917 { 7918 // previous "if" or "elseif" jumps here 7919 isn = ((isn_T *)instr->ga_data) + scope->se_u.se_if.is_if_label; 7920 isn->isn_arg.jump.jump_where = instr->ga_len; 7921 } 7922 // Fill in the "end" label in jumps at the end of the blocks. 7923 compile_fill_jump_to_end(&ifscope->is_end_label, instr->ga_len, cctx); 7924 7925 #ifdef FEAT_PROFILE 7926 // even when skipping we count the endif as executed, unless the block it's 7927 // in is skipped 7928 if (cctx->ctx_compile_type == CT_PROFILE && cctx->ctx_skip == SKIP_YES 7929 && scope->se_skip_save != SKIP_YES) 7930 { 7931 cctx->ctx_skip = SKIP_NOT; 7932 generate_instr(cctx, ISN_PROF_START); 7933 } 7934 #endif 7935 cctx->ctx_skip = scope->se_skip_save; 7936 7937 // If all the blocks end in :return and there is an :else then the 7938 // had_return flag is set. 7939 cctx->ctx_had_return = ifscope->is_had_return && ifscope->is_seen_else; 7940 7941 drop_scope(cctx); 7942 return arg; 7943 } 7944 7945 /* 7946 * Compile "for var in expr": 7947 * 7948 * Produces instructions: 7949 * PUSHNR -1 7950 * STORE loop-idx Set index to -1 7951 * EVAL expr result of "expr" on top of stack 7952 * top: FOR loop-idx, end Increment index, use list on bottom of stack 7953 * - if beyond end, jump to "end" 7954 * - otherwise get item from list and push it 7955 * STORE var Store item in "var" 7956 * ... body ... 7957 * JUMP top Jump back to repeat 7958 * end: DROP Drop the result of "expr" 7959 * 7960 * Compile "for [var1, var2] in expr" - as above, but instead of "STORE var": 7961 * UNPACK 2 Split item in 2 7962 * STORE var1 Store item in "var1" 7963 * STORE var2 Store item in "var2" 7964 */ 7965 static char_u * 7966 compile_for(char_u *arg_start, cctx_T *cctx) 7967 { 7968 char_u *arg; 7969 char_u *arg_end; 7970 char_u *name = NULL; 7971 char_u *p; 7972 char_u *wp; 7973 int var_count = 0; 7974 int var_list = FALSE; 7975 int semicolon = FALSE; 7976 size_t varlen; 7977 garray_T *stack = &cctx->ctx_type_stack; 7978 garray_T *instr = &cctx->ctx_instr; 7979 scope_T *scope; 7980 lvar_T *loop_lvar; // loop iteration variable 7981 lvar_T *var_lvar; // variable for "var" 7982 type_T *vartype; 7983 type_T *item_type = &t_any; 7984 int idx; 7985 int prev_lnum = cctx->ctx_prev_lnum; 7986 7987 p = skip_var_list(arg_start, TRUE, &var_count, &semicolon, FALSE); 7988 if (p == NULL) 7989 return NULL; 7990 if (var_count == 0) 7991 var_count = 1; 7992 else 7993 var_list = TRUE; // can also be a list of one variable 7994 7995 // consume "in" 7996 wp = p; 7997 if (may_get_next_line_error(wp, &p, cctx) == FAIL) 7998 return NULL; 7999 if (STRNCMP(p, "in", 2) != 0 || !IS_WHITE_OR_NUL(p[2])) 8000 { 8001 if (*p == ':' && wp != p) 8002 semsg(_(e_no_white_space_allowed_before_colon_str), p); 8003 else 8004 emsg(_(e_missing_in)); 8005 return NULL; 8006 } 8007 wp = p + 2; 8008 if (may_get_next_line_error(wp, &p, cctx) == FAIL) 8009 return NULL; 8010 8011 // Remove the already generated ISN_DEBUG, it is written below the ISN_FOR 8012 // instruction. 8013 if (cctx->ctx_compile_type == CT_DEBUG && instr->ga_len > 0 8014 && ((isn_T *)instr->ga_data)[instr->ga_len - 1] 8015 .isn_type == ISN_DEBUG) 8016 { 8017 --instr->ga_len; 8018 prev_lnum = ((isn_T *)instr->ga_data)[instr->ga_len] 8019 .isn_arg.debug.dbg_break_lnum; 8020 } 8021 8022 scope = new_scope(cctx, FOR_SCOPE); 8023 if (scope == NULL) 8024 return NULL; 8025 8026 // Reserve a variable to store the loop iteration counter and initialize it 8027 // to -1. 8028 loop_lvar = reserve_local(cctx, (char_u *)"", 0, FALSE, &t_number); 8029 if (loop_lvar == NULL) 8030 { 8031 // out of memory 8032 drop_scope(cctx); 8033 return NULL; 8034 } 8035 generate_STORENR(cctx, loop_lvar->lv_idx, -1); 8036 8037 // compile "expr", it remains on the stack until "endfor" 8038 arg = p; 8039 if (compile_expr0(&arg, cctx) == FAIL) 8040 { 8041 drop_scope(cctx); 8042 return NULL; 8043 } 8044 arg_end = arg; 8045 8046 // If we know the type of "var" and it is a not a supported type we can 8047 // give an error now. 8048 vartype = ((type_T **)stack->ga_data)[stack->ga_len - 1]; 8049 if (vartype->tt_type != VAR_LIST && vartype->tt_type != VAR_STRING 8050 && vartype->tt_type != VAR_BLOB && vartype->tt_type != VAR_ANY) 8051 { 8052 semsg(_(e_for_loop_on_str_not_supported), 8053 vartype_name(vartype->tt_type)); 8054 drop_scope(cctx); 8055 return NULL; 8056 } 8057 8058 if (vartype->tt_type == VAR_STRING) 8059 item_type = &t_string; 8060 else if (vartype->tt_type == VAR_BLOB) 8061 item_type = &t_number; 8062 else if (vartype->tt_type == VAR_LIST 8063 && vartype->tt_member->tt_type != VAR_ANY) 8064 { 8065 if (!var_list) 8066 item_type = vartype->tt_member; 8067 else if (vartype->tt_member->tt_type == VAR_LIST 8068 && vartype->tt_member->tt_member->tt_type != VAR_ANY) 8069 // TODO: should get the type for each lhs 8070 item_type = vartype->tt_member->tt_member; 8071 } 8072 8073 // CMDMOD_REV must come before the FOR instruction. 8074 generate_undo_cmdmods(cctx); 8075 8076 // "for_end" is set when ":endfor" is found 8077 scope->se_u.se_for.fs_top_label = current_instr_idx(cctx); 8078 8079 generate_FOR(cctx, loop_lvar->lv_idx); 8080 8081 arg = arg_start; 8082 if (var_list) 8083 { 8084 generate_UNPACK(cctx, var_count, semicolon); 8085 arg = skipwhite(arg + 1); // skip white after '[' 8086 8087 // the list item is replaced by a number of items 8088 if (GA_GROW_FAILS(stack, var_count - 1)) 8089 { 8090 drop_scope(cctx); 8091 return NULL; 8092 } 8093 --stack->ga_len; 8094 for (idx = 0; idx < var_count; ++idx) 8095 { 8096 ((type_T **)stack->ga_data)[stack->ga_len] = 8097 (semicolon && idx == 0) ? vartype : item_type; 8098 ++stack->ga_len; 8099 } 8100 } 8101 8102 for (idx = 0; idx < var_count; ++idx) 8103 { 8104 assign_dest_T dest = dest_local; 8105 int opt_flags = 0; 8106 int vimvaridx = -1; 8107 type_T *type = &t_any; 8108 type_T *lhs_type = &t_any; 8109 where_T where = WHERE_INIT; 8110 8111 p = skip_var_one(arg, FALSE); 8112 varlen = p - arg; 8113 name = vim_strnsave(arg, varlen); 8114 if (name == NULL) 8115 goto failed; 8116 if (*p == ':') 8117 { 8118 p = skipwhite(p + 1); 8119 lhs_type = parse_type(&p, cctx->ctx_type_list, TRUE); 8120 } 8121 8122 // TODO: script var not supported? 8123 if (get_var_dest(name, &dest, CMD_for, &opt_flags, 8124 &vimvaridx, &type, cctx) == FAIL) 8125 goto failed; 8126 if (dest != dest_local) 8127 { 8128 if (generate_store_var(cctx, dest, opt_flags, vimvaridx, 8129 0, 0, type, name) == FAIL) 8130 goto failed; 8131 } 8132 else if (varlen == 1 && *arg == '_') 8133 { 8134 // Assigning to "_": drop the value. 8135 if (generate_instr_drop(cctx, ISN_DROP, 1) == NULL) 8136 goto failed; 8137 } 8138 else 8139 { 8140 if (lookup_local(arg, varlen, NULL, cctx) == OK) 8141 { 8142 semsg(_(e_variable_already_declared), arg); 8143 goto failed; 8144 } 8145 8146 if (STRNCMP(name, "s:", 2) == 0) 8147 { 8148 semsg(_(e_cannot_declare_script_variable_in_function), name); 8149 goto failed; 8150 } 8151 8152 // Reserve a variable to store "var". 8153 where.wt_index = var_list ? idx + 1 : 0; 8154 where.wt_variable = TRUE; 8155 if (lhs_type == &t_any) 8156 lhs_type = item_type; 8157 else if (item_type != &t_unknown 8158 && (item_type == &t_any 8159 ? need_type(item_type, lhs_type, 8160 -1, 0, cctx, FALSE, FALSE) 8161 : check_type(lhs_type, item_type, TRUE, where)) 8162 == FAIL) 8163 goto failed; 8164 var_lvar = reserve_local(cctx, arg, varlen, TRUE, lhs_type); 8165 if (var_lvar == NULL) 8166 // out of memory or used as an argument 8167 goto failed; 8168 8169 if (semicolon && idx == var_count - 1) 8170 var_lvar->lv_type = vartype; 8171 else 8172 var_lvar->lv_type = item_type; 8173 generate_STORE(cctx, ISN_STORE, var_lvar->lv_idx, NULL); 8174 } 8175 8176 if (*p == ',' || *p == ';') 8177 ++p; 8178 arg = skipwhite(p); 8179 vim_free(name); 8180 } 8181 8182 if (cctx->ctx_compile_type == CT_DEBUG) 8183 { 8184 int save_prev_lnum = cctx->ctx_prev_lnum; 8185 8186 // Add ISN_DEBUG here, so that the loop variables can be inspected. 8187 // Use the prev_lnum from the ISN_DEBUG instruction removed above. 8188 cctx->ctx_prev_lnum = prev_lnum; 8189 generate_instr_debug(cctx); 8190 cctx->ctx_prev_lnum = save_prev_lnum; 8191 } 8192 8193 return arg_end; 8194 8195 failed: 8196 vim_free(name); 8197 drop_scope(cctx); 8198 return NULL; 8199 } 8200 8201 /* 8202 * compile "endfor" 8203 */ 8204 static char_u * 8205 compile_endfor(char_u *arg, cctx_T *cctx) 8206 { 8207 garray_T *instr = &cctx->ctx_instr; 8208 scope_T *scope = cctx->ctx_scope; 8209 forscope_T *forscope; 8210 isn_T *isn; 8211 8212 if (misplaced_cmdmod(cctx)) 8213 return NULL; 8214 8215 if (scope == NULL || scope->se_type != FOR_SCOPE) 8216 { 8217 emsg(_(e_for)); 8218 return NULL; 8219 } 8220 forscope = &scope->se_u.se_for; 8221 cctx->ctx_scope = scope->se_outer; 8222 unwind_locals(cctx, scope->se_local_count); 8223 8224 // At end of ":for" scope jump back to the FOR instruction. 8225 generate_JUMP(cctx, JUMP_ALWAYS, forscope->fs_top_label); 8226 8227 // Fill in the "end" label in the FOR statement so it can jump here. 8228 isn = ((isn_T *)instr->ga_data) + forscope->fs_top_label; 8229 isn->isn_arg.forloop.for_end = instr->ga_len; 8230 8231 // Fill in the "end" label any BREAK statements 8232 compile_fill_jump_to_end(&forscope->fs_end_label, instr->ga_len, cctx); 8233 8234 // Below the ":for" scope drop the "expr" list from the stack. 8235 if (generate_instr_drop(cctx, ISN_DROP, 1) == NULL) 8236 return NULL; 8237 8238 vim_free(scope); 8239 8240 return arg; 8241 } 8242 8243 /* 8244 * compile "while expr" 8245 * 8246 * Produces instructions: 8247 * top: EVAL expr Push result of "expr" 8248 * JUMP_IF_FALSE end jump if false 8249 * ... body ... 8250 * JUMP top Jump back to repeat 8251 * end: 8252 * 8253 */ 8254 static char_u * 8255 compile_while(char_u *arg, cctx_T *cctx) 8256 { 8257 char_u *p = arg; 8258 scope_T *scope; 8259 8260 scope = new_scope(cctx, WHILE_SCOPE); 8261 if (scope == NULL) 8262 return NULL; 8263 8264 // "endwhile" jumps back here, one before when profiling or using cmdmods 8265 scope->se_u.se_while.ws_top_label = current_instr_idx(cctx); 8266 8267 // compile "expr" 8268 if (compile_expr0(&p, cctx) == FAIL) 8269 return NULL; 8270 if (!ends_excmd2(arg, skipwhite(p))) 8271 { 8272 semsg(_(e_trailing_arg), p); 8273 return NULL; 8274 } 8275 8276 if (bool_on_stack(cctx) == FAIL) 8277 return FAIL; 8278 8279 // CMDMOD_REV must come before the jump 8280 generate_undo_cmdmods(cctx); 8281 8282 // "while_end" is set when ":endwhile" is found 8283 if (compile_jump_to_end(&scope->se_u.se_while.ws_end_label, 8284 JUMP_IF_FALSE, cctx) == FAIL) 8285 return FAIL; 8286 8287 return p; 8288 } 8289 8290 /* 8291 * compile "endwhile" 8292 */ 8293 static char_u * 8294 compile_endwhile(char_u *arg, cctx_T *cctx) 8295 { 8296 scope_T *scope = cctx->ctx_scope; 8297 garray_T *instr = &cctx->ctx_instr; 8298 8299 if (misplaced_cmdmod(cctx)) 8300 return NULL; 8301 if (scope == NULL || scope->se_type != WHILE_SCOPE) 8302 { 8303 emsg(_(e_while)); 8304 return NULL; 8305 } 8306 cctx->ctx_scope = scope->se_outer; 8307 unwind_locals(cctx, scope->se_local_count); 8308 8309 #ifdef FEAT_PROFILE 8310 // count the endwhile before jumping 8311 may_generate_prof_end(cctx, cctx->ctx_lnum); 8312 #endif 8313 8314 // At end of ":for" scope jump back to the FOR instruction. 8315 generate_JUMP(cctx, JUMP_ALWAYS, scope->se_u.se_while.ws_top_label); 8316 8317 // Fill in the "end" label in the WHILE statement so it can jump here. 8318 // And in any jumps for ":break" 8319 compile_fill_jump_to_end(&scope->se_u.se_while.ws_end_label, 8320 instr->ga_len, cctx); 8321 8322 vim_free(scope); 8323 8324 return arg; 8325 } 8326 8327 /* 8328 * compile "continue" 8329 */ 8330 static char_u * 8331 compile_continue(char_u *arg, cctx_T *cctx) 8332 { 8333 scope_T *scope = cctx->ctx_scope; 8334 int try_scopes = 0; 8335 int loop_label; 8336 8337 for (;;) 8338 { 8339 if (scope == NULL) 8340 { 8341 emsg(_(e_continue)); 8342 return NULL; 8343 } 8344 if (scope->se_type == FOR_SCOPE) 8345 { 8346 loop_label = scope->se_u.se_for.fs_top_label; 8347 break; 8348 } 8349 if (scope->se_type == WHILE_SCOPE) 8350 { 8351 loop_label = scope->se_u.se_while.ws_top_label; 8352 break; 8353 } 8354 if (scope->se_type == TRY_SCOPE) 8355 ++try_scopes; 8356 scope = scope->se_outer; 8357 } 8358 8359 if (try_scopes > 0) 8360 // Inside one or more try/catch blocks we first need to jump to the 8361 // "finally" or "endtry" to cleanup. 8362 generate_TRYCONT(cctx, try_scopes, loop_label); 8363 else 8364 // Jump back to the FOR or WHILE instruction. 8365 generate_JUMP(cctx, JUMP_ALWAYS, loop_label); 8366 8367 return arg; 8368 } 8369 8370 /* 8371 * compile "break" 8372 */ 8373 static char_u * 8374 compile_break(char_u *arg, cctx_T *cctx) 8375 { 8376 scope_T *scope = cctx->ctx_scope; 8377 endlabel_T **el; 8378 8379 for (;;) 8380 { 8381 if (scope == NULL) 8382 { 8383 emsg(_(e_break)); 8384 return NULL; 8385 } 8386 if (scope->se_type == FOR_SCOPE || scope->se_type == WHILE_SCOPE) 8387 break; 8388 scope = scope->se_outer; 8389 } 8390 8391 // Jump to the end of the FOR or WHILE loop. 8392 if (scope->se_type == FOR_SCOPE) 8393 el = &scope->se_u.se_for.fs_end_label; 8394 else 8395 el = &scope->se_u.se_while.ws_end_label; 8396 if (compile_jump_to_end(el, JUMP_ALWAYS, cctx) == FAIL) 8397 return FAIL; 8398 8399 return arg; 8400 } 8401 8402 /* 8403 * compile "{" start of block 8404 */ 8405 static char_u * 8406 compile_block(char_u *arg, cctx_T *cctx) 8407 { 8408 if (new_scope(cctx, BLOCK_SCOPE) == NULL) 8409 return NULL; 8410 return skipwhite(arg + 1); 8411 } 8412 8413 /* 8414 * compile end of block: drop one scope 8415 */ 8416 static void 8417 compile_endblock(cctx_T *cctx) 8418 { 8419 scope_T *scope = cctx->ctx_scope; 8420 8421 cctx->ctx_scope = scope->se_outer; 8422 unwind_locals(cctx, scope->se_local_count); 8423 vim_free(scope); 8424 } 8425 8426 /* 8427 * compile "try" 8428 * Creates a new scope for the try-endtry, pointing to the first catch and 8429 * finally. 8430 * Creates another scope for the "try" block itself. 8431 * TRY instruction sets up exception handling at runtime. 8432 * 8433 * "try" 8434 * TRY -> catch1, -> finally push trystack entry 8435 * ... try block 8436 * "throw {exception}" 8437 * EVAL {exception} 8438 * THROW create exception 8439 * ... try block 8440 * " catch {expr}" 8441 * JUMP -> finally 8442 * catch1: PUSH exception 8443 * EVAL {expr} 8444 * MATCH 8445 * JUMP nomatch -> catch2 8446 * CATCH remove exception 8447 * ... catch block 8448 * " catch" 8449 * JUMP -> finally 8450 * catch2: CATCH remove exception 8451 * ... catch block 8452 * " finally" 8453 * finally: 8454 * ... finally block 8455 * " endtry" 8456 * ENDTRY pop trystack entry, may rethrow 8457 */ 8458 static char_u * 8459 compile_try(char_u *arg, cctx_T *cctx) 8460 { 8461 garray_T *instr = &cctx->ctx_instr; 8462 scope_T *try_scope; 8463 scope_T *scope; 8464 8465 if (misplaced_cmdmod(cctx)) 8466 return NULL; 8467 8468 // scope that holds the jumps that go to catch/finally/endtry 8469 try_scope = new_scope(cctx, TRY_SCOPE); 8470 if (try_scope == NULL) 8471 return NULL; 8472 8473 if (cctx->ctx_skip != SKIP_YES) 8474 { 8475 isn_T *isn; 8476 8477 // "try_catch" is set when the first ":catch" is found or when no catch 8478 // is found and ":finally" is found. 8479 // "try_finally" is set when ":finally" is found 8480 // "try_endtry" is set when ":endtry" is found 8481 try_scope->se_u.se_try.ts_try_label = instr->ga_len; 8482 if ((isn = generate_instr(cctx, ISN_TRY)) == NULL) 8483 return NULL; 8484 isn->isn_arg.try.try_ref = ALLOC_CLEAR_ONE(tryref_T); 8485 if (isn->isn_arg.try.try_ref == NULL) 8486 return NULL; 8487 } 8488 8489 // scope for the try block itself 8490 scope = new_scope(cctx, BLOCK_SCOPE); 8491 if (scope == NULL) 8492 return NULL; 8493 8494 return arg; 8495 } 8496 8497 /* 8498 * compile "catch {expr}" 8499 */ 8500 static char_u * 8501 compile_catch(char_u *arg, cctx_T *cctx UNUSED) 8502 { 8503 scope_T *scope = cctx->ctx_scope; 8504 garray_T *instr = &cctx->ctx_instr; 8505 char_u *p; 8506 isn_T *isn; 8507 8508 if (misplaced_cmdmod(cctx)) 8509 return NULL; 8510 8511 // end block scope from :try or :catch 8512 if (scope != NULL && scope->se_type == BLOCK_SCOPE) 8513 compile_endblock(cctx); 8514 scope = cctx->ctx_scope; 8515 8516 // Error if not in a :try scope 8517 if (scope == NULL || scope->se_type != TRY_SCOPE) 8518 { 8519 emsg(_(e_catch)); 8520 return NULL; 8521 } 8522 8523 if (scope->se_u.se_try.ts_caught_all) 8524 { 8525 emsg(_(e_catch_unreachable_after_catch_all)); 8526 return NULL; 8527 } 8528 8529 if (cctx->ctx_skip != SKIP_YES) 8530 { 8531 #ifdef FEAT_PROFILE 8532 // the profile-start should be after the jump 8533 if (cctx->ctx_compile_type == CT_PROFILE 8534 && instr->ga_len > 0 8535 && ((isn_T *)instr->ga_data)[instr->ga_len - 1] 8536 .isn_type == ISN_PROF_START) 8537 --instr->ga_len; 8538 #endif 8539 // Jump from end of previous block to :finally or :endtry 8540 if (compile_jump_to_end(&scope->se_u.se_try.ts_end_label, 8541 JUMP_ALWAYS, cctx) == FAIL) 8542 return NULL; 8543 8544 // End :try or :catch scope: set value in ISN_TRY instruction 8545 isn = ((isn_T *)instr->ga_data) + scope->se_u.se_try.ts_try_label; 8546 if (isn->isn_arg.try.try_ref->try_catch == 0) 8547 isn->isn_arg.try.try_ref->try_catch = instr->ga_len; 8548 if (scope->se_u.se_try.ts_catch_label != 0) 8549 { 8550 // Previous catch without match jumps here 8551 isn = ((isn_T *)instr->ga_data) + scope->se_u.se_try.ts_catch_label; 8552 isn->isn_arg.jump.jump_where = instr->ga_len; 8553 } 8554 #ifdef FEAT_PROFILE 8555 if (cctx->ctx_compile_type == CT_PROFILE) 8556 { 8557 // a "throw" that jumps here needs to be counted 8558 generate_instr(cctx, ISN_PROF_END); 8559 // the "catch" is also counted 8560 generate_instr(cctx, ISN_PROF_START); 8561 } 8562 #endif 8563 if (cctx->ctx_compile_type == CT_DEBUG) 8564 generate_instr_debug(cctx); 8565 } 8566 8567 p = skipwhite(arg); 8568 if (ends_excmd2(arg, p)) 8569 { 8570 scope->se_u.se_try.ts_caught_all = TRUE; 8571 scope->se_u.se_try.ts_catch_label = 0; 8572 } 8573 else 8574 { 8575 char_u *end; 8576 char_u *pat; 8577 char_u *tofree = NULL; 8578 int dropped = 0; 8579 int len; 8580 8581 // Push v:exception, push {expr} and MATCH 8582 generate_instr_type(cctx, ISN_PUSHEXC, &t_string); 8583 8584 end = skip_regexp_ex(p + 1, *p, TRUE, &tofree, &dropped, NULL); 8585 if (*end != *p) 8586 { 8587 semsg(_(e_separator_mismatch_str), p); 8588 vim_free(tofree); 8589 return FAIL; 8590 } 8591 if (tofree == NULL) 8592 len = (int)(end - (p + 1)); 8593 else 8594 len = (int)(end - tofree); 8595 pat = vim_strnsave(tofree == NULL ? p + 1 : tofree, len); 8596 vim_free(tofree); 8597 p += len + 2 + dropped; 8598 if (pat == NULL) 8599 return FAIL; 8600 if (generate_PUSHS(cctx, &pat) == FAIL) 8601 return FAIL; 8602 8603 if (generate_COMPARE(cctx, EXPR_MATCH, FALSE) == FAIL) 8604 return NULL; 8605 8606 scope->se_u.se_try.ts_catch_label = instr->ga_len; 8607 if (generate_JUMP(cctx, JUMP_IF_FALSE, 0) == FAIL) 8608 return NULL; 8609 } 8610 8611 if (cctx->ctx_skip != SKIP_YES && generate_instr(cctx, ISN_CATCH) == NULL) 8612 return NULL; 8613 8614 if (new_scope(cctx, BLOCK_SCOPE) == NULL) 8615 return NULL; 8616 return p; 8617 } 8618 8619 static char_u * 8620 compile_finally(char_u *arg, cctx_T *cctx) 8621 { 8622 scope_T *scope = cctx->ctx_scope; 8623 garray_T *instr = &cctx->ctx_instr; 8624 isn_T *isn; 8625 int this_instr; 8626 8627 if (misplaced_cmdmod(cctx)) 8628 return NULL; 8629 8630 // end block scope from :try or :catch 8631 if (scope != NULL && scope->se_type == BLOCK_SCOPE) 8632 compile_endblock(cctx); 8633 scope = cctx->ctx_scope; 8634 8635 // Error if not in a :try scope 8636 if (scope == NULL || scope->se_type != TRY_SCOPE) 8637 { 8638 emsg(_(e_finally)); 8639 return NULL; 8640 } 8641 8642 if (cctx->ctx_skip != SKIP_YES) 8643 { 8644 // End :catch or :finally scope: set value in ISN_TRY instruction 8645 isn = ((isn_T *)instr->ga_data) + scope->se_u.se_try.ts_try_label; 8646 if (isn->isn_arg.try.try_ref->try_finally != 0) 8647 { 8648 emsg(_(e_finally_dup)); 8649 return NULL; 8650 } 8651 8652 this_instr = instr->ga_len; 8653 #ifdef FEAT_PROFILE 8654 if (cctx->ctx_compile_type == CT_PROFILE 8655 && ((isn_T *)instr->ga_data)[this_instr - 1] 8656 .isn_type == ISN_PROF_START) 8657 { 8658 // jump to the profile start of the "finally" 8659 --this_instr; 8660 8661 // jump to the profile end above it 8662 if (this_instr > 0 && ((isn_T *)instr->ga_data)[this_instr - 1] 8663 .isn_type == ISN_PROF_END) 8664 --this_instr; 8665 } 8666 #endif 8667 8668 // Fill in the "end" label in jumps at the end of the blocks. 8669 compile_fill_jump_to_end(&scope->se_u.se_try.ts_end_label, 8670 this_instr, cctx); 8671 8672 // If there is no :catch then an exception jumps to :finally. 8673 if (isn->isn_arg.try.try_ref->try_catch == 0) 8674 isn->isn_arg.try.try_ref->try_catch = this_instr; 8675 isn->isn_arg.try.try_ref->try_finally = this_instr; 8676 if (scope->se_u.se_try.ts_catch_label != 0) 8677 { 8678 // Previous catch without match jumps here 8679 isn = ((isn_T *)instr->ga_data) + scope->se_u.se_try.ts_catch_label; 8680 isn->isn_arg.jump.jump_where = this_instr; 8681 scope->se_u.se_try.ts_catch_label = 0; 8682 } 8683 if (generate_instr(cctx, ISN_FINALLY) == NULL) 8684 return NULL; 8685 8686 // TODO: set index in ts_finally_label jumps 8687 } 8688 8689 return arg; 8690 } 8691 8692 static char_u * 8693 compile_endtry(char_u *arg, cctx_T *cctx) 8694 { 8695 scope_T *scope = cctx->ctx_scope; 8696 garray_T *instr = &cctx->ctx_instr; 8697 isn_T *try_isn; 8698 8699 if (misplaced_cmdmod(cctx)) 8700 return NULL; 8701 8702 // end block scope from :catch or :finally 8703 if (scope != NULL && scope->se_type == BLOCK_SCOPE) 8704 compile_endblock(cctx); 8705 scope = cctx->ctx_scope; 8706 8707 // Error if not in a :try scope 8708 if (scope == NULL || scope->se_type != TRY_SCOPE) 8709 { 8710 if (scope == NULL) 8711 emsg(_(e_no_endtry)); 8712 else if (scope->se_type == WHILE_SCOPE) 8713 emsg(_(e_endwhile)); 8714 else if (scope->se_type == FOR_SCOPE) 8715 emsg(_(e_endfor)); 8716 else 8717 emsg(_(e_endif)); 8718 return NULL; 8719 } 8720 8721 try_isn = ((isn_T *)instr->ga_data) + scope->se_u.se_try.ts_try_label; 8722 if (cctx->ctx_skip != SKIP_YES) 8723 { 8724 if (try_isn->isn_arg.try.try_ref->try_catch == 0 8725 && try_isn->isn_arg.try.try_ref->try_finally == 0) 8726 { 8727 emsg(_(e_missing_catch_or_finally)); 8728 return NULL; 8729 } 8730 8731 #ifdef FEAT_PROFILE 8732 if (cctx->ctx_compile_type == CT_PROFILE 8733 && ((isn_T *)instr->ga_data)[instr->ga_len - 1] 8734 .isn_type == ISN_PROF_START) 8735 // move the profile start after "endtry" so that it's not counted when 8736 // the exception is rethrown. 8737 --instr->ga_len; 8738 #endif 8739 8740 // Fill in the "end" label in jumps at the end of the blocks, if not 8741 // done by ":finally". 8742 compile_fill_jump_to_end(&scope->se_u.se_try.ts_end_label, 8743 instr->ga_len, cctx); 8744 8745 if (scope->se_u.se_try.ts_catch_label != 0) 8746 { 8747 // Last catch without match jumps here 8748 isn_T *isn = ((isn_T *)instr->ga_data) 8749 + scope->se_u.se_try.ts_catch_label; 8750 isn->isn_arg.jump.jump_where = instr->ga_len; 8751 } 8752 } 8753 8754 compile_endblock(cctx); 8755 8756 if (cctx->ctx_skip != SKIP_YES) 8757 { 8758 // End :catch or :finally scope: set instruction index in ISN_TRY 8759 // instruction 8760 try_isn->isn_arg.try.try_ref->try_endtry = instr->ga_len; 8761 if (cctx->ctx_skip != SKIP_YES 8762 && generate_instr(cctx, ISN_ENDTRY) == NULL) 8763 return NULL; 8764 #ifdef FEAT_PROFILE 8765 if (cctx->ctx_compile_type == CT_PROFILE) 8766 generate_instr(cctx, ISN_PROF_START); 8767 #endif 8768 } 8769 return arg; 8770 } 8771 8772 /* 8773 * compile "throw {expr}" 8774 */ 8775 static char_u * 8776 compile_throw(char_u *arg, cctx_T *cctx UNUSED) 8777 { 8778 char_u *p = skipwhite(arg); 8779 8780 if (compile_expr0(&p, cctx) == FAIL) 8781 return NULL; 8782 if (cctx->ctx_skip == SKIP_YES) 8783 return p; 8784 if (may_generate_2STRING(-1, FALSE, cctx) == FAIL) 8785 return NULL; 8786 if (generate_instr_drop(cctx, ISN_THROW, 1) == NULL) 8787 return NULL; 8788 8789 return p; 8790 } 8791 8792 static char_u * 8793 compile_eval(char_u *arg, cctx_T *cctx) 8794 { 8795 char_u *p = arg; 8796 int name_only; 8797 char_u *alias; 8798 long lnum = SOURCING_LNUM; 8799 8800 // find_ex_command() will consider a variable name an expression, assuming 8801 // that something follows on the next line. Check that something actually 8802 // follows, otherwise it's probably a misplaced command. 8803 get_name_len(&p, &alias, FALSE, FALSE); 8804 name_only = ends_excmd2(arg, skipwhite(p)); 8805 vim_free(alias); 8806 8807 p = arg; 8808 if (compile_expr0(&p, cctx) == FAIL) 8809 return NULL; 8810 8811 if (name_only && lnum == SOURCING_LNUM) 8812 { 8813 semsg(_(e_expression_without_effect_str), arg); 8814 return NULL; 8815 } 8816 8817 // drop the result 8818 generate_instr_drop(cctx, ISN_DROP, 1); 8819 8820 return skipwhite(p); 8821 } 8822 8823 /* 8824 * compile "echo expr" 8825 * compile "echomsg expr" 8826 * compile "echoerr expr" 8827 * compile "echoconsole expr" 8828 * compile "execute expr" 8829 */ 8830 static char_u * 8831 compile_mult_expr(char_u *arg, int cmdidx, cctx_T *cctx) 8832 { 8833 char_u *p = arg; 8834 char_u *prev = arg; 8835 char_u *expr_start; 8836 int count = 0; 8837 int start_ctx_lnum = cctx->ctx_lnum; 8838 garray_T *stack = &cctx->ctx_type_stack; 8839 type_T *type; 8840 8841 for (;;) 8842 { 8843 if (ends_excmd2(prev, p)) 8844 break; 8845 expr_start = p; 8846 if (compile_expr0(&p, cctx) == FAIL) 8847 return NULL; 8848 8849 if (cctx->ctx_skip != SKIP_YES) 8850 { 8851 // check for non-void type 8852 type = ((type_T **)stack->ga_data)[stack->ga_len - 1]; 8853 if (type->tt_type == VAR_VOID) 8854 { 8855 semsg(_(e_expression_does_not_result_in_value_str), expr_start); 8856 return NULL; 8857 } 8858 } 8859 8860 ++count; 8861 prev = p; 8862 p = skipwhite(p); 8863 } 8864 8865 if (count > 0) 8866 { 8867 long save_lnum = cctx->ctx_lnum; 8868 8869 // Use the line number where the command started. 8870 cctx->ctx_lnum = start_ctx_lnum; 8871 8872 if (cmdidx == CMD_echo || cmdidx == CMD_echon) 8873 generate_ECHO(cctx, cmdidx == CMD_echo, count); 8874 else if (cmdidx == CMD_execute) 8875 generate_MULT_EXPR(cctx, ISN_EXECUTE, count); 8876 else if (cmdidx == CMD_echomsg) 8877 generate_MULT_EXPR(cctx, ISN_ECHOMSG, count); 8878 else if (cmdidx == CMD_echoconsole) 8879 generate_MULT_EXPR(cctx, ISN_ECHOCONSOLE, count); 8880 else 8881 generate_MULT_EXPR(cctx, ISN_ECHOERR, count); 8882 8883 cctx->ctx_lnum = save_lnum; 8884 } 8885 return p; 8886 } 8887 8888 /* 8889 * If "eap" has a range that is not a constant generate an ISN_RANGE 8890 * instruction to compute it and return OK. 8891 * Otherwise return FAIL, the caller must deal with any range. 8892 */ 8893 static int 8894 compile_variable_range(exarg_T *eap, cctx_T *cctx) 8895 { 8896 char_u *range_end = skip_range(eap->cmd, TRUE, NULL); 8897 char_u *p = skipdigits(eap->cmd); 8898 8899 if (p == range_end) 8900 return FAIL; 8901 return generate_RANGE(cctx, vim_strnsave(eap->cmd, range_end - eap->cmd)); 8902 } 8903 8904 /* 8905 * :put r 8906 * :put ={expr} 8907 */ 8908 static char_u * 8909 compile_put(char_u *arg, exarg_T *eap, cctx_T *cctx) 8910 { 8911 char_u *line = arg; 8912 linenr_T lnum; 8913 char *errormsg; 8914 int above = eap->forceit; 8915 8916 eap->regname = *line; 8917 8918 if (eap->regname == '=') 8919 { 8920 char_u *p = line + 1; 8921 8922 if (compile_expr0(&p, cctx) == FAIL) 8923 return NULL; 8924 line = p; 8925 } 8926 else if (eap->regname != NUL) 8927 ++line; 8928 8929 if (compile_variable_range(eap, cctx) == OK) 8930 { 8931 lnum = above ? LNUM_VARIABLE_RANGE_ABOVE : LNUM_VARIABLE_RANGE; 8932 } 8933 else 8934 { 8935 // Either no range or a number. 8936 // "errormsg" will not be set because the range is ADDR_LINES. 8937 if (parse_cmd_address(eap, &errormsg, FALSE) == FAIL) 8938 // cannot happen 8939 return NULL; 8940 if (eap->addr_count == 0) 8941 lnum = -1; 8942 else 8943 lnum = eap->line2; 8944 if (above) 8945 --lnum; 8946 } 8947 8948 generate_PUT(cctx, eap->regname, lnum); 8949 return line; 8950 } 8951 8952 /* 8953 * A command that is not compiled, execute with legacy code. 8954 */ 8955 static char_u * 8956 compile_exec(char_u *line_arg, exarg_T *eap, cctx_T *cctx) 8957 { 8958 char_u *line = line_arg; 8959 char_u *p; 8960 int has_expr = FALSE; 8961 char_u *nextcmd = (char_u *)""; 8962 char_u *tofree = NULL; 8963 8964 if (cctx->ctx_skip == SKIP_YES) 8965 goto theend; 8966 8967 // If there was a prececing command modifier, drop it and include it in the 8968 // EXEC command. 8969 if (cctx->ctx_has_cmdmod) 8970 { 8971 garray_T *instr = &cctx->ctx_instr; 8972 isn_T *isn = ((isn_T *)instr->ga_data) + instr->ga_len - 1; 8973 8974 if (isn->isn_type == ISN_CMDMOD) 8975 { 8976 vim_regfree(isn->isn_arg.cmdmod.cf_cmdmod 8977 ->cmod_filter_regmatch.regprog); 8978 vim_free(isn->isn_arg.cmdmod.cf_cmdmod); 8979 --instr->ga_len; 8980 cctx->ctx_has_cmdmod = FALSE; 8981 } 8982 } 8983 8984 if (eap->cmdidx >= 0 && eap->cmdidx < CMD_SIZE) 8985 { 8986 long argt = eap->argt; 8987 int usefilter = FALSE; 8988 8989 has_expr = argt & (EX_XFILE | EX_EXPAND); 8990 8991 // If the command can be followed by a bar, find the bar and truncate 8992 // it, so that the following command can be compiled. 8993 // The '|' is overwritten with a NUL, it is put back below. 8994 if ((eap->cmdidx == CMD_write || eap->cmdidx == CMD_read) 8995 && *eap->arg == '!') 8996 // :w !filter or :r !filter or :r! filter 8997 usefilter = TRUE; 8998 if ((argt & EX_TRLBAR) && !usefilter) 8999 { 9000 eap->argt = argt; 9001 separate_nextcmd(eap); 9002 if (eap->nextcmd != NULL) 9003 nextcmd = eap->nextcmd; 9004 } 9005 else if (eap->cmdidx == CMD_wincmd) 9006 { 9007 p = eap->arg; 9008 if (*p != NUL) 9009 ++p; 9010 if (*p == 'g' || *p == Ctrl_G) 9011 ++p; 9012 p = skipwhite(p); 9013 if (*p == '|') 9014 { 9015 *p = NUL; 9016 nextcmd = p + 1; 9017 } 9018 } 9019 else if (eap->cmdidx == CMD_command || eap->cmdidx == CMD_autocmd) 9020 { 9021 // If there is a trailing '{' read lines until the '}' 9022 p = eap->arg + STRLEN(eap->arg) - 1; 9023 while (p > eap->arg && VIM_ISWHITE(*p)) 9024 --p; 9025 if (*p == '{') 9026 { 9027 exarg_T ea; 9028 int flags; // unused 9029 int start_lnum = SOURCING_LNUM; 9030 9031 CLEAR_FIELD(ea); 9032 ea.arg = eap->arg; 9033 fill_exarg_from_cctx(&ea, cctx); 9034 (void)may_get_cmd_block(&ea, p, &tofree, &flags); 9035 if (tofree != NULL) 9036 { 9037 *p = NUL; 9038 line = concat_str(line, tofree); 9039 if (line == NULL) 9040 goto theend; 9041 vim_free(tofree); 9042 tofree = line; 9043 SOURCING_LNUM = start_lnum; 9044 } 9045 } 9046 } 9047 } 9048 9049 if (eap->cmdidx == CMD_syntax && STRNCMP(eap->arg, "include ", 8) == 0) 9050 { 9051 // expand filename in "syntax include [@group] filename" 9052 has_expr = TRUE; 9053 eap->arg = skipwhite(eap->arg + 7); 9054 if (*eap->arg == '@') 9055 eap->arg = skiptowhite(eap->arg); 9056 } 9057 9058 if ((eap->cmdidx == CMD_global || eap->cmdidx == CMD_vglobal) 9059 && STRLEN(eap->arg) > 4) 9060 { 9061 int delim = *eap->arg; 9062 9063 p = skip_regexp_ex(eap->arg + 1, delim, TRUE, NULL, NULL, NULL); 9064 if (*p == delim) 9065 { 9066 eap->arg = p + 1; 9067 has_expr = TRUE; 9068 } 9069 } 9070 9071 if (eap->cmdidx == CMD_folddoopen || eap->cmdidx == CMD_folddoclosed) 9072 { 9073 // TODO: should only expand when appropriate for the command 9074 eap->arg = skiptowhite(eap->arg); 9075 has_expr = TRUE; 9076 } 9077 9078 if (has_expr && (p = (char_u *)strstr((char *)eap->arg, "`=")) != NULL) 9079 { 9080 int count = 0; 9081 char_u *start = skipwhite(line); 9082 9083 // :cmd xxx`=expr1`yyy`=expr2`zzz 9084 // PUSHS ":cmd xxx" 9085 // eval expr1 9086 // PUSHS "yyy" 9087 // eval expr2 9088 // PUSHS "zzz" 9089 // EXECCONCAT 5 9090 for (;;) 9091 { 9092 if (p > start) 9093 { 9094 char_u *val = vim_strnsave(start, p - start); 9095 9096 generate_PUSHS(cctx, &val); 9097 ++count; 9098 } 9099 p += 2; 9100 if (compile_expr0(&p, cctx) == FAIL) 9101 return NULL; 9102 may_generate_2STRING(-1, TRUE, cctx); 9103 ++count; 9104 p = skipwhite(p); 9105 if (*p != '`') 9106 { 9107 emsg(_(e_missing_backtick)); 9108 return NULL; 9109 } 9110 start = p + 1; 9111 9112 p = (char_u *)strstr((char *)start, "`="); 9113 if (p == NULL) 9114 { 9115 if (*skipwhite(start) != NUL) 9116 { 9117 char_u *val = vim_strsave(start); 9118 9119 generate_PUSHS(cctx, &val); 9120 ++count; 9121 } 9122 break; 9123 } 9124 } 9125 generate_EXECCONCAT(cctx, count); 9126 } 9127 else 9128 generate_EXEC(cctx, ISN_EXEC, line); 9129 9130 theend: 9131 if (*nextcmd != NUL) 9132 { 9133 // the parser expects a pointer to the bar, put it back 9134 --nextcmd; 9135 *nextcmd = '|'; 9136 } 9137 vim_free(tofree); 9138 9139 return nextcmd; 9140 } 9141 9142 /* 9143 * A script command with heredoc, e.g. 9144 * ruby << EOF 9145 * command 9146 * EOF 9147 * Has been turned into one long line with NL characters by 9148 * get_function_body(): 9149 * ruby << EOF<NL> command<NL>EOF 9150 */ 9151 static char_u * 9152 compile_script(char_u *line, cctx_T *cctx) 9153 { 9154 if (cctx->ctx_skip != SKIP_YES) 9155 { 9156 isn_T *isn; 9157 9158 if ((isn = generate_instr(cctx, ISN_EXEC_SPLIT)) == NULL) 9159 return NULL; 9160 isn->isn_arg.string = vim_strsave(line); 9161 } 9162 return (char_u *)""; 9163 } 9164 9165 9166 /* 9167 * :s/pat/repl/ 9168 */ 9169 static char_u * 9170 compile_substitute(char_u *arg, exarg_T *eap, cctx_T *cctx) 9171 { 9172 char_u *cmd = eap->arg; 9173 char_u *expr = (char_u *)strstr((char *)cmd, "\\="); 9174 9175 if (expr != NULL) 9176 { 9177 int delimiter = *cmd++; 9178 9179 // There is a \=expr, find it in the substitute part. 9180 cmd = skip_regexp_ex(cmd, delimiter, magic_isset(), NULL, NULL, NULL); 9181 if (cmd[0] == delimiter && cmd[1] == '\\' && cmd[2] == '=') 9182 { 9183 garray_T save_ga = cctx->ctx_instr; 9184 char_u *end; 9185 int expr_res; 9186 int trailing_error; 9187 int instr_count; 9188 isn_T *instr; 9189 isn_T *isn; 9190 9191 cmd += 3; 9192 end = skip_substitute(cmd, delimiter); 9193 9194 // Temporarily reset the list of instructions so that the jump 9195 // labels are correct. 9196 cctx->ctx_instr.ga_len = 0; 9197 cctx->ctx_instr.ga_maxlen = 0; 9198 cctx->ctx_instr.ga_data = NULL; 9199 expr_res = compile_expr0(&cmd, cctx); 9200 if (end[-1] == NUL) 9201 end[-1] = delimiter; 9202 cmd = skipwhite(cmd); 9203 trailing_error = *cmd != delimiter && *cmd != NUL; 9204 9205 if (expr_res == FAIL || trailing_error 9206 || GA_GROW_FAILS(&cctx->ctx_instr, 1)) 9207 { 9208 if (trailing_error) 9209 semsg(_(e_trailing_arg), cmd); 9210 clear_instr_ga(&cctx->ctx_instr); 9211 cctx->ctx_instr = save_ga; 9212 return NULL; 9213 } 9214 9215 // Move the generated instructions into the ISN_SUBSTITUTE 9216 // instructions, then restore the list of instructions before 9217 // adding the ISN_SUBSTITUTE instruction. 9218 instr_count = cctx->ctx_instr.ga_len; 9219 instr = cctx->ctx_instr.ga_data; 9220 instr[instr_count].isn_type = ISN_FINISH; 9221 9222 cctx->ctx_instr = save_ga; 9223 if ((isn = generate_instr(cctx, ISN_SUBSTITUTE)) == NULL) 9224 { 9225 int idx; 9226 9227 for (idx = 0; idx < instr_count; ++idx) 9228 delete_instr(instr + idx); 9229 vim_free(instr); 9230 return NULL; 9231 } 9232 isn->isn_arg.subs.subs_cmd = vim_strsave(arg); 9233 isn->isn_arg.subs.subs_instr = instr; 9234 9235 // skip over flags 9236 if (*end == '&') 9237 ++end; 9238 while (ASCII_ISALPHA(*end) || *end == '#') 9239 ++end; 9240 return end; 9241 } 9242 } 9243 9244 return compile_exec(arg, eap, cctx); 9245 } 9246 9247 static char_u * 9248 compile_redir(char_u *line, exarg_T *eap, cctx_T *cctx) 9249 { 9250 char_u *arg = eap->arg; 9251 lhs_T *lhs = &cctx->ctx_redir_lhs; 9252 9253 if (lhs->lhs_name != NULL) 9254 { 9255 if (STRNCMP(arg, "END", 3) == 0) 9256 { 9257 if (lhs->lhs_append) 9258 { 9259 // First load the current variable value. 9260 if (compile_load_lhs_with_index(lhs, lhs->lhs_whole, 9261 cctx) == FAIL) 9262 return NULL; 9263 } 9264 9265 // Gets the redirected text and put it on the stack, then store it 9266 // in the variable. 9267 generate_instr_type(cctx, ISN_REDIREND, &t_string); 9268 9269 if (lhs->lhs_append) 9270 generate_instr_drop(cctx, ISN_CONCAT, 1); 9271 9272 if (lhs->lhs_has_index) 9273 { 9274 // Use the info in "lhs" to store the value at the index in the 9275 // list or dict. 9276 if (compile_assign_unlet(lhs->lhs_whole, lhs, TRUE, 9277 &t_string, cctx) == FAIL) 9278 return NULL; 9279 } 9280 else if (generate_store_lhs(cctx, lhs, -1) == FAIL) 9281 return NULL; 9282 9283 VIM_CLEAR(lhs->lhs_name); 9284 VIM_CLEAR(lhs->lhs_whole); 9285 return arg + 3; 9286 } 9287 emsg(_(e_cannot_nest_redir)); 9288 return NULL; 9289 } 9290 9291 if (arg[0] == '=' && arg[1] == '>') 9292 { 9293 int append = FALSE; 9294 9295 // redirect to a variable is compiled 9296 arg += 2; 9297 if (*arg == '>') 9298 { 9299 ++arg; 9300 append = TRUE; 9301 } 9302 arg = skipwhite(arg); 9303 9304 if (compile_assign_lhs(arg, lhs, CMD_redir, 9305 FALSE, FALSE, 1, cctx) == FAIL) 9306 return NULL; 9307 generate_instr(cctx, ISN_REDIRSTART); 9308 lhs->lhs_append = append; 9309 if (lhs->lhs_has_index) 9310 { 9311 lhs->lhs_whole = vim_strnsave(arg, lhs->lhs_varlen_total); 9312 if (lhs->lhs_whole == NULL) 9313 return NULL; 9314 } 9315 9316 return arg + lhs->lhs_varlen_total; 9317 } 9318 9319 // other redirects are handled like at script level 9320 return compile_exec(line, eap, cctx); 9321 } 9322 9323 #ifdef FEAT_QUICKFIX 9324 static char_u * 9325 compile_cexpr(char_u *line, exarg_T *eap, cctx_T *cctx) 9326 { 9327 isn_T *isn; 9328 char_u *p; 9329 9330 isn = generate_instr(cctx, ISN_CEXPR_AUCMD); 9331 if (isn == NULL) 9332 return NULL; 9333 isn->isn_arg.number = eap->cmdidx; 9334 9335 p = eap->arg; 9336 if (compile_expr0(&p, cctx) == FAIL) 9337 return NULL; 9338 9339 isn = generate_instr(cctx, ISN_CEXPR_CORE); 9340 if (isn == NULL) 9341 return NULL; 9342 isn->isn_arg.cexpr.cexpr_ref = ALLOC_ONE(cexprref_T); 9343 if (isn->isn_arg.cexpr.cexpr_ref == NULL) 9344 return NULL; 9345 isn->isn_arg.cexpr.cexpr_ref->cer_cmdidx = eap->cmdidx; 9346 isn->isn_arg.cexpr.cexpr_ref->cer_forceit = eap->forceit; 9347 isn->isn_arg.cexpr.cexpr_ref->cer_cmdline = vim_strsave(skipwhite(line)); 9348 9349 return p; 9350 } 9351 #endif 9352 9353 /* 9354 * Add a function to the list of :def functions. 9355 * This sets "ufunc->uf_dfunc_idx" but the function isn't compiled yet. 9356 */ 9357 static int 9358 add_def_function(ufunc_T *ufunc) 9359 { 9360 dfunc_T *dfunc; 9361 9362 if (def_functions.ga_len == 0) 9363 { 9364 // The first position is not used, so that a zero uf_dfunc_idx means it 9365 // wasn't set. 9366 if (GA_GROW_FAILS(&def_functions, 1)) 9367 return FAIL; 9368 ++def_functions.ga_len; 9369 } 9370 9371 // Add the function to "def_functions". 9372 if (GA_GROW_FAILS(&def_functions, 1)) 9373 return FAIL; 9374 dfunc = ((dfunc_T *)def_functions.ga_data) + def_functions.ga_len; 9375 CLEAR_POINTER(dfunc); 9376 dfunc->df_idx = def_functions.ga_len; 9377 ufunc->uf_dfunc_idx = dfunc->df_idx; 9378 dfunc->df_ufunc = ufunc; 9379 dfunc->df_name = vim_strsave(ufunc->uf_name); 9380 ga_init2(&dfunc->df_var_names, sizeof(char_u *), 10); 9381 ++dfunc->df_refcount; 9382 ++def_functions.ga_len; 9383 return OK; 9384 } 9385 9386 /* 9387 * After ex_function() has collected all the function lines: parse and compile 9388 * the lines into instructions. 9389 * Adds the function to "def_functions". 9390 * When "check_return_type" is set then set ufunc->uf_ret_type to the type of 9391 * the return statement (used for lambda). When uf_ret_type is already set 9392 * then check that it matches. 9393 * When "profiling" is true add ISN_PROF_START instructions. 9394 * "outer_cctx" is set for a nested function. 9395 * This can be used recursively through compile_lambda(), which may reallocate 9396 * "def_functions". 9397 * Returns OK or FAIL. 9398 */ 9399 int 9400 compile_def_function( 9401 ufunc_T *ufunc, 9402 int check_return_type, 9403 compiletype_T compile_type, 9404 cctx_T *outer_cctx) 9405 { 9406 char_u *line = NULL; 9407 char_u *line_to_free = NULL; 9408 char_u *p; 9409 char *errormsg = NULL; // error message 9410 cctx_T cctx; 9411 garray_T *instr; 9412 int did_emsg_before = did_emsg; 9413 int did_emsg_silent_before = did_emsg_silent; 9414 int ret = FAIL; 9415 sctx_T save_current_sctx = current_sctx; 9416 int save_estack_compiling = estack_compiling; 9417 int save_cmod_flags = cmdmod.cmod_flags; 9418 int do_estack_push; 9419 int new_def_function = FALSE; 9420 #ifdef FEAT_PROFILE 9421 int prof_lnum = -1; 9422 #endif 9423 int debug_lnum = -1; 9424 9425 // When using a function that was compiled before: Free old instructions. 9426 // The index is reused. Otherwise add a new entry in "def_functions". 9427 if (ufunc->uf_dfunc_idx > 0) 9428 { 9429 dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data) 9430 + ufunc->uf_dfunc_idx; 9431 isn_T *instr_dest = NULL; 9432 9433 switch (compile_type) 9434 { 9435 case CT_PROFILE: 9436 #ifdef FEAT_PROFILE 9437 instr_dest = dfunc->df_instr_prof; break; 9438 #endif 9439 case CT_NONE: instr_dest = dfunc->df_instr; break; 9440 case CT_DEBUG: instr_dest = dfunc->df_instr_debug; break; 9441 } 9442 if (instr_dest != NULL) 9443 // Was compiled in this mode before: Free old instructions. 9444 delete_def_function_contents(dfunc, FALSE); 9445 ga_clear_strings(&dfunc->df_var_names); 9446 } 9447 else 9448 { 9449 if (add_def_function(ufunc) == FAIL) 9450 return FAIL; 9451 new_def_function = TRUE; 9452 } 9453 9454 ufunc->uf_def_status = UF_COMPILING; 9455 9456 CLEAR_FIELD(cctx); 9457 9458 cctx.ctx_compile_type = compile_type; 9459 cctx.ctx_ufunc = ufunc; 9460 cctx.ctx_lnum = -1; 9461 cctx.ctx_outer = outer_cctx; 9462 ga_init2(&cctx.ctx_locals, sizeof(lvar_T), 10); 9463 ga_init2(&cctx.ctx_type_stack, sizeof(type_T *), 50); 9464 ga_init2(&cctx.ctx_imports, sizeof(imported_T), 10); 9465 cctx.ctx_type_list = &ufunc->uf_type_list; 9466 ga_init2(&cctx.ctx_instr, sizeof(isn_T), 50); 9467 instr = &cctx.ctx_instr; 9468 9469 // Set the context to the function, it may be compiled when called from 9470 // another script. Set the script version to the most modern one. 9471 // The line number will be set in next_line_from_context(). 9472 current_sctx = ufunc->uf_script_ctx; 9473 current_sctx.sc_version = SCRIPT_VERSION_VIM9; 9474 9475 // Don't use the flag from ":legacy" here. 9476 cmdmod.cmod_flags &= ~CMOD_LEGACY; 9477 9478 // Make sure error messages are OK. 9479 do_estack_push = !estack_top_is_ufunc(ufunc, 1); 9480 if (do_estack_push) 9481 estack_push_ufunc(ufunc, 1); 9482 estack_compiling = TRUE; 9483 9484 if (ufunc->uf_def_args.ga_len > 0) 9485 { 9486 int count = ufunc->uf_def_args.ga_len; 9487 int first_def_arg = ufunc->uf_args.ga_len - count; 9488 int i; 9489 char_u *arg; 9490 int off = STACK_FRAME_SIZE + (ufunc->uf_va_name != NULL ? 1 : 0); 9491 int did_set_arg_type = FALSE; 9492 9493 // Produce instructions for the default values of optional arguments. 9494 SOURCING_LNUM = 0; // line number unknown 9495 for (i = 0; i < count; ++i) 9496 { 9497 garray_T *stack = &cctx.ctx_type_stack; 9498 type_T *val_type; 9499 int arg_idx = first_def_arg + i; 9500 where_T where = WHERE_INIT; 9501 int r; 9502 int jump_instr_idx = instr->ga_len; 9503 isn_T *isn; 9504 9505 // Use a JUMP_IF_ARG_SET instruction to skip if the value was given. 9506 if (generate_JUMP_IF_ARG_SET(&cctx, i - count - off) == FAIL) 9507 goto erret; 9508 9509 // Make sure later arguments are not found. 9510 ufunc->uf_args_visible = arg_idx; 9511 9512 arg = ((char_u **)(ufunc->uf_def_args.ga_data))[i]; 9513 r = compile_expr0(&arg, &cctx); 9514 9515 if (r == FAIL) 9516 goto erret; 9517 9518 // If no type specified use the type of the default value. 9519 // Otherwise check that the default value type matches the 9520 // specified type. 9521 val_type = ((type_T **)stack->ga_data)[stack->ga_len - 1]; 9522 where.wt_index = arg_idx + 1; 9523 if (ufunc->uf_arg_types[arg_idx] == &t_unknown) 9524 { 9525 did_set_arg_type = TRUE; 9526 ufunc->uf_arg_types[arg_idx] = val_type; 9527 } 9528 else if (check_type(ufunc->uf_arg_types[arg_idx], val_type, 9529 TRUE, where) == FAIL) 9530 goto erret; 9531 9532 if (generate_STORE(&cctx, ISN_STORE, i - count - off, NULL) == FAIL) 9533 goto erret; 9534 9535 // set instruction index in JUMP_IF_ARG_SET to here 9536 isn = ((isn_T *)instr->ga_data) + jump_instr_idx; 9537 isn->isn_arg.jumparg.jump_where = instr->ga_len; 9538 } 9539 9540 if (did_set_arg_type) 9541 set_function_type(ufunc); 9542 } 9543 ufunc->uf_args_visible = ufunc->uf_args.ga_len; 9544 9545 /* 9546 * Loop over all the lines of the function and generate instructions. 9547 */ 9548 for (;;) 9549 { 9550 exarg_T ea; 9551 int starts_with_colon = FALSE; 9552 char_u *cmd; 9553 cmdmod_T local_cmdmod; 9554 9555 // Bail out on the first error to avoid a flood of errors and report 9556 // the right line number when inside try/catch. 9557 if (did_emsg_before != did_emsg) 9558 goto erret; 9559 9560 if (line != NULL && *line == '|') 9561 // the line continues after a '|' 9562 ++line; 9563 else if (line != NULL && *skipwhite(line) != NUL 9564 && !(*line == '#' && (line == cctx.ctx_line_start 9565 || VIM_ISWHITE(line[-1])))) 9566 { 9567 semsg(_(e_trailing_arg), line); 9568 goto erret; 9569 } 9570 else if (line != NULL && vim9_bad_comment(skipwhite(line))) 9571 goto erret; 9572 else 9573 { 9574 line = next_line_from_context(&cctx, FALSE); 9575 if (cctx.ctx_lnum >= ufunc->uf_lines.ga_len) 9576 { 9577 // beyond the last line 9578 #ifdef FEAT_PROFILE 9579 if (cctx.ctx_skip != SKIP_YES) 9580 may_generate_prof_end(&cctx, prof_lnum); 9581 #endif 9582 break; 9583 } 9584 // Make a copy, splitting off nextcmd and removing trailing spaces 9585 // may change it. 9586 if (line != NULL) 9587 { 9588 line = vim_strsave(line); 9589 vim_free(line_to_free); 9590 line_to_free = line; 9591 } 9592 } 9593 9594 CLEAR_FIELD(ea); 9595 ea.cmdlinep = &line; 9596 ea.cmd = skipwhite(line); 9597 9598 if (*ea.cmd == '#') 9599 { 9600 // "#" starts a comment 9601 line = (char_u *)""; 9602 continue; 9603 } 9604 9605 #ifdef FEAT_PROFILE 9606 if (cctx.ctx_compile_type == CT_PROFILE && cctx.ctx_lnum != prof_lnum 9607 && cctx.ctx_skip != SKIP_YES) 9608 { 9609 may_generate_prof_end(&cctx, prof_lnum); 9610 9611 prof_lnum = cctx.ctx_lnum; 9612 generate_instr(&cctx, ISN_PROF_START); 9613 } 9614 #endif 9615 if (cctx.ctx_compile_type == CT_DEBUG && cctx.ctx_lnum != debug_lnum 9616 && cctx.ctx_skip != SKIP_YES) 9617 { 9618 debug_lnum = cctx.ctx_lnum; 9619 generate_instr_debug(&cctx); 9620 } 9621 cctx.ctx_prev_lnum = cctx.ctx_lnum + 1; 9622 9623 // Some things can be recognized by the first character. 9624 switch (*ea.cmd) 9625 { 9626 case '}': 9627 { 9628 // "}" ends a block scope 9629 scopetype_T stype = cctx.ctx_scope == NULL 9630 ? NO_SCOPE : cctx.ctx_scope->se_type; 9631 9632 if (stype == BLOCK_SCOPE) 9633 { 9634 compile_endblock(&cctx); 9635 line = ea.cmd; 9636 } 9637 else 9638 { 9639 emsg(_(e_using_rcurly_outside_if_block_scope)); 9640 goto erret; 9641 } 9642 if (line != NULL) 9643 line = skipwhite(ea.cmd + 1); 9644 continue; 9645 } 9646 9647 case '{': 9648 // "{" starts a block scope 9649 // "{'a': 1}->func() is something else 9650 if (ends_excmd(*skipwhite(ea.cmd + 1))) 9651 { 9652 line = compile_block(ea.cmd, &cctx); 9653 continue; 9654 } 9655 break; 9656 } 9657 9658 /* 9659 * COMMAND MODIFIERS 9660 */ 9661 cctx.ctx_has_cmdmod = FALSE; 9662 if (parse_command_modifiers(&ea, &errormsg, &local_cmdmod, FALSE) 9663 == FAIL) 9664 { 9665 if (errormsg != NULL) 9666 goto erret; 9667 // empty line or comment 9668 line = (char_u *)""; 9669 continue; 9670 } 9671 generate_cmdmods(&cctx, &local_cmdmod); 9672 undo_cmdmod(&local_cmdmod); 9673 9674 // Check if there was a colon after the last command modifier or before 9675 // the current position. 9676 for (p = ea.cmd; p >= line; --p) 9677 { 9678 if (*p == ':') 9679 starts_with_colon = TRUE; 9680 if (p < ea.cmd && !VIM_ISWHITE(*p)) 9681 break; 9682 } 9683 9684 // Skip ":call" to get to the function name, unless using :legacy 9685 p = ea.cmd; 9686 if (!(local_cmdmod.cmod_flags & CMOD_LEGACY)) 9687 { 9688 if (checkforcmd(&ea.cmd, "call", 3)) 9689 { 9690 if (*ea.cmd == '(') 9691 // not for "call()" 9692 ea.cmd = p; 9693 else 9694 ea.cmd = skipwhite(ea.cmd); 9695 } 9696 9697 if (!starts_with_colon) 9698 { 9699 int assign; 9700 9701 // Check for assignment after command modifiers. 9702 assign = may_compile_assignment(&ea, &line, &cctx); 9703 if (assign == OK) 9704 goto nextline; 9705 if (assign == FAIL) 9706 goto erret; 9707 } 9708 } 9709 9710 /* 9711 * COMMAND after range 9712 * 'text'->func() should not be confused with 'a mark 9713 * "++nr" and "--nr" are eval commands 9714 */ 9715 cmd = ea.cmd; 9716 if (!(local_cmdmod.cmod_flags & CMOD_LEGACY) 9717 && (starts_with_colon || !(*cmd == '\'' 9718 || (cmd[0] == cmd[1] && (*cmd == '+' || *cmd == '-'))))) 9719 { 9720 ea.cmd = skip_range(ea.cmd, TRUE, NULL); 9721 if (ea.cmd > cmd) 9722 { 9723 if (!starts_with_colon) 9724 { 9725 semsg(_(e_colon_required_before_range_str), cmd); 9726 goto erret; 9727 } 9728 ea.addr_count = 1; 9729 if (ends_excmd2(line, ea.cmd)) 9730 { 9731 // A range without a command: jump to the line. 9732 // TODO: compile to a more efficient command, possibly 9733 // calling parse_cmd_address(). 9734 ea.cmdidx = CMD_SIZE; 9735 line = compile_exec(line, &ea, &cctx); 9736 goto nextline; 9737 } 9738 } 9739 } 9740 p = find_ex_command(&ea, NULL, 9741 starts_with_colon || (local_cmdmod.cmod_flags & CMOD_LEGACY) 9742 ? NULL : item_exists, &cctx); 9743 9744 if (p == NULL) 9745 { 9746 if (cctx.ctx_skip != SKIP_YES) 9747 emsg(_(e_ambiguous_use_of_user_defined_command)); 9748 goto erret; 9749 } 9750 9751 // When using ":legacy cmd" always use compile_exec(). 9752 if (local_cmdmod.cmod_flags & CMOD_LEGACY) 9753 { 9754 char_u *start = ea.cmd; 9755 9756 switch (ea.cmdidx) 9757 { 9758 case CMD_if: 9759 case CMD_elseif: 9760 case CMD_else: 9761 case CMD_endif: 9762 case CMD_for: 9763 case CMD_endfor: 9764 case CMD_continue: 9765 case CMD_break: 9766 case CMD_while: 9767 case CMD_endwhile: 9768 case CMD_try: 9769 case CMD_catch: 9770 case CMD_finally: 9771 case CMD_endtry: 9772 semsg(_(e_cannot_use_legacy_with_command_str), ea.cmd); 9773 goto erret; 9774 default: break; 9775 } 9776 9777 // ":legacy return expr" needs to be handled differently. 9778 if (checkforcmd(&start, "return", 4)) 9779 ea.cmdidx = CMD_return; 9780 else 9781 ea.cmdidx = CMD_legacy; 9782 } 9783 9784 if (p == ea.cmd && ea.cmdidx != CMD_SIZE) 9785 { 9786 if (cctx.ctx_skip == SKIP_YES && ea.cmdidx != CMD_eval) 9787 { 9788 line += STRLEN(line); 9789 goto nextline; 9790 } 9791 else if (ea.cmdidx != CMD_eval) 9792 { 9793 // CMD_var cannot happen, compile_assignment() above would be 9794 // used. Most likely an assignment to a non-existing variable. 9795 semsg(_(e_command_not_recognized_str), ea.cmd); 9796 goto erret; 9797 } 9798 } 9799 9800 if (cctx.ctx_had_return 9801 && ea.cmdidx != CMD_elseif 9802 && ea.cmdidx != CMD_else 9803 && ea.cmdidx != CMD_endif 9804 && ea.cmdidx != CMD_endfor 9805 && ea.cmdidx != CMD_endwhile 9806 && ea.cmdidx != CMD_catch 9807 && ea.cmdidx != CMD_finally 9808 && ea.cmdidx != CMD_endtry) 9809 { 9810 emsg(_(e_unreachable_code_after_return)); 9811 goto erret; 9812 } 9813 9814 p = skipwhite(p); 9815 if (ea.cmdidx != CMD_SIZE 9816 && ea.cmdidx != CMD_write && ea.cmdidx != CMD_read) 9817 { 9818 if (ea.cmdidx >= 0) 9819 ea.argt = excmd_get_argt(ea.cmdidx); 9820 if ((ea.argt & EX_BANG) && *p == '!') 9821 { 9822 ea.forceit = TRUE; 9823 p = skipwhite(p + 1); 9824 } 9825 } 9826 9827 switch (ea.cmdidx) 9828 { 9829 case CMD_def: 9830 ea.arg = p; 9831 line = compile_nested_function(&ea, &cctx); 9832 break; 9833 9834 case CMD_function: 9835 // TODO: should we allow this, e.g. to declare a global 9836 // function? 9837 emsg(_(e_cannot_use_function_inside_def)); 9838 goto erret; 9839 9840 case CMD_return: 9841 line = compile_return(p, check_return_type, 9842 local_cmdmod.cmod_flags & CMOD_LEGACY, &cctx); 9843 cctx.ctx_had_return = TRUE; 9844 break; 9845 9846 case CMD_let: 9847 emsg(_(e_cannot_use_let_in_vim9_script)); 9848 break; 9849 case CMD_var: 9850 case CMD_final: 9851 case CMD_const: 9852 case CMD_increment: 9853 case CMD_decrement: 9854 line = compile_assignment(p, &ea, ea.cmdidx, &cctx); 9855 if (line == p) 9856 line = NULL; 9857 break; 9858 9859 case CMD_unlet: 9860 case CMD_unlockvar: 9861 case CMD_lockvar: 9862 line = compile_unletlock(p, &ea, &cctx); 9863 break; 9864 9865 case CMD_import: 9866 emsg(_(e_import_can_only_be_used_in_script)); 9867 line = NULL; 9868 break; 9869 9870 case CMD_if: 9871 line = compile_if(p, &cctx); 9872 break; 9873 case CMD_elseif: 9874 line = compile_elseif(p, &cctx); 9875 cctx.ctx_had_return = FALSE; 9876 break; 9877 case CMD_else: 9878 line = compile_else(p, &cctx); 9879 cctx.ctx_had_return = FALSE; 9880 break; 9881 case CMD_endif: 9882 line = compile_endif(p, &cctx); 9883 break; 9884 9885 case CMD_while: 9886 line = compile_while(p, &cctx); 9887 break; 9888 case CMD_endwhile: 9889 line = compile_endwhile(p, &cctx); 9890 cctx.ctx_had_return = FALSE; 9891 break; 9892 9893 case CMD_for: 9894 line = compile_for(p, &cctx); 9895 break; 9896 case CMD_endfor: 9897 line = compile_endfor(p, &cctx); 9898 cctx.ctx_had_return = FALSE; 9899 break; 9900 case CMD_continue: 9901 line = compile_continue(p, &cctx); 9902 break; 9903 case CMD_break: 9904 line = compile_break(p, &cctx); 9905 break; 9906 9907 case CMD_try: 9908 line = compile_try(p, &cctx); 9909 break; 9910 case CMD_catch: 9911 line = compile_catch(p, &cctx); 9912 cctx.ctx_had_return = FALSE; 9913 break; 9914 case CMD_finally: 9915 line = compile_finally(p, &cctx); 9916 cctx.ctx_had_return = FALSE; 9917 break; 9918 case CMD_endtry: 9919 line = compile_endtry(p, &cctx); 9920 cctx.ctx_had_return = FALSE; 9921 break; 9922 case CMD_throw: 9923 line = compile_throw(p, &cctx); 9924 break; 9925 9926 case CMD_eval: 9927 line = compile_eval(p, &cctx); 9928 break; 9929 9930 case CMD_echo: 9931 case CMD_echon: 9932 case CMD_execute: 9933 case CMD_echomsg: 9934 case CMD_echoerr: 9935 case CMD_echoconsole: 9936 line = compile_mult_expr(p, ea.cmdidx, &cctx); 9937 break; 9938 9939 case CMD_put: 9940 ea.cmd = cmd; 9941 line = compile_put(p, &ea, &cctx); 9942 break; 9943 9944 case CMD_substitute: 9945 if (cctx.ctx_skip == SKIP_YES) 9946 line = (char_u *)""; 9947 else 9948 { 9949 ea.arg = p; 9950 line = compile_substitute(line, &ea, &cctx); 9951 } 9952 break; 9953 9954 case CMD_redir: 9955 ea.arg = p; 9956 line = compile_redir(line, &ea, &cctx); 9957 break; 9958 9959 case CMD_cexpr: 9960 case CMD_lexpr: 9961 case CMD_caddexpr: 9962 case CMD_laddexpr: 9963 case CMD_cgetexpr: 9964 case CMD_lgetexpr: 9965 #ifdef FEAT_QUICKFIX 9966 ea.arg = p; 9967 line = compile_cexpr(line, &ea, &cctx); 9968 #else 9969 ex_ni(&ea); 9970 line = NULL; 9971 #endif 9972 break; 9973 9974 case CMD_append: 9975 case CMD_change: 9976 case CMD_insert: 9977 case CMD_k: 9978 case CMD_t: 9979 case CMD_xit: 9980 not_in_vim9(&ea); 9981 goto erret; 9982 9983 case CMD_SIZE: 9984 if (cctx.ctx_skip != SKIP_YES) 9985 { 9986 semsg(_(e_invalid_command_str), ea.cmd); 9987 goto erret; 9988 } 9989 // We don't check for a next command here. 9990 line = (char_u *)""; 9991 break; 9992 9993 case CMD_lua: 9994 case CMD_mzscheme: 9995 case CMD_perl: 9996 case CMD_py3: 9997 case CMD_python3: 9998 case CMD_python: 9999 case CMD_pythonx: 10000 case CMD_ruby: 10001 case CMD_tcl: 10002 ea.arg = p; 10003 if (vim_strchr(line, '\n') == NULL) 10004 line = compile_exec(line, &ea, &cctx); 10005 else 10006 // heredoc lines have been concatenated with NL 10007 // characters in get_function_body() 10008 line = compile_script(line, &cctx); 10009 break; 10010 10011 default: 10012 // Not recognized, execute with do_cmdline_cmd(). 10013 ea.arg = p; 10014 line = compile_exec(line, &ea, &cctx); 10015 break; 10016 } 10017 nextline: 10018 if (line == NULL) 10019 goto erret; 10020 line = skipwhite(line); 10021 10022 // Undo any command modifiers. 10023 generate_undo_cmdmods(&cctx); 10024 10025 if (cctx.ctx_type_stack.ga_len < 0) 10026 { 10027 iemsg("Type stack underflow"); 10028 goto erret; 10029 } 10030 } 10031 10032 if (cctx.ctx_scope != NULL) 10033 { 10034 if (cctx.ctx_scope->se_type == IF_SCOPE) 10035 emsg(_(e_endif)); 10036 else if (cctx.ctx_scope->se_type == WHILE_SCOPE) 10037 emsg(_(e_endwhile)); 10038 else if (cctx.ctx_scope->se_type == FOR_SCOPE) 10039 emsg(_(e_endfor)); 10040 else 10041 emsg(_(e_missing_rcurly)); 10042 goto erret; 10043 } 10044 10045 if (!cctx.ctx_had_return) 10046 { 10047 if (ufunc->uf_ret_type->tt_type == VAR_UNKNOWN) 10048 ufunc->uf_ret_type = &t_void; 10049 else if (ufunc->uf_ret_type->tt_type != VAR_VOID) 10050 { 10051 emsg(_(e_missing_return_statement)); 10052 goto erret; 10053 } 10054 10055 // Return void if there is no return at the end. 10056 generate_instr(&cctx, ISN_RETURN_VOID); 10057 } 10058 10059 // When compiled with ":silent!" and there was an error don't consider the 10060 // function compiled. 10061 if (emsg_silent == 0 || did_emsg_silent == did_emsg_silent_before) 10062 { 10063 dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data) 10064 + ufunc->uf_dfunc_idx; 10065 dfunc->df_deleted = FALSE; 10066 dfunc->df_script_seq = current_sctx.sc_seq; 10067 #ifdef FEAT_PROFILE 10068 if (cctx.ctx_compile_type == CT_PROFILE) 10069 { 10070 dfunc->df_instr_prof = instr->ga_data; 10071 dfunc->df_instr_prof_count = instr->ga_len; 10072 } 10073 else 10074 #endif 10075 if (cctx.ctx_compile_type == CT_DEBUG) 10076 { 10077 dfunc->df_instr_debug = instr->ga_data; 10078 dfunc->df_instr_debug_count = instr->ga_len; 10079 } 10080 else 10081 { 10082 dfunc->df_instr = instr->ga_data; 10083 dfunc->df_instr_count = instr->ga_len; 10084 } 10085 dfunc->df_varcount = dfunc->df_var_names.ga_len; 10086 dfunc->df_has_closure = cctx.ctx_has_closure; 10087 if (cctx.ctx_outer_used) 10088 ufunc->uf_flags |= FC_CLOSURE; 10089 ufunc->uf_def_status = UF_COMPILED; 10090 } 10091 10092 ret = OK; 10093 10094 erret: 10095 if (ufunc->uf_def_status == UF_COMPILING) 10096 { 10097 dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data) 10098 + ufunc->uf_dfunc_idx; 10099 10100 // Compiling aborted, free the generated instructions. 10101 clear_instr_ga(instr); 10102 VIM_CLEAR(dfunc->df_name); 10103 ga_clear_strings(&dfunc->df_var_names); 10104 10105 // If using the last entry in the table and it was added above, we 10106 // might as well remove it. 10107 if (!dfunc->df_deleted && new_def_function 10108 && ufunc->uf_dfunc_idx == def_functions.ga_len - 1) 10109 { 10110 --def_functions.ga_len; 10111 ufunc->uf_dfunc_idx = 0; 10112 } 10113 ufunc->uf_def_status = UF_COMPILE_ERROR; 10114 10115 while (cctx.ctx_scope != NULL) 10116 drop_scope(&cctx); 10117 10118 if (errormsg != NULL) 10119 emsg(errormsg); 10120 else if (did_emsg == did_emsg_before) 10121 emsg(_(e_compiling_def_function_failed)); 10122 } 10123 10124 if (cctx.ctx_redir_lhs.lhs_name != NULL) 10125 { 10126 if (ret == OK) 10127 { 10128 emsg(_(e_missing_redir_end)); 10129 ret = FAIL; 10130 } 10131 vim_free(cctx.ctx_redir_lhs.lhs_name); 10132 vim_free(cctx.ctx_redir_lhs.lhs_whole); 10133 } 10134 10135 current_sctx = save_current_sctx; 10136 estack_compiling = save_estack_compiling; 10137 cmdmod.cmod_flags = save_cmod_flags; 10138 if (do_estack_push) 10139 estack_pop(); 10140 10141 vim_free(line_to_free); 10142 free_imported(&cctx); 10143 free_locals(&cctx); 10144 ga_clear(&cctx.ctx_type_stack); 10145 return ret; 10146 } 10147 10148 void 10149 set_function_type(ufunc_T *ufunc) 10150 { 10151 int varargs = ufunc->uf_va_name != NULL; 10152 int argcount = ufunc->uf_args.ga_len; 10153 10154 // Create a type for the function, with the return type and any 10155 // argument types. 10156 // A vararg is included in uf_args.ga_len but not in uf_arg_types. 10157 // The type is included in "tt_args". 10158 if (argcount > 0 || varargs) 10159 { 10160 if (ufunc->uf_type_list.ga_itemsize == 0) 10161 ga_init2(&ufunc->uf_type_list, sizeof(type_T *), 10); 10162 ufunc->uf_func_type = alloc_func_type(ufunc->uf_ret_type, 10163 argcount, &ufunc->uf_type_list); 10164 // Add argument types to the function type. 10165 if (func_type_add_arg_types(ufunc->uf_func_type, 10166 argcount + varargs, 10167 &ufunc->uf_type_list) == FAIL) 10168 return; 10169 ufunc->uf_func_type->tt_argcount = argcount + varargs; 10170 ufunc->uf_func_type->tt_min_argcount = 10171 argcount - ufunc->uf_def_args.ga_len; 10172 if (ufunc->uf_arg_types == NULL) 10173 { 10174 int i; 10175 10176 // lambda does not have argument types. 10177 for (i = 0; i < argcount; ++i) 10178 ufunc->uf_func_type->tt_args[i] = &t_any; 10179 } 10180 else 10181 mch_memmove(ufunc->uf_func_type->tt_args, 10182 ufunc->uf_arg_types, sizeof(type_T *) * argcount); 10183 if (varargs) 10184 { 10185 ufunc->uf_func_type->tt_args[argcount] = 10186 ufunc->uf_va_type == NULL ? &t_list_any : ufunc->uf_va_type; 10187 ufunc->uf_func_type->tt_flags = TTFLAG_VARARGS; 10188 } 10189 } 10190 else 10191 // No arguments, can use a predefined type. 10192 ufunc->uf_func_type = get_func_type(ufunc->uf_ret_type, 10193 argcount, &ufunc->uf_type_list); 10194 } 10195 10196 10197 /* 10198 * Delete an instruction, free what it contains. 10199 */ 10200 void 10201 delete_instr(isn_T *isn) 10202 { 10203 switch (isn->isn_type) 10204 { 10205 case ISN_DEF: 10206 case ISN_EXEC: 10207 case ISN_EXEC_SPLIT: 10208 case ISN_LEGACY_EVAL: 10209 case ISN_LOADAUTO: 10210 case ISN_LOADB: 10211 case ISN_LOADENV: 10212 case ISN_LOADG: 10213 case ISN_LOADOPT: 10214 case ISN_LOADT: 10215 case ISN_LOADW: 10216 case ISN_LOCKUNLOCK: 10217 case ISN_PUSHEXC: 10218 case ISN_PUSHFUNC: 10219 case ISN_PUSHS: 10220 case ISN_RANGE: 10221 case ISN_STOREAUTO: 10222 case ISN_STOREB: 10223 case ISN_STOREENV: 10224 case ISN_STOREG: 10225 case ISN_STORET: 10226 case ISN_STOREW: 10227 case ISN_STRINGMEMBER: 10228 vim_free(isn->isn_arg.string); 10229 break; 10230 10231 case ISN_SUBSTITUTE: 10232 { 10233 int idx; 10234 isn_T *list = isn->isn_arg.subs.subs_instr; 10235 10236 vim_free(isn->isn_arg.subs.subs_cmd); 10237 for (idx = 0; list[idx].isn_type != ISN_FINISH; ++idx) 10238 delete_instr(list + idx); 10239 vim_free(list); 10240 } 10241 break; 10242 10243 case ISN_INSTR: 10244 { 10245 int idx; 10246 isn_T *list = isn->isn_arg.instr; 10247 10248 for (idx = 0; list[idx].isn_type != ISN_FINISH; ++idx) 10249 delete_instr(list + idx); 10250 vim_free(list); 10251 } 10252 break; 10253 10254 case ISN_LOADS: 10255 case ISN_STORES: 10256 vim_free(isn->isn_arg.loadstore.ls_name); 10257 break; 10258 10259 case ISN_UNLET: 10260 case ISN_UNLETENV: 10261 vim_free(isn->isn_arg.unlet.ul_name); 10262 break; 10263 10264 case ISN_STOREOPT: 10265 vim_free(isn->isn_arg.storeopt.so_name); 10266 break; 10267 10268 case ISN_PUSHBLOB: // push blob isn_arg.blob 10269 blob_unref(isn->isn_arg.blob); 10270 break; 10271 10272 case ISN_PUSHJOB: 10273 #ifdef FEAT_JOB_CHANNEL 10274 job_unref(isn->isn_arg.job); 10275 #endif 10276 break; 10277 10278 case ISN_PUSHCHANNEL: 10279 #ifdef FEAT_JOB_CHANNEL 10280 channel_unref(isn->isn_arg.channel); 10281 #endif 10282 break; 10283 10284 case ISN_UCALL: 10285 vim_free(isn->isn_arg.ufunc.cuf_name); 10286 break; 10287 10288 case ISN_FUNCREF: 10289 { 10290 dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data) 10291 + isn->isn_arg.funcref.fr_func; 10292 ufunc_T *ufunc = dfunc->df_ufunc; 10293 10294 if (ufunc != NULL && func_name_refcount(ufunc->uf_name)) 10295 func_ptr_unref(ufunc); 10296 } 10297 break; 10298 10299 case ISN_DCALL: 10300 { 10301 dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data) 10302 + isn->isn_arg.dfunc.cdf_idx; 10303 10304 if (dfunc->df_ufunc != NULL 10305 && func_name_refcount(dfunc->df_ufunc->uf_name)) 10306 func_ptr_unref(dfunc->df_ufunc); 10307 } 10308 break; 10309 10310 case ISN_NEWFUNC: 10311 { 10312 char_u *lambda = isn->isn_arg.newfunc.nf_lambda; 10313 ufunc_T *ufunc = find_func_even_dead(lambda, TRUE, NULL); 10314 10315 if (ufunc != NULL) 10316 { 10317 unlink_def_function(ufunc); 10318 func_ptr_unref(ufunc); 10319 } 10320 10321 vim_free(lambda); 10322 vim_free(isn->isn_arg.newfunc.nf_global); 10323 } 10324 break; 10325 10326 case ISN_CHECKTYPE: 10327 case ISN_SETTYPE: 10328 free_type(isn->isn_arg.type.ct_type); 10329 break; 10330 10331 case ISN_CMDMOD: 10332 vim_regfree(isn->isn_arg.cmdmod.cf_cmdmod 10333 ->cmod_filter_regmatch.regprog); 10334 vim_free(isn->isn_arg.cmdmod.cf_cmdmod); 10335 break; 10336 10337 case ISN_LOADSCRIPT: 10338 case ISN_STORESCRIPT: 10339 vim_free(isn->isn_arg.script.scriptref); 10340 break; 10341 10342 case ISN_TRY: 10343 vim_free(isn->isn_arg.try.try_ref); 10344 break; 10345 10346 case ISN_CEXPR_CORE: 10347 vim_free(isn->isn_arg.cexpr.cexpr_ref->cer_cmdline); 10348 vim_free(isn->isn_arg.cexpr.cexpr_ref); 10349 break; 10350 10351 case ISN_2BOOL: 10352 case ISN_2STRING: 10353 case ISN_2STRING_ANY: 10354 case ISN_ADDBLOB: 10355 case ISN_ADDLIST: 10356 case ISN_ANYINDEX: 10357 case ISN_ANYSLICE: 10358 case ISN_BCALL: 10359 case ISN_BLOBAPPEND: 10360 case ISN_BLOBINDEX: 10361 case ISN_BLOBSLICE: 10362 case ISN_CATCH: 10363 case ISN_CEXPR_AUCMD: 10364 case ISN_CHECKLEN: 10365 case ISN_CHECKNR: 10366 case ISN_CMDMOD_REV: 10367 case ISN_COMPAREANY: 10368 case ISN_COMPAREBLOB: 10369 case ISN_COMPAREBOOL: 10370 case ISN_COMPAREDICT: 10371 case ISN_COMPAREFLOAT: 10372 case ISN_COMPAREFUNC: 10373 case ISN_COMPARELIST: 10374 case ISN_COMPARENR: 10375 case ISN_COMPARESPECIAL: 10376 case ISN_COMPARESTRING: 10377 case ISN_CONCAT: 10378 case ISN_COND2BOOL: 10379 case ISN_DEBUG: 10380 case ISN_DROP: 10381 case ISN_ECHO: 10382 case ISN_ECHOCONSOLE: 10383 case ISN_ECHOERR: 10384 case ISN_ECHOMSG: 10385 case ISN_ENDTRY: 10386 case ISN_EXECCONCAT: 10387 case ISN_EXECUTE: 10388 case ISN_FINALLY: 10389 case ISN_FINISH: 10390 case ISN_FOR: 10391 case ISN_GETITEM: 10392 case ISN_JUMP: 10393 case ISN_JUMP_IF_ARG_SET: 10394 case ISN_LISTAPPEND: 10395 case ISN_LISTINDEX: 10396 case ISN_LISTSLICE: 10397 case ISN_LOAD: 10398 case ISN_LOADBDICT: 10399 case ISN_LOADGDICT: 10400 case ISN_LOADOUTER: 10401 case ISN_LOADREG: 10402 case ISN_LOADTDICT: 10403 case ISN_LOADV: 10404 case ISN_LOADWDICT: 10405 case ISN_LOCKCONST: 10406 case ISN_MEMBER: 10407 case ISN_NEGATENR: 10408 case ISN_NEWDICT: 10409 case ISN_NEWLIST: 10410 case ISN_OPANY: 10411 case ISN_OPFLOAT: 10412 case ISN_OPNR: 10413 case ISN_PCALL: 10414 case ISN_PCALL_END: 10415 case ISN_PROF_END: 10416 case ISN_PROF_START: 10417 case ISN_PUSHBOOL: 10418 case ISN_PUSHF: 10419 case ISN_PUSHNR: 10420 case ISN_PUSHSPEC: 10421 case ISN_PUT: 10422 case ISN_REDIREND: 10423 case ISN_REDIRSTART: 10424 case ISN_RETURN: 10425 case ISN_RETURN_VOID: 10426 case ISN_SHUFFLE: 10427 case ISN_SLICE: 10428 case ISN_STORE: 10429 case ISN_STOREINDEX: 10430 case ISN_STORENR: 10431 case ISN_STOREOUTER: 10432 case ISN_STORERANGE: 10433 case ISN_STOREREG: 10434 case ISN_STOREV: 10435 case ISN_STRINDEX: 10436 case ISN_STRSLICE: 10437 case ISN_THROW: 10438 case ISN_TRYCONT: 10439 case ISN_UNLETINDEX: 10440 case ISN_UNLETRANGE: 10441 case ISN_UNPACK: 10442 // nothing allocated 10443 break; 10444 } 10445 } 10446 10447 /* 10448 * Free all instructions for "dfunc" except df_name. 10449 */ 10450 static void 10451 delete_def_function_contents(dfunc_T *dfunc, int mark_deleted) 10452 { 10453 int idx; 10454 10455 ga_clear(&dfunc->df_def_args_isn); 10456 ga_clear_strings(&dfunc->df_var_names); 10457 10458 if (dfunc->df_instr != NULL) 10459 { 10460 for (idx = 0; idx < dfunc->df_instr_count; ++idx) 10461 delete_instr(dfunc->df_instr + idx); 10462 VIM_CLEAR(dfunc->df_instr); 10463 dfunc->df_instr = NULL; 10464 } 10465 if (dfunc->df_instr_debug != NULL) 10466 { 10467 for (idx = 0; idx < dfunc->df_instr_debug_count; ++idx) 10468 delete_instr(dfunc->df_instr_debug + idx); 10469 VIM_CLEAR(dfunc->df_instr_debug); 10470 dfunc->df_instr_debug = NULL; 10471 } 10472 #ifdef FEAT_PROFILE 10473 if (dfunc->df_instr_prof != NULL) 10474 { 10475 for (idx = 0; idx < dfunc->df_instr_prof_count; ++idx) 10476 delete_instr(dfunc->df_instr_prof + idx); 10477 VIM_CLEAR(dfunc->df_instr_prof); 10478 dfunc->df_instr_prof = NULL; 10479 } 10480 #endif 10481 10482 if (mark_deleted) 10483 dfunc->df_deleted = TRUE; 10484 if (dfunc->df_ufunc != NULL) 10485 dfunc->df_ufunc->uf_def_status = UF_NOT_COMPILED; 10486 } 10487 10488 /* 10489 * When a user function is deleted, clear the contents of any associated def 10490 * function, unless another user function still uses it. 10491 * The position in def_functions can be re-used. 10492 */ 10493 void 10494 unlink_def_function(ufunc_T *ufunc) 10495 { 10496 if (ufunc->uf_dfunc_idx > 0) 10497 { 10498 dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data) 10499 + ufunc->uf_dfunc_idx; 10500 10501 if (--dfunc->df_refcount <= 0) 10502 delete_def_function_contents(dfunc, TRUE); 10503 ufunc->uf_def_status = UF_NOT_COMPILED; 10504 ufunc->uf_dfunc_idx = 0; 10505 if (dfunc->df_ufunc == ufunc) 10506 dfunc->df_ufunc = NULL; 10507 } 10508 } 10509 10510 /* 10511 * Used when a user function refers to an existing dfunc. 10512 */ 10513 void 10514 link_def_function(ufunc_T *ufunc) 10515 { 10516 if (ufunc->uf_dfunc_idx > 0) 10517 { 10518 dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data) 10519 + ufunc->uf_dfunc_idx; 10520 10521 ++dfunc->df_refcount; 10522 } 10523 } 10524 10525 #if defined(EXITFREE) || defined(PROTO) 10526 /* 10527 * Free all functions defined with ":def". 10528 */ 10529 void 10530 free_def_functions(void) 10531 { 10532 int idx; 10533 10534 for (idx = 0; idx < def_functions.ga_len; ++idx) 10535 { 10536 dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data) + idx; 10537 10538 delete_def_function_contents(dfunc, TRUE); 10539 vim_free(dfunc->df_name); 10540 } 10541 10542 ga_clear(&def_functions); 10543 } 10544 #endif 10545 10546 10547 #endif // FEAT_EVAL 10548