comparison src/eval.c @ 21096:74e5e212e550 v8.2.1099

patch 8.2.1099: Vim9: cannot use line break in :cexpr argument Commit: https://github.com/vim/vim/commit/37c837119579ff70b005a4e54c2e26ca42b74022 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Jun 30 21:18:36 2020 +0200 patch 8.2.1099: Vim9: cannot use line break in :cexpr argument Problem: Vim9: cannot use line break in :cexpr argument. Solution: Check for line break.
author Bram Moolenaar <Bram@vim.org>
date Tue, 30 Jun 2020 21:30:04 +0200
parents 376b520312d6
children e88b0daa2fcb
comparison
equal deleted inserted replaced
21095:989c7526a1b2 21096:74e5e212e550
151 // functions not garbage collected 151 // functions not garbage collected
152 free_all_functions(); 152 free_all_functions();
153 } 153 }
154 #endif 154 #endif
155 155
156 static void
157 fill_evalarg_from_eap(evalarg_T *evalarg, exarg_T *eap, int skip)
158 {
159 CLEAR_FIELD(*evalarg);
160 evalarg->eval_flags = skip ? 0 : EVAL_EVALUATE;
161 if (eap != NULL && getline_equal(eap->getline, eap->cookie, getsourceline))
162 {
163 evalarg->eval_getline = eap->getline;
164 evalarg->eval_cookie = eap->cookie;
165 }
166 }
167
156 /* 168 /*
157 * Top level evaluation function, returning a boolean. 169 * Top level evaluation function, returning a boolean.
158 * Sets "error" to TRUE if there was an error. 170 * Sets "error" to TRUE if there was an error.
159 * Return TRUE or FALSE. 171 * Return TRUE or FALSE.
160 */ 172 */
167 { 179 {
168 typval_T tv; 180 typval_T tv;
169 varnumber_T retval = FALSE; 181 varnumber_T retval = FALSE;
170 evalarg_T evalarg; 182 evalarg_T evalarg;
171 183
172 CLEAR_FIELD(evalarg); 184 fill_evalarg_from_eap(&evalarg, eap, skip);
173 evalarg.eval_flags = skip ? 0 : EVAL_EVALUATE;
174 if (eap != NULL && getline_equal(eap->getline, eap->cookie, getsourceline))
175 {
176 evalarg.eval_getline = eap->getline;
177 evalarg.eval_cookie = eap->cookie;
178 }
179 185
180 if (skip) 186 if (skip)
181 ++emsg_skip; 187 ++emsg_skip;
182 if (eval0(arg, &tv, eap, &evalarg) == FAIL) 188 if (eval0(arg, &tv, eap, &evalarg) == FAIL)
183 *error = TRUE; 189 *error = TRUE;
333 { 339 {
334 typval_T tv; 340 typval_T tv;
335 char_u *retval; 341 char_u *retval;
336 evalarg_T evalarg; 342 evalarg_T evalarg;
337 343
338 CLEAR_FIELD(evalarg); 344 fill_evalarg_from_eap(&evalarg, eap, skip);
339 evalarg.eval_flags = skip ? 0 : EVAL_EVALUATE;
340 if (eap != NULL && getline_equal(eap->getline, eap->cookie, getsourceline))
341 {
342 evalarg.eval_getline = eap->getline;
343 evalarg.eval_cookie = eap->cookie;
344 }
345 if (skip) 345 if (skip)
346 ++emsg_skip; 346 ++emsg_skip;
347 if (eval0(arg, &tv, eap, &evalarg) == FAIL || skip) 347 if (eval0(arg, &tv, eap, &evalarg) == FAIL || skip)
348 retval = NULL; 348 retval = NULL;
349 else 349 else
533 */ 533 */
534 typval_T * 534 typval_T *
535 eval_expr(char_u *arg, exarg_T *eap) 535 eval_expr(char_u *arg, exarg_T *eap)
536 { 536 {
537 typval_T *tv; 537 typval_T *tv;
538 evalarg_T evalarg;
539
540 fill_evalarg_from_eap(&evalarg, eap, eap != NULL && eap->skip);
538 541
539 tv = ALLOC_ONE(typval_T); 542 tv = ALLOC_ONE(typval_T);
540 if (tv != NULL && eval0(arg, tv, eap, &EVALARG_EVALUATE) == FAIL) 543 if (tv != NULL && eval0(arg, tv, eap, &evalarg) == FAIL)
541 VIM_CLEAR(tv); 544 VIM_CLEAR(tv);
542 clear_evalarg(&EVALARG_EVALUATE, eap); 545
543 546 clear_evalarg(&evalarg, eap);
544 return tv; 547 return tv;
545 } 548 }
546 549
547 /* 550 /*
548 * Call some Vim script function and return the result in "*rettv". 551 * Call some Vim script function and return the result in "*rettv".
5237 int atstart = TRUE; 5240 int atstart = TRUE;
5238 int did_emsg_before = did_emsg; 5241 int did_emsg_before = did_emsg;
5239 int called_emsg_before = called_emsg; 5242 int called_emsg_before = called_emsg;
5240 evalarg_T evalarg; 5243 evalarg_T evalarg;
5241 5244
5242 CLEAR_FIELD(evalarg); 5245 fill_evalarg_from_eap(&evalarg, eap, eap != NULL && eap->skip);
5243 evalarg.eval_flags = eap->skip ? 0 : EVAL_EVALUATE;
5244 if (getline_equal(eap->getline, eap->cookie, getsourceline))
5245 {
5246 evalarg.eval_getline = eap->getline;
5247 evalarg.eval_cookie = eap->cookie;
5248 }
5249 5246
5250 if (eap->skip) 5247 if (eap->skip)
5251 ++emsg_skip; 5248 ++emsg_skip;
5252 while ((!ends_excmd2(eap->cmd, arg) || *arg == '"') && !got_int) 5249 while ((!ends_excmd2(eap->cmd, arg) || *arg == '"') && !got_int)
5253 { 5250 {