Mercurial > vim
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) |