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 * userfunc.c: User defined function support 12 */ 13 14 #include "vim.h" 15 16 #if defined(FEAT_EVAL) || defined(PROTO) 17 /* 18 * All user-defined functions are found in this hashtable. 19 */ 20 static hashtab_T func_hashtab; 21 22 // Used by get_func_tv() 23 static garray_T funcargs = GA_EMPTY; 24 25 // pointer to funccal for currently active function 26 static funccall_T *current_funccal = NULL; 27 28 // Pointer to list of previously used funccal, still around because some 29 // item in it is still being used. 30 static funccall_T *previous_funccal = NULL; 31 32 static char *e_funcexts = N_("E122: Function %s already exists, add ! to replace it"); 33 static char *e_funcdict = N_("E717: Dictionary entry already exists"); 34 static char *e_funcref = N_("E718: Funcref required"); 35 static char *e_nofunc = N_("E130: Unknown function: %s"); 36 37 static void funccal_unref(funccall_T *fc, ufunc_T *fp, int force); 38 static void func_clear(ufunc_T *fp, int force); 39 static int func_free(ufunc_T *fp, int force); 40 41 void 42 func_init() 43 { 44 hash_init(&func_hashtab); 45 } 46 47 /* 48 * Return the function hash table 49 */ 50 hashtab_T * 51 func_tbl_get(void) 52 { 53 return &func_hashtab; 54 } 55 56 /* 57 * Get one function argument. 58 * If "argtypes" is not NULL also get the type: "arg: type" (:def function). 59 * If "types_optional" is TRUE a missing type is OK, use "any". 60 * If "evalarg" is not NULL use it to check for an already declared name. 61 * Return a pointer to after the type. 62 * When something is wrong return "arg". 63 */ 64 static char_u * 65 one_function_arg( 66 char_u *arg, 67 garray_T *newargs, 68 garray_T *argtypes, 69 int types_optional, 70 evalarg_T *evalarg, 71 int is_vararg, 72 int skip) 73 { 74 char_u *p = arg; 75 char_u *arg_copy = NULL; 76 int is_underscore = FALSE; 77 78 while (ASCII_ISALNUM(*p) || *p == '_') 79 ++p; 80 if (arg == p || isdigit(*arg) 81 || (argtypes == NULL 82 && ((p - arg == 9 && STRNCMP(arg, "firstline", 9) == 0) 83 || (p - arg == 8 && STRNCMP(arg, "lastline", 8) == 0)))) 84 { 85 if (!skip) 86 semsg(_("E125: Illegal argument: %s"), arg); 87 return arg; 88 } 89 90 // Vim9 script: cannot use script var name for argument. In function: also 91 // check local vars and arguments. 92 if (!skip && argtypes != NULL && check_defined(arg, p - arg, 93 evalarg == NULL ? NULL : evalarg->eval_cctx, TRUE) == FAIL) 94 return arg; 95 96 if (newargs != NULL && ga_grow(newargs, 1) == FAIL) 97 return arg; 98 if (newargs != NULL) 99 { 100 int c; 101 int i; 102 103 c = *p; 104 *p = NUL; 105 arg_copy = vim_strsave(arg); 106 if (arg_copy == NULL) 107 { 108 *p = c; 109 return arg; 110 } 111 is_underscore = arg_copy[0] == '_' && arg_copy[1] == NUL; 112 if (argtypes == NULL || !is_underscore) 113 // Check for duplicate argument name. 114 for (i = 0; i < newargs->ga_len; ++i) 115 if (STRCMP(((char_u **)(newargs->ga_data))[i], arg_copy) == 0) 116 { 117 semsg(_("E853: Duplicate argument name: %s"), arg_copy); 118 vim_free(arg_copy); 119 return arg; 120 } 121 ((char_u **)(newargs->ga_data))[newargs->ga_len] = arg_copy; 122 newargs->ga_len++; 123 124 *p = c; 125 } 126 127 // get any type from "arg: type" 128 if (argtypes != NULL && (skip || ga_grow(argtypes, 1) == OK)) 129 { 130 char_u *type = NULL; 131 132 if (VIM_ISWHITE(*p) && *skipwhite(p) == ':') 133 { 134 semsg(_(e_no_white_space_allowed_before_colon_str), 135 arg_copy == NULL ? arg : arg_copy); 136 p = skipwhite(p); 137 } 138 if (*p == ':') 139 { 140 ++p; 141 if (!skip && !VIM_ISWHITE(*p)) 142 { 143 semsg(_(e_white_space_required_after_str_str), ":", p - 1); 144 return arg; 145 } 146 type = skipwhite(p); 147 p = skip_type(type, TRUE); 148 if (!skip) 149 type = vim_strnsave(type, p - type); 150 } 151 else if (*skipwhite(p) != '=' && !types_optional && !is_underscore) 152 { 153 semsg(_(e_missing_argument_type_for_str), 154 arg_copy == NULL ? arg : arg_copy); 155 return arg; 156 } 157 if (!skip) 158 { 159 if (type == NULL && types_optional) 160 // lambda arguments default to "any" type 161 type = vim_strsave((char_u *) 162 (is_vararg ? "list<any>" : "any")); 163 ((char_u **)argtypes->ga_data)[argtypes->ga_len++] = type; 164 } 165 } 166 167 return p; 168 } 169 170 /* 171 * Get function arguments. 172 * "argp" should point to just after the "(", possibly to white space. 173 * "argp" is advanced just after "endchar". 174 */ 175 static int 176 get_function_args( 177 char_u **argp, 178 char_u endchar, 179 garray_T *newargs, 180 garray_T *argtypes, // NULL unless using :def 181 int types_optional, // types optional if "argtypes" is not NULL 182 evalarg_T *evalarg, // context or NULL 183 int *varargs, 184 garray_T *default_args, 185 int skip, 186 exarg_T *eap, 187 char_u **line_to_free) 188 { 189 int mustend = FALSE; 190 char_u *arg; 191 char_u *p; 192 int c; 193 int any_default = FALSE; 194 char_u *expr; 195 char_u *whitep = *argp; 196 197 if (newargs != NULL) 198 ga_init2(newargs, (int)sizeof(char_u *), 3); 199 if (argtypes != NULL) 200 ga_init2(argtypes, (int)sizeof(char_u *), 3); 201 if (!skip && default_args != NULL) 202 ga_init2(default_args, (int)sizeof(char_u *), 3); 203 204 if (varargs != NULL) 205 *varargs = FALSE; 206 207 /* 208 * Isolate the arguments: "arg1, arg2, ...)" 209 */ 210 arg = skipwhite(*argp); 211 p = arg; 212 while (*p != endchar) 213 { 214 while (eap != NULL && eap->getline != NULL 215 && (*p == NUL || (VIM_ISWHITE(*whitep) && *p == '#'))) 216 { 217 char_u *theline; 218 219 // End of the line, get the next one. 220 theline = eap->getline(':', eap->cookie, 0, TRUE); 221 if (theline == NULL) 222 break; 223 vim_free(*line_to_free); 224 *line_to_free = theline; 225 whitep = (char_u *)" "; 226 p = skipwhite(theline); 227 } 228 229 if (mustend && *p != endchar) 230 { 231 if (!skip) 232 semsg(_(e_invarg2), *argp); 233 goto err_ret; 234 } 235 if (*p == endchar) 236 break; 237 238 if (p[0] == '.' && p[1] == '.' && p[2] == '.') 239 { 240 if (varargs != NULL) 241 *varargs = TRUE; 242 p += 3; 243 mustend = TRUE; 244 245 if (argtypes != NULL) 246 { 247 // ...name: list<type> 248 if (!eval_isnamec1(*p)) 249 { 250 if (!skip) 251 emsg(_(e_missing_name_after_dots)); 252 goto err_ret; 253 } 254 255 arg = p; 256 p = one_function_arg(p, newargs, argtypes, types_optional, 257 evalarg, TRUE, skip); 258 if (p == arg) 259 break; 260 if (*skipwhite(p) == '=') 261 { 262 emsg(_(e_cannot_use_default_for_variable_arguments)); 263 break; 264 } 265 } 266 } 267 else 268 { 269 char_u *np; 270 271 arg = p; 272 p = one_function_arg(p, newargs, argtypes, types_optional, 273 evalarg, FALSE, skip); 274 if (p == arg) 275 break; 276 277 // Recognize " = expr" but not " == expr". A lambda can have 278 // "(a = expr" but "(a == expr" and "(a =~ expr" are not a lambda. 279 np = skipwhite(p); 280 if (*np == '=' && np[1] != '=' && np[1] != '~' 281 && default_args != NULL) 282 { 283 typval_T rettv; 284 285 // find the end of the expression (doesn't evaluate it) 286 any_default = TRUE; 287 p = skipwhite(p) + 1; 288 whitep = p; 289 p = skipwhite(p); 290 expr = p; 291 if (eval1(&p, &rettv, NULL) != FAIL) 292 { 293 if (!skip) 294 { 295 if (ga_grow(default_args, 1) == FAIL) 296 goto err_ret; 297 298 // trim trailing whitespace 299 while (p > expr && VIM_ISWHITE(p[-1])) 300 p--; 301 c = *p; 302 *p = NUL; 303 expr = vim_strsave(expr); 304 if (expr == NULL) 305 { 306 *p = c; 307 goto err_ret; 308 } 309 ((char_u **)(default_args->ga_data)) 310 [default_args->ga_len] = expr; 311 default_args->ga_len++; 312 *p = c; 313 } 314 } 315 else 316 mustend = TRUE; 317 } 318 else if (any_default) 319 { 320 emsg(_("E989: Non-default argument follows default argument")); 321 goto err_ret; 322 } 323 324 if (VIM_ISWHITE(*p) && *skipwhite(p) == ',') 325 { 326 // Be tolerant when skipping 327 if (!skip) 328 { 329 semsg(_(e_no_white_space_allowed_before_str_str), ",", p); 330 goto err_ret; 331 } 332 p = skipwhite(p); 333 } 334 if (*p == ',') 335 { 336 ++p; 337 // Don't give this error when skipping, it makes the "->" not 338 // found in "{k,v -> x}" and give a confusing error. 339 // Allow missing space after comma in legacy functions. 340 if (!skip && argtypes != NULL 341 && !IS_WHITE_OR_NUL(*p) && *p != endchar) 342 { 343 semsg(_(e_white_space_required_after_str_str), ",", p - 1); 344 goto err_ret; 345 } 346 } 347 else 348 mustend = TRUE; 349 } 350 whitep = p; 351 p = skipwhite(p); 352 } 353 354 if (*p != endchar) 355 goto err_ret; 356 ++p; // skip "endchar" 357 358 *argp = p; 359 return OK; 360 361 err_ret: 362 if (newargs != NULL) 363 ga_clear_strings(newargs); 364 if (!skip && default_args != NULL) 365 ga_clear_strings(default_args); 366 return FAIL; 367 } 368 369 /* 370 * Parse the argument types, filling "fp->uf_arg_types". 371 * Return OK or FAIL. 372 */ 373 static int 374 parse_argument_types(ufunc_T *fp, garray_T *argtypes, int varargs) 375 { 376 int len = 0; 377 378 ga_init2(&fp->uf_type_list, sizeof(type_T *), 10); 379 if (argtypes->ga_len > 0) 380 { 381 // When "varargs" is set the last name/type goes into uf_va_name 382 // and uf_va_type. 383 len = argtypes->ga_len - (varargs ? 1 : 0); 384 385 if (len > 0) 386 fp->uf_arg_types = ALLOC_CLEAR_MULT(type_T *, len); 387 if (fp->uf_arg_types != NULL) 388 { 389 int i; 390 type_T *type; 391 392 for (i = 0; i < len; ++ i) 393 { 394 char_u *p = ((char_u **)argtypes->ga_data)[i]; 395 396 if (p == NULL) 397 // will get the type from the default value 398 type = &t_unknown; 399 else 400 type = parse_type(&p, &fp->uf_type_list, TRUE); 401 if (type == NULL) 402 return FAIL; 403 fp->uf_arg_types[i] = type; 404 } 405 } 406 } 407 408 if (varargs) 409 { 410 char_u *p; 411 412 // Move the last argument "...name: type" to uf_va_name and 413 // uf_va_type. 414 fp->uf_va_name = ((char_u **)fp->uf_args.ga_data) 415 [fp->uf_args.ga_len - 1]; 416 --fp->uf_args.ga_len; 417 p = ((char_u **)argtypes->ga_data)[len]; 418 if (p == NULL) 419 // TODO: get type from default value 420 fp->uf_va_type = &t_list_any; 421 else 422 { 423 fp->uf_va_type = parse_type(&p, &fp->uf_type_list, TRUE); 424 if (fp->uf_va_type != NULL && fp->uf_va_type->tt_type != VAR_LIST) 425 { 426 semsg(_(e_variable_arguments_type_must_be_list_str), 427 ((char_u **)argtypes->ga_data)[len]); 428 return FAIL; 429 } 430 } 431 if (fp->uf_va_type == NULL) 432 return FAIL; 433 } 434 435 return OK; 436 } 437 438 static int 439 parse_return_type(ufunc_T *fp, char_u *ret_type) 440 { 441 if (ret_type == NULL) 442 fp->uf_ret_type = &t_void; 443 else 444 { 445 char_u *p = ret_type; 446 447 fp->uf_ret_type = parse_type(&p, &fp->uf_type_list, TRUE); 448 if (fp->uf_ret_type == NULL) 449 { 450 fp->uf_ret_type = &t_void; 451 return FAIL; 452 } 453 } 454 return OK; 455 } 456 457 /* 458 * Register function "fp" as using "current_funccal" as its scope. 459 */ 460 static int 461 register_closure(ufunc_T *fp) 462 { 463 if (fp->uf_scoped == current_funccal) 464 // no change 465 return OK; 466 funccal_unref(fp->uf_scoped, fp, FALSE); 467 fp->uf_scoped = current_funccal; 468 current_funccal->fc_refcount++; 469 470 if (ga_grow(¤t_funccal->fc_funcs, 1) == FAIL) 471 return FAIL; 472 ((ufunc_T **)current_funccal->fc_funcs.ga_data) 473 [current_funccal->fc_funcs.ga_len++] = fp; 474 return OK; 475 } 476 477 static void 478 set_ufunc_name(ufunc_T *fp, char_u *name) 479 { 480 // Add a type cast to avoid a warning for an overflow, the uf_name[] array 481 // actually extends beyond the struct. 482 STRCPY((void *)fp->uf_name, name); 483 484 if (name[0] == K_SPECIAL) 485 { 486 fp->uf_name_exp = alloc(STRLEN(name) + 3); 487 if (fp->uf_name_exp != NULL) 488 { 489 STRCPY(fp->uf_name_exp, "<SNR>"); 490 STRCAT(fp->uf_name_exp, fp->uf_name + 3); 491 } 492 } 493 } 494 495 /* 496 * Get a name for a lambda. Returned in static memory. 497 */ 498 char_u * 499 get_lambda_name(void) 500 { 501 static char_u name[30]; 502 static int lambda_no = 0; 503 504 sprintf((char*)name, "<lambda>%d", ++lambda_no); 505 return name; 506 } 507 508 #if defined(FEAT_LUA) || defined(PROTO) 509 /* 510 * Registers a native C callback which can be called from Vim script. 511 * Returns the name of the Vim script function. 512 */ 513 char_u * 514 register_cfunc(cfunc_T cb, cfunc_free_T cb_free, void *state) 515 { 516 char_u *name = get_lambda_name(); 517 ufunc_T *fp; 518 519 fp = alloc_clear(offsetof(ufunc_T, uf_name) + STRLEN(name) + 1); 520 if (fp == NULL) 521 return NULL; 522 523 fp->uf_def_status = UF_NOT_COMPILED; 524 fp->uf_refcount = 1; 525 fp->uf_varargs = TRUE; 526 fp->uf_flags = FC_CFUNC; 527 fp->uf_calls = 0; 528 fp->uf_script_ctx = current_sctx; 529 fp->uf_cb = cb; 530 fp->uf_cb_free = cb_free; 531 fp->uf_cb_state = state; 532 533 set_ufunc_name(fp, name); 534 hash_add(&func_hashtab, UF2HIKEY(fp)); 535 536 return name; 537 } 538 #endif 539 540 /* 541 * Skip over "->" or "=>" after the arguments of a lambda. 542 * If ": type" is found make "ret_type" point to "type". 543 * If "white_error" is not NULL check for correct use of white space and set 544 * "white_error" to TRUE if there is an error. 545 * Return NULL if no valid arrow found. 546 */ 547 static char_u * 548 skip_arrow( 549 char_u *start, 550 int equal_arrow, 551 char_u **ret_type, 552 int *white_error) 553 { 554 char_u *s = start; 555 char_u *bef = start - 2; // "start" points to > of -> 556 557 if (equal_arrow) 558 { 559 if (*s == ':') 560 { 561 if (white_error != NULL && !VIM_ISWHITE(s[1])) 562 { 563 *white_error = TRUE; 564 semsg(_(e_white_space_required_after_str_str), ":", s); 565 return NULL; 566 } 567 s = skipwhite(s + 1); 568 *ret_type = s; 569 s = skip_type(s, TRUE); 570 if (s == *ret_type) 571 { 572 emsg(_(e_missing_return_type)); 573 return NULL; 574 } 575 } 576 bef = s; 577 s = skipwhite(s); 578 if (*s != '=') 579 return NULL; 580 ++s; 581 } 582 if (*s != '>') 583 return NULL; 584 if (white_error != NULL && ((!VIM_ISWHITE(*bef) && *bef != '{') 585 || !IS_WHITE_OR_NUL(s[1]))) 586 { 587 *white_error = TRUE; 588 semsg(_(e_white_space_required_before_and_after_str_at_str), 589 equal_arrow ? "=>" : "->", bef); 590 return NULL; 591 } 592 return skipwhite(s + 1); 593 } 594 595 /* 596 * Check if "*cmd" points to a function command and if so advance "*cmd" and 597 * return TRUE. 598 * Otherwise return FALSE; 599 * Do not consider "function(" to be a command. 600 */ 601 static int 602 is_function_cmd(char_u **cmd) 603 { 604 char_u *p = *cmd; 605 606 if (checkforcmd(&p, "function", 2)) 607 { 608 if (*p == '(') 609 return FALSE; 610 *cmd = p; 611 return TRUE; 612 } 613 return FALSE; 614 } 615 616 /* 617 * Called when defining a function: The context may be needed for script 618 * variables declared in a block that is visible now but not when the function 619 * is compiled or called later. 620 */ 621 static void 622 function_using_block_scopes(ufunc_T *fp, cstack_T *cstack) 623 { 624 if (cstack != NULL && cstack->cs_idx >= 0) 625 { 626 int count = cstack->cs_idx + 1; 627 int i; 628 629 fp->uf_block_ids = ALLOC_MULT(int, count); 630 if (fp->uf_block_ids != NULL) 631 { 632 mch_memmove(fp->uf_block_ids, cstack->cs_block_id, 633 sizeof(int) * count); 634 fp->uf_block_depth = count; 635 } 636 637 // Set flag in each block to indicate a function was defined. This 638 // is used to keep the variable when leaving the block, see 639 // hide_script_var(). 640 for (i = 0; i <= cstack->cs_idx; ++i) 641 cstack->cs_flags[i] |= CSF_FUNC_DEF; 642 } 643 } 644 645 /* 646 * Read the body of a function, put every line in "newlines". 647 * This stops at "}", "endfunction" or "enddef". 648 * "newlines" must already have been initialized. 649 * "eap->cmdidx" is CMD_function, CMD_def or CMD_block; 650 */ 651 static int 652 get_function_body( 653 exarg_T *eap, 654 garray_T *newlines, 655 char_u *line_arg_in, 656 char_u **line_to_free) 657 { 658 linenr_T sourcing_lnum_top = SOURCING_LNUM; 659 linenr_T sourcing_lnum_off; 660 int saved_wait_return = need_wait_return; 661 char_u *line_arg = line_arg_in; 662 int vim9_function = eap->cmdidx == CMD_def 663 || eap->cmdidx == CMD_block; 664 #define MAX_FUNC_NESTING 50 665 char nesting_def[MAX_FUNC_NESTING]; 666 char nesting_inline[MAX_FUNC_NESTING]; 667 int nesting = 0; 668 getline_opt_T getline_options; 669 int indent = 2; 670 char_u *skip_until = NULL; 671 int ret = FAIL; 672 int is_heredoc = FALSE; 673 int heredoc_concat_len = 0; 674 garray_T heredoc_ga; 675 char_u *heredoc_trimmed = NULL; 676 677 ga_init2(&heredoc_ga, 1, 500); 678 679 // Detect having skipped over comment lines to find the return 680 // type. Add NULL lines to keep the line count correct. 681 sourcing_lnum_off = get_sourced_lnum(eap->getline, eap->cookie); 682 if (SOURCING_LNUM < sourcing_lnum_off) 683 { 684 sourcing_lnum_off -= SOURCING_LNUM; 685 if (ga_grow(newlines, sourcing_lnum_off) == FAIL) 686 goto theend; 687 while (sourcing_lnum_off-- > 0) 688 ((char_u **)(newlines->ga_data))[newlines->ga_len++] = NULL; 689 } 690 691 nesting_def[0] = vim9_function; 692 nesting_inline[0] = eap->cmdidx == CMD_block; 693 getline_options = vim9_function 694 ? GETLINE_CONCAT_CONTBAR : GETLINE_CONCAT_CONT; 695 for (;;) 696 { 697 char_u *theline; 698 char_u *p; 699 char_u *arg; 700 701 if (KeyTyped) 702 { 703 msg_scroll = TRUE; 704 saved_wait_return = FALSE; 705 } 706 need_wait_return = FALSE; 707 708 if (line_arg != NULL) 709 { 710 // Use eap->arg, split up in parts by line breaks. 711 theline = line_arg; 712 p = vim_strchr(theline, '\n'); 713 if (p == NULL) 714 line_arg += STRLEN(line_arg); 715 else 716 { 717 *p = NUL; 718 line_arg = p + 1; 719 } 720 } 721 else 722 { 723 vim_free(*line_to_free); 724 if (eap->getline == NULL) 725 theline = getcmdline(':', 0L, indent, getline_options); 726 else 727 theline = eap->getline(':', eap->cookie, indent, 728 getline_options); 729 *line_to_free = theline; 730 } 731 if (KeyTyped) 732 lines_left = Rows - 1; 733 if (theline == NULL) 734 { 735 // Use the start of the function for the line number. 736 SOURCING_LNUM = sourcing_lnum_top; 737 if (skip_until != NULL) 738 semsg(_(e_missing_heredoc_end_marker_str), skip_until); 739 else if (nesting_inline[nesting]) 740 emsg(_(e_missing_end_block)); 741 else if (eap->cmdidx == CMD_def) 742 emsg(_(e_missing_enddef)); 743 else 744 emsg(_("E126: Missing :endfunction")); 745 goto theend; 746 } 747 748 // Detect line continuation: SOURCING_LNUM increased more than one. 749 sourcing_lnum_off = get_sourced_lnum(eap->getline, eap->cookie); 750 if (SOURCING_LNUM < sourcing_lnum_off) 751 sourcing_lnum_off -= SOURCING_LNUM; 752 else 753 sourcing_lnum_off = 0; 754 755 if (skip_until != NULL) 756 { 757 // Don't check for ":endfunc"/":enddef" between 758 // * ":append" and "." 759 // * ":python <<EOF" and "EOF" 760 // * ":let {var-name} =<< [trim] {marker}" and "{marker}" 761 if (heredoc_trimmed == NULL 762 || (is_heredoc && skipwhite(theline) == theline) 763 || STRNCMP(theline, heredoc_trimmed, 764 STRLEN(heredoc_trimmed)) == 0) 765 { 766 if (heredoc_trimmed == NULL) 767 p = theline; 768 else if (is_heredoc) 769 p = skipwhite(theline) == theline 770 ? theline : theline + STRLEN(heredoc_trimmed); 771 else 772 p = theline + STRLEN(heredoc_trimmed); 773 if (STRCMP(p, skip_until) == 0) 774 { 775 VIM_CLEAR(skip_until); 776 VIM_CLEAR(heredoc_trimmed); 777 getline_options = vim9_function 778 ? GETLINE_CONCAT_CONTBAR : GETLINE_CONCAT_CONT; 779 is_heredoc = FALSE; 780 781 if (heredoc_concat_len > 0) 782 { 783 // Replace the starting line with all the concatenated 784 // lines. 785 ga_concat(&heredoc_ga, theline); 786 vim_free(((char_u **)(newlines->ga_data))[ 787 heredoc_concat_len - 1]); 788 ((char_u **)(newlines->ga_data))[ 789 heredoc_concat_len - 1] = heredoc_ga.ga_data; 790 ga_init(&heredoc_ga); 791 heredoc_concat_len = 0; 792 theline += STRLEN(theline); // skip the "EOF" 793 } 794 } 795 } 796 } 797 else 798 { 799 int c; 800 char_u *end; 801 802 // skip ':' and blanks 803 for (p = theline; VIM_ISWHITE(*p) || *p == ':'; ++p) 804 ; 805 806 // Check for "endfunction", "enddef" or "}". 807 // When a ":" follows it must be a dict key; "enddef: value," 808 if (nesting_inline[nesting] 809 ? *p == '}' 810 : (checkforcmd(&p, nesting_def[nesting] 811 ? "enddef" : "endfunction", 4) 812 && *p != ':')) 813 { 814 if (nesting-- == 0) 815 { 816 char_u *nextcmd = NULL; 817 818 if (*p == '|' || *p == '}') 819 nextcmd = p + 1; 820 else if (line_arg != NULL && *skipwhite(line_arg) != NUL) 821 nextcmd = line_arg; 822 else if (*p != NUL && *p != (vim9_function ? '#' : '"') 823 && (vim9_function || p_verbose > 0)) 824 { 825 SOURCING_LNUM = sourcing_lnum_top 826 + newlines->ga_len + 1; 827 if (eap->cmdidx == CMD_def) 828 semsg(_(e_text_found_after_enddef_str), p); 829 else 830 give_warning2((char_u *) 831 _("W22: Text found after :endfunction: %s"), 832 p, TRUE); 833 } 834 if (nextcmd != NULL && *skipwhite(nextcmd) != NUL) 835 { 836 // Another command follows. If the line came from "eap" 837 // we can simply point into it, otherwise we need to 838 // change "eap->cmdlinep". 839 eap->nextcmd = nextcmd; 840 if (*line_to_free != NULL) 841 { 842 vim_free(*eap->cmdlinep); 843 *eap->cmdlinep = *line_to_free; 844 *line_to_free = NULL; 845 } 846 } 847 break; 848 } 849 } 850 851 // Check for mismatched "endfunc" or "enddef". 852 // We don't check for "def" inside "func" thus we also can't check 853 // for "enddef". 854 // We continue to find the end of the function, although we might 855 // not find it. 856 else if (nesting_def[nesting]) 857 { 858 if (checkforcmd(&p, "endfunction", 4) && *p != ':') 859 emsg(_(e_mismatched_endfunction)); 860 } 861 else if (eap->cmdidx == CMD_def && checkforcmd(&p, "enddef", 4)) 862 emsg(_(e_mismatched_enddef)); 863 864 // Increase indent inside "if", "while", "for" and "try", decrease 865 // at "end". 866 if (indent > 2 && (*p == '}' || STRNCMP(p, "end", 3) == 0)) 867 indent -= 2; 868 else if (STRNCMP(p, "if", 2) == 0 869 || STRNCMP(p, "wh", 2) == 0 870 || STRNCMP(p, "for", 3) == 0 871 || STRNCMP(p, "try", 3) == 0) 872 indent += 2; 873 874 // Check for defining a function inside this function. 875 // Only recognize "def" inside "def", not inside "function", 876 // For backwards compatibility, see Test_function_python(). 877 c = *p; 878 if (is_function_cmd(&p) 879 || (eap->cmdidx == CMD_def && checkforcmd(&p, "def", 3))) 880 { 881 if (*p == '!') 882 p = skipwhite(p + 1); 883 p += eval_fname_script(p); 884 vim_free(trans_function_name(&p, NULL, TRUE, 0, NULL, 885 NULL, NULL)); 886 if (*skipwhite(p) == '(') 887 { 888 if (nesting == MAX_FUNC_NESTING - 1) 889 emsg(_(e_function_nesting_too_deep)); 890 else 891 { 892 ++nesting; 893 nesting_def[nesting] = (c == 'd'); 894 nesting_inline[nesting] = FALSE; 895 indent += 2; 896 } 897 } 898 } 899 900 if (nesting_def[nesting] ? *p != '#' : *p != '"') 901 { 902 // Not a comment line: check for nested inline function. 903 end = p + STRLEN(p) - 1; 904 while (end > p && VIM_ISWHITE(*end)) 905 --end; 906 if (end > p + 1 && *end == '{' && VIM_ISWHITE(end[-1])) 907 { 908 int is_block; 909 910 // check for trailing "=> {": start of an inline function 911 --end; 912 while (end > p && VIM_ISWHITE(*end)) 913 --end; 914 is_block = end > p + 2 && end[-1] == '=' && end[0] == '>'; 915 if (!is_block) 916 { 917 char_u *s = p; 918 919 // check for line starting with "au" for :autocmd or 920 // "com" for :command, these can use a {} block 921 is_block = checkforcmd_noparen(&s, "autocmd", 2) 922 || checkforcmd_noparen(&s, "command", 3); 923 } 924 925 if (is_block) 926 { 927 if (nesting == MAX_FUNC_NESTING - 1) 928 emsg(_(e_function_nesting_too_deep)); 929 else 930 { 931 ++nesting; 932 nesting_def[nesting] = TRUE; 933 nesting_inline[nesting] = TRUE; 934 indent += 2; 935 } 936 } 937 } 938 } 939 940 // Check for ":append", ":change", ":insert". Not for :def. 941 p = skip_range(p, FALSE, NULL); 942 if (!vim9_function 943 && ((p[0] == 'a' && (!ASCII_ISALPHA(p[1]) || p[1] == 'p')) 944 || (p[0] == 'c' 945 && (!ASCII_ISALPHA(p[1]) || (p[1] == 'h' 946 && (!ASCII_ISALPHA(p[2]) || (p[2] == 'a' 947 && (STRNCMP(&p[3], "nge", 3) != 0 948 || !ASCII_ISALPHA(p[6]))))))) 949 || (p[0] == 'i' 950 && (!ASCII_ISALPHA(p[1]) || (p[1] == 'n' 951 && (!ASCII_ISALPHA(p[2]) 952 || (p[2] == 's' 953 && (!ASCII_ISALPHA(p[3]) 954 || p[3] == 'e')))))))) 955 skip_until = vim_strsave((char_u *)"."); 956 957 // Check for ":python <<EOF", ":tcl <<EOF", etc. 958 arg = skipwhite(skiptowhite(p)); 959 if (arg[0] == '<' && arg[1] =='<' 960 && ((p[0] == 'p' && p[1] == 'y' 961 && (!ASCII_ISALNUM(p[2]) || p[2] == 't' 962 || ((p[2] == '3' || p[2] == 'x') 963 && !ASCII_ISALPHA(p[3])))) 964 || (p[0] == 'p' && p[1] == 'e' 965 && (!ASCII_ISALPHA(p[2]) || p[2] == 'r')) 966 || (p[0] == 't' && p[1] == 'c' 967 && (!ASCII_ISALPHA(p[2]) || p[2] == 'l')) 968 || (p[0] == 'l' && p[1] == 'u' && p[2] == 'a' 969 && !ASCII_ISALPHA(p[3])) 970 || (p[0] == 'r' && p[1] == 'u' && p[2] == 'b' 971 && (!ASCII_ISALPHA(p[3]) || p[3] == 'y')) 972 || (p[0] == 'm' && p[1] == 'z' 973 && (!ASCII_ISALPHA(p[2]) || p[2] == 's')) 974 )) 975 { 976 // ":python <<" continues until a dot, like ":append" 977 p = skipwhite(arg + 2); 978 if (STRNCMP(p, "trim", 4) == 0) 979 { 980 // Ignore leading white space. 981 p = skipwhite(p + 4); 982 heredoc_trimmed = vim_strnsave(theline, 983 skipwhite(theline) - theline); 984 } 985 if (*p == NUL) 986 skip_until = vim_strsave((char_u *)"."); 987 else 988 skip_until = vim_strnsave(p, skiptowhite(p) - p); 989 getline_options = GETLINE_NONE; 990 is_heredoc = TRUE; 991 if (eap->cmdidx == CMD_def) 992 heredoc_concat_len = newlines->ga_len + 1; 993 } 994 995 // Check for ":cmd v =<< [trim] EOF" 996 // and ":cmd [a, b] =<< [trim] EOF" 997 // and "lines =<< [trim] EOF" for Vim9 998 // Where "cmd" can be "let", "var", "final" or "const". 999 arg = skipwhite(skiptowhite(p)); 1000 if (*arg == '[') 1001 arg = vim_strchr(arg, ']'); 1002 if (arg != NULL) 1003 { 1004 int found = (eap->cmdidx == CMD_def && arg[0] == '=' 1005 && arg[1] == '<' && arg[2] =='<'); 1006 1007 if (!found) 1008 // skip over the argument after "cmd" 1009 arg = skipwhite(skiptowhite(arg)); 1010 if (found || (arg[0] == '=' && arg[1] == '<' && arg[2] =='<' 1011 && (checkforcmd(&p, "let", 2) 1012 || checkforcmd(&p, "var", 3) 1013 || checkforcmd(&p, "final", 5) 1014 || checkforcmd(&p, "const", 5)))) 1015 { 1016 p = skipwhite(arg + 3); 1017 if (STRNCMP(p, "trim", 4) == 0) 1018 { 1019 // Ignore leading white space. 1020 p = skipwhite(p + 4); 1021 heredoc_trimmed = vim_strnsave(theline, 1022 skipwhite(theline) - theline); 1023 } 1024 skip_until = vim_strnsave(p, skiptowhite(p) - p); 1025 getline_options = GETLINE_NONE; 1026 is_heredoc = TRUE; 1027 } 1028 } 1029 } 1030 1031 // Add the line to the function. 1032 if (ga_grow(newlines, 1 + sourcing_lnum_off) == FAIL) 1033 goto theend; 1034 1035 if (heredoc_concat_len > 0) 1036 { 1037 // For a :def function "python << EOF" concatenats all the lines, 1038 // to be used for the instruction later. 1039 ga_concat(&heredoc_ga, theline); 1040 ga_concat(&heredoc_ga, (char_u *)"\n"); 1041 p = vim_strsave((char_u *)""); 1042 } 1043 else 1044 { 1045 // Copy the line to newly allocated memory. get_one_sourceline() 1046 // allocates 250 bytes per line, this saves 80% on average. The 1047 // cost is an extra alloc/free. 1048 p = vim_strsave(theline); 1049 } 1050 if (p == NULL) 1051 goto theend; 1052 ((char_u **)(newlines->ga_data))[newlines->ga_len++] = p; 1053 1054 // Add NULL lines for continuation lines, so that the line count is 1055 // equal to the index in the growarray. 1056 while (sourcing_lnum_off-- > 0) 1057 ((char_u **)(newlines->ga_data))[newlines->ga_len++] = NULL; 1058 1059 // Check for end of eap->arg. 1060 if (line_arg != NULL && *line_arg == NUL) 1061 line_arg = NULL; 1062 } 1063 1064 // Return OK when no error was detected. 1065 if (!did_emsg) 1066 ret = OK; 1067 1068 theend: 1069 vim_free(skip_until); 1070 vim_free(heredoc_trimmed); 1071 vim_free(heredoc_ga.ga_data); 1072 need_wait_return |= saved_wait_return; 1073 return ret; 1074 } 1075 1076 /* 1077 * Handle the body of a lambda. *arg points to the "{", process statements 1078 * until the matching "}". 1079 * When not evaluating "newargs" is NULL. 1080 * When successful "rettv" is set to a funcref. 1081 */ 1082 static int 1083 lambda_function_body( 1084 char_u **arg, 1085 typval_T *rettv, 1086 evalarg_T *evalarg, 1087 garray_T *newargs, 1088 garray_T *argtypes, 1089 int varargs, 1090 garray_T *default_args, 1091 char_u *ret_type) 1092 { 1093 int evaluate = (evalarg->eval_flags & EVAL_EVALUATE); 1094 garray_T *gap = &evalarg->eval_ga; 1095 garray_T *freegap = &evalarg->eval_freega; 1096 ufunc_T *ufunc = NULL; 1097 exarg_T eap; 1098 garray_T newlines; 1099 char_u *cmdline = NULL; 1100 int ret = FAIL; 1101 char_u *line_to_free = NULL; 1102 partial_T *pt; 1103 char_u *name; 1104 int lnum_save = -1; 1105 linenr_T sourcing_lnum_top = SOURCING_LNUM; 1106 1107 if (!ends_excmd2(*arg, skipwhite(*arg + 1))) 1108 { 1109 semsg(_(e_trailing_arg), *arg + 1); 1110 return FAIL; 1111 } 1112 1113 CLEAR_FIELD(eap); 1114 eap.cmdidx = CMD_block; 1115 eap.forceit = FALSE; 1116 eap.cmdlinep = &cmdline; 1117 eap.skip = !evaluate; 1118 if (evalarg->eval_cctx != NULL) 1119 fill_exarg_from_cctx(&eap, evalarg->eval_cctx); 1120 else 1121 { 1122 eap.getline = evalarg->eval_getline; 1123 eap.cookie = evalarg->eval_cookie; 1124 } 1125 1126 ga_init2(&newlines, (int)sizeof(char_u *), 10); 1127 if (get_function_body(&eap, &newlines, NULL, &line_to_free) == FAIL) 1128 { 1129 vim_free(cmdline); 1130 goto erret; 1131 } 1132 1133 // When inside a lambda must add the function lines to evalarg.eval_ga. 1134 evalarg->eval_break_count += newlines.ga_len; 1135 if (gap->ga_itemsize > 0) 1136 { 1137 int idx; 1138 char_u *last; 1139 size_t plen; 1140 char_u *pnl; 1141 1142 for (idx = 0; idx < newlines.ga_len; ++idx) 1143 { 1144 char_u *p = skipwhite(((char_u **)newlines.ga_data)[idx]); 1145 1146 if (ga_grow(gap, 1) == FAIL || ga_grow(freegap, 1) == FAIL) 1147 goto erret; 1148 1149 // Going to concatenate the lines after parsing. For an empty or 1150 // comment line use an empty string. 1151 // Insert NL characters at the start of each line, the string will 1152 // be split again later in .get_lambda_tv(). 1153 if (*p == NUL || vim9_comment_start(p)) 1154 p = (char_u *)""; 1155 plen = STRLEN(p); 1156 pnl = vim_strnsave((char_u *)"\n", plen + 1); 1157 if (pnl != NULL) 1158 mch_memmove(pnl + 1, p, plen + 1); 1159 ((char_u **)gap->ga_data)[gap->ga_len++] = pnl; 1160 ((char_u **)freegap->ga_data)[freegap->ga_len++] = pnl; 1161 } 1162 if (ga_grow(gap, 1) == FAIL || ga_grow(freegap, 1) == FAIL) 1163 goto erret; 1164 if (cmdline != NULL) 1165 // more is following after the "}", which was skipped 1166 last = cmdline; 1167 else 1168 // nothing is following the "}" 1169 last = (char_u *)"}"; 1170 plen = STRLEN(last); 1171 pnl = vim_strnsave((char_u *)"\n", plen + 1); 1172 if (pnl != NULL) 1173 mch_memmove(pnl + 1, last, plen + 1); 1174 ((char_u **)gap->ga_data)[gap->ga_len++] = pnl; 1175 ((char_u **)freegap->ga_data)[freegap->ga_len++] = pnl; 1176 } 1177 1178 if (cmdline != NULL) 1179 { 1180 // Something comes after the "}". 1181 *arg = eap.nextcmd; 1182 1183 // "arg" points into cmdline, need to keep the line and free it later. 1184 vim_free(evalarg->eval_tofree_cmdline); 1185 evalarg->eval_tofree_cmdline = cmdline; 1186 } 1187 else 1188 *arg = (char_u *)""; 1189 1190 if (!evaluate) 1191 { 1192 ret = OK; 1193 goto erret; 1194 } 1195 1196 name = get_lambda_name(); 1197 ufunc = alloc_clear(offsetof(ufunc_T, uf_name) + STRLEN(name) + 1); 1198 if (ufunc == NULL) 1199 goto erret; 1200 set_ufunc_name(ufunc, name); 1201 if (hash_add(&func_hashtab, UF2HIKEY(ufunc)) == FAIL) 1202 goto erret; 1203 ufunc->uf_refcount = 1; 1204 ufunc->uf_args = *newargs; 1205 newargs->ga_data = NULL; 1206 ufunc->uf_def_args = *default_args; 1207 default_args->ga_data = NULL; 1208 ufunc->uf_func_type = &t_func_any; 1209 1210 // error messages are for the first function line 1211 lnum_save = SOURCING_LNUM; 1212 SOURCING_LNUM = sourcing_lnum_top; 1213 1214 // parse argument types 1215 if (parse_argument_types(ufunc, argtypes, varargs) == FAIL) 1216 { 1217 SOURCING_LNUM = lnum_save; 1218 goto erret; 1219 } 1220 1221 // parse the return type, if any 1222 if (parse_return_type(ufunc, ret_type) == FAIL) 1223 goto erret; 1224 1225 pt = ALLOC_CLEAR_ONE(partial_T); 1226 if (pt == NULL) 1227 goto erret; 1228 pt->pt_func = ufunc; 1229 pt->pt_refcount = 1; 1230 1231 ufunc->uf_lines = newlines; 1232 newlines.ga_data = NULL; 1233 if (sandbox) 1234 ufunc->uf_flags |= FC_SANDBOX; 1235 if (!ASCII_ISUPPER(*ufunc->uf_name)) 1236 ufunc->uf_flags |= FC_VIM9; 1237 ufunc->uf_script_ctx = current_sctx; 1238 ufunc->uf_script_ctx_version = current_sctx.sc_version; 1239 ufunc->uf_script_ctx.sc_lnum += sourcing_lnum_top; 1240 set_function_type(ufunc); 1241 1242 function_using_block_scopes(ufunc, evalarg->eval_cstack); 1243 1244 rettv->vval.v_partial = pt; 1245 rettv->v_type = VAR_PARTIAL; 1246 ufunc = NULL; 1247 ret = OK; 1248 1249 erret: 1250 if (lnum_save >= 0) 1251 SOURCING_LNUM = lnum_save; 1252 vim_free(line_to_free); 1253 ga_clear_strings(&newlines); 1254 if (newargs != NULL) 1255 ga_clear_strings(newargs); 1256 ga_clear_strings(default_args); 1257 if (ufunc != NULL) 1258 { 1259 func_clear(ufunc, TRUE); 1260 func_free(ufunc, TRUE); 1261 } 1262 return ret; 1263 } 1264 1265 /* 1266 * Parse a lambda expression and get a Funcref from "*arg" into "rettv". 1267 * "arg" points to the { in "{arg -> expr}" or the ( in "(arg) => expr" 1268 * When "types_optional" is TRUE optionally take argument types. 1269 * Return OK or FAIL. Returns NOTDONE for dict or {expr}. 1270 */ 1271 int 1272 get_lambda_tv( 1273 char_u **arg, 1274 typval_T *rettv, 1275 int types_optional, 1276 evalarg_T *evalarg) 1277 { 1278 int evaluate = evalarg != NULL 1279 && (evalarg->eval_flags & EVAL_EVALUATE); 1280 garray_T newargs; 1281 garray_T newlines; 1282 garray_T *pnewargs; 1283 garray_T argtypes; 1284 garray_T default_args; 1285 ufunc_T *fp = NULL; 1286 partial_T *pt = NULL; 1287 int varargs; 1288 char_u *ret_type = NULL; 1289 int ret; 1290 char_u *s; 1291 char_u *start, *end; 1292 int *old_eval_lavars = eval_lavars_used; 1293 int eval_lavars = FALSE; 1294 char_u *tofree1 = NULL; 1295 char_u *tofree2 = NULL; 1296 int equal_arrow = **arg == '('; 1297 int white_error = FALSE; 1298 int called_emsg_start = called_emsg; 1299 1300 if (equal_arrow && !in_vim9script()) 1301 return NOTDONE; 1302 1303 ga_init(&newargs); 1304 ga_init(&newlines); 1305 1306 // First, check if this is really a lambda expression. "->" or "=>" must 1307 // be found after the arguments. 1308 s = *arg + 1; 1309 ret = get_function_args(&s, equal_arrow ? ')' : '-', NULL, 1310 types_optional ? &argtypes : NULL, types_optional, evalarg, 1311 NULL, &default_args, TRUE, NULL, NULL); 1312 if (ret == FAIL || skip_arrow(s, equal_arrow, &ret_type, NULL) == NULL) 1313 { 1314 if (types_optional) 1315 ga_clear_strings(&argtypes); 1316 return called_emsg == called_emsg_start ? NOTDONE : FAIL; 1317 } 1318 1319 // Parse the arguments for real. 1320 if (evaluate) 1321 pnewargs = &newargs; 1322 else 1323 pnewargs = NULL; 1324 *arg += 1; 1325 ret = get_function_args(arg, equal_arrow ? ')' : '-', pnewargs, 1326 types_optional ? &argtypes : NULL, types_optional, evalarg, 1327 &varargs, &default_args, 1328 FALSE, NULL, NULL); 1329 if (ret == FAIL 1330 || (s = skip_arrow(*arg, equal_arrow, &ret_type, 1331 equal_arrow || in_vim9script() ? &white_error : NULL)) == NULL) 1332 { 1333 if (types_optional) 1334 ga_clear_strings(&argtypes); 1335 ga_clear_strings(&newargs); 1336 return white_error ? FAIL : NOTDONE; 1337 } 1338 *arg = s; 1339 1340 // Skipping over linebreaks may make "ret_type" invalid, make a copy. 1341 if (ret_type != NULL) 1342 { 1343 ret_type = vim_strsave(ret_type); 1344 tofree2 = ret_type; 1345 } 1346 1347 // Set up a flag for checking local variables and arguments. 1348 if (evaluate) 1349 eval_lavars_used = &eval_lavars; 1350 1351 *arg = skipwhite_and_linebreak(*arg, evalarg); 1352 1353 // Recognize "{" as the start of a function body. 1354 if (equal_arrow && **arg == '{') 1355 { 1356 if (evalarg == NULL) 1357 // cannot happen? 1358 goto theend; 1359 if (lambda_function_body(arg, rettv, evalarg, pnewargs, 1360 types_optional ? &argtypes : NULL, varargs, 1361 &default_args, ret_type) == FAIL) 1362 goto errret; 1363 goto theend; 1364 } 1365 if (default_args.ga_len > 0) 1366 { 1367 emsg(_(e_cannot_use_default_values_in_lambda)); 1368 goto errret; 1369 } 1370 1371 // Get the start and the end of the expression. 1372 start = *arg; 1373 ret = skip_expr_concatenate(arg, &start, &end, evalarg); 1374 if (ret == FAIL) 1375 goto errret; 1376 if (evalarg != NULL) 1377 { 1378 // avoid that the expression gets freed when another line break follows 1379 tofree1 = evalarg->eval_tofree; 1380 evalarg->eval_tofree = NULL; 1381 } 1382 1383 if (!equal_arrow) 1384 { 1385 *arg = skipwhite_and_linebreak(*arg, evalarg); 1386 if (**arg != '}') 1387 { 1388 semsg(_("E451: Expected }: %s"), *arg); 1389 goto errret; 1390 } 1391 ++*arg; 1392 } 1393 1394 if (evaluate) 1395 { 1396 int len; 1397 int flags = 0; 1398 char_u *p; 1399 char_u *line_end; 1400 char_u *name = get_lambda_name(); 1401 1402 fp = alloc_clear(offsetof(ufunc_T, uf_name) + STRLEN(name) + 1); 1403 if (fp == NULL) 1404 goto errret; 1405 fp->uf_def_status = UF_NOT_COMPILED; 1406 pt = ALLOC_CLEAR_ONE(partial_T); 1407 if (pt == NULL) 1408 goto errret; 1409 1410 ga_init2(&newlines, (int)sizeof(char_u *), 1); 1411 if (ga_grow(&newlines, 1) == FAIL) 1412 goto errret; 1413 1414 // If there are line breaks, we need to split up the string. 1415 line_end = vim_strchr(start, '\n'); 1416 if (line_end == NULL || line_end > end) 1417 line_end = end; 1418 1419 // Add "return " before the expression (or the first line). 1420 len = 7 + (int)(line_end - start) + 1; 1421 p = alloc(len); 1422 if (p == NULL) 1423 goto errret; 1424 ((char_u **)(newlines.ga_data))[newlines.ga_len++] = p; 1425 STRCPY(p, "return "); 1426 vim_strncpy(p + 7, start, line_end - start); 1427 1428 if (line_end != end) 1429 { 1430 // Add more lines, split by line breaks. Thus is used when a 1431 // lambda with { cmds } is encountered. 1432 while (*line_end == '\n') 1433 { 1434 if (ga_grow(&newlines, 1) == FAIL) 1435 goto errret; 1436 start = line_end + 1; 1437 line_end = vim_strchr(start, '\n'); 1438 if (line_end == NULL) 1439 line_end = end; 1440 ((char_u **)(newlines.ga_data))[newlines.ga_len++] = 1441 vim_strnsave(start, line_end - start); 1442 } 1443 } 1444 1445 if (strstr((char *)p + 7, "a:") == NULL) 1446 // No a: variables are used for sure. 1447 flags |= FC_NOARGS; 1448 1449 fp->uf_refcount = 1; 1450 set_ufunc_name(fp, name); 1451 fp->uf_args = newargs; 1452 ga_init(&fp->uf_def_args); 1453 if (types_optional) 1454 { 1455 if (parse_argument_types(fp, &argtypes, 1456 in_vim9script() && varargs) == FAIL) 1457 goto errret; 1458 if (ret_type != NULL) 1459 { 1460 fp->uf_ret_type = parse_type(&ret_type, 1461 &fp->uf_type_list, TRUE); 1462 if (fp->uf_ret_type == NULL) 1463 goto errret; 1464 } 1465 else 1466 fp->uf_ret_type = &t_unknown; 1467 } 1468 1469 fp->uf_lines = newlines; 1470 if (current_funccal != NULL && eval_lavars) 1471 { 1472 flags |= FC_CLOSURE; 1473 if (register_closure(fp) == FAIL) 1474 goto errret; 1475 } 1476 1477 #ifdef FEAT_PROFILE 1478 if (prof_def_func()) 1479 func_do_profile(fp); 1480 #endif 1481 if (sandbox) 1482 flags |= FC_SANDBOX; 1483 // In legacy script a lambda can be called with more args than 1484 // uf_args.ga_len. In Vim9 script "...name" has to be used. 1485 fp->uf_varargs = !in_vim9script() || varargs; 1486 fp->uf_flags = flags; 1487 fp->uf_calls = 0; 1488 fp->uf_script_ctx = current_sctx; 1489 fp->uf_script_ctx.sc_lnum += SOURCING_LNUM - newlines.ga_len; 1490 1491 function_using_block_scopes(fp, evalarg->eval_cstack); 1492 1493 pt->pt_func = fp; 1494 pt->pt_refcount = 1; 1495 rettv->vval.v_partial = pt; 1496 rettv->v_type = VAR_PARTIAL; 1497 1498 hash_add(&func_hashtab, UF2HIKEY(fp)); 1499 } 1500 1501 theend: 1502 eval_lavars_used = old_eval_lavars; 1503 if (evalarg != NULL && evalarg->eval_tofree == NULL) 1504 evalarg->eval_tofree = tofree1; 1505 else 1506 vim_free(tofree1); 1507 vim_free(tofree2); 1508 if (types_optional) 1509 ga_clear_strings(&argtypes); 1510 1511 return OK; 1512 1513 errret: 1514 ga_clear_strings(&newargs); 1515 ga_clear_strings(&newlines); 1516 ga_clear_strings(&default_args); 1517 if (types_optional) 1518 { 1519 ga_clear_strings(&argtypes); 1520 if (fp != NULL) 1521 vim_free(fp->uf_arg_types); 1522 } 1523 vim_free(fp); 1524 vim_free(pt); 1525 if (evalarg != NULL && evalarg->eval_tofree == NULL) 1526 evalarg->eval_tofree = tofree1; 1527 else 1528 vim_free(tofree1); 1529 vim_free(tofree2); 1530 eval_lavars_used = old_eval_lavars; 1531 return FAIL; 1532 } 1533 1534 /* 1535 * Check if "name" is a variable of type VAR_FUNC. If so, return the function 1536 * name it contains, otherwise return "name". 1537 * If "partialp" is not NULL, and "name" is of type VAR_PARTIAL also set 1538 * "partialp". 1539 * If "type" is not NULL and a Vim9 script-local variable is found look up the 1540 * type of the variable. 1541 */ 1542 char_u * 1543 deref_func_name( 1544 char_u *name, 1545 int *lenp, 1546 partial_T **partialp, 1547 type_T **type, 1548 int no_autoload) 1549 { 1550 dictitem_T *v; 1551 int cc; 1552 char_u *s = NULL; 1553 hashtab_T *ht; 1554 1555 if (partialp != NULL) 1556 *partialp = NULL; 1557 1558 cc = name[*lenp]; 1559 name[*lenp] = NUL; 1560 1561 v = find_var(name, &ht, no_autoload); 1562 name[*lenp] = cc; 1563 if (v != NULL) 1564 { 1565 if (v->di_tv.v_type == VAR_FUNC) 1566 { 1567 if (v->di_tv.vval.v_string == NULL) 1568 { 1569 *lenp = 0; 1570 return (char_u *)""; // just in case 1571 } 1572 s = v->di_tv.vval.v_string; 1573 *lenp = (int)STRLEN(s); 1574 } 1575 1576 if (v->di_tv.v_type == VAR_PARTIAL) 1577 { 1578 partial_T *pt = v->di_tv.vval.v_partial; 1579 1580 if (pt == NULL) 1581 { 1582 *lenp = 0; 1583 return (char_u *)""; // just in case 1584 } 1585 if (partialp != NULL) 1586 *partialp = pt; 1587 s = partial_name(pt); 1588 *lenp = (int)STRLEN(s); 1589 } 1590 1591 if (s != NULL) 1592 { 1593 if (type != NULL && ht == get_script_local_ht()) 1594 { 1595 svar_T *sv = find_typval_in_script(&v->di_tv); 1596 1597 if (sv != NULL) 1598 *type = sv->sv_type; 1599 } 1600 return s; 1601 } 1602 } 1603 1604 return name; 1605 } 1606 1607 /* 1608 * Give an error message with a function name. Handle <SNR> things. 1609 * "ermsg" is to be passed without translation, use N_() instead of _(). 1610 */ 1611 void 1612 emsg_funcname(char *ermsg, char_u *name) 1613 { 1614 char_u *p; 1615 1616 if (*name == K_SPECIAL) 1617 p = concat_str((char_u *)"<SNR>", name + 3); 1618 else 1619 p = name; 1620 semsg(_(ermsg), p); 1621 if (p != name) 1622 vim_free(p); 1623 } 1624 1625 /* 1626 * Allocate a variable for the result of a function. 1627 * Return OK or FAIL. 1628 */ 1629 int 1630 get_func_tv( 1631 char_u *name, // name of the function 1632 int len, // length of "name" or -1 to use strlen() 1633 typval_T *rettv, 1634 char_u **arg, // argument, pointing to the '(' 1635 evalarg_T *evalarg, // for line continuation 1636 funcexe_T *funcexe) // various values 1637 { 1638 char_u *argp; 1639 int ret = OK; 1640 typval_T argvars[MAX_FUNC_ARGS + 1]; // vars for arguments 1641 int argcount = 0; // number of arguments found 1642 int vim9script = in_vim9script(); 1643 1644 /* 1645 * Get the arguments. 1646 */ 1647 argp = *arg; 1648 while (argcount < MAX_FUNC_ARGS - (funcexe->partial == NULL ? 0 1649 : funcexe->partial->pt_argc)) 1650 { 1651 // skip the '(' or ',' and possibly line breaks 1652 argp = skipwhite_and_linebreak(argp + 1, evalarg); 1653 1654 if (*argp == ')' || *argp == ',' || *argp == NUL) 1655 break; 1656 if (eval1(&argp, &argvars[argcount], evalarg) == FAIL) 1657 { 1658 ret = FAIL; 1659 break; 1660 } 1661 ++argcount; 1662 // The comma should come right after the argument, but this wasn't 1663 // checked previously, thus only enforce it in Vim9 script. 1664 if (vim9script) 1665 { 1666 if (*argp != ',' && *skipwhite(argp) == ',') 1667 { 1668 semsg(_(e_no_white_space_allowed_before_str_str), ",", argp); 1669 ret = FAIL; 1670 break; 1671 } 1672 } 1673 else 1674 argp = skipwhite(argp); 1675 if (*argp != ',') 1676 break; 1677 if (vim9script && !IS_WHITE_OR_NUL(argp[1])) 1678 { 1679 semsg(_(e_white_space_required_after_str_str), ",", argp); 1680 ret = FAIL; 1681 break; 1682 } 1683 } 1684 argp = skipwhite_and_linebreak(argp, evalarg); 1685 if (*argp == ')') 1686 ++argp; 1687 else 1688 ret = FAIL; 1689 1690 if (ret == OK) 1691 { 1692 int i = 0; 1693 int did_emsg_before = did_emsg; 1694 1695 if (get_vim_var_nr(VV_TESTING)) 1696 { 1697 // Prepare for calling test_garbagecollect_now(), need to know 1698 // what variables are used on the call stack. 1699 if (funcargs.ga_itemsize == 0) 1700 ga_init2(&funcargs, (int)sizeof(typval_T *), 50); 1701 for (i = 0; i < argcount; ++i) 1702 if (ga_grow(&funcargs, 1) == OK) 1703 ((typval_T **)funcargs.ga_data)[funcargs.ga_len++] = 1704 &argvars[i]; 1705 } 1706 1707 ret = call_func(name, len, rettv, argcount, argvars, funcexe); 1708 if (in_vim9script() && did_emsg > did_emsg_before) 1709 { 1710 // An error in a builtin function does not return FAIL, but we do 1711 // want to abort further processing if an error was given. 1712 ret = FAIL; 1713 clear_tv(rettv); 1714 } 1715 1716 funcargs.ga_len -= i; 1717 } 1718 else if (!aborting()) 1719 { 1720 if (argcount == MAX_FUNC_ARGS) 1721 emsg_funcname(N_("E740: Too many arguments for function %s"), name); 1722 else 1723 emsg_funcname(N_("E116: Invalid arguments for function %s"), name); 1724 } 1725 1726 while (--argcount >= 0) 1727 clear_tv(&argvars[argcount]); 1728 1729 if (in_vim9script()) 1730 *arg = argp; 1731 else 1732 *arg = skipwhite(argp); 1733 return ret; 1734 } 1735 1736 /* 1737 * Return TRUE if "p" starts with "<SID>" or "s:". 1738 * Only works if eval_fname_script() returned non-zero for "p"! 1739 */ 1740 static int 1741 eval_fname_sid(char_u *p) 1742 { 1743 return (*p == 's' || TOUPPER_ASC(p[2]) == 'I'); 1744 } 1745 1746 /* 1747 * In a script change <SID>name() and s:name() to K_SNR 123_name(). 1748 * Change <SNR>123_name() to K_SNR 123_name(). 1749 * Use "fname_buf[FLEN_FIXED + 1]" when it fits, otherwise allocate memory 1750 * (slow). 1751 */ 1752 char_u * 1753 fname_trans_sid(char_u *name, char_u *fname_buf, char_u **tofree, int *error) 1754 { 1755 int llen; 1756 char_u *fname; 1757 int i; 1758 1759 llen = eval_fname_script(name); 1760 if (llen > 0) 1761 { 1762 fname_buf[0] = K_SPECIAL; 1763 fname_buf[1] = KS_EXTRA; 1764 fname_buf[2] = (int)KE_SNR; 1765 i = 3; 1766 if (eval_fname_sid(name)) // "<SID>" or "s:" 1767 { 1768 if (current_sctx.sc_sid <= 0) 1769 *error = FCERR_SCRIPT; 1770 else 1771 { 1772 sprintf((char *)fname_buf + 3, "%ld_", 1773 (long)current_sctx.sc_sid); 1774 i = (int)STRLEN(fname_buf); 1775 } 1776 } 1777 if (i + STRLEN(name + llen) < FLEN_FIXED) 1778 { 1779 STRCPY(fname_buf + i, name + llen); 1780 fname = fname_buf; 1781 } 1782 else 1783 { 1784 fname = alloc(i + STRLEN(name + llen) + 1); 1785 if (fname == NULL) 1786 *error = FCERR_OTHER; 1787 else 1788 { 1789 *tofree = fname; 1790 mch_memmove(fname, fname_buf, (size_t)i); 1791 STRCPY(fname + i, name + llen); 1792 } 1793 } 1794 } 1795 else 1796 fname = name; 1797 return fname; 1798 } 1799 1800 /* 1801 * Find a function "name" in script "sid". 1802 */ 1803 static ufunc_T * 1804 find_func_with_sid(char_u *name, int sid) 1805 { 1806 hashitem_T *hi; 1807 char_u buffer[200]; 1808 1809 buffer[0] = K_SPECIAL; 1810 buffer[1] = KS_EXTRA; 1811 buffer[2] = (int)KE_SNR; 1812 vim_snprintf((char *)buffer + 3, sizeof(buffer) - 3, "%ld_%s", 1813 (long)sid, name); 1814 hi = hash_find(&func_hashtab, buffer); 1815 if (!HASHITEM_EMPTY(hi)) 1816 return HI2UF(hi); 1817 1818 return NULL; 1819 } 1820 1821 /* 1822 * Find a function by name, return pointer to it in ufuncs. 1823 * When "is_global" is true don't find script-local or imported functions. 1824 * Return NULL for unknown function. 1825 */ 1826 ufunc_T * 1827 find_func_even_dead(char_u *name, int is_global, cctx_T *cctx) 1828 { 1829 hashitem_T *hi; 1830 ufunc_T *func; 1831 imported_T *imported; 1832 1833 if (!is_global) 1834 { 1835 char_u *after_script = NULL; 1836 long sid = 0; 1837 int find_script_local = in_vim9script() 1838 && eval_isnamec1(*name) && name[1] != ':'; 1839 1840 if (find_script_local) 1841 { 1842 // Find script-local function before global one. 1843 func = find_func_with_sid(name, current_sctx.sc_sid); 1844 if (func != NULL) 1845 return func; 1846 } 1847 1848 if (name[0] == K_SPECIAL 1849 && name[1] == KS_EXTRA 1850 && name[2] == KE_SNR) 1851 { 1852 // Caller changes s: to <SNR>99_name. 1853 1854 after_script = name + 3; 1855 sid = getdigits(&after_script); 1856 if (*after_script == '_') 1857 ++after_script; 1858 else 1859 after_script = NULL; 1860 } 1861 if (find_script_local || after_script != NULL) 1862 { 1863 // Find imported function before global one. 1864 if (after_script != NULL && sid != current_sctx.sc_sid) 1865 imported = find_imported_in_script(after_script, 0, sid); 1866 else 1867 imported = find_imported(after_script == NULL 1868 ? name : after_script, 0, cctx); 1869 if (imported != NULL && imported->imp_funcname != NULL) 1870 { 1871 hi = hash_find(&func_hashtab, imported->imp_funcname); 1872 if (!HASHITEM_EMPTY(hi)) 1873 return HI2UF(hi); 1874 } 1875 } 1876 } 1877 1878 hi = hash_find(&func_hashtab, 1879 STRNCMP(name, "g:", 2) == 0 ? name + 2 : name); 1880 if (!HASHITEM_EMPTY(hi)) 1881 return HI2UF(hi); 1882 1883 return NULL; 1884 } 1885 1886 /* 1887 * Find a function by name, return pointer to it in ufuncs. 1888 * "cctx" is passed in a :def function to find imported functions. 1889 * Return NULL for unknown or dead function. 1890 */ 1891 ufunc_T * 1892 find_func(char_u *name, int is_global, cctx_T *cctx) 1893 { 1894 ufunc_T *fp = find_func_even_dead(name, is_global, cctx); 1895 1896 if (fp != NULL && (fp->uf_flags & FC_DEAD) == 0) 1897 return fp; 1898 return NULL; 1899 } 1900 1901 /* 1902 * Return TRUE if "ufunc" is a global function. 1903 */ 1904 int 1905 func_is_global(ufunc_T *ufunc) 1906 { 1907 return ufunc->uf_name[0] != K_SPECIAL; 1908 } 1909 1910 /* 1911 * Copy the function name of "fp" to buffer "buf". 1912 * "buf" must be able to hold the function name plus three bytes. 1913 * Takes care of script-local function names. 1914 */ 1915 static void 1916 cat_func_name(char_u *buf, ufunc_T *fp) 1917 { 1918 if (!func_is_global(fp)) 1919 { 1920 STRCPY(buf, "<SNR>"); 1921 STRCAT(buf, fp->uf_name + 3); 1922 } 1923 else 1924 STRCPY(buf, fp->uf_name); 1925 } 1926 1927 /* 1928 * Add a number variable "name" to dict "dp" with value "nr". 1929 */ 1930 static void 1931 add_nr_var( 1932 dict_T *dp, 1933 dictitem_T *v, 1934 char *name, 1935 varnumber_T nr) 1936 { 1937 STRCPY(v->di_key, name); 1938 v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX; 1939 hash_add(&dp->dv_hashtab, DI2HIKEY(v)); 1940 v->di_tv.v_type = VAR_NUMBER; 1941 v->di_tv.v_lock = VAR_FIXED; 1942 v->di_tv.vval.v_number = nr; 1943 } 1944 1945 /* 1946 * Free "fc". 1947 */ 1948 static void 1949 free_funccal(funccall_T *fc) 1950 { 1951 int i; 1952 1953 for (i = 0; i < fc->fc_funcs.ga_len; ++i) 1954 { 1955 ufunc_T *fp = ((ufunc_T **)(fc->fc_funcs.ga_data))[i]; 1956 1957 // When garbage collecting a funccall_T may be freed before the 1958 // function that references it, clear its uf_scoped field. 1959 // The function may have been redefined and point to another 1960 // funccall_T, don't clear it then. 1961 if (fp != NULL && fp->uf_scoped == fc) 1962 fp->uf_scoped = NULL; 1963 } 1964 ga_clear(&fc->fc_funcs); 1965 1966 func_ptr_unref(fc->func); 1967 vim_free(fc); 1968 } 1969 1970 /* 1971 * Free "fc" and what it contains. 1972 * Can be called only when "fc" is kept beyond the period of it called, 1973 * i.e. after cleanup_function_call(fc). 1974 */ 1975 static void 1976 free_funccal_contents(funccall_T *fc) 1977 { 1978 listitem_T *li; 1979 1980 // Free all l: variables. 1981 vars_clear(&fc->l_vars.dv_hashtab); 1982 1983 // Free all a: variables. 1984 vars_clear(&fc->l_avars.dv_hashtab); 1985 1986 // Free the a:000 variables. 1987 FOR_ALL_LIST_ITEMS(&fc->l_varlist, li) 1988 clear_tv(&li->li_tv); 1989 1990 free_funccal(fc); 1991 } 1992 1993 /* 1994 * Handle the last part of returning from a function: free the local hashtable. 1995 * Unless it is still in use by a closure. 1996 */ 1997 static void 1998 cleanup_function_call(funccall_T *fc) 1999 { 2000 int may_free_fc = fc->fc_refcount <= 0; 2001 int free_fc = TRUE; 2002 2003 current_funccal = fc->caller; 2004 2005 // Free all l: variables if not referred. 2006 if (may_free_fc && fc->l_vars.dv_refcount == DO_NOT_FREE_CNT) 2007 vars_clear(&fc->l_vars.dv_hashtab); 2008 else 2009 free_fc = FALSE; 2010 2011 // If the a:000 list and the l: and a: dicts are not referenced and 2012 // there is no closure using it, we can free the funccall_T and what's 2013 // in it. 2014 if (may_free_fc && fc->l_avars.dv_refcount == DO_NOT_FREE_CNT) 2015 vars_clear_ext(&fc->l_avars.dv_hashtab, FALSE); 2016 else 2017 { 2018 int todo; 2019 hashitem_T *hi; 2020 dictitem_T *di; 2021 2022 free_fc = FALSE; 2023 2024 // Make a copy of the a: variables, since we didn't do that above. 2025 todo = (int)fc->l_avars.dv_hashtab.ht_used; 2026 for (hi = fc->l_avars.dv_hashtab.ht_array; todo > 0; ++hi) 2027 { 2028 if (!HASHITEM_EMPTY(hi)) 2029 { 2030 --todo; 2031 di = HI2DI(hi); 2032 copy_tv(&di->di_tv, &di->di_tv); 2033 } 2034 } 2035 } 2036 2037 if (may_free_fc && fc->l_varlist.lv_refcount == DO_NOT_FREE_CNT) 2038 fc->l_varlist.lv_first = NULL; 2039 else 2040 { 2041 listitem_T *li; 2042 2043 free_fc = FALSE; 2044 2045 // Make a copy of the a:000 items, since we didn't do that above. 2046 FOR_ALL_LIST_ITEMS(&fc->l_varlist, li) 2047 copy_tv(&li->li_tv, &li->li_tv); 2048 } 2049 2050 if (free_fc) 2051 free_funccal(fc); 2052 else 2053 { 2054 static int made_copy = 0; 2055 2056 // "fc" is still in use. This can happen when returning "a:000", 2057 // assigning "l:" to a global variable or defining a closure. 2058 // Link "fc" in the list for garbage collection later. 2059 fc->caller = previous_funccal; 2060 previous_funccal = fc; 2061 2062 if (want_garbage_collect) 2063 // If garbage collector is ready, clear count. 2064 made_copy = 0; 2065 else if (++made_copy >= (int)((4096 * 1024) / sizeof(*fc))) 2066 { 2067 // We have made a lot of copies, worth 4 Mbyte. This can happen 2068 // when repetitively calling a function that creates a reference to 2069 // itself somehow. Call the garbage collector soon to avoid using 2070 // too much memory. 2071 made_copy = 0; 2072 want_garbage_collect = TRUE; 2073 } 2074 } 2075 } 2076 2077 /* 2078 * There are two kinds of function names: 2079 * 1. ordinary names, function defined with :function or :def 2080 * 2. numbered functions and lambdas 2081 * For the first we only count the name stored in func_hashtab as a reference, 2082 * using function() does not count as a reference, because the function is 2083 * looked up by name. 2084 */ 2085 int 2086 func_name_refcount(char_u *name) 2087 { 2088 return isdigit(*name) || *name == '<'; 2089 } 2090 2091 /* 2092 * Unreference "fc": decrement the reference count and free it when it 2093 * becomes zero. "fp" is detached from "fc". 2094 * When "force" is TRUE we are exiting. 2095 */ 2096 static void 2097 funccal_unref(funccall_T *fc, ufunc_T *fp, int force) 2098 { 2099 funccall_T **pfc; 2100 int i; 2101 2102 if (fc == NULL) 2103 return; 2104 2105 if (--fc->fc_refcount <= 0 && (force || ( 2106 fc->l_varlist.lv_refcount == DO_NOT_FREE_CNT 2107 && fc->l_vars.dv_refcount == DO_NOT_FREE_CNT 2108 && fc->l_avars.dv_refcount == DO_NOT_FREE_CNT))) 2109 for (pfc = &previous_funccal; *pfc != NULL; pfc = &(*pfc)->caller) 2110 { 2111 if (fc == *pfc) 2112 { 2113 *pfc = fc->caller; 2114 free_funccal_contents(fc); 2115 return; 2116 } 2117 } 2118 for (i = 0; i < fc->fc_funcs.ga_len; ++i) 2119 if (((ufunc_T **)(fc->fc_funcs.ga_data))[i] == fp) 2120 ((ufunc_T **)(fc->fc_funcs.ga_data))[i] = NULL; 2121 } 2122 2123 /* 2124 * Remove the function from the function hashtable. If the function was 2125 * deleted while it still has references this was already done. 2126 * Return TRUE if the entry was deleted, FALSE if it wasn't found. 2127 */ 2128 static int 2129 func_remove(ufunc_T *fp) 2130 { 2131 hashitem_T *hi; 2132 2133 // Return if it was already virtually deleted. 2134 if (fp->uf_flags & FC_DEAD) 2135 return FALSE; 2136 2137 hi = hash_find(&func_hashtab, UF2HIKEY(fp)); 2138 if (!HASHITEM_EMPTY(hi)) 2139 { 2140 // When there is a def-function index do not actually remove the 2141 // function, so we can find the index when defining the function again. 2142 // Do remove it when it's a copy. 2143 if (fp->uf_def_status == UF_COMPILED && (fp->uf_flags & FC_COPY) == 0) 2144 { 2145 fp->uf_flags |= FC_DEAD; 2146 return FALSE; 2147 } 2148 hash_remove(&func_hashtab, hi); 2149 fp->uf_flags |= FC_DELETED; 2150 return TRUE; 2151 } 2152 return FALSE; 2153 } 2154 2155 static void 2156 func_clear_items(ufunc_T *fp) 2157 { 2158 ga_clear_strings(&(fp->uf_args)); 2159 ga_clear_strings(&(fp->uf_def_args)); 2160 ga_clear_strings(&(fp->uf_lines)); 2161 VIM_CLEAR(fp->uf_arg_types); 2162 VIM_CLEAR(fp->uf_block_ids); 2163 VIM_CLEAR(fp->uf_va_name); 2164 clear_type_list(&fp->uf_type_list); 2165 2166 // Increment the refcount of this function to avoid it being freed 2167 // recursively when the partial is freed. 2168 fp->uf_refcount += 3; 2169 partial_unref(fp->uf_partial); 2170 fp->uf_partial = NULL; 2171 fp->uf_refcount -= 3; 2172 2173 #ifdef FEAT_LUA 2174 if (fp->uf_cb_free != NULL) 2175 { 2176 fp->uf_cb_free(fp->uf_cb_state); 2177 fp->uf_cb_free = NULL; 2178 } 2179 2180 fp->uf_cb_state = NULL; 2181 fp->uf_cb = NULL; 2182 #endif 2183 #ifdef FEAT_PROFILE 2184 VIM_CLEAR(fp->uf_tml_count); 2185 VIM_CLEAR(fp->uf_tml_total); 2186 VIM_CLEAR(fp->uf_tml_self); 2187 #endif 2188 } 2189 2190 /* 2191 * Free all things that a function contains. Does not free the function 2192 * itself, use func_free() for that. 2193 * When "force" is TRUE we are exiting. 2194 */ 2195 static void 2196 func_clear(ufunc_T *fp, int force) 2197 { 2198 if (fp->uf_cleared) 2199 return; 2200 fp->uf_cleared = TRUE; 2201 2202 // clear this function 2203 func_clear_items(fp); 2204 funccal_unref(fp->uf_scoped, fp, force); 2205 unlink_def_function(fp); 2206 } 2207 2208 /* 2209 * Free a function and remove it from the list of functions. Does not free 2210 * what a function contains, call func_clear() first. 2211 * When "force" is TRUE we are exiting. 2212 * Returns OK when the function was actually freed. 2213 */ 2214 static int 2215 func_free(ufunc_T *fp, int force) 2216 { 2217 // Only remove it when not done already, otherwise we would remove a newer 2218 // version of the function with the same name. 2219 if ((fp->uf_flags & (FC_DELETED | FC_REMOVED)) == 0) 2220 func_remove(fp); 2221 2222 if ((fp->uf_flags & FC_DEAD) == 0 || force) 2223 { 2224 if (fp->uf_dfunc_idx > 0) 2225 unlink_def_function(fp); 2226 VIM_CLEAR(fp->uf_name_exp); 2227 vim_free(fp); 2228 return OK; 2229 } 2230 return FAIL; 2231 } 2232 2233 /* 2234 * Free all things that a function contains and free the function itself. 2235 * When "force" is TRUE we are exiting. 2236 */ 2237 static void 2238 func_clear_free(ufunc_T *fp, int force) 2239 { 2240 func_clear(fp, force); 2241 if (force || fp->uf_dfunc_idx == 0 || func_name_refcount(fp->uf_name) 2242 || (fp->uf_flags & FC_COPY)) 2243 func_free(fp, force); 2244 else 2245 fp->uf_flags |= FC_DEAD; 2246 } 2247 2248 /* 2249 * Copy already defined function "lambda" to a new function with name "global". 2250 * This is for when a compiled function defines a global function. 2251 */ 2252 int 2253 copy_func(char_u *lambda, char_u *global, ectx_T *ectx) 2254 { 2255 ufunc_T *ufunc = find_func_even_dead(lambda, TRUE, NULL); 2256 ufunc_T *fp = NULL; 2257 2258 if (ufunc == NULL) 2259 { 2260 semsg(_(e_lambda_function_not_found_str), lambda); 2261 return FAIL; 2262 } 2263 2264 fp = find_func(global, TRUE, NULL); 2265 if (fp != NULL) 2266 { 2267 // TODO: handle ! to overwrite 2268 semsg(_(e_funcexts), global); 2269 return FAIL; 2270 } 2271 2272 fp = alloc_clear(offsetof(ufunc_T, uf_name) + STRLEN(global) + 1); 2273 if (fp == NULL) 2274 return FAIL; 2275 2276 fp->uf_varargs = ufunc->uf_varargs; 2277 fp->uf_flags = (ufunc->uf_flags & ~FC_VIM9) | FC_COPY; 2278 fp->uf_def_status = ufunc->uf_def_status; 2279 fp->uf_dfunc_idx = ufunc->uf_dfunc_idx; 2280 if (ga_copy_strings(&ufunc->uf_args, &fp->uf_args) == FAIL 2281 || ga_copy_strings(&ufunc->uf_def_args, &fp->uf_def_args) 2282 == FAIL 2283 || ga_copy_strings(&ufunc->uf_lines, &fp->uf_lines) == FAIL) 2284 goto failed; 2285 2286 fp->uf_name_exp = ufunc->uf_name_exp == NULL ? NULL 2287 : vim_strsave(ufunc->uf_name_exp); 2288 if (ufunc->uf_arg_types != NULL) 2289 { 2290 fp->uf_arg_types = ALLOC_MULT(type_T *, fp->uf_args.ga_len); 2291 if (fp->uf_arg_types == NULL) 2292 goto failed; 2293 mch_memmove(fp->uf_arg_types, ufunc->uf_arg_types, 2294 sizeof(type_T *) * fp->uf_args.ga_len); 2295 } 2296 if (ufunc->uf_va_name != NULL) 2297 { 2298 fp->uf_va_name = vim_strsave(ufunc->uf_va_name); 2299 if (fp->uf_va_name == NULL) 2300 goto failed; 2301 } 2302 fp->uf_ret_type = ufunc->uf_ret_type; 2303 2304 fp->uf_refcount = 1; 2305 STRCPY(fp->uf_name, global); 2306 hash_add(&func_hashtab, UF2HIKEY(fp)); 2307 2308 // the referenced dfunc_T is now used one more time 2309 link_def_function(fp); 2310 2311 // Create a partial to store the context of the function where it was 2312 // instantiated. Only needs to be done once. Do this on the original 2313 // function, "dfunc->df_ufunc" will point to it. 2314 if ((ufunc->uf_flags & FC_CLOSURE) && ufunc->uf_partial == NULL) 2315 { 2316 partial_T *pt = ALLOC_CLEAR_ONE(partial_T); 2317 2318 if (pt == NULL) 2319 goto failed; 2320 if (fill_partial_and_closure(pt, ufunc, ectx) == FAIL) 2321 { 2322 vim_free(pt); 2323 goto failed; 2324 } 2325 ufunc->uf_partial = pt; 2326 --pt->pt_refcount; // not actually referenced here 2327 } 2328 2329 return OK; 2330 2331 failed: 2332 func_clear_free(fp, TRUE); 2333 return FAIL; 2334 } 2335 2336 static int funcdepth = 0; 2337 2338 /* 2339 * Increment the function call depth count. 2340 * Return FAIL when going over 'maxfuncdepth'. 2341 * Otherwise return OK, must call funcdepth_decrement() later! 2342 */ 2343 int 2344 funcdepth_increment(void) 2345 { 2346 if (funcdepth >= p_mfd) 2347 { 2348 emsg(_("E132: Function call depth is higher than 'maxfuncdepth'")); 2349 return FAIL; 2350 } 2351 ++funcdepth; 2352 return OK; 2353 } 2354 2355 void 2356 funcdepth_decrement(void) 2357 { 2358 --funcdepth; 2359 } 2360 2361 /* 2362 * Get the current function call depth. 2363 */ 2364 int 2365 funcdepth_get(void) 2366 { 2367 return funcdepth; 2368 } 2369 2370 /* 2371 * Restore the function call depth. This is for cases where there is no 2372 * guarantee funcdepth_decrement() can be called exactly the same number of 2373 * times as funcdepth_increment(). 2374 */ 2375 void 2376 funcdepth_restore(int depth) 2377 { 2378 funcdepth = depth; 2379 } 2380 2381 /* 2382 * Call a user function. 2383 */ 2384 static void 2385 call_user_func( 2386 ufunc_T *fp, // pointer to function 2387 int argcount, // nr of args 2388 typval_T *argvars, // arguments 2389 typval_T *rettv, // return value 2390 funcexe_T *funcexe, // context 2391 dict_T *selfdict) // Dictionary for "self" 2392 { 2393 sctx_T save_current_sctx; 2394 int using_sandbox = FALSE; 2395 funccall_T *fc; 2396 int save_did_emsg; 2397 int default_arg_err = FALSE; 2398 dictitem_T *v; 2399 int fixvar_idx = 0; // index in fixvar[] 2400 int i; 2401 int ai; 2402 int islambda = FALSE; 2403 char_u numbuf[NUMBUFLEN]; 2404 char_u *name; 2405 typval_T *tv_to_free[MAX_FUNC_ARGS]; 2406 int tv_to_free_len = 0; 2407 #ifdef FEAT_PROFILE 2408 profinfo_T profile_info; 2409 #endif 2410 ESTACK_CHECK_DECLARATION 2411 2412 #ifdef FEAT_PROFILE 2413 CLEAR_FIELD(profile_info); 2414 #endif 2415 2416 // If depth of calling is getting too high, don't execute the function. 2417 if (funcdepth_increment() == FAIL) 2418 { 2419 rettv->v_type = VAR_NUMBER; 2420 rettv->vval.v_number = -1; 2421 return; 2422 } 2423 2424 line_breakcheck(); // check for CTRL-C hit 2425 2426 fc = ALLOC_CLEAR_ONE(funccall_T); 2427 if (fc == NULL) 2428 return; 2429 fc->caller = current_funccal; 2430 current_funccal = fc; 2431 fc->func = fp; 2432 fc->rettv = rettv; 2433 fc->level = ex_nesting_level; 2434 // Check if this function has a breakpoint. 2435 fc->breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, (linenr_T)0); 2436 fc->dbg_tick = debug_tick; 2437 // Set up fields for closure. 2438 ga_init2(&fc->fc_funcs, sizeof(ufunc_T *), 1); 2439 func_ptr_ref(fp); 2440 2441 if (fp->uf_def_status != UF_NOT_COMPILED) 2442 { 2443 #ifdef FEAT_PROFILE 2444 ufunc_T *caller = fc->caller == NULL ? NULL : fc->caller->func; 2445 #endif 2446 // Execute the function, possibly compiling it first. 2447 #ifdef FEAT_PROFILE 2448 if (do_profiling == PROF_YES) 2449 profile_may_start_func(&profile_info, fp, caller); 2450 #endif 2451 call_def_function(fp, argcount, argvars, funcexe->partial, rettv); 2452 funcdepth_decrement(); 2453 #ifdef FEAT_PROFILE 2454 if (do_profiling == PROF_YES && (fp->uf_profiling 2455 || (caller != NULL && caller->uf_profiling))) 2456 profile_may_end_func(&profile_info, fp, caller); 2457 #endif 2458 current_funccal = fc->caller; 2459 free_funccal(fc); 2460 return; 2461 } 2462 2463 if (STRNCMP(fp->uf_name, "<lambda>", 8) == 0) 2464 islambda = TRUE; 2465 2466 /* 2467 * Note about using fc->fixvar[]: This is an array of FIXVAR_CNT variables 2468 * with names up to VAR_SHORT_LEN long. This avoids having to alloc/free 2469 * each argument variable and saves a lot of time. 2470 */ 2471 /* 2472 * Init l: variables. 2473 */ 2474 init_var_dict(&fc->l_vars, &fc->l_vars_var, VAR_DEF_SCOPE); 2475 if (selfdict != NULL) 2476 { 2477 // Set l:self to "selfdict". Use "name" to avoid a warning from 2478 // some compiler that checks the destination size. 2479 v = &fc->fixvar[fixvar_idx++].var; 2480 name = v->di_key; 2481 STRCPY(name, "self"); 2482 v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX; 2483 hash_add(&fc->l_vars.dv_hashtab, DI2HIKEY(v)); 2484 v->di_tv.v_type = VAR_DICT; 2485 v->di_tv.v_lock = 0; 2486 v->di_tv.vval.v_dict = selfdict; 2487 ++selfdict->dv_refcount; 2488 } 2489 2490 /* 2491 * Init a: variables, unless none found (in lambda). 2492 * Set a:0 to "argcount" less number of named arguments, if >= 0. 2493 * Set a:000 to a list with room for the "..." arguments. 2494 */ 2495 init_var_dict(&fc->l_avars, &fc->l_avars_var, VAR_SCOPE); 2496 if ((fp->uf_flags & FC_NOARGS) == 0) 2497 add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "0", 2498 (varnumber_T)(argcount >= fp->uf_args.ga_len 2499 ? argcount - fp->uf_args.ga_len : 0)); 2500 fc->l_avars.dv_lock = VAR_FIXED; 2501 if ((fp->uf_flags & FC_NOARGS) == 0) 2502 { 2503 // Use "name" to avoid a warning from some compiler that checks the 2504 // destination size. 2505 v = &fc->fixvar[fixvar_idx++].var; 2506 name = v->di_key; 2507 STRCPY(name, "000"); 2508 v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX; 2509 hash_add(&fc->l_avars.dv_hashtab, DI2HIKEY(v)); 2510 v->di_tv.v_type = VAR_LIST; 2511 v->di_tv.v_lock = VAR_FIXED; 2512 v->di_tv.vval.v_list = &fc->l_varlist; 2513 } 2514 CLEAR_FIELD(fc->l_varlist); 2515 fc->l_varlist.lv_refcount = DO_NOT_FREE_CNT; 2516 fc->l_varlist.lv_lock = VAR_FIXED; 2517 2518 /* 2519 * Set a:firstline to "firstline" and a:lastline to "lastline". 2520 * Set a:name to named arguments. 2521 * Set a:N to the "..." arguments. 2522 * Skipped when no a: variables used (in lambda). 2523 */ 2524 if ((fp->uf_flags & FC_NOARGS) == 0) 2525 { 2526 add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "firstline", 2527 (varnumber_T)funcexe->firstline); 2528 add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "lastline", 2529 (varnumber_T)funcexe->lastline); 2530 } 2531 for (i = 0; i < argcount || i < fp->uf_args.ga_len; ++i) 2532 { 2533 int addlocal = FALSE; 2534 typval_T def_rettv; 2535 int isdefault = FALSE; 2536 2537 ai = i - fp->uf_args.ga_len; 2538 if (ai < 0) 2539 { 2540 // named argument a:name 2541 name = FUNCARG(fp, i); 2542 if (islambda) 2543 addlocal = TRUE; 2544 2545 // evaluate named argument default expression 2546 isdefault = ai + fp->uf_def_args.ga_len >= 0 2547 && (i >= argcount || (argvars[i].v_type == VAR_SPECIAL 2548 && argvars[i].vval.v_number == VVAL_NONE)); 2549 if (isdefault) 2550 { 2551 char_u *default_expr = NULL; 2552 2553 def_rettv.v_type = VAR_NUMBER; 2554 def_rettv.vval.v_number = -1; 2555 2556 default_expr = ((char_u **)(fp->uf_def_args.ga_data)) 2557 [ai + fp->uf_def_args.ga_len]; 2558 if (eval1(&default_expr, &def_rettv, &EVALARG_EVALUATE) == FAIL) 2559 { 2560 default_arg_err = 1; 2561 break; 2562 } 2563 } 2564 } 2565 else 2566 { 2567 if ((fp->uf_flags & FC_NOARGS) != 0) 2568 // Bail out if no a: arguments used (in lambda). 2569 break; 2570 2571 // "..." argument a:1, a:2, etc. 2572 sprintf((char *)numbuf, "%d", ai + 1); 2573 name = numbuf; 2574 } 2575 if (fixvar_idx < FIXVAR_CNT && STRLEN(name) <= VAR_SHORT_LEN) 2576 { 2577 v = &fc->fixvar[fixvar_idx++].var; 2578 v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX; 2579 STRCPY(v->di_key, name); 2580 } 2581 else 2582 { 2583 v = dictitem_alloc(name); 2584 if (v == NULL) 2585 break; 2586 v->di_flags |= DI_FLAGS_RO | DI_FLAGS_FIX; 2587 } 2588 2589 // Note: the values are copied directly to avoid alloc/free. 2590 // "argvars" must have VAR_FIXED for v_lock. 2591 v->di_tv = isdefault ? def_rettv : argvars[i]; 2592 v->di_tv.v_lock = VAR_FIXED; 2593 2594 if (isdefault) 2595 // Need to free this later, no matter where it's stored. 2596 tv_to_free[tv_to_free_len++] = &v->di_tv; 2597 2598 if (addlocal) 2599 { 2600 // Named arguments should be accessed without the "a:" prefix in 2601 // lambda expressions. Add to the l: dict. 2602 copy_tv(&v->di_tv, &v->di_tv); 2603 hash_add(&fc->l_vars.dv_hashtab, DI2HIKEY(v)); 2604 } 2605 else 2606 hash_add(&fc->l_avars.dv_hashtab, DI2HIKEY(v)); 2607 2608 if (ai >= 0 && ai < MAX_FUNC_ARGS) 2609 { 2610 listitem_T *li = &fc->l_listitems[ai]; 2611 2612 li->li_tv = argvars[i]; 2613 li->li_tv.v_lock = VAR_FIXED; 2614 list_append(&fc->l_varlist, li); 2615 } 2616 } 2617 2618 // Don't redraw while executing the function. 2619 ++RedrawingDisabled; 2620 2621 if (fp->uf_flags & FC_SANDBOX) 2622 { 2623 using_sandbox = TRUE; 2624 ++sandbox; 2625 } 2626 2627 estack_push_ufunc(fp, 1); 2628 ESTACK_CHECK_SETUP 2629 if (p_verbose >= 12) 2630 { 2631 ++no_wait_return; 2632 verbose_enter_scroll(); 2633 2634 smsg(_("calling %s"), SOURCING_NAME); 2635 if (p_verbose >= 14) 2636 { 2637 char_u buf[MSG_BUF_LEN]; 2638 char_u numbuf2[NUMBUFLEN]; 2639 char_u *tofree; 2640 char_u *s; 2641 2642 msg_puts("("); 2643 for (i = 0; i < argcount; ++i) 2644 { 2645 if (i > 0) 2646 msg_puts(", "); 2647 if (argvars[i].v_type == VAR_NUMBER) 2648 msg_outnum((long)argvars[i].vval.v_number); 2649 else 2650 { 2651 // Do not want errors such as E724 here. 2652 ++emsg_off; 2653 s = tv2string(&argvars[i], &tofree, numbuf2, 0); 2654 --emsg_off; 2655 if (s != NULL) 2656 { 2657 if (vim_strsize(s) > MSG_BUF_CLEN) 2658 { 2659 trunc_string(s, buf, MSG_BUF_CLEN, MSG_BUF_LEN); 2660 s = buf; 2661 } 2662 msg_puts((char *)s); 2663 vim_free(tofree); 2664 } 2665 } 2666 } 2667 msg_puts(")"); 2668 } 2669 msg_puts("\n"); // don't overwrite this either 2670 2671 verbose_leave_scroll(); 2672 --no_wait_return; 2673 } 2674 #ifdef FEAT_PROFILE 2675 if (do_profiling == PROF_YES) 2676 profile_may_start_func(&profile_info, fp, 2677 fc->caller == NULL ? NULL : fc->caller->func); 2678 #endif 2679 2680 save_current_sctx = current_sctx; 2681 current_sctx = fp->uf_script_ctx; 2682 save_did_emsg = did_emsg; 2683 did_emsg = FALSE; 2684 2685 if (default_arg_err && (fp->uf_flags & FC_ABORT)) 2686 did_emsg = TRUE; 2687 else if (islambda) 2688 { 2689 char_u *p = *(char_u **)fp->uf_lines.ga_data + 7; 2690 2691 // A Lambda always has the command "return {expr}". It is much faster 2692 // to evaluate {expr} directly. 2693 ++ex_nesting_level; 2694 (void)eval1(&p, rettv, &EVALARG_EVALUATE); 2695 --ex_nesting_level; 2696 } 2697 else 2698 // call do_cmdline() to execute the lines 2699 do_cmdline(NULL, get_func_line, (void *)fc, 2700 DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT); 2701 2702 --RedrawingDisabled; 2703 2704 // when the function was aborted because of an error, return -1 2705 if ((did_emsg && (fp->uf_flags & FC_ABORT)) || rettv->v_type == VAR_UNKNOWN) 2706 { 2707 clear_tv(rettv); 2708 rettv->v_type = VAR_NUMBER; 2709 rettv->vval.v_number = -1; 2710 } 2711 2712 #ifdef FEAT_PROFILE 2713 if (do_profiling == PROF_YES) 2714 { 2715 ufunc_T *caller = fc->caller == NULL ? NULL : fc->caller->func; 2716 2717 if (fp->uf_profiling || (caller != NULL && caller->uf_profiling)) 2718 profile_may_end_func(&profile_info, fp, caller); 2719 } 2720 #endif 2721 2722 // when being verbose, mention the return value 2723 if (p_verbose >= 12) 2724 { 2725 ++no_wait_return; 2726 verbose_enter_scroll(); 2727 2728 if (aborting()) 2729 smsg(_("%s aborted"), SOURCING_NAME); 2730 else if (fc->rettv->v_type == VAR_NUMBER) 2731 smsg(_("%s returning #%ld"), SOURCING_NAME, 2732 (long)fc->rettv->vval.v_number); 2733 else 2734 { 2735 char_u buf[MSG_BUF_LEN]; 2736 char_u numbuf2[NUMBUFLEN]; 2737 char_u *tofree; 2738 char_u *s; 2739 2740 // The value may be very long. Skip the middle part, so that we 2741 // have some idea how it starts and ends. smsg() would always 2742 // truncate it at the end. Don't want errors such as E724 here. 2743 ++emsg_off; 2744 s = tv2string(fc->rettv, &tofree, numbuf2, 0); 2745 --emsg_off; 2746 if (s != NULL) 2747 { 2748 if (vim_strsize(s) > MSG_BUF_CLEN) 2749 { 2750 trunc_string(s, buf, MSG_BUF_CLEN, MSG_BUF_LEN); 2751 s = buf; 2752 } 2753 smsg(_("%s returning %s"), SOURCING_NAME, s); 2754 vim_free(tofree); 2755 } 2756 } 2757 msg_puts("\n"); // don't overwrite this either 2758 2759 verbose_leave_scroll(); 2760 --no_wait_return; 2761 } 2762 2763 ESTACK_CHECK_NOW 2764 estack_pop(); 2765 current_sctx = save_current_sctx; 2766 #ifdef FEAT_PROFILE 2767 if (do_profiling == PROF_YES) 2768 script_prof_restore(&profile_info.pi_wait_start); 2769 #endif 2770 if (using_sandbox) 2771 --sandbox; 2772 2773 if (p_verbose >= 12 && SOURCING_NAME != NULL) 2774 { 2775 ++no_wait_return; 2776 verbose_enter_scroll(); 2777 2778 smsg(_("continuing in %s"), SOURCING_NAME); 2779 msg_puts("\n"); // don't overwrite this either 2780 2781 verbose_leave_scroll(); 2782 --no_wait_return; 2783 } 2784 2785 did_emsg |= save_did_emsg; 2786 funcdepth_decrement(); 2787 for (i = 0; i < tv_to_free_len; ++i) 2788 clear_tv(tv_to_free[i]); 2789 cleanup_function_call(fc); 2790 } 2791 2792 /* 2793 * Check the argument count for user function "fp". 2794 * Return FCERR_UNKNOWN if OK, FCERR_TOOFEW or FCERR_TOOMANY otherwise. 2795 */ 2796 int 2797 check_user_func_argcount(ufunc_T *fp, int argcount) 2798 { 2799 int regular_args = fp->uf_args.ga_len; 2800 2801 if (argcount < regular_args - fp->uf_def_args.ga_len) 2802 return FCERR_TOOFEW; 2803 else if (!has_varargs(fp) && argcount > regular_args) 2804 return FCERR_TOOMANY; 2805 return FCERR_UNKNOWN; 2806 } 2807 2808 /* 2809 * Call a user function after checking the arguments. 2810 */ 2811 int 2812 call_user_func_check( 2813 ufunc_T *fp, 2814 int argcount, 2815 typval_T *argvars, 2816 typval_T *rettv, 2817 funcexe_T *funcexe, 2818 dict_T *selfdict) 2819 { 2820 int error; 2821 2822 if (fp->uf_flags & FC_RANGE && funcexe->doesrange != NULL) 2823 *funcexe->doesrange = TRUE; 2824 error = check_user_func_argcount(fp, argcount); 2825 if (error != FCERR_UNKNOWN) 2826 return error; 2827 if ((fp->uf_flags & FC_DICT) && selfdict == NULL) 2828 error = FCERR_DICT; 2829 else 2830 { 2831 int did_save_redo = FALSE; 2832 save_redo_T save_redo; 2833 2834 /* 2835 * Call the user function. 2836 * Save and restore search patterns, script variables and 2837 * redo buffer. 2838 */ 2839 save_search_patterns(); 2840 if (!ins_compl_active()) 2841 { 2842 saveRedobuff(&save_redo); 2843 did_save_redo = TRUE; 2844 } 2845 ++fp->uf_calls; 2846 call_user_func(fp, argcount, argvars, rettv, funcexe, 2847 (fp->uf_flags & FC_DICT) ? selfdict : NULL); 2848 if (--fp->uf_calls <= 0 && fp->uf_refcount <= 0) 2849 // Function was unreferenced while being used, free it now. 2850 func_clear_free(fp, FALSE); 2851 if (did_save_redo) 2852 restoreRedobuff(&save_redo); 2853 restore_search_patterns(); 2854 error = FCERR_NONE; 2855 } 2856 return error; 2857 } 2858 2859 static funccal_entry_T *funccal_stack = NULL; 2860 2861 /* 2862 * Save the current function call pointer, and set it to NULL. 2863 * Used when executing autocommands and for ":source". 2864 */ 2865 void 2866 save_funccal(funccal_entry_T *entry) 2867 { 2868 entry->top_funccal = current_funccal; 2869 entry->next = funccal_stack; 2870 funccal_stack = entry; 2871 current_funccal = NULL; 2872 } 2873 2874 void 2875 restore_funccal(void) 2876 { 2877 if (funccal_stack == NULL) 2878 iemsg("INTERNAL: restore_funccal()"); 2879 else 2880 { 2881 current_funccal = funccal_stack->top_funccal; 2882 funccal_stack = funccal_stack->next; 2883 } 2884 } 2885 2886 funccall_T * 2887 get_current_funccal(void) 2888 { 2889 return current_funccal; 2890 } 2891 2892 /* 2893 * Mark all functions of script "sid" as deleted. 2894 */ 2895 void 2896 delete_script_functions(int sid) 2897 { 2898 hashitem_T *hi; 2899 ufunc_T *fp; 2900 long_u todo = 1; 2901 char_u buf[30]; 2902 size_t len; 2903 2904 buf[0] = K_SPECIAL; 2905 buf[1] = KS_EXTRA; 2906 buf[2] = (int)KE_SNR; 2907 sprintf((char *)buf + 3, "%d_", sid); 2908 len = STRLEN(buf); 2909 2910 while (todo > 0) 2911 { 2912 todo = func_hashtab.ht_used; 2913 for (hi = func_hashtab.ht_array; todo > 0; ++hi) 2914 if (!HASHITEM_EMPTY(hi)) 2915 { 2916 fp = HI2UF(hi); 2917 if (STRNCMP(fp->uf_name, buf, len) == 0) 2918 { 2919 int changed = func_hashtab.ht_changed; 2920 2921 fp->uf_flags |= FC_DEAD; 2922 2923 if (fp->uf_calls > 0) 2924 { 2925 // Function is executing, don't free it but do remove 2926 // it from the hashtable. 2927 if (func_remove(fp)) 2928 fp->uf_refcount--; 2929 } 2930 else 2931 { 2932 func_clear(fp, TRUE); 2933 // When clearing a function another function can be 2934 // cleared as a side effect. When that happens start 2935 // over. 2936 if (changed != func_hashtab.ht_changed) 2937 break; 2938 } 2939 } 2940 --todo; 2941 } 2942 } 2943 } 2944 2945 #if defined(EXITFREE) || defined(PROTO) 2946 void 2947 free_all_functions(void) 2948 { 2949 hashitem_T *hi; 2950 ufunc_T *fp; 2951 long_u skipped = 0; 2952 long_u todo = 1; 2953 int changed; 2954 2955 // Clean up the current_funccal chain and the funccal stack. 2956 while (current_funccal != NULL) 2957 { 2958 clear_tv(current_funccal->rettv); 2959 cleanup_function_call(current_funccal); 2960 if (current_funccal == NULL && funccal_stack != NULL) 2961 restore_funccal(); 2962 } 2963 2964 // First clear what the functions contain. Since this may lower the 2965 // reference count of a function, it may also free a function and change 2966 // the hash table. Restart if that happens. 2967 while (todo > 0) 2968 { 2969 todo = func_hashtab.ht_used; 2970 for (hi = func_hashtab.ht_array; todo > 0; ++hi) 2971 if (!HASHITEM_EMPTY(hi)) 2972 { 2973 // clear the def function index now 2974 fp = HI2UF(hi); 2975 fp->uf_flags &= ~FC_DEAD; 2976 fp->uf_def_status = UF_NOT_COMPILED; 2977 2978 // Only free functions that are not refcounted, those are 2979 // supposed to be freed when no longer referenced. 2980 if (func_name_refcount(fp->uf_name)) 2981 ++skipped; 2982 else 2983 { 2984 changed = func_hashtab.ht_changed; 2985 func_clear(fp, TRUE); 2986 if (changed != func_hashtab.ht_changed) 2987 { 2988 skipped = 0; 2989 break; 2990 } 2991 } 2992 --todo; 2993 } 2994 } 2995 2996 // Now actually free the functions. Need to start all over every time, 2997 // because func_free() may change the hash table. 2998 skipped = 0; 2999 while (func_hashtab.ht_used > skipped) 3000 { 3001 todo = func_hashtab.ht_used; 3002 for (hi = func_hashtab.ht_array; todo > 0; ++hi) 3003 if (!HASHITEM_EMPTY(hi)) 3004 { 3005 --todo; 3006 // Only free functions that are not refcounted, those are 3007 // supposed to be freed when no longer referenced. 3008 fp = HI2UF(hi); 3009 if (func_name_refcount(fp->uf_name)) 3010 ++skipped; 3011 else 3012 { 3013 if (func_free(fp, FALSE) == OK) 3014 { 3015 skipped = 0; 3016 break; 3017 } 3018 // did not actually free it 3019 ++skipped; 3020 } 3021 } 3022 } 3023 if (skipped == 0) 3024 hash_clear(&func_hashtab); 3025 3026 free_def_functions(); 3027 } 3028 #endif 3029 3030 /* 3031 * Return TRUE if "name" looks like a builtin function name: starts with a 3032 * lower case letter and doesn't contain AUTOLOAD_CHAR or ':'. 3033 * "len" is the length of "name", or -1 for NUL terminated. 3034 */ 3035 int 3036 builtin_function(char_u *name, int len) 3037 { 3038 char_u *p; 3039 3040 if (!ASCII_ISLOWER(name[0]) || name[1] == ':') 3041 return FALSE; 3042 p = vim_strchr(name, AUTOLOAD_CHAR); 3043 return p == NULL || (len > 0 && p > name + len); 3044 } 3045 3046 int 3047 func_call( 3048 char_u *name, 3049 typval_T *args, 3050 partial_T *partial, 3051 dict_T *selfdict, 3052 typval_T *rettv) 3053 { 3054 list_T *l = args->vval.v_list; 3055 listitem_T *item; 3056 typval_T argv[MAX_FUNC_ARGS + 1]; 3057 int argc = 0; 3058 int r = 0; 3059 3060 CHECK_LIST_MATERIALIZE(l); 3061 FOR_ALL_LIST_ITEMS(l, item) 3062 { 3063 if (argc == MAX_FUNC_ARGS - (partial == NULL ? 0 : partial->pt_argc)) 3064 { 3065 emsg(_("E699: Too many arguments")); 3066 break; 3067 } 3068 // Make a copy of each argument. This is needed to be able to set 3069 // v_lock to VAR_FIXED in the copy without changing the original list. 3070 copy_tv(&item->li_tv, &argv[argc++]); 3071 } 3072 3073 if (item == NULL) 3074 { 3075 funcexe_T funcexe; 3076 3077 CLEAR_FIELD(funcexe); 3078 funcexe.firstline = curwin->w_cursor.lnum; 3079 funcexe.lastline = curwin->w_cursor.lnum; 3080 funcexe.evaluate = TRUE; 3081 funcexe.partial = partial; 3082 funcexe.selfdict = selfdict; 3083 r = call_func(name, -1, rettv, argc, argv, &funcexe); 3084 } 3085 3086 // Free the arguments. 3087 while (argc > 0) 3088 clear_tv(&argv[--argc]); 3089 3090 return r; 3091 } 3092 3093 static int callback_depth = 0; 3094 3095 int 3096 get_callback_depth(void) 3097 { 3098 return callback_depth; 3099 } 3100 3101 /* 3102 * Invoke call_func() with a callback. 3103 */ 3104 int 3105 call_callback( 3106 callback_T *callback, 3107 int len, // length of "name" or -1 to use strlen() 3108 typval_T *rettv, // return value goes here 3109 int argcount, // number of "argvars" 3110 typval_T *argvars) // vars for arguments, must have "argcount" 3111 // PLUS ONE elements! 3112 { 3113 funcexe_T funcexe; 3114 int ret; 3115 3116 CLEAR_FIELD(funcexe); 3117 funcexe.evaluate = TRUE; 3118 funcexe.partial = callback->cb_partial; 3119 ++callback_depth; 3120 ret = call_func(callback->cb_name, len, rettv, argcount, argvars, &funcexe); 3121 --callback_depth; 3122 return ret; 3123 } 3124 3125 /* 3126 * Give an error message for the result of a function. 3127 * Nothing if "error" is FCERR_NONE. 3128 */ 3129 void 3130 user_func_error(int error, char_u *name) 3131 { 3132 switch (error) 3133 { 3134 case FCERR_UNKNOWN: 3135 emsg_funcname(e_unknownfunc, name); 3136 break; 3137 case FCERR_NOTMETHOD: 3138 emsg_funcname( 3139 N_("E276: Cannot use function as a method: %s"), name); 3140 break; 3141 case FCERR_DELETED: 3142 emsg_funcname(N_(e_func_deleted), name); 3143 break; 3144 case FCERR_TOOMANY: 3145 emsg_funcname((char *)e_toomanyarg, name); 3146 break; 3147 case FCERR_TOOFEW: 3148 emsg_funcname((char *)e_toofewarg, name); 3149 break; 3150 case FCERR_SCRIPT: 3151 emsg_funcname( 3152 N_("E120: Using <SID> not in a script context: %s"), name); 3153 break; 3154 case FCERR_DICT: 3155 emsg_funcname( 3156 N_("E725: Calling dict function without Dictionary: %s"), 3157 name); 3158 break; 3159 } 3160 } 3161 3162 /* 3163 * Call a function with its resolved parameters 3164 * 3165 * Return FAIL when the function can't be called, OK otherwise. 3166 * Also returns OK when an error was encountered while executing the function. 3167 */ 3168 int 3169 call_func( 3170 char_u *funcname, // name of the function 3171 int len, // length of "name" or -1 to use strlen() 3172 typval_T *rettv, // return value goes here 3173 int argcount_in, // number of "argvars" 3174 typval_T *argvars_in, // vars for arguments, must have "argcount" 3175 // PLUS ONE elements! 3176 funcexe_T *funcexe) // more arguments 3177 { 3178 int ret = FAIL; 3179 int error = FCERR_NONE; 3180 int i; 3181 ufunc_T *fp = NULL; 3182 char_u fname_buf[FLEN_FIXED + 1]; 3183 char_u *tofree = NULL; 3184 char_u *fname = NULL; 3185 char_u *name = NULL; 3186 int argcount = argcount_in; 3187 typval_T *argvars = argvars_in; 3188 dict_T *selfdict = funcexe->selfdict; 3189 typval_T argv[MAX_FUNC_ARGS + 1]; // used when "partial" or 3190 // "funcexe->basetv" is not NULL 3191 int argv_clear = 0; 3192 int argv_base = 0; 3193 partial_T *partial = funcexe->partial; 3194 type_T check_type; 3195 3196 // Initialize rettv so that it is safe for caller to invoke clear_tv(rettv) 3197 // even when call_func() returns FAIL. 3198 rettv->v_type = VAR_UNKNOWN; 3199 3200 if (partial != NULL) 3201 fp = partial->pt_func; 3202 if (fp == NULL) 3203 { 3204 // Make a copy of the name, if it comes from a funcref variable it 3205 // could be changed or deleted in the called function. 3206 name = len > 0 ? vim_strnsave(funcname, len) : vim_strsave(funcname); 3207 if (name == NULL) 3208 return ret; 3209 3210 fname = fname_trans_sid(name, fname_buf, &tofree, &error); 3211 } 3212 3213 if (funcexe->doesrange != NULL) 3214 *funcexe->doesrange = FALSE; 3215 3216 if (partial != NULL) 3217 { 3218 // When the function has a partial with a dict and there is a dict 3219 // argument, use the dict argument. That is backwards compatible. 3220 // When the dict was bound explicitly use the one from the partial. 3221 if (partial->pt_dict != NULL && (selfdict == NULL || !partial->pt_auto)) 3222 selfdict = partial->pt_dict; 3223 if (error == FCERR_NONE && partial->pt_argc > 0) 3224 { 3225 for (argv_clear = 0; argv_clear < partial->pt_argc; ++argv_clear) 3226 { 3227 if (argv_clear + argcount_in >= MAX_FUNC_ARGS) 3228 { 3229 error = FCERR_TOOMANY; 3230 goto theend; 3231 } 3232 copy_tv(&partial->pt_argv[argv_clear], &argv[argv_clear]); 3233 } 3234 for (i = 0; i < argcount_in; ++i) 3235 argv[i + argv_clear] = argvars_in[i]; 3236 argvars = argv; 3237 argcount = partial->pt_argc + argcount_in; 3238 3239 if (funcexe->check_type != NULL 3240 && funcexe->check_type->tt_argcount != -1) 3241 { 3242 // Now funcexe->check_type is missing the added arguments, make 3243 // a copy of the type with the correction. 3244 check_type = *funcexe->check_type; 3245 funcexe->check_type = &check_type; 3246 check_type.tt_argcount += partial->pt_argc; 3247 check_type.tt_min_argcount += partial->pt_argc; 3248 } 3249 } 3250 } 3251 3252 if (error == FCERR_NONE && funcexe->check_type != NULL && funcexe->evaluate) 3253 { 3254 // Check that the argument types are OK for the types of the funcref. 3255 if (check_argument_types(funcexe->check_type, argvars, argcount, 3256 (name != NULL) ? name : funcname) == FAIL) 3257 error = FCERR_OTHER; 3258 } 3259 3260 if (error == FCERR_NONE && funcexe->evaluate) 3261 { 3262 char_u *rfname = fname; 3263 int is_global = FALSE; 3264 3265 // Skip "g:" before a function name. 3266 if (fp == NULL && fname[0] == 'g' && fname[1] == ':') 3267 { 3268 is_global = TRUE; 3269 rfname = fname + 2; 3270 } 3271 3272 rettv->v_type = VAR_NUMBER; // default rettv is number zero 3273 rettv->vval.v_number = 0; 3274 error = FCERR_UNKNOWN; 3275 3276 if (fp != NULL || !builtin_function(rfname, -1)) 3277 { 3278 /* 3279 * User defined function. 3280 */ 3281 if (fp == NULL) 3282 fp = find_func(rfname, is_global, NULL); 3283 3284 // Trigger FuncUndefined event, may load the function. 3285 if (fp == NULL 3286 && apply_autocmds(EVENT_FUNCUNDEFINED, 3287 rfname, rfname, TRUE, NULL) 3288 && !aborting()) 3289 { 3290 // executed an autocommand, search for the function again 3291 fp = find_func(rfname, is_global, NULL); 3292 } 3293 // Try loading a package. 3294 if (fp == NULL && script_autoload(rfname, TRUE) && !aborting()) 3295 { 3296 // loaded a package, search for the function again 3297 fp = find_func(rfname, is_global, NULL); 3298 } 3299 if (fp == NULL) 3300 { 3301 char_u *p = untrans_function_name(rfname); 3302 3303 // If using Vim9 script try not local to the script. 3304 // Don't do this if the name starts with "s:". 3305 if (p != NULL && (funcname[0] != 's' || funcname[1] != ':')) 3306 fp = find_func(p, is_global, NULL); 3307 } 3308 3309 if (fp != NULL && (fp->uf_flags & FC_DELETED)) 3310 error = FCERR_DELETED; 3311 #ifdef FEAT_LUA 3312 else if (fp != NULL && (fp->uf_flags & FC_CFUNC)) 3313 { 3314 cfunc_T cb = fp->uf_cb; 3315 3316 error = (*cb)(argcount, argvars, rettv, fp->uf_cb_state); 3317 } 3318 #endif 3319 else if (fp != NULL) 3320 { 3321 if (funcexe->argv_func != NULL) 3322 // postponed filling in the arguments, do it now 3323 argcount = funcexe->argv_func(argcount, argvars, argv_clear, 3324 fp->uf_args.ga_len); 3325 3326 if (funcexe->basetv != NULL) 3327 { 3328 // Method call: base->Method() 3329 mch_memmove(&argv[1], argvars, sizeof(typval_T) * argcount); 3330 argv[0] = *funcexe->basetv; 3331 argcount++; 3332 argvars = argv; 3333 argv_base = 1; 3334 } 3335 3336 error = call_user_func_check(fp, argcount, argvars, rettv, 3337 funcexe, selfdict); 3338 } 3339 } 3340 else if (funcexe->basetv != NULL) 3341 { 3342 /* 3343 * expr->method(): Find the method name in the table, call its 3344 * implementation with the base as one of the arguments. 3345 */ 3346 error = call_internal_method(fname, argcount, argvars, rettv, 3347 funcexe->basetv); 3348 } 3349 else 3350 { 3351 /* 3352 * Find the function name in the table, call its implementation. 3353 */ 3354 error = call_internal_func(fname, argcount, argvars, rettv); 3355 } 3356 3357 /* 3358 * The function call (or "FuncUndefined" autocommand sequence) might 3359 * have been aborted by an error, an interrupt, or an explicitly thrown 3360 * exception that has not been caught so far. This situation can be 3361 * tested for by calling aborting(). For an error in an internal 3362 * function or for the "E132" error in call_user_func(), however, the 3363 * throw point at which the "force_abort" flag (temporarily reset by 3364 * emsg()) is normally updated has not been reached yet. We need to 3365 * update that flag first to make aborting() reliable. 3366 */ 3367 update_force_abort(); 3368 } 3369 if (error == FCERR_NONE) 3370 ret = OK; 3371 3372 theend: 3373 /* 3374 * Report an error unless the argument evaluation or function call has been 3375 * cancelled due to an aborting error, an interrupt, or an exception. 3376 */ 3377 if (!aborting()) 3378 { 3379 user_func_error(error, (name != NULL) ? name : funcname); 3380 } 3381 3382 // clear the copies made from the partial 3383 while (argv_clear > 0) 3384 clear_tv(&argv[--argv_clear + argv_base]); 3385 3386 vim_free(tofree); 3387 vim_free(name); 3388 3389 return ret; 3390 } 3391 3392 char_u * 3393 printable_func_name(ufunc_T *fp) 3394 { 3395 return fp->uf_name_exp != NULL ? fp->uf_name_exp : fp->uf_name; 3396 } 3397 3398 /* 3399 * List the head of the function: "function name(arg1, arg2)". 3400 */ 3401 static void 3402 list_func_head(ufunc_T *fp, int indent) 3403 { 3404 int j; 3405 3406 msg_start(); 3407 if (indent) 3408 msg_puts(" "); 3409 if (fp->uf_def_status != UF_NOT_COMPILED) 3410 msg_puts("def "); 3411 else 3412 msg_puts("function "); 3413 msg_puts((char *)printable_func_name(fp)); 3414 msg_putchar('('); 3415 for (j = 0; j < fp->uf_args.ga_len; ++j) 3416 { 3417 if (j) 3418 msg_puts(", "); 3419 msg_puts((char *)FUNCARG(fp, j)); 3420 if (fp->uf_arg_types != NULL) 3421 { 3422 char *tofree; 3423 3424 msg_puts(": "); 3425 msg_puts(type_name(fp->uf_arg_types[j], &tofree)); 3426 vim_free(tofree); 3427 } 3428 if (j >= fp->uf_args.ga_len - fp->uf_def_args.ga_len) 3429 { 3430 msg_puts(" = "); 3431 msg_puts(((char **)(fp->uf_def_args.ga_data)) 3432 [j - fp->uf_args.ga_len + fp->uf_def_args.ga_len]); 3433 } 3434 } 3435 if (fp->uf_varargs) 3436 { 3437 if (j) 3438 msg_puts(", "); 3439 msg_puts("..."); 3440 } 3441 if (fp->uf_va_name != NULL) 3442 { 3443 if (j) 3444 msg_puts(", "); 3445 msg_puts("..."); 3446 msg_puts((char *)fp->uf_va_name); 3447 if (fp->uf_va_type != NULL) 3448 { 3449 char *tofree; 3450 3451 msg_puts(": "); 3452 msg_puts(type_name(fp->uf_va_type, &tofree)); 3453 vim_free(tofree); 3454 } 3455 } 3456 msg_putchar(')'); 3457 3458 if (fp->uf_def_status != UF_NOT_COMPILED) 3459 { 3460 if (fp->uf_ret_type != &t_void) 3461 { 3462 char *tofree; 3463 3464 msg_puts(": "); 3465 msg_puts(type_name(fp->uf_ret_type, &tofree)); 3466 vim_free(tofree); 3467 } 3468 } 3469 else if (fp->uf_flags & FC_ABORT) 3470 msg_puts(" abort"); 3471 if (fp->uf_flags & FC_RANGE) 3472 msg_puts(" range"); 3473 if (fp->uf_flags & FC_DICT) 3474 msg_puts(" dict"); 3475 if (fp->uf_flags & FC_CLOSURE) 3476 msg_puts(" closure"); 3477 msg_clr_eos(); 3478 if (p_verbose > 0) 3479 last_set_msg(fp->uf_script_ctx); 3480 } 3481 3482 /* 3483 * Get a function name, translating "<SID>" and "<SNR>". 3484 * Also handles a Funcref in a List or Dictionary. 3485 * Returns the function name in allocated memory, or NULL for failure. 3486 * Set "*is_global" to TRUE when the function must be global, unless 3487 * "is_global" is NULL. 3488 * flags: 3489 * TFN_INT: internal function name OK 3490 * TFN_QUIET: be quiet 3491 * TFN_NO_AUTOLOAD: do not use script autoloading 3492 * TFN_NO_DEREF: do not dereference a Funcref 3493 * Advances "pp" to just after the function name (if no error). 3494 */ 3495 char_u * 3496 trans_function_name( 3497 char_u **pp, 3498 int *is_global, 3499 int skip, // only find the end, don't evaluate 3500 int flags, 3501 funcdict_T *fdp, // return: info about dictionary used 3502 partial_T **partial, // return: partial of a FuncRef 3503 type_T **type) // return: type of funcref if not NULL 3504 { 3505 char_u *name = NULL; 3506 char_u *start; 3507 char_u *end; 3508 int lead; 3509 char_u sid_buf[20]; 3510 int len; 3511 int extra = 0; 3512 lval_T lv; 3513 int vim9script; 3514 static char *e_function_name = N_("E129: Function name required"); 3515 3516 if (fdp != NULL) 3517 CLEAR_POINTER(fdp); 3518 start = *pp; 3519 3520 // Check for hard coded <SNR>: already translated function ID (from a user 3521 // command). 3522 if ((*pp)[0] == K_SPECIAL && (*pp)[1] == KS_EXTRA 3523 && (*pp)[2] == (int)KE_SNR) 3524 { 3525 *pp += 3; 3526 len = get_id_len(pp) + 3; 3527 return vim_strnsave(start, len); 3528 } 3529 3530 // A name starting with "<SID>" or "<SNR>" is local to a script. But 3531 // don't skip over "s:", get_lval() needs it for "s:dict.func". 3532 lead = eval_fname_script(start); 3533 if (lead > 2) 3534 start += lead; 3535 3536 // Note that TFN_ flags use the same values as GLV_ flags. 3537 end = get_lval(start, NULL, &lv, FALSE, skip, flags | GLV_READ_ONLY, 3538 lead > 2 ? 0 : FNE_CHECK_START); 3539 if (end == start) 3540 { 3541 if (!skip) 3542 emsg(_(e_function_name)); 3543 goto theend; 3544 } 3545 if (end == NULL || (lv.ll_tv != NULL && (lead > 2 || lv.ll_range))) 3546 { 3547 /* 3548 * Report an invalid expression in braces, unless the expression 3549 * evaluation has been cancelled due to an aborting error, an 3550 * interrupt, or an exception. 3551 */ 3552 if (!aborting()) 3553 { 3554 if (end != NULL) 3555 semsg(_(e_invarg2), start); 3556 } 3557 else 3558 *pp = find_name_end(start, NULL, NULL, FNE_INCL_BR); 3559 goto theend; 3560 } 3561 3562 if (lv.ll_tv != NULL) 3563 { 3564 if (fdp != NULL) 3565 { 3566 fdp->fd_dict = lv.ll_dict; 3567 fdp->fd_newkey = lv.ll_newkey; 3568 lv.ll_newkey = NULL; 3569 fdp->fd_di = lv.ll_di; 3570 } 3571 if (lv.ll_tv->v_type == VAR_FUNC && lv.ll_tv->vval.v_string != NULL) 3572 { 3573 name = vim_strsave(lv.ll_tv->vval.v_string); 3574 *pp = end; 3575 } 3576 else if (lv.ll_tv->v_type == VAR_PARTIAL 3577 && lv.ll_tv->vval.v_partial != NULL) 3578 { 3579 name = vim_strsave(partial_name(lv.ll_tv->vval.v_partial)); 3580 *pp = end; 3581 if (partial != NULL) 3582 *partial = lv.ll_tv->vval.v_partial; 3583 } 3584 else 3585 { 3586 if (!skip && !(flags & TFN_QUIET) && (fdp == NULL 3587 || lv.ll_dict == NULL || fdp->fd_newkey == NULL)) 3588 emsg(_(e_funcref)); 3589 else 3590 *pp = end; 3591 name = NULL; 3592 } 3593 goto theend; 3594 } 3595 3596 if (lv.ll_name == NULL) 3597 { 3598 // Error found, but continue after the function name. 3599 *pp = end; 3600 goto theend; 3601 } 3602 3603 // Check if the name is a Funcref. If so, use the value. 3604 if (lv.ll_exp_name != NULL) 3605 { 3606 len = (int)STRLEN(lv.ll_exp_name); 3607 name = deref_func_name(lv.ll_exp_name, &len, partial, type, 3608 flags & TFN_NO_AUTOLOAD); 3609 if (name == lv.ll_exp_name) 3610 name = NULL; 3611 } 3612 else if (!(flags & TFN_NO_DEREF)) 3613 { 3614 len = (int)(end - *pp); 3615 name = deref_func_name(*pp, &len, partial, type, 3616 flags & TFN_NO_AUTOLOAD); 3617 if (name == *pp) 3618 name = NULL; 3619 } 3620 if (name != NULL) 3621 { 3622 name = vim_strsave(name); 3623 *pp = end; 3624 if (STRNCMP(name, "<SNR>", 5) == 0) 3625 { 3626 // Change "<SNR>" to the byte sequence. 3627 name[0] = K_SPECIAL; 3628 name[1] = KS_EXTRA; 3629 name[2] = (int)KE_SNR; 3630 mch_memmove(name + 3, name + 5, STRLEN(name + 5) + 1); 3631 } 3632 goto theend; 3633 } 3634 3635 if (lv.ll_exp_name != NULL) 3636 { 3637 len = (int)STRLEN(lv.ll_exp_name); 3638 if (lead <= 2 && lv.ll_name == lv.ll_exp_name 3639 && STRNCMP(lv.ll_name, "s:", 2) == 0) 3640 { 3641 // When there was "s:" already or the name expanded to get a 3642 // leading "s:" then remove it. 3643 lv.ll_name += 2; 3644 len -= 2; 3645 lead = 2; 3646 } 3647 } 3648 else 3649 { 3650 // skip over "s:" and "g:" 3651 if (lead == 2 || (lv.ll_name[0] == 'g' && lv.ll_name[1] == ':')) 3652 { 3653 if (is_global != NULL && lv.ll_name[0] == 'g') 3654 *is_global = TRUE; 3655 lv.ll_name += 2; 3656 } 3657 len = (int)(end - lv.ll_name); 3658 } 3659 if (len <= 0) 3660 { 3661 if (!skip) 3662 emsg(_(e_function_name)); 3663 goto theend; 3664 } 3665 3666 // In Vim9 script a user function is script-local by default, unless it 3667 // starts with a lower case character: dict.func(). 3668 vim9script = ASCII_ISUPPER(*start) && in_vim9script(); 3669 if (vim9script) 3670 { 3671 char_u *p; 3672 3673 // SomeScript#func() is a global function. 3674 for (p = start; *p != NUL && *p != '('; ++p) 3675 if (*p == AUTOLOAD_CHAR) 3676 vim9script = FALSE; 3677 } 3678 3679 /* 3680 * Copy the function name to allocated memory. 3681 * Accept <SID>name() inside a script, translate into <SNR>123_name(). 3682 * Accept <SNR>123_name() outside a script. 3683 */ 3684 if (skip) 3685 lead = 0; // do nothing 3686 else if (lead > 0 || vim9script) 3687 { 3688 if (!vim9script) 3689 lead = 3; 3690 if (vim9script || (lv.ll_exp_name != NULL 3691 && eval_fname_sid(lv.ll_exp_name)) 3692 || eval_fname_sid(*pp)) 3693 { 3694 // It's script-local, "s:" or "<SID>" 3695 if (current_sctx.sc_sid <= 0) 3696 { 3697 emsg(_(e_usingsid)); 3698 goto theend; 3699 } 3700 sprintf((char *)sid_buf, "%ld_", (long)current_sctx.sc_sid); 3701 if (vim9script) 3702 extra = 3 + (int)STRLEN(sid_buf); 3703 else 3704 lead += (int)STRLEN(sid_buf); 3705 } 3706 } 3707 else if (!(flags & TFN_INT) && (builtin_function(lv.ll_name, len) 3708 || (in_vim9script() && *lv.ll_name == '_'))) 3709 { 3710 semsg(_("E128: Function name must start with a capital or \"s:\": %s"), 3711 start); 3712 goto theend; 3713 } 3714 if (!skip && !(flags & TFN_QUIET) && !(flags & TFN_NO_DEREF)) 3715 { 3716 char_u *cp = vim_strchr(lv.ll_name, ':'); 3717 3718 if (cp != NULL && cp < end) 3719 { 3720 semsg(_("E884: Function name cannot contain a colon: %s"), start); 3721 goto theend; 3722 } 3723 } 3724 3725 name = alloc(len + lead + extra + 1); 3726 if (name != NULL) 3727 { 3728 if (!skip && (lead > 0 || vim9script)) 3729 { 3730 name[0] = K_SPECIAL; 3731 name[1] = KS_EXTRA; 3732 name[2] = (int)KE_SNR; 3733 if (vim9script || lead > 3) // If it's "<SID>" 3734 STRCPY(name + 3, sid_buf); 3735 } 3736 mch_memmove(name + lead + extra, lv.ll_name, (size_t)len); 3737 name[lead + extra + len] = NUL; 3738 } 3739 *pp = end; 3740 3741 theend: 3742 clear_lval(&lv); 3743 return name; 3744 } 3745 3746 /* 3747 * Assuming "name" is the result of trans_function_name() and it was prefixed 3748 * to use the script-local name, return the unmodified name (points into 3749 * "name"). Otherwise return NULL. 3750 * This can be used to first search for a script-local function and fall back 3751 * to the global function if not found. 3752 */ 3753 char_u * 3754 untrans_function_name(char_u *name) 3755 { 3756 char_u *p; 3757 3758 if (*name == K_SPECIAL && in_vim9script()) 3759 { 3760 p = vim_strchr(name, '_'); 3761 if (p != NULL) 3762 return p + 1; 3763 } 3764 return NULL; 3765 } 3766 3767 /* 3768 * List functions. When "regmatch" is NULL all of then. 3769 * Otherwise functions matching "regmatch". 3770 */ 3771 void 3772 list_functions(regmatch_T *regmatch) 3773 { 3774 int changed = func_hashtab.ht_changed; 3775 long_u todo = func_hashtab.ht_used; 3776 hashitem_T *hi; 3777 3778 for (hi = func_hashtab.ht_array; todo > 0 && !got_int; ++hi) 3779 { 3780 if (!HASHITEM_EMPTY(hi)) 3781 { 3782 ufunc_T *fp = HI2UF(hi); 3783 3784 --todo; 3785 if ((fp->uf_flags & FC_DEAD) == 0 3786 && (regmatch == NULL 3787 ? !message_filtered(fp->uf_name) 3788 && !func_name_refcount(fp->uf_name) 3789 : !isdigit(*fp->uf_name) 3790 && vim_regexec(regmatch, fp->uf_name, 0))) 3791 { 3792 list_func_head(fp, FALSE); 3793 if (changed != func_hashtab.ht_changed) 3794 { 3795 emsg(_("E454: function list was modified")); 3796 return; 3797 } 3798 } 3799 } 3800 } 3801 } 3802 3803 /* 3804 * ":function" also supporting nested ":def". 3805 * When "name_arg" is not NULL this is a nested function, using "name_arg" for 3806 * the function name. 3807 * Returns a pointer to the function or NULL if no function defined. 3808 */ 3809 ufunc_T * 3810 define_function(exarg_T *eap, char_u *name_arg) 3811 { 3812 char_u *line_to_free = NULL; 3813 int j; 3814 int c; 3815 int saved_did_emsg; 3816 char_u *name = name_arg; 3817 int is_global = FALSE; 3818 char_u *p; 3819 char_u *arg; 3820 char_u *whitep; 3821 char_u *line_arg = NULL; 3822 garray_T newargs; 3823 garray_T argtypes; 3824 garray_T default_args; 3825 garray_T newlines; 3826 int varargs = FALSE; 3827 int flags = 0; 3828 char_u *ret_type = NULL; 3829 ufunc_T *fp = NULL; 3830 int overwrite = FALSE; 3831 dictitem_T *v; 3832 funcdict_T fudi; 3833 static int func_nr = 0; // number for nameless function 3834 int paren; 3835 hashitem_T *hi; 3836 linenr_T sourcing_lnum_top; 3837 int vim9script = in_vim9script(); 3838 imported_T *import = NULL; 3839 3840 /* 3841 * ":function" without argument: list functions. 3842 */ 3843 if (ends_excmd2(eap->cmd, eap->arg)) 3844 { 3845 if (!eap->skip) 3846 list_functions(NULL); 3847 set_nextcmd(eap, eap->arg); 3848 return NULL; 3849 } 3850 3851 /* 3852 * ":function /pat": list functions matching pattern. 3853 */ 3854 if (*eap->arg == '/') 3855 { 3856 p = skip_regexp(eap->arg + 1, '/', TRUE); 3857 if (!eap->skip) 3858 { 3859 regmatch_T regmatch; 3860 3861 c = *p; 3862 *p = NUL; 3863 regmatch.regprog = vim_regcomp(eap->arg + 1, RE_MAGIC); 3864 *p = c; 3865 if (regmatch.regprog != NULL) 3866 { 3867 regmatch.rm_ic = p_ic; 3868 list_functions(®match); 3869 vim_regfree(regmatch.regprog); 3870 } 3871 } 3872 if (*p == '/') 3873 ++p; 3874 set_nextcmd(eap, p); 3875 return NULL; 3876 } 3877 3878 ga_init(&newargs); 3879 ga_init(&argtypes); 3880 ga_init(&default_args); 3881 3882 /* 3883 * Get the function name. There are these situations: 3884 * func normal function name 3885 * "name" == func, "fudi.fd_dict" == NULL 3886 * dict.func new dictionary entry 3887 * "name" == NULL, "fudi.fd_dict" set, 3888 * "fudi.fd_di" == NULL, "fudi.fd_newkey" == func 3889 * dict.func existing dict entry with a Funcref 3890 * "name" == func, "fudi.fd_dict" set, 3891 * "fudi.fd_di" set, "fudi.fd_newkey" == NULL 3892 * dict.func existing dict entry that's not a Funcref 3893 * "name" == NULL, "fudi.fd_dict" set, 3894 * "fudi.fd_di" set, "fudi.fd_newkey" == NULL 3895 * s:func script-local function name 3896 * g:func global function name, same as "func" 3897 */ 3898 p = eap->arg; 3899 if (name_arg != NULL) 3900 { 3901 // nested function, argument is (args). 3902 paren = TRUE; 3903 CLEAR_FIELD(fudi); 3904 } 3905 else 3906 { 3907 if (STRNCMP(p, "<lambda>", 8) == 0) 3908 { 3909 p += 8; 3910 (void)getdigits(&p); 3911 name = vim_strnsave(eap->arg, p - eap->arg); 3912 CLEAR_FIELD(fudi); 3913 } 3914 else 3915 name = trans_function_name(&p, &is_global, eap->skip, 3916 TFN_NO_AUTOLOAD, &fudi, NULL, NULL); 3917 paren = (vim_strchr(p, '(') != NULL); 3918 if (name == NULL && (fudi.fd_dict == NULL || !paren) && !eap->skip) 3919 { 3920 /* 3921 * Return on an invalid expression in braces, unless the expression 3922 * evaluation has been cancelled due to an aborting error, an 3923 * interrupt, or an exception. 3924 */ 3925 if (!aborting()) 3926 { 3927 if (!eap->skip && fudi.fd_newkey != NULL) 3928 semsg(_(e_dictkey), fudi.fd_newkey); 3929 vim_free(fudi.fd_newkey); 3930 return NULL; 3931 } 3932 else 3933 eap->skip = TRUE; 3934 } 3935 } 3936 3937 // An error in a function call during evaluation of an expression in magic 3938 // braces should not cause the function not to be defined. 3939 saved_did_emsg = did_emsg; 3940 did_emsg = FALSE; 3941 3942 /* 3943 * ":function func" with only function name: list function. 3944 */ 3945 if (!paren) 3946 { 3947 if (!ends_excmd(*skipwhite(p))) 3948 { 3949 semsg(_(e_trailing_arg), p); 3950 goto ret_free; 3951 } 3952 set_nextcmd(eap, p); 3953 if (eap->nextcmd != NULL) 3954 *p = NUL; 3955 if (!eap->skip && !got_int) 3956 { 3957 fp = find_func(name, is_global, NULL); 3958 if (fp == NULL && ASCII_ISUPPER(*eap->arg)) 3959 { 3960 char_u *up = untrans_function_name(name); 3961 3962 // With Vim9 script the name was made script-local, if not 3963 // found try again with the original name. 3964 if (up != NULL) 3965 fp = find_func(up, FALSE, NULL); 3966 } 3967 3968 if (fp != NULL) 3969 { 3970 list_func_head(fp, TRUE); 3971 for (j = 0; j < fp->uf_lines.ga_len && !got_int; ++j) 3972 { 3973 if (FUNCLINE(fp, j) == NULL) 3974 continue; 3975 msg_putchar('\n'); 3976 msg_outnum((long)(j + 1)); 3977 if (j < 9) 3978 msg_putchar(' '); 3979 if (j < 99) 3980 msg_putchar(' '); 3981 msg_prt_line(FUNCLINE(fp, j), FALSE); 3982 out_flush(); // show a line at a time 3983 ui_breakcheck(); 3984 } 3985 if (!got_int) 3986 { 3987 msg_putchar('\n'); 3988 if (fp->uf_def_status != UF_NOT_COMPILED) 3989 msg_puts(" enddef"); 3990 else 3991 msg_puts(" endfunction"); 3992 } 3993 } 3994 else 3995 emsg_funcname(N_("E123: Undefined function: %s"), eap->arg); 3996 } 3997 goto ret_free; 3998 } 3999 4000 /* 4001 * ":function name(arg1, arg2)" Define function. 4002 */ 4003 p = skipwhite(p); 4004 if (*p != '(') 4005 { 4006 if (!eap->skip) 4007 { 4008 semsg(_("E124: Missing '(': %s"), eap->arg); 4009 goto ret_free; 4010 } 4011 // attempt to continue by skipping some text 4012 if (vim_strchr(p, '(') != NULL) 4013 p = vim_strchr(p, '('); 4014 } 4015 4016 if ((vim9script || eap->cmdidx == CMD_def) && VIM_ISWHITE(p[-1])) 4017 { 4018 semsg(_(e_no_white_space_allowed_before_str_str), "(", p - 1); 4019 goto ret_free; 4020 } 4021 4022 // In Vim9 script only global functions can be redefined. 4023 if (vim9script && eap->forceit && !is_global) 4024 { 4025 emsg(_(e_nobang)); 4026 goto ret_free; 4027 } 4028 4029 ga_init2(&newlines, (int)sizeof(char_u *), 10); 4030 4031 if (!eap->skip && name_arg == NULL) 4032 { 4033 // Check the name of the function. Unless it's a dictionary function 4034 // (that we are overwriting). 4035 if (name != NULL) 4036 arg = name; 4037 else 4038 arg = fudi.fd_newkey; 4039 if (arg != NULL && (fudi.fd_di == NULL 4040 || (fudi.fd_di->di_tv.v_type != VAR_FUNC 4041 && fudi.fd_di->di_tv.v_type != VAR_PARTIAL))) 4042 { 4043 if (*arg == K_SPECIAL) 4044 j = 3; 4045 else 4046 j = 0; 4047 while (arg[j] != NUL && (j == 0 ? eval_isnamec1(arg[j]) 4048 : eval_isnamec(arg[j]))) 4049 ++j; 4050 if (arg[j] != NUL) 4051 emsg_funcname((char *)e_invarg2, arg); 4052 } 4053 // Disallow using the g: dict. 4054 if (fudi.fd_dict != NULL && fudi.fd_dict->dv_scope == VAR_DEF_SCOPE) 4055 emsg(_("E862: Cannot use g: here")); 4056 } 4057 4058 // This may get more lines and make the pointers into the first line 4059 // invalid. 4060 ++p; 4061 if (get_function_args(&p, ')', &newargs, 4062 eap->cmdidx == CMD_def ? &argtypes : NULL, FALSE, 4063 NULL, &varargs, &default_args, eap->skip, 4064 eap, &line_to_free) == FAIL) 4065 goto errret_2; 4066 whitep = p; 4067 4068 if (eap->cmdidx == CMD_def) 4069 { 4070 // find the return type: :def Func(): type 4071 if (*skipwhite(p) == ':') 4072 { 4073 if (*p != ':') 4074 { 4075 semsg(_(e_no_white_space_allowed_before_colon_str), p); 4076 p = skipwhite(p); 4077 } 4078 else if (!IS_WHITE_OR_NUL(p[1])) 4079 semsg(_(e_white_space_required_after_str_str), ":", p); 4080 ret_type = skipwhite(p + 1); 4081 p = skip_type(ret_type, FALSE); 4082 if (p > ret_type) 4083 { 4084 ret_type = vim_strnsave(ret_type, p - ret_type); 4085 whitep = p; 4086 p = skipwhite(p); 4087 } 4088 else 4089 { 4090 semsg(_(e_expected_type_str), ret_type); 4091 ret_type = NULL; 4092 } 4093 } 4094 p = skipwhite(p); 4095 } 4096 else 4097 // find extra arguments "range", "dict", "abort" and "closure" 4098 for (;;) 4099 { 4100 whitep = p; 4101 p = skipwhite(p); 4102 if (STRNCMP(p, "range", 5) == 0) 4103 { 4104 flags |= FC_RANGE; 4105 p += 5; 4106 } 4107 else if (STRNCMP(p, "dict", 4) == 0) 4108 { 4109 flags |= FC_DICT; 4110 p += 4; 4111 } 4112 else if (STRNCMP(p, "abort", 5) == 0) 4113 { 4114 flags |= FC_ABORT; 4115 p += 5; 4116 } 4117 else if (STRNCMP(p, "closure", 7) == 0) 4118 { 4119 flags |= FC_CLOSURE; 4120 p += 7; 4121 if (current_funccal == NULL) 4122 { 4123 emsg_funcname(N_("E932: Closure function should not be at top level: %s"), 4124 name == NULL ? (char_u *)"" : name); 4125 goto erret; 4126 } 4127 } 4128 else 4129 break; 4130 } 4131 4132 // When there is a line break use what follows for the function body. 4133 // Makes 'exe "func Test()\n...\nendfunc"' work. 4134 if (*p == '\n') 4135 line_arg = p + 1; 4136 else if (*p != NUL 4137 && !(*p == '"' && (!vim9script || eap->cmdidx == CMD_function) 4138 && eap->cmdidx != CMD_def) 4139 && !(VIM_ISWHITE(*whitep) && *p == '#' 4140 && (vim9script || eap->cmdidx == CMD_def)) 4141 && !eap->skip 4142 && !did_emsg) 4143 semsg(_(e_trailing_arg), p); 4144 4145 /* 4146 * Read the body of the function, until "}", ":endfunction" or ":enddef" is 4147 * found. 4148 */ 4149 if (KeyTyped) 4150 { 4151 // Check if the function already exists, don't let the user type the 4152 // whole function before telling him it doesn't work! For a script we 4153 // need to skip the body to be able to find what follows. 4154 if (!eap->skip && !eap->forceit) 4155 { 4156 if (fudi.fd_dict != NULL && fudi.fd_newkey == NULL) 4157 emsg(_(e_funcdict)); 4158 else if (name != NULL && find_func(name, is_global, NULL) != NULL) 4159 emsg_funcname(e_funcexts, name); 4160 } 4161 4162 if (!eap->skip && did_emsg) 4163 goto erret; 4164 4165 msg_putchar('\n'); // don't overwrite the function name 4166 cmdline_row = msg_row; 4167 } 4168 4169 // Save the starting line number. 4170 sourcing_lnum_top = SOURCING_LNUM; 4171 4172 // Do not define the function when getting the body fails and when 4173 // skipping. 4174 if (get_function_body(eap, &newlines, line_arg, &line_to_free) == FAIL 4175 || eap->skip) 4176 goto erret; 4177 4178 /* 4179 * If there are no errors, add the function 4180 */ 4181 if (fudi.fd_dict == NULL) 4182 { 4183 hashtab_T *ht; 4184 4185 v = find_var(name, &ht, TRUE); 4186 if (v != NULL && v->di_tv.v_type == VAR_FUNC) 4187 { 4188 emsg_funcname(N_("E707: Function name conflicts with variable: %s"), 4189 name); 4190 goto erret; 4191 } 4192 4193 fp = find_func_even_dead(name, is_global, NULL); 4194 if (vim9script) 4195 { 4196 char_u *uname = untrans_function_name(name); 4197 4198 import = find_imported(uname == NULL ? name : uname, 0, NULL); 4199 } 4200 4201 if (fp != NULL || import != NULL) 4202 { 4203 int dead = fp != NULL && (fp->uf_flags & FC_DEAD); 4204 4205 // Function can be replaced with "function!" and when sourcing the 4206 // same script again, but only once. 4207 // A name that is used by an import can not be overruled. 4208 if (import != NULL 4209 || (!dead && !eap->forceit 4210 && (fp->uf_script_ctx.sc_sid != current_sctx.sc_sid 4211 || fp->uf_script_ctx.sc_seq == current_sctx.sc_seq))) 4212 { 4213 if (vim9script) 4214 emsg_funcname(e_name_already_defined_str, name); 4215 else 4216 emsg_funcname(e_funcexts, name); 4217 goto erret; 4218 } 4219 if (fp->uf_calls > 0) 4220 { 4221 emsg_funcname( 4222 N_("E127: Cannot redefine function %s: It is in use"), 4223 name); 4224 goto erret; 4225 } 4226 if (fp->uf_refcount > 1) 4227 { 4228 // This function is referenced somewhere, don't redefine it but 4229 // create a new one. 4230 --fp->uf_refcount; 4231 fp->uf_flags |= FC_REMOVED; 4232 fp = NULL; 4233 overwrite = TRUE; 4234 } 4235 else 4236 { 4237 char_u *exp_name = fp->uf_name_exp; 4238 4239 // redefine existing function, keep the expanded name 4240 VIM_CLEAR(name); 4241 fp->uf_name_exp = NULL; 4242 func_clear_items(fp); 4243 fp->uf_name_exp = exp_name; 4244 fp->uf_flags &= ~FC_DEAD; 4245 #ifdef FEAT_PROFILE 4246 fp->uf_profiling = FALSE; 4247 fp->uf_prof_initialized = FALSE; 4248 #endif 4249 fp->uf_def_status = UF_NOT_COMPILED; 4250 } 4251 } 4252 } 4253 else 4254 { 4255 char numbuf[20]; 4256 4257 fp = NULL; 4258 if (fudi.fd_newkey == NULL && !eap->forceit) 4259 { 4260 emsg(_(e_funcdict)); 4261 goto erret; 4262 } 4263 if (fudi.fd_di == NULL) 4264 { 4265 // Can't add a function to a locked dictionary 4266 if (value_check_lock(fudi.fd_dict->dv_lock, eap->arg, FALSE)) 4267 goto erret; 4268 } 4269 // Can't change an existing function if it is locked 4270 else if (value_check_lock(fudi.fd_di->di_tv.v_lock, eap->arg, FALSE)) 4271 goto erret; 4272 4273 // Give the function a sequential number. Can only be used with a 4274 // Funcref! 4275 vim_free(name); 4276 sprintf(numbuf, "%d", ++func_nr); 4277 name = vim_strsave((char_u *)numbuf); 4278 if (name == NULL) 4279 goto erret; 4280 } 4281 4282 if (fp == NULL) 4283 { 4284 if (fudi.fd_dict == NULL && vim_strchr(name, AUTOLOAD_CHAR) != NULL) 4285 { 4286 int slen, plen; 4287 char_u *scriptname; 4288 4289 // Check that the autoload name matches the script name. 4290 j = FAIL; 4291 if (SOURCING_NAME != NULL) 4292 { 4293 scriptname = autoload_name(name); 4294 if (scriptname != NULL) 4295 { 4296 p = vim_strchr(scriptname, '/'); 4297 plen = (int)STRLEN(p); 4298 slen = (int)STRLEN(SOURCING_NAME); 4299 if (slen > plen && fnamecmp(p, 4300 SOURCING_NAME + slen - plen) == 0) 4301 j = OK; 4302 vim_free(scriptname); 4303 } 4304 } 4305 if (j == FAIL) 4306 { 4307 linenr_T save_lnum = SOURCING_LNUM; 4308 4309 SOURCING_LNUM = sourcing_lnum_top; 4310 semsg(_("E746: Function name does not match script file name: %s"), name); 4311 SOURCING_LNUM = save_lnum; 4312 goto erret; 4313 } 4314 } 4315 4316 fp = alloc_clear(offsetof(ufunc_T, uf_name) + STRLEN(name) + 1); 4317 if (fp == NULL) 4318 goto erret; 4319 4320 if (fudi.fd_dict != NULL) 4321 { 4322 if (fudi.fd_di == NULL) 4323 { 4324 // add new dict entry 4325 fudi.fd_di = dictitem_alloc(fudi.fd_newkey); 4326 if (fudi.fd_di == NULL) 4327 { 4328 vim_free(fp); 4329 fp = NULL; 4330 goto erret; 4331 } 4332 if (dict_add(fudi.fd_dict, fudi.fd_di) == FAIL) 4333 { 4334 vim_free(fudi.fd_di); 4335 vim_free(fp); 4336 fp = NULL; 4337 goto erret; 4338 } 4339 } 4340 else 4341 // overwrite existing dict entry 4342 clear_tv(&fudi.fd_di->di_tv); 4343 fudi.fd_di->di_tv.v_type = VAR_FUNC; 4344 fudi.fd_di->di_tv.vval.v_string = vim_strsave(name); 4345 4346 // behave like "dict" was used 4347 flags |= FC_DICT; 4348 } 4349 4350 // insert the new function in the function list 4351 set_ufunc_name(fp, name); 4352 if (overwrite) 4353 { 4354 hi = hash_find(&func_hashtab, name); 4355 hi->hi_key = UF2HIKEY(fp); 4356 } 4357 else if (hash_add(&func_hashtab, UF2HIKEY(fp)) == FAIL) 4358 { 4359 vim_free(fp); 4360 fp = NULL; 4361 goto erret; 4362 } 4363 fp->uf_refcount = 1; 4364 } 4365 fp->uf_args = newargs; 4366 fp->uf_def_args = default_args; 4367 fp->uf_ret_type = &t_any; 4368 fp->uf_func_type = &t_func_any; 4369 4370 if (eap->cmdidx == CMD_def) 4371 { 4372 int lnum_save = SOURCING_LNUM; 4373 cstack_T *cstack = eap->cstack; 4374 4375 fp->uf_def_status = UF_TO_BE_COMPILED; 4376 4377 // error messages are for the first function line 4378 SOURCING_LNUM = sourcing_lnum_top; 4379 4380 // The function may use script variables from the context. 4381 function_using_block_scopes(fp, cstack); 4382 4383 if (parse_argument_types(fp, &argtypes, varargs) == FAIL) 4384 { 4385 SOURCING_LNUM = lnum_save; 4386 goto errret_2; 4387 } 4388 varargs = FALSE; 4389 4390 // parse the return type, if any 4391 if (parse_return_type(fp, ret_type) == FAIL) 4392 { 4393 SOURCING_LNUM = lnum_save; 4394 goto erret; 4395 } 4396 SOURCING_LNUM = lnum_save; 4397 } 4398 else 4399 fp->uf_def_status = UF_NOT_COMPILED; 4400 4401 fp->uf_lines = newlines; 4402 if ((flags & FC_CLOSURE) != 0) 4403 { 4404 if (register_closure(fp) == FAIL) 4405 goto erret; 4406 } 4407 else 4408 fp->uf_scoped = NULL; 4409 4410 #ifdef FEAT_PROFILE 4411 if (prof_def_func()) 4412 func_do_profile(fp); 4413 #endif 4414 fp->uf_varargs = varargs; 4415 if (sandbox) 4416 flags |= FC_SANDBOX; 4417 if (vim9script && !ASCII_ISUPPER(*fp->uf_name)) 4418 flags |= FC_VIM9; 4419 fp->uf_flags = flags; 4420 fp->uf_calls = 0; 4421 fp->uf_cleared = FALSE; 4422 fp->uf_script_ctx = current_sctx; 4423 fp->uf_script_ctx_version = current_sctx.sc_version; 4424 fp->uf_script_ctx.sc_lnum += sourcing_lnum_top; 4425 if (is_export) 4426 { 4427 fp->uf_flags |= FC_EXPORT; 4428 // let ex_export() know the export worked. 4429 is_export = FALSE; 4430 } 4431 4432 if (eap->cmdidx == CMD_def) 4433 set_function_type(fp); 4434 else if (fp->uf_script_ctx.sc_version == SCRIPT_VERSION_VIM9) 4435 // :func does not use Vim9 script syntax, even in a Vim9 script file 4436 fp->uf_script_ctx.sc_version = SCRIPT_VERSION_MAX; 4437 4438 goto ret_free; 4439 4440 erret: 4441 ga_clear_strings(&newargs); 4442 ga_clear_strings(&default_args); 4443 if (fp != NULL) 4444 { 4445 ga_init(&fp->uf_args); 4446 ga_init(&fp->uf_def_args); 4447 } 4448 errret_2: 4449 ga_clear_strings(&newlines); 4450 if (fp != NULL) 4451 VIM_CLEAR(fp->uf_arg_types); 4452 ret_free: 4453 ga_clear_strings(&argtypes); 4454 vim_free(line_to_free); 4455 vim_free(fudi.fd_newkey); 4456 if (name != name_arg) 4457 vim_free(name); 4458 vim_free(ret_type); 4459 did_emsg |= saved_did_emsg; 4460 4461 return fp; 4462 } 4463 4464 /* 4465 * ":function" 4466 */ 4467 void 4468 ex_function(exarg_T *eap) 4469 { 4470 (void)define_function(eap, NULL); 4471 } 4472 4473 /* 4474 * :defcompile - compile all :def functions in the current script that need to 4475 * be compiled. Except dead functions. Doesn't do profiling. 4476 */ 4477 void 4478 ex_defcompile(exarg_T *eap UNUSED) 4479 { 4480 long todo = (long)func_hashtab.ht_used; 4481 int changed = func_hashtab.ht_changed; 4482 hashitem_T *hi; 4483 ufunc_T *ufunc; 4484 4485 for (hi = func_hashtab.ht_array; todo > 0 && !got_int; ++hi) 4486 { 4487 if (!HASHITEM_EMPTY(hi)) 4488 { 4489 --todo; 4490 ufunc = HI2UF(hi); 4491 if (ufunc->uf_script_ctx.sc_sid == current_sctx.sc_sid 4492 && ufunc->uf_def_status == UF_TO_BE_COMPILED 4493 && (ufunc->uf_flags & FC_DEAD) == 0) 4494 { 4495 (void)compile_def_function(ufunc, FALSE, CT_NONE, NULL); 4496 4497 if (func_hashtab.ht_changed != changed) 4498 { 4499 // a function has been added or removed, need to start over 4500 todo = (long)func_hashtab.ht_used; 4501 changed = func_hashtab.ht_changed; 4502 hi = func_hashtab.ht_array; 4503 --hi; 4504 } 4505 } 4506 } 4507 } 4508 } 4509 4510 /* 4511 * Return 5 if "p" starts with "<SID>" or "<SNR>" (ignoring case). 4512 * Return 2 if "p" starts with "s:". 4513 * Return 0 otherwise. 4514 */ 4515 int 4516 eval_fname_script(char_u *p) 4517 { 4518 // Use MB_STRICMP() because in Turkish comparing the "I" may not work with 4519 // the standard library function. 4520 if (p[0] == '<' && (MB_STRNICMP(p + 1, "SID>", 4) == 0 4521 || MB_STRNICMP(p + 1, "SNR>", 4) == 0)) 4522 return 5; 4523 if (p[0] == 's' && p[1] == ':') 4524 return 2; 4525 return 0; 4526 } 4527 4528 int 4529 translated_function_exists(char_u *name, int is_global) 4530 { 4531 if (builtin_function(name, -1)) 4532 return has_internal_func(name); 4533 return find_func(name, is_global, NULL) != NULL; 4534 } 4535 4536 /* 4537 * Return TRUE when "ufunc" has old-style "..." varargs 4538 * or named varargs "...name: type". 4539 */ 4540 int 4541 has_varargs(ufunc_T *ufunc) 4542 { 4543 return ufunc->uf_varargs || ufunc->uf_va_name != NULL; 4544 } 4545 4546 /* 4547 * Return TRUE if a function "name" exists. 4548 * If "no_defef" is TRUE, do not dereference a Funcref. 4549 */ 4550 int 4551 function_exists(char_u *name, int no_deref) 4552 { 4553 char_u *nm = name; 4554 char_u *p; 4555 int n = FALSE; 4556 int flag; 4557 int is_global = FALSE; 4558 4559 flag = TFN_INT | TFN_QUIET | TFN_NO_AUTOLOAD; 4560 if (no_deref) 4561 flag |= TFN_NO_DEREF; 4562 p = trans_function_name(&nm, &is_global, FALSE, flag, NULL, NULL, NULL); 4563 nm = skipwhite(nm); 4564 4565 // Only accept "funcname", "funcname ", "funcname (..." and 4566 // "funcname(...", not "funcname!...". 4567 if (p != NULL && (*nm == NUL || *nm == '(')) 4568 n = translated_function_exists(p, is_global); 4569 vim_free(p); 4570 return n; 4571 } 4572 4573 #if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3) || defined(PROTO) 4574 char_u * 4575 get_expanded_name(char_u *name, int check) 4576 { 4577 char_u *nm = name; 4578 char_u *p; 4579 int is_global = FALSE; 4580 4581 p = trans_function_name(&nm, &is_global, FALSE, 4582 TFN_INT|TFN_QUIET, NULL, NULL, NULL); 4583 4584 if (p != NULL && *nm == NUL 4585 && (!check || translated_function_exists(p, is_global))) 4586 return p; 4587 4588 vim_free(p); 4589 return NULL; 4590 } 4591 #endif 4592 4593 /* 4594 * Function given to ExpandGeneric() to obtain the list of user defined 4595 * function names. 4596 */ 4597 char_u * 4598 get_user_func_name(expand_T *xp, int idx) 4599 { 4600 static long_u done; 4601 static int changed; 4602 static hashitem_T *hi; 4603 ufunc_T *fp; 4604 4605 if (idx == 0) 4606 { 4607 done = 0; 4608 hi = func_hashtab.ht_array; 4609 changed = func_hashtab.ht_changed; 4610 } 4611 if (changed == func_hashtab.ht_changed && done < func_hashtab.ht_used) 4612 { 4613 if (done++ > 0) 4614 ++hi; 4615 while (HASHITEM_EMPTY(hi)) 4616 ++hi; 4617 fp = HI2UF(hi); 4618 4619 // don't show dead, dict and lambda functions 4620 if ((fp->uf_flags & FC_DEAD) || (fp->uf_flags & FC_DICT) 4621 || STRNCMP(fp->uf_name, "<lambda>", 8) == 0) 4622 return (char_u *)""; 4623 4624 if (STRLEN(fp->uf_name) + 4 >= IOSIZE) 4625 return fp->uf_name; // prevents overflow 4626 4627 cat_func_name(IObuff, fp); 4628 if (xp->xp_context != EXPAND_USER_FUNC 4629 && xp->xp_context != EXPAND_DISASSEMBLE) 4630 { 4631 STRCAT(IObuff, "("); 4632 if (!has_varargs(fp) && fp->uf_args.ga_len == 0) 4633 STRCAT(IObuff, ")"); 4634 } 4635 return IObuff; 4636 } 4637 return NULL; 4638 } 4639 4640 /* 4641 * ":delfunction {name}" 4642 */ 4643 void 4644 ex_delfunction(exarg_T *eap) 4645 { 4646 ufunc_T *fp = NULL; 4647 char_u *p; 4648 char_u *name; 4649 funcdict_T fudi; 4650 int is_global = FALSE; 4651 4652 p = eap->arg; 4653 name = trans_function_name(&p, &is_global, eap->skip, 0, &fudi, 4654 NULL, NULL); 4655 vim_free(fudi.fd_newkey); 4656 if (name == NULL) 4657 { 4658 if (fudi.fd_dict != NULL && !eap->skip) 4659 emsg(_(e_funcref)); 4660 return; 4661 } 4662 if (!ends_excmd(*skipwhite(p))) 4663 { 4664 vim_free(name); 4665 semsg(_(e_trailing_arg), p); 4666 return; 4667 } 4668 set_nextcmd(eap, p); 4669 if (eap->nextcmd != NULL) 4670 *p = NUL; 4671 4672 if (isdigit(*name) && fudi.fd_dict == NULL) 4673 { 4674 if (!eap->skip) 4675 semsg(_(e_invarg2), eap->arg); 4676 vim_free(name); 4677 return; 4678 } 4679 if (!eap->skip) 4680 fp = find_func(name, is_global, NULL); 4681 vim_free(name); 4682 4683 if (!eap->skip) 4684 { 4685 if (fp == NULL) 4686 { 4687 if (!eap->forceit) 4688 semsg(_(e_nofunc), eap->arg); 4689 return; 4690 } 4691 if (fp->uf_calls > 0) 4692 { 4693 semsg(_("E131: Cannot delete function %s: It is in use"), eap->arg); 4694 return; 4695 } 4696 if (fp->uf_flags & FC_VIM9) 4697 { 4698 semsg(_(e_cannot_delete_vim9_script_function_str), eap->arg); 4699 return; 4700 } 4701 4702 if (fudi.fd_dict != NULL) 4703 { 4704 // Delete the dict item that refers to the function, it will 4705 // invoke func_unref() and possibly delete the function. 4706 dictitem_remove(fudi.fd_dict, fudi.fd_di); 4707 } 4708 else 4709 { 4710 // A normal function (not a numbered function or lambda) has a 4711 // refcount of 1 for the entry in the hashtable. When deleting 4712 // it and the refcount is more than one, it should be kept. 4713 // A numbered function and lambda should be kept if the refcount is 4714 // one or more. 4715 if (fp->uf_refcount > (func_name_refcount(fp->uf_name) ? 0 : 1)) 4716 { 4717 // Function is still referenced somewhere. Don't free it but 4718 // do remove it from the hashtable. 4719 if (func_remove(fp)) 4720 fp->uf_refcount--; 4721 } 4722 else 4723 func_clear_free(fp, FALSE); 4724 } 4725 } 4726 } 4727 4728 /* 4729 * Unreference a Function: decrement the reference count and free it when it 4730 * becomes zero. 4731 */ 4732 void 4733 func_unref(char_u *name) 4734 { 4735 ufunc_T *fp = NULL; 4736 4737 if (name == NULL || !func_name_refcount(name)) 4738 return; 4739 fp = find_func(name, FALSE, NULL); 4740 if (fp == NULL && isdigit(*name)) 4741 { 4742 #ifdef EXITFREE 4743 if (!entered_free_all_mem) 4744 #endif 4745 internal_error("func_unref()"); 4746 } 4747 func_ptr_unref(fp); 4748 } 4749 4750 /* 4751 * Unreference a Function: decrement the reference count and free it when it 4752 * becomes zero. 4753 * Also when it becomes one and uf_partial points to the function. 4754 */ 4755 void 4756 func_ptr_unref(ufunc_T *fp) 4757 { 4758 if (fp != NULL && (--fp->uf_refcount <= 0 4759 || (fp->uf_refcount == 1 && fp->uf_partial != NULL 4760 && fp->uf_partial->pt_refcount <= 1 4761 && fp->uf_partial->pt_func == fp))) 4762 { 4763 // Only delete it when it's not being used. Otherwise it's done 4764 // when "uf_calls" becomes zero. 4765 if (fp->uf_calls == 0) 4766 func_clear_free(fp, FALSE); 4767 } 4768 } 4769 4770 /* 4771 * Count a reference to a Function. 4772 */ 4773 void 4774 func_ref(char_u *name) 4775 { 4776 ufunc_T *fp; 4777 4778 if (name == NULL || !func_name_refcount(name)) 4779 return; 4780 fp = find_func(name, FALSE, NULL); 4781 if (fp != NULL) 4782 ++fp->uf_refcount; 4783 else if (isdigit(*name)) 4784 // Only give an error for a numbered function. 4785 // Fail silently, when named or lambda function isn't found. 4786 internal_error("func_ref()"); 4787 } 4788 4789 /* 4790 * Count a reference to a Function. 4791 */ 4792 void 4793 func_ptr_ref(ufunc_T *fp) 4794 { 4795 if (fp != NULL) 4796 ++fp->uf_refcount; 4797 } 4798 4799 /* 4800 * Return TRUE if items in "fc" do not have "copyID". That means they are not 4801 * referenced from anywhere that is in use. 4802 */ 4803 static int 4804 can_free_funccal(funccall_T *fc, int copyID) 4805 { 4806 return (fc->l_varlist.lv_copyID != copyID 4807 && fc->l_vars.dv_copyID != copyID 4808 && fc->l_avars.dv_copyID != copyID 4809 && fc->fc_copyID != copyID); 4810 } 4811 4812 /* 4813 * ":return [expr]" 4814 */ 4815 void 4816 ex_return(exarg_T *eap) 4817 { 4818 char_u *arg = eap->arg; 4819 typval_T rettv; 4820 int returning = FALSE; 4821 evalarg_T evalarg; 4822 4823 if (current_funccal == NULL) 4824 { 4825 emsg(_("E133: :return not inside a function")); 4826 return; 4827 } 4828 4829 CLEAR_FIELD(evalarg); 4830 evalarg.eval_flags = eap->skip ? 0 : EVAL_EVALUATE; 4831 4832 if (eap->skip) 4833 ++emsg_skip; 4834 4835 eap->nextcmd = NULL; 4836 if ((*arg != NUL && *arg != '|' && *arg != '\n') 4837 && eval0(arg, &rettv, eap, &evalarg) != FAIL) 4838 { 4839 if (!eap->skip) 4840 returning = do_return(eap, FALSE, TRUE, &rettv); 4841 else 4842 clear_tv(&rettv); 4843 } 4844 // It's safer to return also on error. 4845 else if (!eap->skip) 4846 { 4847 // In return statement, cause_abort should be force_abort. 4848 update_force_abort(); 4849 4850 /* 4851 * Return unless the expression evaluation has been cancelled due to an 4852 * aborting error, an interrupt, or an exception. 4853 */ 4854 if (!aborting()) 4855 returning = do_return(eap, FALSE, TRUE, NULL); 4856 } 4857 4858 // When skipping or the return gets pending, advance to the next command 4859 // in this line (!returning). Otherwise, ignore the rest of the line. 4860 // Following lines will be ignored by get_func_line(). 4861 if (returning) 4862 eap->nextcmd = NULL; 4863 else if (eap->nextcmd == NULL) // no argument 4864 set_nextcmd(eap, arg); 4865 4866 if (eap->skip) 4867 --emsg_skip; 4868 clear_evalarg(&evalarg, eap); 4869 } 4870 4871 /* 4872 * ":1,25call func(arg1, arg2)" function call. 4873 */ 4874 void 4875 ex_call(exarg_T *eap) 4876 { 4877 char_u *arg = eap->arg; 4878 char_u *startarg; 4879 char_u *name; 4880 char_u *tofree; 4881 int len; 4882 typval_T rettv; 4883 linenr_T lnum; 4884 int doesrange; 4885 int failed = FALSE; 4886 funcdict_T fudi; 4887 partial_T *partial = NULL; 4888 evalarg_T evalarg; 4889 type_T *type = NULL; 4890 4891 fill_evalarg_from_eap(&evalarg, eap, eap->skip); 4892 if (eap->skip) 4893 { 4894 // trans_function_name() doesn't work well when skipping, use eval0() 4895 // instead to skip to any following command, e.g. for: 4896 // :if 0 | call dict.foo().bar() | endif 4897 ++emsg_skip; 4898 if (eval0(eap->arg, &rettv, eap, &evalarg) != FAIL) 4899 clear_tv(&rettv); 4900 --emsg_skip; 4901 clear_evalarg(&evalarg, eap); 4902 return; 4903 } 4904 4905 tofree = trans_function_name(&arg, NULL, eap->skip, TFN_INT, 4906 &fudi, &partial, in_vim9script() ? &type : NULL); 4907 if (fudi.fd_newkey != NULL) 4908 { 4909 // Still need to give an error message for missing key. 4910 semsg(_(e_dictkey), fudi.fd_newkey); 4911 vim_free(fudi.fd_newkey); 4912 } 4913 if (tofree == NULL) 4914 return; 4915 4916 // Increase refcount on dictionary, it could get deleted when evaluating 4917 // the arguments. 4918 if (fudi.fd_dict != NULL) 4919 ++fudi.fd_dict->dv_refcount; 4920 4921 // If it is the name of a variable of type VAR_FUNC or VAR_PARTIAL use its 4922 // contents. For VAR_PARTIAL get its partial, unless we already have one 4923 // from trans_function_name(). 4924 len = (int)STRLEN(tofree); 4925 name = deref_func_name(tofree, &len, partial != NULL ? NULL : &partial, 4926 in_vim9script() && type == NULL ? &type : NULL, FALSE); 4927 4928 // Skip white space to allow ":call func ()". Not good, but required for 4929 // backward compatibility. 4930 startarg = skipwhite(arg); 4931 if (*startarg != '(') 4932 { 4933 semsg(_(e_missing_paren), eap->arg); 4934 goto end; 4935 } 4936 if (in_vim9script() && startarg > arg) 4937 { 4938 semsg(_(e_no_white_space_allowed_before_str_str), "(", eap->arg); 4939 goto end; 4940 } 4941 4942 /* 4943 * When skipping, evaluate the function once, to find the end of the 4944 * arguments. 4945 * When the function takes a range, this is discovered after the first 4946 * call, and the loop is broken. 4947 */ 4948 if (eap->skip) 4949 { 4950 ++emsg_skip; 4951 lnum = eap->line2; // do it once, also with an invalid range 4952 } 4953 else 4954 lnum = eap->line1; 4955 for ( ; lnum <= eap->line2; ++lnum) 4956 { 4957 funcexe_T funcexe; 4958 4959 if (!eap->skip && eap->addr_count > 0) 4960 { 4961 if (lnum > curbuf->b_ml.ml_line_count) 4962 { 4963 // If the function deleted lines or switched to another buffer 4964 // the line number may become invalid. 4965 emsg(_(e_invalid_range)); 4966 break; 4967 } 4968 curwin->w_cursor.lnum = lnum; 4969 curwin->w_cursor.col = 0; 4970 curwin->w_cursor.coladd = 0; 4971 } 4972 arg = startarg; 4973 4974 CLEAR_FIELD(funcexe); 4975 funcexe.firstline = eap->line1; 4976 funcexe.lastline = eap->line2; 4977 funcexe.doesrange = &doesrange; 4978 funcexe.evaluate = !eap->skip; 4979 funcexe.partial = partial; 4980 funcexe.selfdict = fudi.fd_dict; 4981 funcexe.check_type = type; 4982 rettv.v_type = VAR_UNKNOWN; // clear_tv() uses this 4983 if (get_func_tv(name, -1, &rettv, &arg, &evalarg, &funcexe) == FAIL) 4984 { 4985 failed = TRUE; 4986 break; 4987 } 4988 if (has_watchexpr()) 4989 dbg_check_breakpoint(eap); 4990 4991 // Handle a function returning a Funcref, Dictionary or List. 4992 if (handle_subscript(&arg, &rettv, 4993 eap->skip ? NULL : &EVALARG_EVALUATE, TRUE) == FAIL) 4994 { 4995 failed = TRUE; 4996 break; 4997 } 4998 4999 clear_tv(&rettv); 5000 if (doesrange || eap->skip) 5001 break; 5002 5003 // Stop when immediately aborting on error, or when an interrupt 5004 // occurred or an exception was thrown but not caught. 5005 // get_func_tv() returned OK, so that the check for trailing 5006 // characters below is executed. 5007 if (aborting()) 5008 break; 5009 } 5010 if (eap->skip) 5011 --emsg_skip; 5012 clear_evalarg(&evalarg, eap); 5013 5014 // When inside :try we need to check for following "| catch" or "| endtry". 5015 // Not when there was an error, but do check if an exception was thrown. 5016 if ((!aborting() || did_throw) 5017 && (!failed || eap->cstack->cs_trylevel > 0)) 5018 { 5019 // Check for trailing illegal characters and a following command. 5020 arg = skipwhite(arg); 5021 if (!ends_excmd2(eap->arg, arg)) 5022 { 5023 if (!failed && !aborting()) 5024 { 5025 emsg_severe = TRUE; 5026 semsg(_(e_trailing_arg), arg); 5027 } 5028 } 5029 else 5030 set_nextcmd(eap, arg); 5031 } 5032 5033 end: 5034 dict_unref(fudi.fd_dict); 5035 vim_free(tofree); 5036 } 5037 5038 /* 5039 * Return from a function. Possibly makes the return pending. Also called 5040 * for a pending return at the ":endtry" or after returning from an extra 5041 * do_cmdline(). "reanimate" is used in the latter case. "is_cmd" is set 5042 * when called due to a ":return" command. "rettv" may point to a typval_T 5043 * with the return rettv. Returns TRUE when the return can be carried out, 5044 * FALSE when the return gets pending. 5045 */ 5046 int 5047 do_return( 5048 exarg_T *eap, 5049 int reanimate, 5050 int is_cmd, 5051 void *rettv) 5052 { 5053 int idx; 5054 cstack_T *cstack = eap->cstack; 5055 5056 if (reanimate) 5057 // Undo the return. 5058 current_funccal->returned = FALSE; 5059 5060 /* 5061 * Cleanup (and inactivate) conditionals, but stop when a try conditional 5062 * not in its finally clause (which then is to be executed next) is found. 5063 * In this case, make the ":return" pending for execution at the ":endtry". 5064 * Otherwise, return normally. 5065 */ 5066 idx = cleanup_conditionals(eap->cstack, 0, TRUE); 5067 if (idx >= 0) 5068 { 5069 cstack->cs_pending[idx] = CSTP_RETURN; 5070 5071 if (!is_cmd && !reanimate) 5072 // A pending return again gets pending. "rettv" points to an 5073 // allocated variable with the rettv of the original ":return"'s 5074 // argument if present or is NULL else. 5075 cstack->cs_rettv[idx] = rettv; 5076 else 5077 { 5078 // When undoing a return in order to make it pending, get the stored 5079 // return rettv. 5080 if (reanimate) 5081 rettv = current_funccal->rettv; 5082 5083 if (rettv != NULL) 5084 { 5085 // Store the value of the pending return. 5086 if ((cstack->cs_rettv[idx] = alloc_tv()) != NULL) 5087 *(typval_T *)cstack->cs_rettv[idx] = *(typval_T *)rettv; 5088 else 5089 emsg(_(e_out_of_memory)); 5090 } 5091 else 5092 cstack->cs_rettv[idx] = NULL; 5093 5094 if (reanimate) 5095 { 5096 // The pending return value could be overwritten by a ":return" 5097 // without argument in a finally clause; reset the default 5098 // return value. 5099 current_funccal->rettv->v_type = VAR_NUMBER; 5100 current_funccal->rettv->vval.v_number = 0; 5101 } 5102 } 5103 report_make_pending(CSTP_RETURN, rettv); 5104 } 5105 else 5106 { 5107 current_funccal->returned = TRUE; 5108 5109 // If the return is carried out now, store the return value. For 5110 // a return immediately after reanimation, the value is already 5111 // there. 5112 if (!reanimate && rettv != NULL) 5113 { 5114 clear_tv(current_funccal->rettv); 5115 *current_funccal->rettv = *(typval_T *)rettv; 5116 if (!is_cmd) 5117 vim_free(rettv); 5118 } 5119 } 5120 5121 return idx < 0; 5122 } 5123 5124 /* 5125 * Free the variable with a pending return value. 5126 */ 5127 void 5128 discard_pending_return(void *rettv) 5129 { 5130 free_tv((typval_T *)rettv); 5131 } 5132 5133 /* 5134 * Generate a return command for producing the value of "rettv". The result 5135 * is an allocated string. Used by report_pending() for verbose messages. 5136 */ 5137 char_u * 5138 get_return_cmd(void *rettv) 5139 { 5140 char_u *s = NULL; 5141 char_u *tofree = NULL; 5142 char_u numbuf[NUMBUFLEN]; 5143 5144 if (rettv != NULL) 5145 s = echo_string((typval_T *)rettv, &tofree, numbuf, 0); 5146 if (s == NULL) 5147 s = (char_u *)""; 5148 5149 STRCPY(IObuff, ":return "); 5150 STRNCPY(IObuff + 8, s, IOSIZE - 8); 5151 if (STRLEN(s) + 8 >= IOSIZE) 5152 STRCPY(IObuff + IOSIZE - 4, "..."); 5153 vim_free(tofree); 5154 return vim_strsave(IObuff); 5155 } 5156 5157 /* 5158 * Get next function line. 5159 * Called by do_cmdline() to get the next line. 5160 * Returns allocated string, or NULL for end of function. 5161 */ 5162 char_u * 5163 get_func_line( 5164 int c UNUSED, 5165 void *cookie, 5166 int indent UNUSED, 5167 getline_opt_T options UNUSED) 5168 { 5169 funccall_T *fcp = (funccall_T *)cookie; 5170 ufunc_T *fp = fcp->func; 5171 char_u *retval; 5172 garray_T *gap; // growarray with function lines 5173 5174 // If breakpoints have been added/deleted need to check for it. 5175 if (fcp->dbg_tick != debug_tick) 5176 { 5177 fcp->breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, 5178 SOURCING_LNUM); 5179 fcp->dbg_tick = debug_tick; 5180 } 5181 #ifdef FEAT_PROFILE 5182 if (do_profiling == PROF_YES) 5183 func_line_end(cookie); 5184 #endif 5185 5186 gap = &fp->uf_lines; 5187 if (((fp->uf_flags & FC_ABORT) && did_emsg && !aborted_in_try()) 5188 || fcp->returned) 5189 retval = NULL; 5190 else 5191 { 5192 // Skip NULL lines (continuation lines). 5193 while (fcp->linenr < gap->ga_len 5194 && ((char_u **)(gap->ga_data))[fcp->linenr] == NULL) 5195 ++fcp->linenr; 5196 if (fcp->linenr >= gap->ga_len) 5197 retval = NULL; 5198 else 5199 { 5200 retval = vim_strsave(((char_u **)(gap->ga_data))[fcp->linenr++]); 5201 SOURCING_LNUM = fcp->linenr; 5202 #ifdef FEAT_PROFILE 5203 if (do_profiling == PROF_YES) 5204 func_line_start(cookie, SOURCING_LNUM); 5205 #endif 5206 } 5207 } 5208 5209 // Did we encounter a breakpoint? 5210 if (fcp->breakpoint != 0 && fcp->breakpoint <= SOURCING_LNUM) 5211 { 5212 dbg_breakpoint(fp->uf_name, SOURCING_LNUM); 5213 // Find next breakpoint. 5214 fcp->breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, 5215 SOURCING_LNUM); 5216 fcp->dbg_tick = debug_tick; 5217 } 5218 5219 return retval; 5220 } 5221 5222 /* 5223 * Return TRUE if the currently active function should be ended, because a 5224 * return was encountered or an error occurred. Used inside a ":while". 5225 */ 5226 int 5227 func_has_ended(void *cookie) 5228 { 5229 funccall_T *fcp = (funccall_T *)cookie; 5230 5231 // Ignore the "abort" flag if the abortion behavior has been changed due to 5232 // an error inside a try conditional. 5233 return (((fcp->func->uf_flags & FC_ABORT) && did_emsg && !aborted_in_try()) 5234 || fcp->returned); 5235 } 5236 5237 /* 5238 * return TRUE if cookie indicates a function which "abort"s on errors. 5239 */ 5240 int 5241 func_has_abort( 5242 void *cookie) 5243 { 5244 return ((funccall_T *)cookie)->func->uf_flags & FC_ABORT; 5245 } 5246 5247 5248 /* 5249 * Turn "dict.Func" into a partial for "Func" bound to "dict". 5250 * Don't do this when "Func" is already a partial that was bound 5251 * explicitly (pt_auto is FALSE). 5252 * Changes "rettv" in-place. 5253 * Returns the updated "selfdict_in". 5254 */ 5255 dict_T * 5256 make_partial(dict_T *selfdict_in, typval_T *rettv) 5257 { 5258 char_u *fname; 5259 char_u *tofree = NULL; 5260 ufunc_T *fp; 5261 char_u fname_buf[FLEN_FIXED + 1]; 5262 int error; 5263 dict_T *selfdict = selfdict_in; 5264 5265 if (rettv->v_type == VAR_PARTIAL && rettv->vval.v_partial->pt_func != NULL) 5266 fp = rettv->vval.v_partial->pt_func; 5267 else 5268 { 5269 fname = rettv->v_type == VAR_FUNC ? rettv->vval.v_string 5270 : rettv->vval.v_partial->pt_name; 5271 // Translate "s:func" to the stored function name. 5272 fname = fname_trans_sid(fname, fname_buf, &tofree, &error); 5273 fp = find_func(fname, FALSE, NULL); 5274 vim_free(tofree); 5275 } 5276 5277 if (fp != NULL && (fp->uf_flags & FC_DICT)) 5278 { 5279 partial_T *pt = ALLOC_CLEAR_ONE(partial_T); 5280 5281 if (pt != NULL) 5282 { 5283 pt->pt_refcount = 1; 5284 pt->pt_dict = selfdict; 5285 pt->pt_auto = TRUE; 5286 selfdict = NULL; 5287 if (rettv->v_type == VAR_FUNC) 5288 { 5289 // Just a function: Take over the function name and use 5290 // selfdict. 5291 pt->pt_name = rettv->vval.v_string; 5292 } 5293 else 5294 { 5295 partial_T *ret_pt = rettv->vval.v_partial; 5296 int i; 5297 5298 // Partial: copy the function name, use selfdict and copy 5299 // args. Can't take over name or args, the partial might 5300 // be referenced elsewhere. 5301 if (ret_pt->pt_name != NULL) 5302 { 5303 pt->pt_name = vim_strsave(ret_pt->pt_name); 5304 func_ref(pt->pt_name); 5305 } 5306 else 5307 { 5308 pt->pt_func = ret_pt->pt_func; 5309 func_ptr_ref(pt->pt_func); 5310 } 5311 if (ret_pt->pt_argc > 0) 5312 { 5313 pt->pt_argv = ALLOC_MULT(typval_T, ret_pt->pt_argc); 5314 if (pt->pt_argv == NULL) 5315 // out of memory: drop the arguments 5316 pt->pt_argc = 0; 5317 else 5318 { 5319 pt->pt_argc = ret_pt->pt_argc; 5320 for (i = 0; i < pt->pt_argc; i++) 5321 copy_tv(&ret_pt->pt_argv[i], &pt->pt_argv[i]); 5322 } 5323 } 5324 partial_unref(ret_pt); 5325 } 5326 rettv->v_type = VAR_PARTIAL; 5327 rettv->vval.v_partial = pt; 5328 } 5329 } 5330 return selfdict; 5331 } 5332 5333 /* 5334 * Return the name of the executed function. 5335 */ 5336 char_u * 5337 func_name(void *cookie) 5338 { 5339 return ((funccall_T *)cookie)->func->uf_name; 5340 } 5341 5342 /* 5343 * Return the address holding the next breakpoint line for a funccall cookie. 5344 */ 5345 linenr_T * 5346 func_breakpoint(void *cookie) 5347 { 5348 return &((funccall_T *)cookie)->breakpoint; 5349 } 5350 5351 /* 5352 * Return the address holding the debug tick for a funccall cookie. 5353 */ 5354 int * 5355 func_dbg_tick(void *cookie) 5356 { 5357 return &((funccall_T *)cookie)->dbg_tick; 5358 } 5359 5360 /* 5361 * Return the nesting level for a funccall cookie. 5362 */ 5363 int 5364 func_level(void *cookie) 5365 { 5366 return ((funccall_T *)cookie)->level; 5367 } 5368 5369 /* 5370 * Return TRUE when a function was ended by a ":return" command. 5371 */ 5372 int 5373 current_func_returned(void) 5374 { 5375 return current_funccal->returned; 5376 } 5377 5378 int 5379 free_unref_funccal(int copyID, int testing) 5380 { 5381 int did_free = FALSE; 5382 int did_free_funccal = FALSE; 5383 funccall_T *fc, **pfc; 5384 5385 for (pfc = &previous_funccal; *pfc != NULL; ) 5386 { 5387 if (can_free_funccal(*pfc, copyID)) 5388 { 5389 fc = *pfc; 5390 *pfc = fc->caller; 5391 free_funccal_contents(fc); 5392 did_free = TRUE; 5393 did_free_funccal = TRUE; 5394 } 5395 else 5396 pfc = &(*pfc)->caller; 5397 } 5398 if (did_free_funccal) 5399 // When a funccal was freed some more items might be garbage 5400 // collected, so run again. 5401 (void)garbage_collect(testing); 5402 5403 return did_free; 5404 } 5405 5406 /* 5407 * Get function call environment based on backtrace debug level 5408 */ 5409 static funccall_T * 5410 get_funccal(void) 5411 { 5412 int i; 5413 funccall_T *funccal; 5414 funccall_T *temp_funccal; 5415 5416 funccal = current_funccal; 5417 if (debug_backtrace_level > 0) 5418 { 5419 for (i = 0; i < debug_backtrace_level; i++) 5420 { 5421 temp_funccal = funccal->caller; 5422 if (temp_funccal) 5423 funccal = temp_funccal; 5424 else 5425 // backtrace level overflow. reset to max 5426 debug_backtrace_level = i; 5427 } 5428 } 5429 return funccal; 5430 } 5431 5432 /* 5433 * Return the hashtable used for local variables in the current funccal. 5434 * Return NULL if there is no current funccal. 5435 */ 5436 hashtab_T * 5437 get_funccal_local_ht() 5438 { 5439 if (current_funccal == NULL || current_funccal->l_vars.dv_refcount == 0) 5440 return NULL; 5441 return &get_funccal()->l_vars.dv_hashtab; 5442 } 5443 5444 /* 5445 * Return the l: scope variable. 5446 * Return NULL if there is no current funccal. 5447 */ 5448 dictitem_T * 5449 get_funccal_local_var() 5450 { 5451 if (current_funccal == NULL || current_funccal->l_vars.dv_refcount == 0) 5452 return NULL; 5453 return &get_funccal()->l_vars_var; 5454 } 5455 5456 /* 5457 * Return the hashtable used for argument in the current funccal. 5458 * Return NULL if there is no current funccal. 5459 */ 5460 hashtab_T * 5461 get_funccal_args_ht() 5462 { 5463 if (current_funccal == NULL || current_funccal->l_vars.dv_refcount == 0) 5464 return NULL; 5465 return &get_funccal()->l_avars.dv_hashtab; 5466 } 5467 5468 /* 5469 * Return the a: scope variable. 5470 * Return NULL if there is no current funccal. 5471 */ 5472 dictitem_T * 5473 get_funccal_args_var() 5474 { 5475 if (current_funccal == NULL || current_funccal->l_vars.dv_refcount == 0) 5476 return NULL; 5477 return &get_funccal()->l_avars_var; 5478 } 5479 5480 /* 5481 * List function variables, if there is a function. 5482 */ 5483 void 5484 list_func_vars(int *first) 5485 { 5486 if (current_funccal != NULL && current_funccal->l_vars.dv_refcount > 0) 5487 list_hashtable_vars(¤t_funccal->l_vars.dv_hashtab, 5488 "l:", FALSE, first); 5489 } 5490 5491 /* 5492 * If "ht" is the hashtable for local variables in the current funccal, return 5493 * the dict that contains it. 5494 * Otherwise return NULL. 5495 */ 5496 dict_T * 5497 get_current_funccal_dict(hashtab_T *ht) 5498 { 5499 if (current_funccal != NULL 5500 && ht == ¤t_funccal->l_vars.dv_hashtab) 5501 return ¤t_funccal->l_vars; 5502 return NULL; 5503 } 5504 5505 /* 5506 * Search hashitem in parent scope. 5507 */ 5508 hashitem_T * 5509 find_hi_in_scoped_ht(char_u *name, hashtab_T **pht) 5510 { 5511 funccall_T *old_current_funccal = current_funccal; 5512 hashtab_T *ht; 5513 hashitem_T *hi = NULL; 5514 char_u *varname; 5515 5516 if (current_funccal == NULL || current_funccal->func->uf_scoped == NULL) 5517 return NULL; 5518 5519 // Search in parent scope, which can be referenced from a lambda. 5520 current_funccal = current_funccal->func->uf_scoped; 5521 while (current_funccal != NULL) 5522 { 5523 ht = find_var_ht(name, &varname); 5524 if (ht != NULL && *varname != NUL) 5525 { 5526 hi = hash_find(ht, varname); 5527 if (!HASHITEM_EMPTY(hi)) 5528 { 5529 *pht = ht; 5530 break; 5531 } 5532 } 5533 if (current_funccal == current_funccal->func->uf_scoped) 5534 break; 5535 current_funccal = current_funccal->func->uf_scoped; 5536 } 5537 current_funccal = old_current_funccal; 5538 5539 return hi; 5540 } 5541 5542 /* 5543 * Search variable in parent scope. 5544 */ 5545 dictitem_T * 5546 find_var_in_scoped_ht(char_u *name, int no_autoload) 5547 { 5548 dictitem_T *v = NULL; 5549 funccall_T *old_current_funccal = current_funccal; 5550 hashtab_T *ht; 5551 char_u *varname; 5552 5553 if (current_funccal == NULL || current_funccal->func->uf_scoped == NULL) 5554 return NULL; 5555 5556 // Search in parent scope which is possible to reference from lambda 5557 current_funccal = current_funccal->func->uf_scoped; 5558 while (current_funccal) 5559 { 5560 ht = find_var_ht(name, &varname); 5561 if (ht != NULL && *varname != NUL) 5562 { 5563 v = find_var_in_ht(ht, *name, varname, no_autoload); 5564 if (v != NULL) 5565 break; 5566 } 5567 if (current_funccal == current_funccal->func->uf_scoped) 5568 break; 5569 current_funccal = current_funccal->func->uf_scoped; 5570 } 5571 current_funccal = old_current_funccal; 5572 5573 return v; 5574 } 5575 5576 /* 5577 * Set "copyID + 1" in previous_funccal and callers. 5578 */ 5579 int 5580 set_ref_in_previous_funccal(int copyID) 5581 { 5582 funccall_T *fc; 5583 5584 for (fc = previous_funccal; fc != NULL; fc = fc->caller) 5585 { 5586 fc->fc_copyID = copyID + 1; 5587 if (set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID + 1, NULL) 5588 || set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID + 1, NULL) 5589 || set_ref_in_list_items(&fc->l_varlist, copyID + 1, NULL)) 5590 return TRUE; 5591 } 5592 return FALSE; 5593 } 5594 5595 static int 5596 set_ref_in_funccal(funccall_T *fc, int copyID) 5597 { 5598 if (fc->fc_copyID != copyID) 5599 { 5600 fc->fc_copyID = copyID; 5601 if (set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID, NULL) 5602 || set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID, NULL) 5603 || set_ref_in_list_items(&fc->l_varlist, copyID, NULL) 5604 || set_ref_in_func(NULL, fc->func, copyID)) 5605 return TRUE; 5606 } 5607 return FALSE; 5608 } 5609 5610 /* 5611 * Set "copyID" in all local vars and arguments in the call stack. 5612 */ 5613 int 5614 set_ref_in_call_stack(int copyID) 5615 { 5616 funccall_T *fc; 5617 funccal_entry_T *entry; 5618 5619 for (fc = current_funccal; fc != NULL; fc = fc->caller) 5620 if (set_ref_in_funccal(fc, copyID)) 5621 return TRUE; 5622 5623 // Also go through the funccal_stack. 5624 for (entry = funccal_stack; entry != NULL; entry = entry->next) 5625 for (fc = entry->top_funccal; fc != NULL; fc = fc->caller) 5626 if (set_ref_in_funccal(fc, copyID)) 5627 return TRUE; 5628 return FALSE; 5629 } 5630 5631 /* 5632 * Set "copyID" in all functions available by name. 5633 */ 5634 int 5635 set_ref_in_functions(int copyID) 5636 { 5637 int todo; 5638 hashitem_T *hi = NULL; 5639 ufunc_T *fp; 5640 5641 todo = (int)func_hashtab.ht_used; 5642 for (hi = func_hashtab.ht_array; todo > 0 && !got_int; ++hi) 5643 { 5644 if (!HASHITEM_EMPTY(hi)) 5645 { 5646 --todo; 5647 fp = HI2UF(hi); 5648 if (!func_name_refcount(fp->uf_name) 5649 && set_ref_in_func(NULL, fp, copyID)) 5650 return TRUE; 5651 } 5652 } 5653 return FALSE; 5654 } 5655 5656 /* 5657 * Set "copyID" in all function arguments. 5658 */ 5659 int 5660 set_ref_in_func_args(int copyID) 5661 { 5662 int i; 5663 5664 for (i = 0; i < funcargs.ga_len; ++i) 5665 if (set_ref_in_item(((typval_T **)funcargs.ga_data)[i], 5666 copyID, NULL, NULL)) 5667 return TRUE; 5668 return FALSE; 5669 } 5670 5671 /* 5672 * Mark all lists and dicts referenced through function "name" with "copyID". 5673 * Returns TRUE if setting references failed somehow. 5674 */ 5675 int 5676 set_ref_in_func(char_u *name, ufunc_T *fp_in, int copyID) 5677 { 5678 ufunc_T *fp = fp_in; 5679 funccall_T *fc; 5680 int error = FCERR_NONE; 5681 char_u fname_buf[FLEN_FIXED + 1]; 5682 char_u *tofree = NULL; 5683 char_u *fname; 5684 int abort = FALSE; 5685 5686 if (name == NULL && fp_in == NULL) 5687 return FALSE; 5688 5689 if (fp_in == NULL) 5690 { 5691 fname = fname_trans_sid(name, fname_buf, &tofree, &error); 5692 fp = find_func(fname, FALSE, NULL); 5693 } 5694 if (fp != NULL) 5695 { 5696 for (fc = fp->uf_scoped; fc != NULL; fc = fc->func->uf_scoped) 5697 abort = abort || set_ref_in_funccal(fc, copyID); 5698 } 5699 5700 vim_free(tofree); 5701 return abort; 5702 } 5703 5704 #endif // FEAT_EVAL 5705