Patch 7.4.723
Problem:    For indenting, finding the C++ baseclass can be slow.
Solution:   Cache the result. (Hirohito Higashi)
Files:      src/misc1.c


*** ../vim-7.4.722/src/misc1.c  2015-03-31 13:33:00.797524914 +0200
--- src/misc1.c 2015-05-04 17:45:41.108783310 +0200
***************
*** 5376,5381 ****
--- 5376,5387 ----
        fixthisline(get_c_indent);
  }
  
+ /* Find result cache for cpp_baseclass */
+ typedef struct {
+     int           found;
+     lpos_T  lpos;
+ } cpp_baseclass_cache_T;
+ 
  /*
   * Functions for C-indenting.
   * Most of this originally comes from Eric Fischer.
***************
*** 5409,5415 ****
  static int    cin_is_if_for_while_before_offset __ARGS((char_u *line, int 
*poffset));
  static int    cin_iswhileofdo_end __ARGS((int terminated));
  static int    cin_isbreak __ARGS((char_u *));
! static int    cin_is_cpp_baseclass __ARGS((colnr_T *col));
  static int    get_baseclass_amount __ARGS((int col));
  static int    cin_ends_in __ARGS((char_u *, char_u *, char_u *));
  static int    cin_starts_with __ARGS((char_u *s, char *word));
--- 5415,5421 ----
  static int    cin_is_if_for_while_before_offset __ARGS((char_u *line, int 
*poffset));
  static int    cin_iswhileofdo_end __ARGS((int terminated));
  static int    cin_isbreak __ARGS((char_u *));
! static int    cin_is_cpp_baseclass __ARGS((cpp_baseclass_cache_T *cached));
  static int    get_baseclass_amount __ARGS((int col));
  static int    cin_ends_in __ARGS((char_u *, char_u *, char_u *));
  static int    cin_starts_with __ARGS((char_u *s, char *word));
***************
*** 6372,6386 ****
   * This is a lot of guessing.  Watch out for "cond ? func() : foo".
   */
      static int
! cin_is_cpp_baseclass(col)
!     colnr_T   *col;       /* return: column to align with */
  {
      char_u    *s;
      int               class_or_struct, lookfor_ctor_init, cpp_base_class;
      linenr_T  lnum = curwin->w_cursor.lnum;
      char_u    *line = ml_get_curline();
  
!     *col = 0;
  
      s = skipwhite(line);
      if (*s == '#')            /* skip #define FOO x ? (x) : x */
--- 6378,6396 ----
   * This is a lot of guessing.  Watch out for "cond ? func() : foo".
   */
      static int
! cin_is_cpp_baseclass(cached)
!     cpp_baseclass_cache_T *cached; /* input and output */
  {
+     lpos_T    *pos = &cached->lpos;       /* find position */
      char_u    *s;
      int               class_or_struct, lookfor_ctor_init, cpp_base_class;
      linenr_T  lnum = curwin->w_cursor.lnum;
      char_u    *line = ml_get_curline();
  
!     if (pos->lnum <= lnum)
!       return cached->found;   /* Use the cached result */
! 
!     pos->col = 0;
  
      s = skipwhite(line);
      if (*s == '#')            /* skip #define FOO x ? (x) : x */
***************
*** 6424,6429 ****
--- 6434,6440 ----
        --lnum;
      }
  
+     pos->lnum = lnum;
      line = ml_get(lnum);
      s = cin_skipcomment(line);
      for (;;)
***************
*** 6456,6462 ****
                 * cpp-base-class-declaration or constructor-initialization */
                cpp_base_class = TRUE;
                lookfor_ctor_init = class_or_struct = FALSE;
!               *col = 0;
                s = cin_skipcomment(s + 1);
            }
            else
--- 6467,6473 ----
                 * cpp-base-class-declaration or constructor-initialization */
                cpp_base_class = TRUE;
                lookfor_ctor_init = class_or_struct = FALSE;
!               pos->col = 0;
                s = cin_skipcomment(s + 1);
            }
            else
***************
*** 6497,6520 ****
                class_or_struct = FALSE;
                lookfor_ctor_init = FALSE;
            }
!           else if (*col == 0)
            {
                /* it can't be a constructor-initialization any more */
                lookfor_ctor_init = FALSE;
  
                /* the first statement starts here: lineup with this one... */
                if (cpp_base_class)
!                   *col = (colnr_T)(s - line);
            }
  
            /* When the line ends in a comma don't align with it. */
            if (lnum == curwin->w_cursor.lnum && *s == ',' && cin_nocode(s + 1))
!               *col = 0;
  
            s = cin_skipcomment(s + 1);
        }
      }
  
      return cpp_base_class;
  }
  
--- 6508,6534 ----
                class_or_struct = FALSE;
                lookfor_ctor_init = FALSE;
            }
!           else if (pos->col == 0)
            {
                /* it can't be a constructor-initialization any more */
                lookfor_ctor_init = FALSE;
  
                /* the first statement starts here: lineup with this one... */
                if (cpp_base_class)
!                   pos->col = (colnr_T)(s - line);
            }
  
            /* When the line ends in a comma don't align with it. */
            if (lnum == curwin->w_cursor.lnum && *s == ',' && cin_nocode(s + 1))
!               pos->col = 0;
  
            s = cin_skipcomment(s + 1);
        }
      }
  
+     cached->found = cpp_base_class;
+     if (cpp_base_class)
+       pos->lnum = lnum;
      return cpp_base_class;
  }
  
***************
*** 7047,7053 ****
  #define LOOKFOR_CPP_BASECLASS 9
  #define LOOKFOR_ENUM_OR_INIT  10
  #define LOOKFOR_JS_KEY                11
! #define LOOKFOR_COMMA 12
  
      int               whilelevel;
      linenr_T  lnum;
--- 7061,7067 ----
  #define LOOKFOR_CPP_BASECLASS 9
  #define LOOKFOR_ENUM_OR_INIT  10
  #define LOOKFOR_JS_KEY                11
! #define LOOKFOR_COMMA         12
  
      int               whilelevel;
      linenr_T  lnum;
***************
*** 7059,7064 ****
--- 7073,7079 ----
      int               original_line_islabel;
      int               added_to_amount = 0;
      int               js_cur_has_key = 0;
+     cpp_baseclass_cache_T cache_cpp_baseclass = { FALSE, { MAXLNUM, 0 } };
  
      /* make a copy, value is changed below */
      int               ind_continuation = curbuf->b_ind_continuation;
***************
*** 8089,8095 ****
                n = FALSE;
                if (lookfor != LOOKFOR_TERM && curbuf->b_ind_cpp_baseclass > 0)
                {
!                   n = cin_is_cpp_baseclass(&col);
                    l = ml_get_curline();
                }
                if (n)
--- 8104,8110 ----
                n = FALSE;
                if (lookfor != LOOKFOR_TERM && curbuf->b_ind_cpp_baseclass > 0)
                {
!                   n = cin_is_cpp_baseclass(&cache_cpp_baseclass);
                    l = ml_get_curline();
                }
                if (n)
***************
*** 8110,8116 ****
                    }
                    else
                                                                     /* XXX */
!                       amount = get_baseclass_amount(col);
                    break;
                }
                else if (lookfor == LOOKFOR_CPP_BASECLASS)
--- 8125,8132 ----
                    }
                    else
                                                                     /* XXX */
!                       amount = get_baseclass_amount(
!                                               cache_cpp_baseclass.lpos.col);
                    break;
                }
                else if (lookfor == LOOKFOR_CPP_BASECLASS)
***************
*** 8780,8792 ****
                n = FALSE;
                if (curbuf->b_ind_cpp_baseclass != 0 && theline[0] != '{')
                {
!                   n = cin_is_cpp_baseclass(&col);
                    l = ml_get_curline();
                }
                if (n)
                {
                                                                     /* XXX */
!                   amount = get_baseclass_amount(col);
                    break;
                }
  
--- 8796,8808 ----
                n = FALSE;
                if (curbuf->b_ind_cpp_baseclass != 0 && theline[0] != '{')
                {
!                   n = cin_is_cpp_baseclass(&cache_cpp_baseclass);
                    l = ml_get_curline();
                }
                if (n)
                {
                                                                     /* XXX */
!                   amount = get_baseclass_amount(cache_cpp_baseclass.lpos.col);
                    break;
                }
  
*** ../vim-7.4.722/src/version.c        2015-05-04 17:28:17.344445737 +0200
--- src/version.c       2015-05-04 17:30:58.030650914 +0200
***************
*** 743,744 ****
--- 743,746 ----
  {   /* Add new patch number below this line */
+ /**/
+     723,
  /**/

-- 
I have a drinking problem -- I don't have a drink!

 /// Bram Moolenaar -- b...@moolenaar.net -- 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 vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui