Skip to content

Commit de3295d

Browse files
yegappanchrisbra
authored andcommitted
patch 9.0.2027: Vim9: no support for bitwise operators in lambda funcs
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 <[email protected]> Co-authored-by: Yegappan Lakshmanan <[email protected]>
1 parent ae3cfa4 commit de3295d

File tree

3 files changed

+60
-14
lines changed

3 files changed

+60
-14
lines changed

src/eval.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3515,15 +3515,15 @@ eval5(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
35153515
return OK;
35163516

35173517
// Handle a bitwise left or right shift operator
3518-
if (rettv->v_type != VAR_NUMBER)
3518+
evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE);
3519+
if (evaluate && rettv->v_type != VAR_NUMBER)
35193520
{
35203521
// left operand should be a number
35213522
emsg(_(e_bitshift_ops_must_be_number));
35223523
clear_tv(rettv);
35233524
return FAIL;
35243525
}
35253526

3526-
evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE);
35273527
vim9script = in_vim9script();
35283528
if (getnext)
35293529
{
@@ -3553,20 +3553,20 @@ eval5(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
35533553
return FAIL;
35543554
}
35553555

3556-
if (var2.v_type != VAR_NUMBER || var2.vval.v_number < 0)
3557-
{
3558-
// right operand should be a positive number
3559-
if (var2.v_type != VAR_NUMBER)
3560-
emsg(_(e_bitshift_ops_must_be_number));
3561-
else
3562-
emsg(_(e_bitshift_ops_must_be_positive));
3563-
clear_tv(rettv);
3564-
clear_tv(&var2);
3565-
return FAIL;
3566-
}
3567-
35683556
if (evaluate)
35693557
{
3558+
if (var2.v_type != VAR_NUMBER || var2.vval.v_number < 0)
3559+
{
3560+
// right operand should be a positive number
3561+
if (var2.v_type != VAR_NUMBER)
3562+
emsg(_(e_bitshift_ops_must_be_number));
3563+
else
3564+
emsg(_(e_bitshift_ops_must_be_positive));
3565+
clear_tv(rettv);
3566+
clear_tv(&var2);
3567+
return FAIL;
3568+
}
3569+
35703570
if (var2.vval.v_number > MAX_LSHIFT_BITS)
35713571
// shifting more bits than we have always results in zero
35723572
rettv->vval.v_number = 0;

src/testdir/test_expr.vim

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,6 +1041,50 @@ func Test_bitwise_shift()
10411041
assert_equal(16, a)
10421042
END
10431043
call v9.CheckDefAndScriptSuccess(lines)
1044+
1045+
let lines =<< trim END
1046+
# Use in a lambda function
1047+
const DivBy2Ref_A = (n: number): number => n >> 1
1048+
assert_equal(16, DivBy2Ref_A(32))
1049+
const DivBy2Ref_B = (n: number): number => (<number>n) >> 1
1050+
assert_equal(16, DivBy2Ref_B(32))
1051+
const MultBy2Ref_A = (n: number): number => n << 1
1052+
assert_equal(8, MultBy2Ref_A(4))
1053+
const MultBy2Ref_B = (n: number): number => (<number>n) << 1
1054+
assert_equal(8, MultBy2Ref_B(4))
1055+
1056+
def DivBy2_A(): func(number): number
1057+
return (n: number): number => n >> 1
1058+
enddef
1059+
assert_equal(16, DivBy2_A()(32))
1060+
def DivBy2_B(): func(number): number
1061+
return (n: number): number => (<number>n) >> 1
1062+
enddef
1063+
assert_equal(16, DivBy2_B()(32))
1064+
def MultBy2_A(): func(number): number
1065+
return (n: number): number => n << 1
1066+
enddef
1067+
assert_equal(64, MultBy2_A()(32))
1068+
def MultBy2_B(): func(number): number
1069+
return (n: number): number => (<number>n) << 1
1070+
enddef
1071+
assert_equal(64, MultBy2_B()(32))
1072+
END
1073+
call v9.CheckDefAndScriptSuccess(lines)
1074+
1075+
" Use in a legacy lambda function
1076+
const DivBy2Ref_A = {n -> n >> 1}
1077+
call assert_equal(16, DivBy2Ref_A(32))
1078+
func DivBy2_A()
1079+
return {n -> n >> 1}
1080+
endfunc
1081+
call assert_equal(16, DivBy2_A()(32))
1082+
const MultBy2Ref_A = {n -> n << 1}
1083+
call assert_equal(64, MultBy2Ref_A(32))
1084+
func MultBy2_A()
1085+
return {n -> n << 1}
1086+
endfunc
1087+
call assert_equal(64, MultBy2_A()(32))
10441088
endfunc
10451089

10461090
" vim: shiftwidth=2 sts=2 expandtab

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,8 @@ static char *(features[]) =
704704

705705
static int included_patches[] =
706706
{ /* Add new patch number below this line */
707+
/**/
708+
2027,
707709
/**/
708710
2026,
709711
/**/

0 commit comments

Comments
 (0)