diff options
author | Yegappan Lakshmanan <yegappan@yahoo.com> | 2023-10-15 09:44:50 +0200 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2023-10-15 09:44:50 +0200 |
commit | de3295dd0c68a8d7540a751a99ee056fd5b9a7a4 (patch) | |
tree | 4028cf0eca80889cfaccccf7af4c392ba6b4db88 /src/eval.c | |
parent | ae3cfa47d3dcee75061db598eb19879693b2393a (diff) |
patch 9.0.2027: Vim9: no support for bitwise operators in lambda funcsv9.0.2027
Problem: Vim9: no support for bitwise operators in lambda funcs
Solution: move "evaluate" assignment a bit up in order to decide
to perform bitwise operations
closes: #13342
closes: #13345
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Diffstat (limited to 'src/eval.c')
-rw-r--r-- | src/eval.c | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/src/eval.c b/src/eval.c index 46eec35572..34502f965b 100644 --- a/src/eval.c +++ b/src/eval.c @@ -3515,7 +3515,8 @@ eval5(char_u **arg, typval_T *rettv, evalarg_T *evalarg) return OK; // Handle a bitwise left or right shift operator - if (rettv->v_type != VAR_NUMBER) + evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE); + if (evaluate && rettv->v_type != VAR_NUMBER) { // left operand should be a number emsg(_(e_bitshift_ops_must_be_number)); @@ -3523,7 +3524,6 @@ eval5(char_u **arg, typval_T *rettv, evalarg_T *evalarg) return FAIL; } - evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE); vim9script = in_vim9script(); if (getnext) { @@ -3553,20 +3553,20 @@ eval5(char_u **arg, typval_T *rettv, evalarg_T *evalarg) return FAIL; } - if (var2.v_type != VAR_NUMBER || var2.vval.v_number < 0) - { - // right operand should be a positive number - if (var2.v_type != VAR_NUMBER) - emsg(_(e_bitshift_ops_must_be_number)); - else - emsg(_(e_bitshift_ops_must_be_positive)); - clear_tv(rettv); - clear_tv(&var2); - return FAIL; - } - if (evaluate) { + if (var2.v_type != VAR_NUMBER || var2.vval.v_number < 0) + { + // right operand should be a positive number + if (var2.v_type != VAR_NUMBER) + emsg(_(e_bitshift_ops_must_be_number)); + else + emsg(_(e_bitshift_ops_must_be_positive)); + clear_tv(rettv); + clear_tv(&var2); + return FAIL; + } + if (var2.vval.v_number > MAX_LSHIFT_BITS) // shifting more bits than we have always results in zero rettv->vval.v_number = 0; |