patch 8.1.0958: compiling weird regexp pattern is very slow
Problem: Compiling weird regexp pattern is very slow.
Solution: When reallocating post list increase size by 50%. (Kuang-che Wu,
closes #4012) Make assert_inrange() accept float values.
diff --git a/src/eval.c b/src/eval.c
index f66d296..046688f 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -9365,32 +9365,65 @@
{
garray_T ga;
int error = FALSE;
- varnumber_T lower = tv_get_number_chk(&argvars[0], &error);
- varnumber_T upper = tv_get_number_chk(&argvars[1], &error);
- varnumber_T actual = tv_get_number_chk(&argvars[2], &error);
char_u *tofree;
char msg[200];
char_u numbuf[NUMBUFLEN];
- if (error)
- return 0;
- if (actual < lower || actual > upper)
+#ifdef FEAT_FLOAT
+ if (argvars[0].v_type == VAR_FLOAT
+ || argvars[1].v_type == VAR_FLOAT
+ || argvars[2].v_type == VAR_FLOAT)
{
- prepare_assert_error(&ga);
- if (argvars[3].v_type != VAR_UNKNOWN)
+ float_T flower = tv_get_float(&argvars[0]);
+ float_T fupper = tv_get_float(&argvars[1]);
+ float_T factual = tv_get_float(&argvars[2]);
+
+ if (factual < flower || factual > fupper)
{
- ga_concat(&ga, tv2string(&argvars[3], &tofree, numbuf, 0));
- vim_free(tofree);
+ prepare_assert_error(&ga);
+ if (argvars[3].v_type != VAR_UNKNOWN)
+ {
+ ga_concat(&ga, tv2string(&argvars[3], &tofree, numbuf, 0));
+ vim_free(tofree);
+ }
+ else
+ {
+ vim_snprintf(msg, 200, "Expected range %g - %g, but got %g",
+ flower, fupper, factual);
+ ga_concat(&ga, (char_u *)msg);
+ }
+ assert_error(&ga);
+ ga_clear(&ga);
+ return 1;
}
- else
+ }
+ else
+#endif
+ {
+ varnumber_T lower = tv_get_number_chk(&argvars[0], &error);
+ varnumber_T upper = tv_get_number_chk(&argvars[1], &error);
+ varnumber_T actual = tv_get_number_chk(&argvars[2], &error);
+
+ if (error)
+ return 0;
+ if (actual < lower || actual > upper)
{
- vim_snprintf(msg, 200, "Expected range %ld - %ld, but got %ld",
+ prepare_assert_error(&ga);
+ if (argvars[3].v_type != VAR_UNKNOWN)
+ {
+ ga_concat(&ga, tv2string(&argvars[3], &tofree, numbuf, 0));
+ vim_free(tofree);
+ }
+ else
+ {
+ vim_snprintf(msg, 200, "Expected range %ld - %ld, but got %ld",
(long)lower, (long)upper, (long)actual);
- ga_concat(&ga, (char_u *)msg);
+ ga_concat(&ga, (char_u *)msg);
+ }
+ assert_error(&ga);
+ ga_clear(&ga);
+ return 1;
}
- assert_error(&ga);
- ga_clear(&ga);
- return 1;
}
return 0;
}
@@ -9822,14 +9855,8 @@
{
float_T f1, f2;
- if (typ1->v_type == VAR_FLOAT)
- f1 = typ1->vval.v_float;
- else
- f1 = tv_get_number(typ1);
- if (typ2->v_type == VAR_FLOAT)
- f2 = typ2->vval.v_float;
- else
- f2 = tv_get_number(typ2);
+ f1 = tv_get_float(typ1);
+ f2 = tv_get_float(typ2);
n1 = FALSE;
switch (type)
{