Patch 8.1.0958
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.
Files:      src/regexp_nfa.c, src/eval.c, src/testdir/test_regexp_latin.vim,
            src/testdir/test_assert.vim


*** ../vim-8.1.0957/src/regexp_nfa.c    2019-02-17 20:16:58.101377164 +0100
--- src/regexp_nfa.c    2019-02-20 21:57:19.818765782 +0100
***************
*** 509,518 ****
  realloc_post_list(void)
  {
      int   nstate_max = (int)(post_end - post_start);
!     int   new_max = nstate_max + 1000;
      int   *new_start;
      int         *old_start;
  
      new_start = (int *)lalloc(new_max * sizeof(int), TRUE);
      if (new_start == NULL)
        return FAIL;
--- 509,521 ----
  realloc_post_list(void)
  {
      int   nstate_max = (int)(post_end - post_start);
!     int   new_max;
      int   *new_start;
      int         *old_start;
  
+     // For weird patterns the number of states can be very high. Increasing by
+     // 50% seems a reasonable compromise between memory use and speed.
+     new_max = nstate_max * 3 / 2;
      new_start = (int *)lalloc(new_max * sizeof(int), TRUE);
      if (new_start == NULL)
        return FAIL;
*** ../vim-8.1.0957/src/eval.c  2019-02-17 17:44:36.203875545 +0100
--- src/eval.c  2019-02-20 21:51:44.813447677 +0100
***************
*** 9365,9396 ****
  {
      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",
                                       (long)lower, (long)upper, (long)actual);
!           ga_concat(&ga, (char_u *)msg);
        }
-       assert_error(&ga);
-       ga_clear(&ga);
-       return 1;
      }
      return 0;
  }
--- 9365,9429 ----
  {
      garray_T  ga;
      int               error = FALSE;
      char_u    *tofree;
      char      msg[200];
      char_u    numbuf[NUMBUFLEN];
  
! #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;
        }
      }
      return 0;
  }
***************
*** 9822,9835 ****
      {
        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);
        n1 = FALSE;
        switch (type)
        {
--- 9855,9862 ----
      {
        float_T f1, f2;
  
!       f1 = tv_get_float(typ1);
!       f2 = tv_get_float(typ2);
        n1 = FALSE;
        switch (type)
        {
*** ../vim-8.1.0957/src/testdir/test_regexp_latin.vim   2019-02-17 
20:16:58.101377164 +0100
--- src/testdir/test_regexp_latin.vim   2019-02-20 21:56:49.094997247 +0100
***************
*** 130,132 ****
--- 130,143 ----
    call assert_equal(0, search("[ -*\\t-\\n]"))
    bwipe!
  endfunc
+ 
+ func Test_pattern_compile_speed()
+   if !exists('+spellcapcheck') || !has('reltime')
+     return
+   endif
+   let start = reltime()
+   " this used to be very slow, not it should be about a second
+   set spc=\\v(((((Nxxxxxxx&&xxxx){179})+)+)+){179}
+   call assert_inrange(0.01, 10.0, reltimefloat(reltime(start)))
+   set spc=
+ endfunc
*** ../vim-8.1.0957/src/testdir/test_assert.vim 2019-01-25 20:48:29.381157353 
+0100
--- src/testdir/test_assert.vim 2019-02-20 21:55:13.587732935 +0100
***************
*** 190,195 ****
--- 190,211 ----
    call remove(v:errors, 0)
  
    call assert_fails('call assert_inrange(1, 1)', 'E119:')
+ 
+   if has('float')
+     call assert_equal(0, assert_inrange(7.0, 7, 7))
+     call assert_equal(0, assert_inrange(7, 7.0, 7))
+     call assert_equal(0, assert_inrange(7, 7, 7.0))
+     call assert_equal(0, assert_inrange(5, 7, 5.0))
+     call assert_equal(0, assert_inrange(5, 7, 6.0))
+     call assert_equal(0, assert_inrange(5, 7, 7.0))
+ 
+     call assert_equal(1, assert_inrange(5, 7, 4.0))
+     call assert_match("Expected range 5.0 - 7.0, but got 4.0", v:errors[0])
+     call remove(v:errors, 0)
+     call assert_equal(1, assert_inrange(5, 7, 8.0))
+     call assert_match("Expected range 5.0 - 7.0, but got 8.0", v:errors[0])
+     call remove(v:errors, 0)
+   endif
  endfunc
  
  func Test_assert_with_msg()
*** ../vim-8.1.0957/src/version.c       2019-02-20 20:36:55.741352867 +0100
--- src/version.c       2019-02-20 22:03:18.520201671 +0100
***************
*** 781,782 ****
--- 781,784 ----
  {   /* Add new patch number below this line */
+ /**/
+     958,
  /**/

-- 
If someone questions your market projections, simply point out that your
target market is "People who are nuts" and "People who will buy any damn
thing".  Nobody is going to tell you there aren't enough of those people
to go around.
                                (Scott Adams - The Dilbert principle)

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui