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