To: vim_dev@googlegroups.com Subject: Patch 8.2.4869 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4869 Problem: Expression in command block does not look after NL. Solution: Skip over NL to check what follows. (closes #10358) Files: src/eval.c, src/proto/eval.pro, src/vim9script.c, src/testdir/test_usercommands.vim *** ../vim-8.2.4868/src/eval.c 2022-04-29 21:14:58.341192079 +0100 --- src/eval.c 2022-05-05 12:14:25.911560323 +0100 *************** *** 1803,1809 **** int i; for (i = 0; i < fi->fi_break_count; ++i) ! eval_next_line(evalarg); } /* --- 1803,1809 ---- int i; for (i = 0; i < fi->fi_break_count; ++i) ! eval_next_line(NULL, evalarg); } /* *************** *** 2153,2159 **** p = skipwhite(next); if (*p != NUL && !vim9_comment_start(p)) return next; ! if (eval_next_line(evalarg) == NULL) break; } return NULL; --- 2153,2159 ---- p = skipwhite(next); if (*p != NUL && !vim9_comment_start(p)) return next; ! if (eval_next_line(NULL, evalarg) == NULL) break; } return NULL; *************** *** 2176,2186 **** if (in_vim9script() && evalarg != NULL && (evalarg->eval_cookie != NULL || evalarg->eval_cctx != NULL) ! && (*p == NUL || (vim9_comment_start(p) && VIM_ISWHITE(p[-1])))) { char_u *next; ! if (evalarg->eval_cookie != NULL) next = getline_peek_skip_comments(evalarg); else next = peek_next_line_from_context(evalarg->eval_cctx); --- 2176,2189 ---- if (in_vim9script() && evalarg != NULL && (evalarg->eval_cookie != NULL || evalarg->eval_cctx != NULL) ! && (*p == NUL || *p == NL ! || (vim9_comment_start(p) && VIM_ISWHITE(p[-1])))) { char_u *next; ! if (*p == NL) ! next = p + 1; ! else if (evalarg->eval_cookie != NULL) next = getline_peek_skip_comments(evalarg); else next = peek_next_line_from_context(evalarg->eval_cctx); *************** *** 2199,2209 **** * Only called for Vim9 script. */ char_u * ! eval_next_line(evalarg_T *evalarg) { garray_T *gap = &evalarg->eval_ga; char_u *line; if (evalarg->eval_cookie != NULL) line = evalarg->eval_getline(0, evalarg->eval_cookie, 0, GETLINE_CONCAT_ALL); --- 2202,2215 ---- * Only called for Vim9 script. */ char_u * ! eval_next_line(char_u *arg, evalarg_T *evalarg) { garray_T *gap = &evalarg->eval_ga; char_u *line; + if (arg != NULL && *arg == NL) + return skipwhite(arg + 1); + if (evalarg->eval_cookie != NULL) line = evalarg->eval_getline(0, evalarg->eval_cookie, 0, GETLINE_CONCAT_ALL); *************** *** 2253,2259 **** return skipwhite(arg); eval_next_non_blank(p, evalarg, &getnext); if (getnext) ! return eval_next_line(evalarg); return p; } --- 2259,2265 ---- return skipwhite(arg); eval_next_non_blank(p, evalarg, &getnext); if (getnext) ! return eval_next_line(arg, evalarg); return p; } *************** *** 2449,2455 **** evaluate = evalarg_used->eval_flags & EVAL_EVALUATE; if (getnext) ! *arg = eval_next_line(evalarg_used); else { if (evaluate && vim9script && !VIM_ISWHITE(p[-1])) --- 2455,2461 ---- evaluate = evalarg_used->eval_flags & EVAL_EVALUATE; if (getnext) ! *arg = eval_next_line(*arg, evalarg_used); else { if (evaluate && vim9script && !VIM_ISWHITE(p[-1])) *************** *** 2515,2521 **** return FAIL; } if (getnext) ! *arg = eval_next_line(evalarg_used); else { if (evaluate && vim9script && !VIM_ISWHITE(p[-1])) --- 2521,2527 ---- return FAIL; } if (getnext) ! *arg = eval_next_line(*arg, evalarg_used); else { if (evaluate && vim9script && !VIM_ISWHITE(p[-1])) *************** *** 2621,2627 **** while (p[0] == '|' && p[1] == '|') { if (getnext) ! *arg = eval_next_line(evalarg_used); else { if (evaluate && vim9script && !VIM_ISWHITE(p[-1])) --- 2627,2633 ---- while (p[0] == '|' && p[1] == '|') { if (getnext) ! *arg = eval_next_line(*arg, evalarg_used); else { if (evaluate && vim9script && !VIM_ISWHITE(p[-1])) *************** *** 2747,2753 **** while (p[0] == '&' && p[1] == '&') { if (getnext) ! *arg = eval_next_line(evalarg_used); else { if (evaluate && vim9script && !VIM_ISWHITE(p[-1])) --- 2753,2759 ---- while (p[0] == '&' && p[1] == '&') { if (getnext) ! *arg = eval_next_line(*arg, evalarg_used); else { if (evaluate && vim9script && !VIM_ISWHITE(p[-1])) *************** *** 2864,2870 **** if (getnext) { ! *arg = eval_next_line(evalarg); p = *arg; } else if (evaluate && vim9script && !VIM_ISWHITE(**arg)) --- 2870,2876 ---- if (getnext) { ! *arg = eval_next_line(*arg, evalarg); p = *arg; } else if (evaluate && vim9script && !VIM_ISWHITE(**arg)) *************** *** 3026,3032 **** evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE); oplen = (concat && p[1] == '.') ? 2 : 1; if (getnext) ! *arg = eval_next_line(evalarg); else { if (evaluate && vim9script && !VIM_ISWHITE(**arg)) --- 3032,3038 ---- evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE); oplen = (concat && p[1] == '.') ? 2 : 1; if (getnext) ! *arg = eval_next_line(*arg, evalarg); else { if (evaluate && vim9script && !VIM_ISWHITE(**arg)) *************** *** 3258,3264 **** evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE); if (getnext) ! *arg = eval_next_line(evalarg); else { if (evaluate && in_vim9script() && !VIM_ISWHITE(**arg)) --- 3264,3270 ---- evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE); if (getnext) ! *arg = eval_next_line(*arg, evalarg); else { if (evaluate && in_vim9script() && !VIM_ISWHITE(**arg)) *************** *** 6150,6156 **** || ASCII_ISALPHA(in_vim9script() ? *skipwhite(p + 2) : p[2]))))) { ! *arg = eval_next_line(evalarg); p = *arg; check_white = FALSE; } --- 6156,6162 ---- || ASCII_ISALPHA(in_vim9script() ? *skipwhite(p + 2) : p[2]))))) { ! *arg = eval_next_line(*arg, evalarg); p = *arg; check_white = FALSE; } *** ../vim-8.2.4868/src/proto/eval.pro 2022-03-08 13:18:10.809020782 +0000 --- src/proto/eval.pro 2022-05-05 12:14:07.771579952 +0100 *************** *** 32,38 **** void set_context_for_expression(expand_T *xp, char_u *arg, cmdidx_T cmdidx); int pattern_match(char_u *pat, char_u *text, int ic); char_u *eval_next_non_blank(char_u *arg, evalarg_T *evalarg, int *getnext); ! char_u *eval_next_line(evalarg_T *evalarg); char_u *skipwhite_and_linebreak(char_u *arg, evalarg_T *evalarg); void init_evalarg(evalarg_T *evalarg); void clear_evalarg(evalarg_T *evalarg, exarg_T *eap); --- 32,38 ---- void set_context_for_expression(expand_T *xp, char_u *arg, cmdidx_T cmdidx); int pattern_match(char_u *pat, char_u *text, int ic); char_u *eval_next_non_blank(char_u *arg, evalarg_T *evalarg, int *getnext); ! char_u *eval_next_line(char_u *arg, evalarg_T *evalarg); char_u *skipwhite_and_linebreak(char_u *arg, evalarg_T *evalarg); void init_evalarg(evalarg_T *evalarg); void clear_evalarg(evalarg_T *evalarg, exarg_T *eap); *** ../vim-8.2.4868/src/vim9script.c 2022-04-24 21:54:56.061612118 +0100 --- src/vim9script.c 2022-05-05 12:13:57.851590827 +0100 *************** *** 589,595 **** char_u *p; if (getnext) ! arg = eval_next_line(evalarg); else arg = nextarg; --- 589,595 ---- char_u *p; if (getnext) ! arg = eval_next_line(expr_end, evalarg); else arg = nextarg; *** ../vim-8.2.4868/src/testdir/test_usercommands.vim 2022-03-23 21:36:23.713441139 +0000 --- src/testdir/test_usercommands.vim 2022-05-05 12:17:05.647399991 +0100 *************** *** 695,700 **** --- 695,714 ---- delcommand HelloThere let lines =<< trim END + command EchoCond { + const test: string = true + ? 'true' + : 'false' + g:result = test + } + EchoCond + END + call v9.CheckScriptSuccess(lines) + call assert_equal('true', g:result) + delcommand EchoCond + unlet g:result + + let lines =<< trim END command BadCommand { echo { 'key': 'value', *** ../vim-8.2.4868/src/version.c 2022-05-04 22:12:34.125942208 +0100 --- src/version.c 2022-05-05 12:18:43.515311131 +0100 *************** *** 748,749 **** --- 748,751 ---- { /* Add new patch number below this line */ + /**/ + 4869, /**/ -- hundred-and-one symptoms of being an internet addict: 93. New mail alarm on your palmtop annoys other churchgoers. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///