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