Mercurial > vim
comparison src/eval.c @ 21925:51d591dbb8df v8.2.1512
patch 8.2.1512: failure after trinary expression fails
Commit: https://github.com/vim/vim/commit/69e44552c567ff25b363ba0790ad3d43fa0397a7
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Aug 22 22:37:20 2020 +0200
patch 8.2.1512: failure after trinary expression fails
Problem: Failure after trinary expression fails.
Solution: Restore eval_flags. (Yasuhiro Matsumoto, closes https://github.com/vim/vim/issues/6776)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 22 Aug 2020 22:45:03 +0200 |
parents | 2559dc02bd64 |
children | e6608764248a |
comparison
equal
deleted
inserted
replaced
21924:7972b1494d5e | 21925:51d591dbb8df |
---|---|
2165 } | 2165 } |
2166 *arg = skipwhite_and_linebreak(*arg + 1, evalarg_used); | 2166 *arg = skipwhite_and_linebreak(*arg + 1, evalarg_used); |
2167 evalarg_used->eval_flags = result ? orig_flags | 2167 evalarg_used->eval_flags = result ? orig_flags |
2168 : orig_flags & ~EVAL_EVALUATE; | 2168 : orig_flags & ~EVAL_EVALUATE; |
2169 if (eval1(arg, rettv, evalarg_used) == FAIL) | 2169 if (eval1(arg, rettv, evalarg_used) == FAIL) |
2170 { | |
2171 evalarg_used->eval_flags = orig_flags; | |
2170 return FAIL; | 2172 return FAIL; |
2173 } | |
2171 | 2174 |
2172 /* | 2175 /* |
2173 * Check for the ":". | 2176 * Check for the ":". |
2174 */ | 2177 */ |
2175 p = eval_next_non_blank(*arg, evalarg_used, &getnext); | 2178 p = eval_next_non_blank(*arg, evalarg_used, &getnext); |
2176 if (*p != ':') | 2179 if (*p != ':') |
2177 { | 2180 { |
2178 emsg(_(e_missing_colon)); | 2181 emsg(_(e_missing_colon)); |
2179 if (evaluate && result) | 2182 if (evaluate && result) |
2180 clear_tv(rettv); | 2183 clear_tv(rettv); |
2184 evalarg_used->eval_flags = orig_flags; | |
2181 return FAIL; | 2185 return FAIL; |
2182 } | 2186 } |
2183 if (getnext) | 2187 if (getnext) |
2184 *arg = eval_next_line(evalarg_used); | 2188 *arg = eval_next_line(evalarg_used); |
2185 else | 2189 else |
2186 { | 2190 { |
2187 if (evaluate && in_vim9script() && !VIM_ISWHITE(p[-1])) | 2191 if (evaluate && in_vim9script() && !VIM_ISWHITE(p[-1])) |
2188 { | 2192 { |
2189 error_white_both(p, 1); | 2193 error_white_both(p, 1); |
2190 clear_tv(rettv); | 2194 clear_tv(rettv); |
2195 evalarg_used->eval_flags = orig_flags; | |
2191 return FAIL; | 2196 return FAIL; |
2192 } | 2197 } |
2193 *arg = p; | 2198 *arg = p; |
2194 } | 2199 } |
2195 | 2200 |
2198 */ | 2203 */ |
2199 if (evaluate && in_vim9script() && !IS_WHITE_OR_NUL((*arg)[1])) | 2204 if (evaluate && in_vim9script() && !IS_WHITE_OR_NUL((*arg)[1])) |
2200 { | 2205 { |
2201 error_white_both(p, 1); | 2206 error_white_both(p, 1); |
2202 clear_tv(rettv); | 2207 clear_tv(rettv); |
2208 evalarg_used->eval_flags = orig_flags; | |
2203 return FAIL; | 2209 return FAIL; |
2204 } | 2210 } |
2205 *arg = skipwhite_and_linebreak(*arg + 1, evalarg_used); | 2211 *arg = skipwhite_and_linebreak(*arg + 1, evalarg_used); |
2206 evalarg_used->eval_flags = !result ? orig_flags | 2212 evalarg_used->eval_flags = !result ? orig_flags |
2207 : orig_flags & ~EVAL_EVALUATE; | 2213 : orig_flags & ~EVAL_EVALUATE; |
2208 if (eval1(arg, &var2, evalarg_used) == FAIL) | 2214 if (eval1(arg, &var2, evalarg_used) == FAIL) |
2209 { | 2215 { |
2210 if (evaluate && result) | 2216 if (evaluate && result) |
2211 clear_tv(rettv); | 2217 clear_tv(rettv); |
2218 evalarg_used->eval_flags = orig_flags; | |
2212 return FAIL; | 2219 return FAIL; |
2213 } | 2220 } |
2214 if (evaluate && !result) | 2221 if (evaluate && !result) |
2215 *rettv = var2; | 2222 *rettv = var2; |
2216 | 2223 |