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.
diff --git a/src/eval.c b/src/eval.c
index 911f0ab..a678d32 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -2296,7 +2296,7 @@
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 @@
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;
}
/*
@@ -2362,25 +2356,26 @@
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 @@
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 @@
int evaluate;
long result = TRUE;
typval_T var2;
- int error;
+ int error = FALSE;
int vim9script = in_vim9script();
if (evalarg == NULL)
@@ -2443,18 +2435,12 @@
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 @@
*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);
@@ -2497,25 +2483,26 @@
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 @@
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;