Skip to content

Commit fd908de

Browse files
authored
Merge pull request neovim#14339 from janlazo/vim-8.2.0044
vim-patch:8.2.{44,45,69,2319}
2 parents 2e156a3 + b2971eb commit fd908de

File tree

3 files changed

+91
-76
lines changed

3 files changed

+91
-76
lines changed

src/nvim/eval.c

Lines changed: 78 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -3417,8 +3417,7 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate)
34173417
{
34183418
typval_T var2;
34193419
char_u *p;
3420-
exptype_T type = TYPE_UNKNOWN;
3421-
bool type_is = false; // true for "is" and "isnot"
3420+
exprtype_T type = EXPR_UNKNOWN;
34223421
int len = 2;
34233422
bool ic;
34243423

@@ -3430,35 +3429,42 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate)
34303429

34313430
p = *arg;
34323431
switch (p[0]) {
3433-
case '=': if (p[1] == '=')
3434-
type = TYPE_EQUAL;
3435-
else if (p[1] == '~')
3436-
type = TYPE_MATCH;
3432+
case '=':
3433+
if (p[1] == '=') {
3434+
type = EXPR_EQUAL;
3435+
} else if (p[1] == '~') {
3436+
type = EXPR_MATCH;
3437+
}
34373438
break;
3438-
case '!': if (p[1] == '=')
3439-
type = TYPE_NEQUAL;
3440-
else if (p[1] == '~')
3441-
type = TYPE_NOMATCH;
3439+
case '!':
3440+
if (p[1] == '=') {
3441+
type = EXPR_NEQUAL;
3442+
} else if (p[1] == '~') {
3443+
type = EXPR_NOMATCH;
3444+
}
34423445
break;
3443-
case '>': if (p[1] != '=') {
3444-
type = TYPE_GREATER;
3446+
case '>':
3447+
if (p[1] != '=') {
3448+
type = EXPR_GREATER;
34453449
len = 1;
3446-
} else
3447-
type = TYPE_GEQUAL;
3450+
} else {
3451+
type = EXPR_GEQUAL;
3452+
}
34483453
break;
3449-
case '<': if (p[1] != '=') {
3450-
type = TYPE_SMALLER;
3454+
case '<':
3455+
if (p[1] != '=') {
3456+
type = EXPR_SMALLER;
34513457
len = 1;
3452-
} else
3453-
type = TYPE_SEQUAL;
3458+
} else {
3459+
type = EXPR_SEQUAL;
3460+
}
34543461
break;
34553462
case 'i': if (p[1] == 's') {
34563463
if (p[2] == 'n' && p[3] == 'o' && p[4] == 't') {
34573464
len = 5;
34583465
}
34593466
if (!isalnum(p[len]) && p[len] != '_') {
3460-
type = len == 2 ? TYPE_EQUAL : TYPE_NEQUAL;
3461-
type_is = true;
3467+
type = len == 2 ? EXPR_IS : EXPR_ISNOT;
34623468
}
34633469
}
34643470
break;
@@ -3467,7 +3473,7 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate)
34673473
/*
34683474
* If there is a comparative operator, use it.
34693475
*/
3470-
if (type != TYPE_UNKNOWN) {
3476+
if (type != EXPR_UNKNOWN) {
34713477
// extra question mark appended: ignore case
34723478
if (p[len] == '?') {
34733479
ic = true;
@@ -3486,7 +3492,7 @@ static int eval4(char_u **arg, typval_T *rettv, int evaluate)
34863492
return FAIL;
34873493
}
34883494
if (evaluate) {
3489-
const int ret = typval_compare(rettv, &var2, type, type_is, ic);
3495+
const int ret = typval_compare(rettv, &var2, type, ic);
34903496

34913497
tv_clear(&var2);
34923498
return ret;
@@ -10582,27 +10588,27 @@ bool invoke_prompt_interrupt(void)
1058210588
int typval_compare(
1058310589
typval_T *typ1, // first operand
1058410590
typval_T *typ2, // second operand
10585-
exptype_T type, // operator
10586-
bool type_is, // true for "is" and "isnot"
10591+
exprtype_T type, // operator
1058710592
bool ic // ignore case
1058810593
)
1058910594
FUNC_ATTR_NONNULL_ALL
1059010595
{
1059110596
varnumber_T n1, n2;
10597+
const bool type_is = type == EXPR_IS || type == EXPR_ISNOT;
1059210598

1059310599
if (type_is && typ1->v_type != typ2->v_type) {
1059410600
// For "is" a different type always means false, for "notis"
1059510601
// it means true.
10596-
n1 = type == TYPE_NEQUAL;
10602+
n1 = type == EXPR_ISNOT;
1059710603
} else if (typ1->v_type == VAR_LIST || typ2->v_type == VAR_LIST) {
1059810604
if (type_is) {
1059910605
n1 = typ1->v_type == typ2->v_type
1060010606
&& typ1->vval.v_list == typ2->vval.v_list;
10601-
if (type == TYPE_NEQUAL) {
10607+
if (type == EXPR_ISNOT) {
1060210608
n1 = !n1;
1060310609
}
1060410610
} else if (typ1->v_type != typ2->v_type
10605-
|| (type != TYPE_EQUAL && type != TYPE_NEQUAL)) {
10611+
|| (type != EXPR_EQUAL && type != EXPR_NEQUAL)) {
1060610612
if (typ1->v_type != typ2->v_type) {
1060710613
EMSG(_("E691: Can only compare List with List"));
1060810614
} else {
@@ -10613,19 +10619,19 @@ int typval_compare(
1061310619
} else {
1061410620
// Compare two Lists for being equal or unequal.
1061510621
n1 = tv_list_equal(typ1->vval.v_list, typ2->vval.v_list, ic, false);
10616-
if (type == TYPE_NEQUAL) {
10622+
if (type == EXPR_NEQUAL) {
1061710623
n1 = !n1;
1061810624
}
1061910625
}
1062010626
} else if (typ1->v_type == VAR_DICT || typ2->v_type == VAR_DICT) {
1062110627
if (type_is) {
1062210628
n1 = typ1->v_type == typ2->v_type
1062310629
&& typ1->vval.v_dict == typ2->vval.v_dict;
10624-
if (type == TYPE_NEQUAL) {
10630+
if (type == EXPR_ISNOT) {
1062510631
n1 = !n1;
1062610632
}
1062710633
} else if (typ1->v_type != typ2->v_type
10628-
|| (type != TYPE_EQUAL && type != TYPE_NEQUAL)) {
10634+
|| (type != EXPR_EQUAL && type != EXPR_NEQUAL)) {
1062910635
if (typ1->v_type != typ2->v_type) {
1063010636
EMSG(_("E735: Can only compare Dictionary with Dictionary"));
1063110637
} else {
@@ -10636,12 +10642,13 @@ int typval_compare(
1063610642
} else {
1063710643
// Compare two Dictionaries for being equal or unequal.
1063810644
n1 = tv_dict_equal(typ1->vval.v_dict, typ2->vval.v_dict, ic, false);
10639-
if (type == TYPE_NEQUAL) {
10645+
if (type == EXPR_NEQUAL) {
1064010646
n1 = !n1;
1064110647
}
1064210648
}
1064310649
} else if (tv_is_func(*typ1) || tv_is_func(*typ2)) {
10644-
if (type != TYPE_EQUAL && type != TYPE_NEQUAL) {
10650+
if (type != EXPR_EQUAL && type != EXPR_NEQUAL
10651+
&& type != EXPR_IS && type != EXPR_ISNOT) {
1064510652
EMSG(_("E694: Invalid operation for Funcrefs"));
1064610653
tv_clear(typ1);
1064710654
return FAIL;
@@ -10663,72 +10670,78 @@ int typval_compare(
1066310670
} else {
1066410671
n1 = tv_equal(typ1, typ2, ic, false);
1066510672
}
10666-
if (type == TYPE_NEQUAL) {
10673+
if (type == EXPR_NEQUAL || type == EXPR_ISNOT) {
1066710674
n1 = !n1;
1066810675
}
1066910676
} else if ((typ1->v_type == VAR_FLOAT || typ2->v_type == VAR_FLOAT)
10670-
&& type != TYPE_MATCH && type != TYPE_NOMATCH) {
10677+
&& type != EXPR_MATCH && type != EXPR_NOMATCH) {
1067110678
// If one of the two variables is a float, compare as a float.
1067210679
// When using "=~" or "!~", always compare as string.
1067310680
const float_T f1 = tv_get_float(typ1);
1067410681
const float_T f2 = tv_get_float(typ2);
1067510682
n1 = false;
1067610683
switch (type) {
10677-
case TYPE_EQUAL: n1 = f1 == f2; break;
10678-
case TYPE_NEQUAL: n1 = f1 != f2; break;
10679-
case TYPE_GREATER: n1 = f1 > f2; break;
10680-
case TYPE_GEQUAL: n1 = f1 >= f2; break;
10681-
case TYPE_SMALLER: n1 = f1 < f2; break;
10682-
case TYPE_SEQUAL: n1 = f1 <= f2; break;
10683-
case TYPE_UNKNOWN:
10684-
case TYPE_MATCH:
10685-
case TYPE_NOMATCH: break;
10684+
case EXPR_IS:
10685+
case EXPR_EQUAL: n1 = f1 == f2; break;
10686+
case EXPR_ISNOT:
10687+
case EXPR_NEQUAL: n1 = f1 != f2; break;
10688+
case EXPR_GREATER: n1 = f1 > f2; break;
10689+
case EXPR_GEQUAL: n1 = f1 >= f2; break;
10690+
case EXPR_SMALLER: n1 = f1 < f2; break;
10691+
case EXPR_SEQUAL: n1 = f1 <= f2; break;
10692+
case EXPR_UNKNOWN:
10693+
case EXPR_MATCH:
10694+
case EXPR_NOMATCH: break; // avoid gcc warning
1068610695
}
1068710696
} else if ((typ1->v_type == VAR_NUMBER || typ2->v_type == VAR_NUMBER)
10688-
&& type != TYPE_MATCH && type != TYPE_NOMATCH) {
10697+
&& type != EXPR_MATCH && type != EXPR_NOMATCH) {
1068910698
// If one of the two variables is a number, compare as a number.
1069010699
// When using "=~" or "!~", always compare as string.
1069110700
n1 = tv_get_number(typ1);
1069210701
n2 = tv_get_number(typ2);
1069310702
switch (type) {
10694-
case TYPE_EQUAL: n1 = n1 == n2; break;
10695-
case TYPE_NEQUAL: n1 = n1 != n2; break;
10696-
case TYPE_GREATER: n1 = n1 > n2; break;
10697-
case TYPE_GEQUAL: n1 = n1 >= n2; break;
10698-
case TYPE_SMALLER: n1 = n1 < n2; break;
10699-
case TYPE_SEQUAL: n1 = n1 <= n2; break;
10700-
case TYPE_UNKNOWN:
10701-
case TYPE_MATCH:
10702-
case TYPE_NOMATCH: break;
10703+
case EXPR_IS:
10704+
case EXPR_EQUAL: n1 = n1 == n2; break;
10705+
case EXPR_ISNOT:
10706+
case EXPR_NEQUAL: n1 = n1 != n2; break;
10707+
case EXPR_GREATER: n1 = n1 > n2; break;
10708+
case EXPR_GEQUAL: n1 = n1 >= n2; break;
10709+
case EXPR_SMALLER: n1 = n1 < n2; break;
10710+
case EXPR_SEQUAL: n1 = n1 <= n2; break;
10711+
case EXPR_UNKNOWN:
10712+
case EXPR_MATCH:
10713+
case EXPR_NOMATCH: break; // avoid gcc warning
1070310714
}
1070410715
} else {
1070510716
char buf1[NUMBUFLEN];
1070610717
char buf2[NUMBUFLEN];
1070710718
const char *const s1 = tv_get_string_buf(typ1, buf1);
1070810719
const char *const s2 = tv_get_string_buf(typ2, buf2);
1070910720
int i;
10710-
if (type != TYPE_MATCH && type != TYPE_NOMATCH) {
10721+
if (type != EXPR_MATCH && type != EXPR_NOMATCH) {
1071110722
i = mb_strcmp_ic(ic, s1, s2);
1071210723
} else {
1071310724
i = 0;
1071410725
}
1071510726
n1 = false;
1071610727
switch (type) {
10717-
case TYPE_EQUAL: n1 = i == 0; break;
10718-
case TYPE_NEQUAL: n1 = i != 0; break;
10719-
case TYPE_GREATER: n1 = i > 0; break;
10720-
case TYPE_GEQUAL: n1 = i >= 0; break;
10721-
case TYPE_SMALLER: n1 = i < 0; break;
10722-
case TYPE_SEQUAL: n1 = i <= 0; break;
10723-
10724-
case TYPE_MATCH:
10725-
case TYPE_NOMATCH:
10728+
case EXPR_IS:
10729+
case EXPR_EQUAL: n1 = i == 0; break;
10730+
case EXPR_ISNOT:
10731+
case EXPR_NEQUAL: n1 = i != 0; break;
10732+
case EXPR_GREATER: n1 = i > 0; break;
10733+
case EXPR_GEQUAL: n1 = i >= 0; break;
10734+
case EXPR_SMALLER: n1 = i < 0; break;
10735+
case EXPR_SEQUAL: n1 = i <= 0; break;
10736+
10737+
case EXPR_MATCH:
10738+
case EXPR_NOMATCH:
1072610739
n1 = pattern_match((char_u *)s2, (char_u *)s1, ic);
10727-
if (type == TYPE_NOMATCH) {
10740+
if (type == EXPR_NOMATCH) {
1072810741
n1 = !n1;
1072910742
}
1073010743
break;
10731-
case TYPE_UNKNOWN: break; // Avoid gcc warning.
10744+
case EXPR_UNKNOWN: break; // avoid gcc warning
1073210745
}
1073310746
}
1073410747
tv_clear(typ1);

src/nvim/eval.h

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -230,16 +230,18 @@ typedef enum
230230

231231
/// types for expressions.
232232
typedef enum {
233-
TYPE_UNKNOWN = 0,
234-
TYPE_EQUAL, ///< ==
235-
TYPE_NEQUAL, ///< !=
236-
TYPE_GREATER, ///< >
237-
TYPE_GEQUAL, ///< >=
238-
TYPE_SMALLER, ///< <
239-
TYPE_SEQUAL, ///< <=
240-
TYPE_MATCH, ///< =~
241-
TYPE_NOMATCH, ///< !~
242-
} exptype_T;
233+
EXPR_UNKNOWN = 0,
234+
EXPR_EQUAL, ///< ==
235+
EXPR_NEQUAL, ///< !=
236+
EXPR_GREATER, ///< >
237+
EXPR_GEQUAL, ///< >=
238+
EXPR_SMALLER, ///< <
239+
EXPR_SEQUAL, ///< <=
240+
EXPR_MATCH, ///< =~
241+
EXPR_NOMATCH, ///< !~
242+
EXPR_IS, ///< is
243+
EXPR_ISNOT, ///< isnot
244+
} exprtype_T;
243245

244246
/// Type for dict_list function
245247
typedef enum {

src/nvim/ex_cmds2.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,7 @@ debuggy_find(
876876
debug_newval = typval_tostring(bp->dbg_val);
877877
line = true;
878878
} else {
879-
if (typval_compare(tv, bp->dbg_val, TYPE_EQUAL, true, false) == OK
879+
if (typval_compare(tv, bp->dbg_val, EXPR_IS, false) == OK
880880
&& tv->vval.v_number == false) {
881881
line = true;
882882
debug_oldval = typval_tostring(bp->dbg_val);

0 commit comments

Comments
 (0)