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