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