Mercurial > vim
diff src/eval.c @ 15904:fec4416adb80 v8.1.0958
patch 8.1.0958: compiling weird regexp pattern is very slow
commit https://github.com/vim/vim/commit/38f08e76acf7d21bb34cf8f79f0f82eb63cdc987
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Feb 20 22:04:32 2019 +0100
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.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 20 Feb 2019 22:15:05 +0100 |
parents | 7fad90423bd2 |
children | 9cc42db77a54 |
line wrap: on
line diff
--- a/src/eval.c +++ b/src/eval.c @@ -9365,32 +9365,65 @@ assert_inrange(typval_T *argvars) { 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) - { - 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", +#ifdef FEAT_FLOAT + if (argvars[0].v_type == VAR_FLOAT + || argvars[1].v_type == VAR_FLOAT + || argvars[2].v_type == VAR_FLOAT) + { + 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) + { + 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 +#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) + { + 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); - } - assert_error(&ga); - ga_clear(&ga); - return 1; + ga_concat(&ga, (char_u *)msg); + } + assert_error(&ga); + ga_clear(&ga); + return 1; + } } return 0; } @@ -9822,14 +9855,8 @@ typval_compare( { 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) {