0
0
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:
Bram Moolenaar
2020-10-03 22:52:39 +02:00
parent 92f26c256e
commit 2bb2658bef
12 changed files with 254 additions and 216 deletions

View File

@@ -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;