mirror of
https://github.com/vim/vim.git
synced 2025-09-23 03:43:49 -04:00
patch 8.2.1795: Vim9: operators && and || have a confusing result
Problem: Vim9: operators && and || have a confusing result. Solution: Make the result a boolean.
This commit is contained in:
102
src/eval.c
102
src/eval.c
@@ -2296,7 +2296,7 @@ eval2(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
|
||||
int orig_flags;
|
||||
long result = FALSE;
|
||||
typval_T var2;
|
||||
int error;
|
||||
int error = FALSE;
|
||||
int vim9script = in_vim9script();
|
||||
|
||||
if (evalarg == NULL)
|
||||
@@ -2309,18 +2309,12 @@ eval2(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
|
||||
if (evaluate)
|
||||
{
|
||||
if (vim9script)
|
||||
{
|
||||
result = tv2bool(rettv);
|
||||
}
|
||||
else
|
||||
{
|
||||
error = FALSE;
|
||||
if (tv_get_number_chk(rettv, &error) != 0)
|
||||
result = TRUE;
|
||||
clear_tv(rettv);
|
||||
if (error)
|
||||
return FAIL;
|
||||
}
|
||||
result = tv_get_bool_chk(rettv, &error);
|
||||
else if (tv_get_number_chk(rettv, &error) != 0)
|
||||
result = TRUE;
|
||||
clear_tv(rettv);
|
||||
if (error)
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2360,27 +2354,28 @@ eval2(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
|
||||
* Compute the result.
|
||||
*/
|
||||
if (evaluate && !result)
|
||||
{
|
||||
if (vim9script)
|
||||
result = tv_get_bool_chk(&var2, &error);
|
||||
else if (tv_get_number_chk(&var2, &error) != 0)
|
||||
result = TRUE;
|
||||
clear_tv(&var2);
|
||||
if (error)
|
||||
return FAIL;
|
||||
}
|
||||
if (evaluate)
|
||||
{
|
||||
if (vim9script)
|
||||
{
|
||||
clear_tv(rettv);
|
||||
*rettv = var2;
|
||||
result = tv2bool(rettv);
|
||||
rettv->v_type = VAR_BOOL;
|
||||
rettv->vval.v_number = result ? VVAL_TRUE : VVAL_FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (tv_get_number_chk(&var2, &error) != 0)
|
||||
result = TRUE;
|
||||
clear_tv(&var2);
|
||||
if (error)
|
||||
return FAIL;
|
||||
rettv->v_type = VAR_NUMBER;
|
||||
rettv->vval.v_number = result;
|
||||
}
|
||||
}
|
||||
if (evaluate && !vim9script)
|
||||
{
|
||||
rettv->v_type = VAR_NUMBER;
|
||||
rettv->vval.v_number = result;
|
||||
}
|
||||
|
||||
p = eval_next_non_blank(*arg, evalarg_used, &getnext);
|
||||
}
|
||||
@@ -2389,9 +2384,6 @@ eval2(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
|
||||
clear_evalarg(&local_evalarg, NULL);
|
||||
else
|
||||
evalarg->eval_flags = orig_flags;
|
||||
|
||||
// Resulting value can be assigned to a bool.
|
||||
rettv->v_lock |= VAR_BOOL_OK;
|
||||
}
|
||||
|
||||
return OK;
|
||||
@@ -2430,7 +2422,7 @@ eval3(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
|
||||
int evaluate;
|
||||
long result = TRUE;
|
||||
typval_T var2;
|
||||
int error;
|
||||
int error = FALSE;
|
||||
int vim9script = in_vim9script();
|
||||
|
||||
if (evalarg == NULL)
|
||||
@@ -2443,18 +2435,12 @@ eval3(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
|
||||
if (evaluate)
|
||||
{
|
||||
if (vim9script)
|
||||
{
|
||||
result = tv2bool(rettv);
|
||||
}
|
||||
else
|
||||
{
|
||||
error = FALSE;
|
||||
if (tv_get_number_chk(rettv, &error) == 0)
|
||||
result = FALSE;
|
||||
clear_tv(rettv);
|
||||
if (error)
|
||||
return FAIL;
|
||||
}
|
||||
result = tv_get_bool_chk(rettv, &error);
|
||||
else if (tv_get_number_chk(rettv, &error) == 0)
|
||||
result = FALSE;
|
||||
clear_tv(rettv);
|
||||
if (error)
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2466,7 +2452,7 @@ eval3(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
|
||||
*arg = eval_next_line(evalarg_used);
|
||||
else
|
||||
{
|
||||
if (evaluate && in_vim9script() && !VIM_ISWHITE(p[-1]))
|
||||
if (evaluate && vim9script && !VIM_ISWHITE(p[-1]))
|
||||
{
|
||||
error_white_both(p, 2);
|
||||
clear_tv(rettv);
|
||||
@@ -2495,27 +2481,28 @@ eval3(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
|
||||
* Compute the result.
|
||||
*/
|
||||
if (evaluate && result)
|
||||
{
|
||||
if (vim9script)
|
||||
result = tv_get_bool_chk(&var2, &error);
|
||||
else if (tv_get_number_chk(&var2, &error) == 0)
|
||||
result = FALSE;
|
||||
clear_tv(&var2);
|
||||
if (error)
|
||||
return FAIL;
|
||||
}
|
||||
if (evaluate)
|
||||
{
|
||||
if (vim9script)
|
||||
{
|
||||
clear_tv(rettv);
|
||||
*rettv = var2;
|
||||
result = tv2bool(rettv);
|
||||
rettv->v_type = VAR_BOOL;
|
||||
rettv->vval.v_number = result ? VVAL_TRUE : VVAL_FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (tv_get_number_chk(&var2, &error) == 0)
|
||||
result = FALSE;
|
||||
clear_tv(&var2);
|
||||
if (error)
|
||||
return FAIL;
|
||||
rettv->v_type = VAR_NUMBER;
|
||||
rettv->vval.v_number = result;
|
||||
}
|
||||
}
|
||||
if (evaluate && !vim9script)
|
||||
{
|
||||
rettv->v_type = VAR_NUMBER;
|
||||
rettv->vval.v_number = result;
|
||||
}
|
||||
|
||||
p = eval_next_non_blank(*arg, evalarg_used, &getnext);
|
||||
}
|
||||
@@ -2524,9 +2511,6 @@ eval3(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
|
||||
clear_evalarg(&local_evalarg, NULL);
|
||||
else
|
||||
evalarg->eval_flags = orig_flags;
|
||||
|
||||
// Resulting value can be assigned to a bool.
|
||||
rettv->v_lock |= VAR_BOOL_OK;
|
||||
}
|
||||
|
||||
return OK;
|
||||
|
Reference in New Issue
Block a user