summaryrefslogtreecommitdiff
path: root/src/typval.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-12-22 21:40:33 +0000
committerBram Moolenaar <Bram@vim.org>2021-12-22 21:40:33 +0000
commit28fbbeac7046f33db350294908eecb380042d553 (patch)
tree99340cd3f303cfc63059b616e5f6e2b5dcee117f /src/typval.c
parentf2f0bddf303e37d4d532ca22e2d53179c20b1d19 (diff)
downloadvim-git-28fbbeac7046f33db350294908eecb380042d553.tar.gz
patch 8.2.3877: function does not abort after a type error in comparev8.2.3877
Problem: Function does not abort after a type error in compare Solution: Check getting number fails. (closes #9384)
Diffstat (limited to 'src/typval.c')
-rw-r--r--src/typval.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/src/typval.c b/src/typval.c
index 9e9b05f99..358e04e67 100644
--- a/src/typval.c
+++ b/src/typval.c
@@ -297,8 +297,8 @@ tv_get_bool_chk(typval_T *varp, int *denote)
}
#if defined(FEAT_FLOAT) || defined(PROTO)
- float_T
-tv_get_float(typval_T *varp)
+ static float_T
+tv_get_float_chk(typval_T *varp, int *error)
{
switch (varp->v_type)
{
@@ -347,8 +347,16 @@ tv_get_float(typval_T *varp)
internal_error_no_abort("tv_get_float(UNKNOWN)");
break;
}
+ if (error != NULL)
+ *error = TRUE;
return 0;
}
+
+ float_T
+tv_get_float(typval_T *varp)
+{
+ return tv_get_float_chk(varp, NULL);
+}
#endif
/*
@@ -1185,9 +1193,16 @@ typval_compare(
&& type != EXPR_MATCH && type != EXPR_NOMATCH)
{
float_T f1, f2;
+ int error = FALSE;
- f1 = tv_get_float(tv1);
- f2 = tv_get_float(tv2);
+ f1 = tv_get_float_chk(tv1, &error);
+ if (!error)
+ f2 = tv_get_float_chk(tv2, &error);
+ if (error)
+ {
+ clear_tv(tv1);
+ return FAIL;
+ }
n1 = FALSE;
switch (type)
{
@@ -1211,8 +1226,16 @@ typval_compare(
else if ((tv1->v_type == VAR_NUMBER || tv2->v_type == VAR_NUMBER)
&& type != EXPR_MATCH && type != EXPR_NOMATCH)
{
- n1 = tv_get_number(tv1);
- n2 = tv_get_number(tv2);
+ int error = FALSE;
+
+ n1 = tv_get_number_chk(tv1, &error);
+ if (!error)
+ n2 = tv_get_number_chk(tv2, &error);
+ if (error)
+ {
+ clear_tv(tv1);
+ return FAIL;
+ }
switch (type)
{
case EXPR_IS: