Skip to content

Commit 07a3db8

Browse files
committed
patch 8.2.0044: expression type is used inconsistently
Problem: Expression type is used inconsistently. Solution: Add "ETYPE_IS" and "ETYPE_ISNOT" as separate enum values. Rename "TYPE_" to "ETYPE_" to avoid confusion.
1 parent 818fed7 commit 07a3db8

5 files changed

Lines changed: 78 additions & 73 deletions

File tree

src/debugger.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -929,8 +929,7 @@ debuggy_find(
929929
}
930930
else
931931
{
932-
if (typval_compare(tv, bp->dbg_val, TYPE_EQUAL,
933-
TRUE, FALSE) == OK
932+
if (typval_compare(tv, bp->dbg_val, ETYPE_IS, FALSE) == OK
934933
&& tv->vval.v_number == FALSE)
935934
{
936935
typval_T *v;

src/eval.c

Lines changed: 63 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1997,8 +1997,7 @@ eval4(char_u **arg, typval_T *rettv, int evaluate)
19971997
typval_T var2;
19981998
char_u *p;
19991999
int i;
2000-
exptype_T type = TYPE_UNKNOWN;
2001-
int type_is = FALSE; // TRUE for "is" and "isnot"
2000+
exptype_T type = ETYPE_UNKNOWN;
20022001
int len = 2;
20032002
int ic;
20042003

@@ -2012,49 +2011,46 @@ eval4(char_u **arg, typval_T *rettv, int evaluate)
20122011
switch (p[0])
20132012
{
20142013
case '=': if (p[1] == '=')
2015-
type = TYPE_EQUAL;
2014+
type = ETYPE_EQUAL;
20162015
else if (p[1] == '~')
2017-
type = TYPE_MATCH;
2016+
type = ETYPE_MATCH;
20182017
break;
20192018
case '!': if (p[1] == '=')
2020-
type = TYPE_NEQUAL;
2019+
type = ETYPE_NEQUAL;
20212020
else if (p[1] == '~')
2022-
type = TYPE_NOMATCH;
2021+
type = ETYPE_NOMATCH;
20232022
break;
20242023
case '>': if (p[1] != '=')
20252024
{
2026-
type = TYPE_GREATER;
2025+
type = ETYPE_GREATER;
20272026
len = 1;
20282027
}
20292028
else
2030-
type = TYPE_GEQUAL;
2029+
type = ETYPE_GEQUAL;
20312030
break;
20322031
case '<': if (p[1] != '=')
20332032
{
2034-
type = TYPE_SMALLER;
2033+
type = ETYPE_SMALLER;
20352034
len = 1;
20362035
}
20372036
else
2038-
type = TYPE_SEQUAL;
2037+
type = ETYPE_SEQUAL;
20392038
break;
20402039
case 'i': if (p[1] == 's')
20412040
{
20422041
if (p[2] == 'n' && p[3] == 'o' && p[4] == 't')
20432042
len = 5;
20442043
i = p[len];
20452044
if (!isalnum(i) && i != '_')
2046-
{
2047-
type = len == 2 ? TYPE_EQUAL : TYPE_NEQUAL;
2048-
type_is = TRUE;
2049-
}
2045+
type = len == 2 ? ETYPE_IS : ETYPE_ISNOT;
20502046
}
20512047
break;
20522048
}
20532049

20542050
/*
20552051
* If there is a comparative operator, use it.
20562052
*/
2057-
if (type != TYPE_UNKNOWN)
2053+
if (type != ETYPE_UNKNOWN)
20582054
{
20592055
// extra question mark appended: ignore case
20602056
if (p[len] == '?')
@@ -2083,7 +2079,7 @@ eval4(char_u **arg, typval_T *rettv, int evaluate)
20832079
}
20842080
if (evaluate)
20852081
{
2086-
int ret = typval_compare(rettv, &var2, type, type_is, ic);
2082+
int ret = typval_compare(rettv, &var2, type, ic);
20872083

20882084
clear_tv(&var2);
20892085
return ret;
@@ -6163,31 +6159,31 @@ typval_compare(
61636159
typval_T *typ1, // first operand
61646160
typval_T *typ2, // second operand
61656161
exptype_T type, // operator
6166-
int type_is, // TRUE for "is" and "isnot"
61676162
int ic) // ignore case
61686163
{
61696164
int i;
61706165
varnumber_T n1, n2;
61716166
char_u *s1, *s2;
61726167
char_u buf1[NUMBUFLEN], buf2[NUMBUFLEN];
6168+
int type_is = type == ETYPE_IS || type == ETYPE_ISNOT;
61736169

61746170
if (type_is && typ1->v_type != typ2->v_type)
61756171
{
61766172
// For "is" a different type always means FALSE, for "notis"
61776173
// it means TRUE.
6178-
n1 = (type == TYPE_NEQUAL);
6174+
n1 = (type == ETYPE_ISNOT);
61796175
}
61806176
else if (typ1->v_type == VAR_BLOB || typ2->v_type == VAR_BLOB)
61816177
{
61826178
if (type_is)
61836179
{
61846180
n1 = (typ1->v_type == typ2->v_type
61856181
&& typ1->vval.v_blob == typ2->vval.v_blob);
6186-
if (type == TYPE_NEQUAL)
6182+
if (type == ETYPE_ISNOT)
61876183
n1 = !n1;
61886184
}
61896185
else if (typ1->v_type != typ2->v_type
6190-
|| (type != TYPE_EQUAL && type != TYPE_NEQUAL))
6186+
|| (type != ETYPE_EQUAL && type != ETYPE_NEQUAL))
61916187
{
61926188
if (typ1->v_type != typ2->v_type)
61936189
emsg(_("E977: Can only compare Blob with Blob"));
@@ -6200,7 +6196,7 @@ typval_compare(
62006196
{
62016197
// Compare two Blobs for being equal or unequal.
62026198
n1 = blob_equal(typ1->vval.v_blob, typ2->vval.v_blob);
6203-
if (type == TYPE_NEQUAL)
6199+
if (type == ETYPE_NEQUAL)
62046200
n1 = !n1;
62056201
}
62066202
}
@@ -6210,11 +6206,11 @@ typval_compare(
62106206
{
62116207
n1 = (typ1->v_type == typ2->v_type
62126208
&& typ1->vval.v_list == typ2->vval.v_list);
6213-
if (type == TYPE_NEQUAL)
6209+
if (type == ETYPE_ISNOT)
62146210
n1 = !n1;
62156211
}
62166212
else if (typ1->v_type != typ2->v_type
6217-
|| (type != TYPE_EQUAL && type != TYPE_NEQUAL))
6213+
|| (type != ETYPE_EQUAL && type != ETYPE_NEQUAL))
62186214
{
62196215
if (typ1->v_type != typ2->v_type)
62206216
emsg(_("E691: Can only compare List with List"));
@@ -6228,7 +6224,7 @@ typval_compare(
62286224
// Compare two Lists for being equal or unequal.
62296225
n1 = list_equal(typ1->vval.v_list, typ2->vval.v_list,
62306226
ic, FALSE);
6231-
if (type == TYPE_NEQUAL)
6227+
if (type == ETYPE_NEQUAL)
62326228
n1 = !n1;
62336229
}
62346230
}
@@ -6239,11 +6235,11 @@ typval_compare(
62396235
{
62406236
n1 = (typ1->v_type == typ2->v_type
62416237
&& typ1->vval.v_dict == typ2->vval.v_dict);
6242-
if (type == TYPE_NEQUAL)
6238+
if (type == ETYPE_ISNOT)
62436239
n1 = !n1;
62446240
}
62456241
else if (typ1->v_type != typ2->v_type
6246-
|| (type != TYPE_EQUAL && type != TYPE_NEQUAL))
6242+
|| (type != ETYPE_EQUAL && type != ETYPE_NEQUAL))
62476243
{
62486244
if (typ1->v_type != typ2->v_type)
62496245
emsg(_("E735: Can only compare Dictionary with Dictionary"));
@@ -6257,15 +6253,15 @@ typval_compare(
62576253
// Compare two Dictionaries for being equal or unequal.
62586254
n1 = dict_equal(typ1->vval.v_dict, typ2->vval.v_dict,
62596255
ic, FALSE);
6260-
if (type == TYPE_NEQUAL)
6256+
if (type == ETYPE_NEQUAL)
62616257
n1 = !n1;
62626258
}
62636259
}
62646260

62656261
else if (typ1->v_type == VAR_FUNC || typ2->v_type == VAR_FUNC
62666262
|| typ1->v_type == VAR_PARTIAL || typ2->v_type == VAR_PARTIAL)
62676263
{
6268-
if (type != TYPE_EQUAL && type != TYPE_NEQUAL)
6264+
if (type != ETYPE_EQUAL && type != ETYPE_NEQUAL)
62696265
{
62706266
emsg(_("E694: Invalid operation for Funcrefs"));
62716267
clear_tv(typ1);
@@ -6291,7 +6287,7 @@ typval_compare(
62916287
}
62926288
else
62936289
n1 = tv_equal(typ1, typ2, ic, FALSE);
6294-
if (type == TYPE_NEQUAL)
6290+
if (type == ETYPE_NEQUAL || type == ETYPE_ISNOT)
62956291
n1 = !n1;
62966292
}
62976293

@@ -6301,7 +6297,7 @@ typval_compare(
63016297
* When using "=~" or "!~", always compare as string.
63026298
*/
63036299
else if ((typ1->v_type == VAR_FLOAT || typ2->v_type == VAR_FLOAT)
6304-
&& type != TYPE_MATCH && type != TYPE_NOMATCH)
6300+
&& type != ETYPE_MATCH && type != ETYPE_NOMATCH)
63056301
{
63066302
float_T f1, f2;
63076303

@@ -6310,15 +6306,17 @@ typval_compare(
63106306
n1 = FALSE;
63116307
switch (type)
63126308
{
6313-
case TYPE_EQUAL: n1 = (f1 == f2); break;
6314-
case TYPE_NEQUAL: n1 = (f1 != f2); break;
6315-
case TYPE_GREATER: n1 = (f1 > f2); break;
6316-
case TYPE_GEQUAL: n1 = (f1 >= f2); break;
6317-
case TYPE_SMALLER: n1 = (f1 < f2); break;
6318-
case TYPE_SEQUAL: n1 = (f1 <= f2); break;
6319-
case TYPE_UNKNOWN:
6320-
case TYPE_MATCH:
6321-
case TYPE_NOMATCH: break; // avoid gcc warning
6309+
case ETYPE_EQUAL: n1 = (f1 == f2); break;
6310+
case ETYPE_NEQUAL: n1 = (f1 != f2); break;
6311+
case ETYPE_GREATER: n1 = (f1 > f2); break;
6312+
case ETYPE_GEQUAL: n1 = (f1 >= f2); break;
6313+
case ETYPE_SMALLER: n1 = (f1 < f2); break;
6314+
case ETYPE_SEQUAL: n1 = (f1 <= f2); break;
6315+
case ETYPE_UNKNOWN:
6316+
case ETYPE_IS:
6317+
case ETYPE_ISNOT:
6318+
case ETYPE_MATCH:
6319+
case ETYPE_NOMATCH: break; // avoid gcc warning
63226320
}
63236321
}
63246322
#endif
@@ -6328,49 +6326,53 @@ typval_compare(
63286326
* When using "=~" or "!~", always compare as string.
63296327
*/
63306328
else if ((typ1->v_type == VAR_NUMBER || typ2->v_type == VAR_NUMBER)
6331-
&& type != TYPE_MATCH && type != TYPE_NOMATCH)
6329+
&& type != ETYPE_MATCH && type != ETYPE_NOMATCH)
63326330
{
63336331
n1 = tv_get_number(typ1);
63346332
n2 = tv_get_number(typ2);
63356333
switch (type)
63366334
{
6337-
case TYPE_EQUAL: n1 = (n1 == n2); break;
6338-
case TYPE_NEQUAL: n1 = (n1 != n2); break;
6339-
case TYPE_GREATER: n1 = (n1 > n2); break;
6340-
case TYPE_GEQUAL: n1 = (n1 >= n2); break;
6341-
case TYPE_SMALLER: n1 = (n1 < n2); break;
6342-
case TYPE_SEQUAL: n1 = (n1 <= n2); break;
6343-
case TYPE_UNKNOWN:
6344-
case TYPE_MATCH:
6345-
case TYPE_NOMATCH: break; // avoid gcc warning
6335+
case ETYPE_EQUAL: n1 = (n1 == n2); break;
6336+
case ETYPE_NEQUAL: n1 = (n1 != n2); break;
6337+
case ETYPE_GREATER: n1 = (n1 > n2); break;
6338+
case ETYPE_GEQUAL: n1 = (n1 >= n2); break;
6339+
case ETYPE_SMALLER: n1 = (n1 < n2); break;
6340+
case ETYPE_SEQUAL: n1 = (n1 <= n2); break;
6341+
case ETYPE_UNKNOWN:
6342+
case ETYPE_IS:
6343+
case ETYPE_ISNOT:
6344+
case ETYPE_MATCH:
6345+
case ETYPE_NOMATCH: break; // avoid gcc warning
63466346
}
63476347
}
63486348
else
63496349
{
63506350
s1 = tv_get_string_buf(typ1, buf1);
63516351
s2 = tv_get_string_buf(typ2, buf2);
6352-
if (type != TYPE_MATCH && type != TYPE_NOMATCH)
6352+
if (type != ETYPE_MATCH && type != ETYPE_NOMATCH)
63536353
i = ic ? MB_STRICMP(s1, s2) : STRCMP(s1, s2);
63546354
else
63556355
i = 0;
63566356
n1 = FALSE;
63576357
switch (type)
63586358
{
6359-
case TYPE_EQUAL: n1 = (i == 0); break;
6360-
case TYPE_NEQUAL: n1 = (i != 0); break;
6361-
case TYPE_GREATER: n1 = (i > 0); break;
6362-
case TYPE_GEQUAL: n1 = (i >= 0); break;
6363-
case TYPE_SMALLER: n1 = (i < 0); break;
6364-
case TYPE_SEQUAL: n1 = (i <= 0); break;
6365-
6366-
case TYPE_MATCH:
6367-
case TYPE_NOMATCH:
6359+
case ETYPE_EQUAL: n1 = (i == 0); break;
6360+
case ETYPE_NEQUAL: n1 = (i != 0); break;
6361+
case ETYPE_GREATER: n1 = (i > 0); break;
6362+
case ETYPE_GEQUAL: n1 = (i >= 0); break;
6363+
case ETYPE_SMALLER: n1 = (i < 0); break;
6364+
case ETYPE_SEQUAL: n1 = (i <= 0); break;
6365+
6366+
case ETYPE_MATCH:
6367+
case ETYPE_NOMATCH:
63686368
n1 = pattern_match(s2, s1, ic);
6369-
if (type == TYPE_NOMATCH)
6369+
if (type == ETYPE_NOMATCH)
63706370
n1 = !n1;
63716371
break;
63726372

6373-
case TYPE_UNKNOWN: break; // avoid gcc warning
6373+
case ETYPE_IS:
6374+
case ETYPE_ISNOT:
6375+
case ETYPE_UNKNOWN: break; // avoid gcc warning
63746376
}
63756377
}
63766378
clear_tv(typ1);

src/proto/eval.pro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ int get_echo_attr(void);
7272
void ex_execute(exarg_T *eap);
7373
char_u *find_option_end(char_u **arg, int *opt_flags);
7474
void last_set_msg(sctx_T script_ctx);
75-
int typval_compare(typval_T *typ1, typval_T *typ2, exptype_T type, int type_is, int ic);
75+
int typval_compare(typval_T *typ1, typval_T *typ2, exptype_T type, int ic);
7676
char_u *typval_tostring(typval_T *arg);
7777
char_u *do_string_sub(char_u *str, char_u *pat, char_u *sub, typval_T *expr, char_u *flags);
7878
/* vim: set ft=c : */

src/structs.h

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3628,15 +3628,17 @@ typedef struct {
36283628
*/
36293629
typedef enum
36303630
{
3631-
TYPE_UNKNOWN = 0,
3632-
TYPE_EQUAL, // ==
3633-
TYPE_NEQUAL, // !=
3634-
TYPE_GREATER, // >
3635-
TYPE_GEQUAL, // >=
3636-
TYPE_SMALLER, // <
3637-
TYPE_SEQUAL, // <=
3638-
TYPE_MATCH, // =~
3639-
TYPE_NOMATCH, // !~
3631+
ETYPE_UNKNOWN = 0,
3632+
ETYPE_EQUAL, // ==
3633+
ETYPE_NEQUAL, // !=
3634+
ETYPE_GREATER, // >
3635+
ETYPE_GEQUAL, // >=
3636+
ETYPE_SMALLER, // <
3637+
ETYPE_SEQUAL, // <=
3638+
ETYPE_MATCH, // =~
3639+
ETYPE_NOMATCH, // !~
3640+
ETYPE_IS, // is
3641+
ETYPE_ISNOT, // isnot
36403642
} exptype_T;
36413643

36423644
/*

src/version.c

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

743743
static int included_patches[] =
744744
{ /* Add new patch number below this line */
745+
/**/
746+
44,
745747
/**/
746748
43,
747749
/**/

0 commit comments

Comments
 (0)