comparison src/eval.c @ 28690:9a7a2908e1a8 v8.2.4869

patch 8.2.4869: expression in command block does not look after NL Commit: https://github.com/vim/vim/commit/e442d59f6d6732c226d636067c07b7342838b36b Author: Bram Moolenaar <Bram@vim.org> Date: Thu May 5 12:20:28 2022 +0100 patch 8.2.4869: expression in command block does not look after NL Problem: Expression in command block does not look after NL. Solution: Skip over NL to check what follows. (closes https://github.com/vim/vim/issues/10358)
author Bram Moolenaar <Bram@vim.org>
date Thu, 05 May 2022 13:30:05 +0200
parents a2cf17d0d5da
children 723c7d940cba
comparison
equal deleted inserted replaced
28689:0c6c580c01b4 28690:9a7a2908e1a8
1801 { 1801 {
1802 forinfo_T *fi = (forinfo_T *)fi_void; 1802 forinfo_T *fi = (forinfo_T *)fi_void;
1803 int i; 1803 int i;
1804 1804
1805 for (i = 0; i < fi->fi_break_count; ++i) 1805 for (i = 0; i < fi->fi_break_count; ++i)
1806 eval_next_line(evalarg); 1806 eval_next_line(NULL, evalarg);
1807 } 1807 }
1808 1808
1809 /* 1809 /*
1810 * Use the first item in a ":for" list. Advance to the next. 1810 * Use the first item in a ":for" list. Advance to the next.
1811 * Assign the values to the variable (list). "arg" points to the first one. 1811 * Assign the values to the variable (list). "arg" points to the first one.
2151 if (next == NULL) 2151 if (next == NULL)
2152 break; 2152 break;
2153 p = skipwhite(next); 2153 p = skipwhite(next);
2154 if (*p != NUL && !vim9_comment_start(p)) 2154 if (*p != NUL && !vim9_comment_start(p))
2155 return next; 2155 return next;
2156 if (eval_next_line(evalarg) == NULL) 2156 if (eval_next_line(NULL, evalarg) == NULL)
2157 break; 2157 break;
2158 } 2158 }
2159 return NULL; 2159 return NULL;
2160 } 2160 }
2161 2161
2174 2174
2175 *getnext = FALSE; 2175 *getnext = FALSE;
2176 if (in_vim9script() 2176 if (in_vim9script()
2177 && evalarg != NULL 2177 && evalarg != NULL
2178 && (evalarg->eval_cookie != NULL || evalarg->eval_cctx != NULL) 2178 && (evalarg->eval_cookie != NULL || evalarg->eval_cctx != NULL)
2179 && (*p == NUL || (vim9_comment_start(p) && VIM_ISWHITE(p[-1])))) 2179 && (*p == NUL || *p == NL
2180 || (vim9_comment_start(p) && VIM_ISWHITE(p[-1]))))
2180 { 2181 {
2181 char_u *next; 2182 char_u *next;
2182 2183
2183 if (evalarg->eval_cookie != NULL) 2184 if (*p == NL)
2185 next = p + 1;
2186 else if (evalarg->eval_cookie != NULL)
2184 next = getline_peek_skip_comments(evalarg); 2187 next = getline_peek_skip_comments(evalarg);
2185 else 2188 else
2186 next = peek_next_line_from_context(evalarg->eval_cctx); 2189 next = peek_next_line_from_context(evalarg->eval_cctx);
2187 2190
2188 if (next != NULL) 2191 if (next != NULL)
2197 /* 2200 /*
2198 * To be called after eval_next_non_blank() sets "getnext" to TRUE. 2201 * To be called after eval_next_non_blank() sets "getnext" to TRUE.
2199 * Only called for Vim9 script. 2202 * Only called for Vim9 script.
2200 */ 2203 */
2201 char_u * 2204 char_u *
2202 eval_next_line(evalarg_T *evalarg) 2205 eval_next_line(char_u *arg, evalarg_T *evalarg)
2203 { 2206 {
2204 garray_T *gap = &evalarg->eval_ga; 2207 garray_T *gap = &evalarg->eval_ga;
2205 char_u *line; 2208 char_u *line;
2209
2210 if (arg != NULL && *arg == NL)
2211 return skipwhite(arg + 1);
2206 2212
2207 if (evalarg->eval_cookie != NULL) 2213 if (evalarg->eval_cookie != NULL)
2208 line = evalarg->eval_getline(0, evalarg->eval_cookie, 0, 2214 line = evalarg->eval_getline(0, evalarg->eval_cookie, 0,
2209 GETLINE_CONCAT_ALL); 2215 GETLINE_CONCAT_ALL);
2210 else 2216 else
2251 2257
2252 if (evalarg == NULL) 2258 if (evalarg == NULL)
2253 return skipwhite(arg); 2259 return skipwhite(arg);
2254 eval_next_non_blank(p, evalarg, &getnext); 2260 eval_next_non_blank(p, evalarg, &getnext);
2255 if (getnext) 2261 if (getnext)
2256 return eval_next_line(evalarg); 2262 return eval_next_line(arg, evalarg);
2257 return p; 2263 return p;
2258 } 2264 }
2259 2265
2260 /* 2266 /*
2261 * Initialize "evalarg" for use. 2267 * Initialize "evalarg" for use.
2447 } 2453 }
2448 orig_flags = evalarg_used->eval_flags; 2454 orig_flags = evalarg_used->eval_flags;
2449 evaluate = evalarg_used->eval_flags & EVAL_EVALUATE; 2455 evaluate = evalarg_used->eval_flags & EVAL_EVALUATE;
2450 2456
2451 if (getnext) 2457 if (getnext)
2452 *arg = eval_next_line(evalarg_used); 2458 *arg = eval_next_line(*arg, evalarg_used);
2453 else 2459 else
2454 { 2460 {
2455 if (evaluate && vim9script && !VIM_ISWHITE(p[-1])) 2461 if (evaluate && vim9script && !VIM_ISWHITE(p[-1]))
2456 { 2462 {
2457 error_white_both(p, op_falsy ? 2 : 1); 2463 error_white_both(p, op_falsy ? 2 : 1);
2513 clear_tv(rettv); 2519 clear_tv(rettv);
2514 evalarg_used->eval_flags = orig_flags; 2520 evalarg_used->eval_flags = orig_flags;
2515 return FAIL; 2521 return FAIL;
2516 } 2522 }
2517 if (getnext) 2523 if (getnext)
2518 *arg = eval_next_line(evalarg_used); 2524 *arg = eval_next_line(*arg, evalarg_used);
2519 else 2525 else
2520 { 2526 {
2521 if (evaluate && vim9script && !VIM_ISWHITE(p[-1])) 2527 if (evaluate && vim9script && !VIM_ISWHITE(p[-1]))
2522 { 2528 {
2523 error_white_both(p, 1); 2529 error_white_both(p, 1);
2619 * Repeat until there is no following "||". 2625 * Repeat until there is no following "||".
2620 */ 2626 */
2621 while (p[0] == '|' && p[1] == '|') 2627 while (p[0] == '|' && p[1] == '|')
2622 { 2628 {
2623 if (getnext) 2629 if (getnext)
2624 *arg = eval_next_line(evalarg_used); 2630 *arg = eval_next_line(*arg, evalarg_used);
2625 else 2631 else
2626 { 2632 {
2627 if (evaluate && vim9script && !VIM_ISWHITE(p[-1])) 2633 if (evaluate && vim9script && !VIM_ISWHITE(p[-1]))
2628 { 2634 {
2629 error_white_both(p, 2); 2635 error_white_both(p, 2);
2745 * Repeat until there is no following "&&". 2751 * Repeat until there is no following "&&".
2746 */ 2752 */
2747 while (p[0] == '&' && p[1] == '&') 2753 while (p[0] == '&' && p[1] == '&')
2748 { 2754 {
2749 if (getnext) 2755 if (getnext)
2750 *arg = eval_next_line(evalarg_used); 2756 *arg = eval_next_line(*arg, evalarg_used);
2751 else 2757 else
2752 { 2758 {
2753 if (evaluate && vim9script && !VIM_ISWHITE(p[-1])) 2759 if (evaluate && vim9script && !VIM_ISWHITE(p[-1]))
2754 { 2760 {
2755 error_white_both(p, 2); 2761 error_white_both(p, 2);
2862 ? 0 : (evalarg->eval_flags & EVAL_EVALUATE); 2868 ? 0 : (evalarg->eval_flags & EVAL_EVALUATE);
2863 long comp_lnum = SOURCING_LNUM; 2869 long comp_lnum = SOURCING_LNUM;
2864 2870
2865 if (getnext) 2871 if (getnext)
2866 { 2872 {
2867 *arg = eval_next_line(evalarg); 2873 *arg = eval_next_line(*arg, evalarg);
2868 p = *arg; 2874 p = *arg;
2869 } 2875 }
2870 else if (evaluate && vim9script && !VIM_ISWHITE(**arg)) 2876 else if (evaluate && vim9script && !VIM_ISWHITE(**arg))
2871 { 2877 {
2872 error_white_both(*arg, len); 2878 error_white_both(*arg, len);
3024 break; 3030 break;
3025 3031
3026 evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE); 3032 evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE);
3027 oplen = (concat && p[1] == '.') ? 2 : 1; 3033 oplen = (concat && p[1] == '.') ? 2 : 1;
3028 if (getnext) 3034 if (getnext)
3029 *arg = eval_next_line(evalarg); 3035 *arg = eval_next_line(*arg, evalarg);
3030 else 3036 else
3031 { 3037 {
3032 if (evaluate && vim9script && !VIM_ISWHITE(**arg)) 3038 if (evaluate && vim9script && !VIM_ISWHITE(**arg))
3033 { 3039 {
3034 error_white_both(*arg, oplen); 3040 error_white_both(*arg, oplen);
3256 if ((op != '*' && op != '/' && op != '%') || p[1] == '=') 3262 if ((op != '*' && op != '/' && op != '%') || p[1] == '=')
3257 break; 3263 break;
3258 3264
3259 evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE); 3265 evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE);
3260 if (getnext) 3266 if (getnext)
3261 *arg = eval_next_line(evalarg); 3267 *arg = eval_next_line(*arg, evalarg);
3262 else 3268 else
3263 { 3269 {
3264 if (evaluate && in_vim9script() && !VIM_ISWHITE(**arg)) 3270 if (evaluate && in_vim9script() && !VIM_ISWHITE(**arg))
3265 { 3271 {
3266 error_white_both(*arg, 1); 3272 error_white_both(*arg, 1);
6148 && ((rettv->v_type == VAR_DICT && *p == '.' && eval_isdictc(p[1])) 6154 && ((rettv->v_type == VAR_DICT && *p == '.' && eval_isdictc(p[1]))
6149 || (p[0] == '-' && p[1] == '>' && (p[2] == '{' 6155 || (p[0] == '-' && p[1] == '>' && (p[2] == '{'
6150 || ASCII_ISALPHA(in_vim9script() ? *skipwhite(p + 2) 6156 || ASCII_ISALPHA(in_vim9script() ? *skipwhite(p + 2)
6151 : p[2]))))) 6157 : p[2])))))
6152 { 6158 {
6153 *arg = eval_next_line(evalarg); 6159 *arg = eval_next_line(*arg, evalarg);
6154 p = *arg; 6160 p = *arg;
6155 check_white = FALSE; 6161 check_white = FALSE;
6156 } 6162 }
6157 6163
6158 if (rettv->v_type == VAR_ANY) 6164 if (rettv->v_type == VAR_ANY)