Karsten Hopp 37f315
To: vim_dev@googlegroups.com
Karsten Hopp 37f315
Subject: Patch 7.3.603
Karsten Hopp 37f315
Fcc: outbox
Karsten Hopp 37f315
From: Bram Moolenaar <Bram@moolenaar.net>
Karsten Hopp 37f315
Mime-Version: 1.0
Karsten Hopp 37f315
Content-Type: text/plain; charset=UTF-8
Karsten Hopp 37f315
Content-Transfer-Encoding: 8bit
Karsten Hopp 37f315
------------
Karsten Hopp 37f315
Karsten Hopp 37f315
Patch 7.3.603
Karsten Hopp 37f315
Problem:    It is possible to add replace builtin functions by calling
Karsten Hopp 37f315
	    extend() on g:.
Karsten Hopp 37f315
Solution:   Add a flag to a dict to indicate it is a scope.  Check for
Karsten Hopp 37f315
	    existing functions. (ZyX)
Karsten Hopp 37f315
Files:	    src/buffer.c, src/eval.c, src/proto/eval.pro, src/structs.h,
Karsten Hopp 37f315
	    src/testdir/test34.in, src/testdir/test34.ok, src/window.c
Karsten Hopp 37f315
Karsten Hopp 37f315
Karsten Hopp 37f315
*** ../vim-7.3.602/src/buffer.c	2012-07-10 15:18:18.000000000 +0200
Karsten Hopp 37f315
--- src/buffer.c	2012-07-16 16:52:58.000000000 +0200
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 1747,1753 ****
Karsten Hopp 37f315
      buf->b_wininfo->wi_win = curwin;
Karsten Hopp 37f315
  
Karsten Hopp 37f315
  #ifdef FEAT_EVAL
Karsten Hopp 37f315
!     init_var_dict(&buf->b_vars, &buf->b_bufvar);    /* init b: variables */
Karsten Hopp 37f315
  #endif
Karsten Hopp 37f315
  #ifdef FEAT_SYN_HL
Karsten Hopp 37f315
      hash_init(&buf->b_s.b_keywtab);
Karsten Hopp 37f315
--- 1747,1754 ----
Karsten Hopp 37f315
      buf->b_wininfo->wi_win = curwin;
Karsten Hopp 37f315
  
Karsten Hopp 37f315
  #ifdef FEAT_EVAL
Karsten Hopp 37f315
!     /* init b: variables */
Karsten Hopp 37f315
!     init_var_dict(&buf->b_vars, &buf->b_bufvar, VAR_SCOPE);
Karsten Hopp 37f315
  #endif
Karsten Hopp 37f315
  #ifdef FEAT_SYN_HL
Karsten Hopp 37f315
      hash_init(&buf->b_s.b_keywtab);
Karsten Hopp 37f315
*** ../vim-7.3.602/src/eval.c	2012-07-10 13:41:09.000000000 +0200
Karsten Hopp 37f315
--- src/eval.c	2012-07-16 17:18:11.000000000 +0200
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 850,857 ****
Karsten Hopp 37f315
      int		    i;
Karsten Hopp 37f315
      struct vimvar   *p;
Karsten Hopp 37f315
  
Karsten Hopp 37f315
!     init_var_dict(&globvardict, &globvars_var);
Karsten Hopp 37f315
!     init_var_dict(&vimvardict, &vimvars_var);
Karsten Hopp 37f315
      vimvardict.dv_lock = VAR_FIXED;
Karsten Hopp 37f315
      hash_init(&compat_hashtab);
Karsten Hopp 37f315
      hash_init(&func_hashtab);
Karsten Hopp 37f315
--- 850,857 ----
Karsten Hopp 37f315
      int		    i;
Karsten Hopp 37f315
      struct vimvar   *p;
Karsten Hopp 37f315
  
Karsten Hopp 37f315
!     init_var_dict(&globvardict, &globvars_var, VAR_DEF_SCOPE);
Karsten Hopp 37f315
!     init_var_dict(&vimvardict, &vimvars_var, VAR_SCOPE);
Karsten Hopp 37f315
      vimvardict.dv_lock = VAR_FIXED;
Karsten Hopp 37f315
      hash_init(&compat_hashtab);
Karsten Hopp 37f315
      hash_init(&func_hashtab);
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 2725,2738 ****
Karsten Hopp 37f315
  	    lp->ll_dict = lp->ll_tv->vval.v_dict;
Karsten Hopp 37f315
  	    lp->ll_di = dict_find(lp->ll_dict, key, len);
Karsten Hopp 37f315
  
Karsten Hopp 37f315
! 	    /* When assigning to g: check that a function and variable name is
Karsten Hopp 37f315
! 	     * valid. */
Karsten Hopp 37f315
! 	    if (rettv != NULL && lp->ll_dict == &globvardict)
Karsten Hopp 37f315
  	    {
Karsten Hopp 37f315
! 		if (rettv->v_type == VAR_FUNC
Karsten Hopp 37f315
  			       && var_check_func_name(key, lp->ll_di == NULL))
Karsten Hopp 37f315
! 		    return NULL;
Karsten Hopp 37f315
! 		if (!valid_varname(key))
Karsten Hopp 37f315
  		    return NULL;
Karsten Hopp 37f315
  	    }
Karsten Hopp 37f315
  
Karsten Hopp 37f315
--- 2725,2750 ----
Karsten Hopp 37f315
  	    lp->ll_dict = lp->ll_tv->vval.v_dict;
Karsten Hopp 37f315
  	    lp->ll_di = dict_find(lp->ll_dict, key, len);
Karsten Hopp 37f315
  
Karsten Hopp 37f315
! 	    /* When assigning to a scope dictionary check that a function and
Karsten Hopp 37f315
! 	     * variable name is valid (only variable name unless it is l: or
Karsten Hopp 37f315
! 	     * g: dictionary). Disallow overwriting a builtin function. */
Karsten Hopp 37f315
! 	    if (rettv != NULL && lp->ll_dict->dv_scope != 0)
Karsten Hopp 37f315
  	    {
Karsten Hopp 37f315
! 		int prevval;
Karsten Hopp 37f315
! 		int wrong;
Karsten Hopp 37f315
! 
Karsten Hopp 37f315
! 		if (len != -1)
Karsten Hopp 37f315
! 		{
Karsten Hopp 37f315
! 		    prevval = key[len];
Karsten Hopp 37f315
! 		    key[len] = NUL;
Karsten Hopp 37f315
! 		}
Karsten Hopp 37f315
! 		wrong = (lp->ll_dict->dv_scope == VAR_DEF_SCOPE
Karsten Hopp 37f315
! 			       && rettv->v_type == VAR_FUNC
Karsten Hopp 37f315
  			       && var_check_func_name(key, lp->ll_di == NULL))
Karsten Hopp 37f315
! 			|| !valid_varname(key);
Karsten Hopp 37f315
! 		if (len != -1)
Karsten Hopp 37f315
! 		    key[len] = prevval;
Karsten Hopp 37f315
! 		if (wrong)
Karsten Hopp 37f315
  		    return NULL;
Karsten Hopp 37f315
  	    }
Karsten Hopp 37f315
  
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 6951,6957 ****
Karsten Hopp 37f315
      d = (dict_T *)alloc(sizeof(dict_T));
Karsten Hopp 37f315
      if (d != NULL)
Karsten Hopp 37f315
      {
Karsten Hopp 37f315
! 	/* Add the list to the list of dicts for garbage collection. */
Karsten Hopp 37f315
  	if (first_dict != NULL)
Karsten Hopp 37f315
  	    first_dict->dv_used_prev = d;
Karsten Hopp 37f315
  	d->dv_used_next = first_dict;
Karsten Hopp 37f315
--- 6963,6969 ----
Karsten Hopp 37f315
      d = (dict_T *)alloc(sizeof(dict_T));
Karsten Hopp 37f315
      if (d != NULL)
Karsten Hopp 37f315
      {
Karsten Hopp 37f315
! 	/* Add the dict to the list of dicts for garbage collection. */
Karsten Hopp 37f315
  	if (first_dict != NULL)
Karsten Hopp 37f315
  	    first_dict->dv_used_prev = d;
Karsten Hopp 37f315
  	d->dv_used_next = first_dict;
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 6960,6965 ****
Karsten Hopp 37f315
--- 6972,6978 ----
Karsten Hopp 37f315
  
Karsten Hopp 37f315
  	hash_init(&d->dv_hashtab);
Karsten Hopp 37f315
  	d->dv_lock = 0;
Karsten Hopp 37f315
+ 	d->dv_scope = 0;
Karsten Hopp 37f315
  	d->dv_refcount = 0;
Karsten Hopp 37f315
  	d->dv_copyID = 0;
Karsten Hopp 37f315
      }
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 10203,10208 ****
Karsten Hopp 37f315
--- 10216,10234 ----
Karsten Hopp 37f315
  		{
Karsten Hopp 37f315
  		    --todo;
Karsten Hopp 37f315
  		    di1 = dict_find(d1, hi2->hi_key, -1);
Karsten Hopp 37f315
+ 		    if (d1->dv_scope != 0)
Karsten Hopp 37f315
+ 		    {
Karsten Hopp 37f315
+ 			/* Disallow replacing a builtin function in l: and g:.
Karsten Hopp 37f315
+ 			 * Check the key to be valid when adding to any
Karsten Hopp 37f315
+ 			 * scope. */
Karsten Hopp 37f315
+ 		        if (d1->dv_scope == VAR_DEF_SCOPE
Karsten Hopp 37f315
+ 				&& HI2DI(hi2)->di_tv.v_type == VAR_FUNC
Karsten Hopp 37f315
+ 				&& var_check_func_name(hi2->hi_key,
Karsten Hopp 37f315
+ 								 di1 == NULL))
Karsten Hopp 37f315
+ 			    break;
Karsten Hopp 37f315
+ 			if (!valid_varname(hi2->hi_key))
Karsten Hopp 37f315
+ 			    break;
Karsten Hopp 37f315
+ 		    }
Karsten Hopp 37f315
  		    if (di1 == NULL)
Karsten Hopp 37f315
  		    {
Karsten Hopp 37f315
  			di1 = dictitem_copy(HI2DI(hi2));
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 20027,20033 ****
Karsten Hopp 37f315
  	{
Karsten Hopp 37f315
  	    sv = SCRIPT_SV(ga_scripts.ga_len + 1) =
Karsten Hopp 37f315
  		(scriptvar_T *)alloc_clear(sizeof(scriptvar_T));
Karsten Hopp 37f315
! 	    init_var_dict(&sv->sv_dict, &sv->sv_var);
Karsten Hopp 37f315
  	    ++ga_scripts.ga_len;
Karsten Hopp 37f315
  	}
Karsten Hopp 37f315
      }
Karsten Hopp 37f315
--- 20053,20059 ----
Karsten Hopp 37f315
  	{
Karsten Hopp 37f315
  	    sv = SCRIPT_SV(ga_scripts.ga_len + 1) =
Karsten Hopp 37f315
  		(scriptvar_T *)alloc_clear(sizeof(scriptvar_T));
Karsten Hopp 37f315
! 	    init_var_dict(&sv->sv_dict, &sv->sv_var, VAR_SCOPE);
Karsten Hopp 37f315
  	    ++ga_scripts.ga_len;
Karsten Hopp 37f315
  	}
Karsten Hopp 37f315
      }
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 20038,20049 ****
Karsten Hopp 37f315
   * point to it.
Karsten Hopp 37f315
   */
Karsten Hopp 37f315
      void
Karsten Hopp 37f315
! init_var_dict(dict, dict_var)
Karsten Hopp 37f315
      dict_T	*dict;
Karsten Hopp 37f315
      dictitem_T	*dict_var;
Karsten Hopp 37f315
  {
Karsten Hopp 37f315
      hash_init(&dict->dv_hashtab);
Karsten Hopp 37f315
      dict->dv_lock = 0;
Karsten Hopp 37f315
      dict->dv_refcount = DO_NOT_FREE_CNT;
Karsten Hopp 37f315
      dict->dv_copyID = 0;
Karsten Hopp 37f315
      dict_var->di_tv.vval.v_dict = dict;
Karsten Hopp 37f315
--- 20064,20077 ----
Karsten Hopp 37f315
   * point to it.
Karsten Hopp 37f315
   */
Karsten Hopp 37f315
      void
Karsten Hopp 37f315
! init_var_dict(dict, dict_var, scope)
Karsten Hopp 37f315
      dict_T	*dict;
Karsten Hopp 37f315
      dictitem_T	*dict_var;
Karsten Hopp 37f315
+     int		scope;
Karsten Hopp 37f315
  {
Karsten Hopp 37f315
      hash_init(&dict->dv_hashtab);
Karsten Hopp 37f315
      dict->dv_lock = 0;
Karsten Hopp 37f315
+     dict->dv_scope = scope;
Karsten Hopp 37f315
      dict->dv_refcount = DO_NOT_FREE_CNT;
Karsten Hopp 37f315
      dict->dv_copyID = 0;
Karsten Hopp 37f315
      dict_var->di_tv.vval.v_dict = dict;
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 22304,22310 ****
Karsten Hopp 37f315
      /*
Karsten Hopp 37f315
       * Init l: variables.
Karsten Hopp 37f315
       */
Karsten Hopp 37f315
!     init_var_dict(&fc->l_vars, &fc->l_vars_var);
Karsten Hopp 37f315
      if (selfdict != NULL)
Karsten Hopp 37f315
      {
Karsten Hopp 37f315
  	/* Set l:self to "selfdict".  Use "name" to avoid a warning from
Karsten Hopp 37f315
--- 22332,22338 ----
Karsten Hopp 37f315
      /*
Karsten Hopp 37f315
       * Init l: variables.
Karsten Hopp 37f315
       */
Karsten Hopp 37f315
!     init_var_dict(&fc->l_vars, &fc->l_vars_var, VAR_DEF_SCOPE);
Karsten Hopp 37f315
      if (selfdict != NULL)
Karsten Hopp 37f315
      {
Karsten Hopp 37f315
  	/* Set l:self to "selfdict".  Use "name" to avoid a warning from
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 22325,22331 ****
Karsten Hopp 37f315
       * Set a:0 to "argcount".
Karsten Hopp 37f315
       * Set a:000 to a list with room for the "..." arguments.
Karsten Hopp 37f315
       */
Karsten Hopp 37f315
!     init_var_dict(&fc->l_avars, &fc->l_avars_var);
Karsten Hopp 37f315
      add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "0",
Karsten Hopp 37f315
  				(varnumber_T)(argcount - fp->uf_args.ga_len));
Karsten Hopp 37f315
      /* Use "name" to avoid a warning from some compiler that checks the
Karsten Hopp 37f315
--- 22353,22359 ----
Karsten Hopp 37f315
       * Set a:0 to "argcount".
Karsten Hopp 37f315
       * Set a:000 to a list with room for the "..." arguments.
Karsten Hopp 37f315
       */
Karsten Hopp 37f315
!     init_var_dict(&fc->l_avars, &fc->l_avars_var, VAR_SCOPE);
Karsten Hopp 37f315
      add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "0",
Karsten Hopp 37f315
  				(varnumber_T)(argcount - fp->uf_args.ga_len));
Karsten Hopp 37f315
      /* Use "name" to avoid a warning from some compiler that checks the
Karsten Hopp 37f315
*** ../vim-7.3.602/src/proto/eval.pro	2012-06-29 12:54:32.000000000 +0200
Karsten Hopp 37f315
--- src/proto/eval.pro	2012-07-16 16:55:16.000000000 +0200
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 93,99 ****
Karsten Hopp 37f315
  char_u *get_tv_string_chk __ARGS((typval_T *varp));
Karsten Hopp 37f315
  char_u *get_var_value __ARGS((char_u *name));
Karsten Hopp 37f315
  void new_script_vars __ARGS((scid_T id));
Karsten Hopp 37f315
! void init_var_dict __ARGS((dict_T *dict, dictitem_T *dict_var));
Karsten Hopp 37f315
  void vars_clear __ARGS((hashtab_T *ht));
Karsten Hopp 37f315
  void copy_tv __ARGS((typval_T *from, typval_T *to));
Karsten Hopp 37f315
  void ex_echo __ARGS((exarg_T *eap));
Karsten Hopp 37f315
--- 93,99 ----
Karsten Hopp 37f315
  char_u *get_tv_string_chk __ARGS((typval_T *varp));
Karsten Hopp 37f315
  char_u *get_var_value __ARGS((char_u *name));
Karsten Hopp 37f315
  void new_script_vars __ARGS((scid_T id));
Karsten Hopp 37f315
! void init_var_dict __ARGS((dict_T *dict, dictitem_T *dict_var, int scope));
Karsten Hopp 37f315
  void vars_clear __ARGS((hashtab_T *ht));
Karsten Hopp 37f315
  void copy_tv __ARGS((typval_T *from, typval_T *to));
Karsten Hopp 37f315
  void ex_echo __ARGS((exarg_T *eap));
Karsten Hopp 37f315
*** ../vim-7.3.602/src/structs.h	2012-06-06 19:02:40.000000000 +0200
Karsten Hopp 37f315
--- src/structs.h	2012-07-16 16:56:43.000000000 +0200
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 1106,1111 ****
Karsten Hopp 37f315
--- 1106,1116 ----
Karsten Hopp 37f315
  #define VAR_DICT    5	/* "v_dict" is used */
Karsten Hopp 37f315
  #define VAR_FLOAT   6	/* "v_float" is used */
Karsten Hopp 37f315
  
Karsten Hopp 37f315
+ /* Values for "dv_scope". */
Karsten Hopp 37f315
+ #define VAR_SCOPE     1	/* a:, v:, s:, etc. scope dictionaries */
Karsten Hopp 37f315
+ #define VAR_DEF_SCOPE 2	/* l:, g: scope dictionaries: here funcrefs are not
Karsten Hopp 37f315
+ 			   allowed to mask existing functions */
Karsten Hopp 37f315
+ 
Karsten Hopp 37f315
  /* Values for "v_lock". */
Karsten Hopp 37f315
  #define VAR_LOCKED  1	/* locked with lock(), can use unlock() */
Karsten Hopp 37f315
  #define VAR_FIXED   2	/* locked forever */
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 1181,1186 ****
Karsten Hopp 37f315
--- 1186,1192 ----
Karsten Hopp 37f315
      int		dv_copyID;	/* ID used by deepcopy() */
Karsten Hopp 37f315
      dict_T	*dv_copydict;	/* copied dict used by deepcopy() */
Karsten Hopp 37f315
      char	dv_lock;	/* zero, VAR_LOCKED, VAR_FIXED */
Karsten Hopp 37f315
+     char	dv_scope;	/* zero, VAR_SCOPE, VAR_DEF_SCOPE */
Karsten Hopp 37f315
      dict_T	*dv_used_next;	/* next dict in used dicts list */
Karsten Hopp 37f315
      dict_T	*dv_used_prev;	/* previous dict in used dicts list */
Karsten Hopp 37f315
  };
Karsten Hopp 37f315
*** ../vim-7.3.602/src/testdir/test34.in	2010-08-15 21:57:29.000000000 +0200
Karsten Hopp 37f315
--- src/testdir/test34.in	2012-07-16 16:51:29.000000000 +0200
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 1,5 ****
Karsten Hopp 37f315
--- 1,6 ----
Karsten Hopp 37f315
  Test for user functions.
Karsten Hopp 37f315
  Also test an <expr> mapping calling a function.
Karsten Hopp 37f315
+ Also test that a builtin function cannot be replaced.
Karsten Hopp 37f315
  
Karsten Hopp 37f315
  STARTTEST
Karsten Hopp 37f315
  :so small.vim
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 58,64 ****
Karsten Hopp 37f315
  ---*---
Karsten Hopp 37f315
  (one
Karsten Hopp 37f315
  (two
Karsten Hopp 37f315
! [(one again?:$-5,$w! test.out
Karsten Hopp 37f315
  :delfunc Table
Karsten Hopp 37f315
  :delfunc Compute
Karsten Hopp 37f315
  :delfunc Expr1
Karsten Hopp 37f315
--- 59,68 ----
Karsten Hopp 37f315
  ---*---
Karsten Hopp 37f315
  (one
Karsten Hopp 37f315
  (two
Karsten Hopp 37f315
! [(one again?:call append(line('$'), max([1, 2, 3]))
Karsten Hopp 37f315
! :call extend(g:, {'max': function('min')})
Karsten Hopp 37f315
! :call append(line('$'), max([1, 2, 3]))
Karsten Hopp 37f315
! :$-7,$w! test.out
Karsten Hopp 37f315
  :delfunc Table
Karsten Hopp 37f315
  :delfunc Compute
Karsten Hopp 37f315
  :delfunc Expr1
Karsten Hopp 37f315
*** ../vim-7.3.602/src/testdir/test34.ok	2011-10-12 22:02:07.000000000 +0200
Karsten Hopp 37f315
--- src/testdir/test34.ok	2012-07-16 16:43:15.000000000 +0200
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 4,6 ****
Karsten Hopp 37f315
--- 4,8 ----
Karsten Hopp 37f315
  1. one
Karsten Hopp 37f315
  2. two
Karsten Hopp 37f315
  1. one again
Karsten Hopp 37f315
+ 3
Karsten Hopp 37f315
+ 3
Karsten Hopp 37f315
*** ../vim-7.3.602/src/window.c	2012-07-06 18:27:34.000000000 +0200
Karsten Hopp 37f315
--- src/window.c	2012-07-16 16:53:45.000000000 +0200
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 3468,3474 ****
Karsten Hopp 37f315
  # endif
Karsten Hopp 37f315
  #ifdef FEAT_EVAL
Karsten Hopp 37f315
  	/* init t: variables */
Karsten Hopp 37f315
! 	init_var_dict(&tp->tp_vars, &tp->tp_winvar);
Karsten Hopp 37f315
  #endif
Karsten Hopp 37f315
  	tp->tp_ch_used = p_ch;
Karsten Hopp 37f315
      }
Karsten Hopp 37f315
--- 3468,3474 ----
Karsten Hopp 37f315
  # endif
Karsten Hopp 37f315
  #ifdef FEAT_EVAL
Karsten Hopp 37f315
  	/* init t: variables */
Karsten Hopp 37f315
! 	init_var_dict(&tp->tp_vars, &tp->tp_winvar, VAR_SCOPE);
Karsten Hopp 37f315
  #endif
Karsten Hopp 37f315
  	tp->tp_ch_used = p_ch;
Karsten Hopp 37f315
      }
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 4410,4416 ****
Karsten Hopp 37f315
  #endif
Karsten Hopp 37f315
  #ifdef FEAT_EVAL
Karsten Hopp 37f315
  	/* init w: variables */
Karsten Hopp 37f315
! 	init_var_dict(&new_wp->w_vars, &new_wp->w_winvar);
Karsten Hopp 37f315
  #endif
Karsten Hopp 37f315
  #ifdef FEAT_FOLDING
Karsten Hopp 37f315
  	foldInitWin(new_wp);
Karsten Hopp 37f315
--- 4410,4416 ----
Karsten Hopp 37f315
  #endif
Karsten Hopp 37f315
  #ifdef FEAT_EVAL
Karsten Hopp 37f315
  	/* init w: variables */
Karsten Hopp 37f315
! 	init_var_dict(&new_wp->w_vars, &new_wp->w_winvar, VAR_SCOPE);
Karsten Hopp 37f315
  #endif
Karsten Hopp 37f315
  #ifdef FEAT_FOLDING
Karsten Hopp 37f315
  	foldInitWin(new_wp);
Karsten Hopp 37f315
*** ../vim-7.3.602/src/version.c	2012-07-16 17:27:57.000000000 +0200
Karsten Hopp 37f315
--- src/version.c	2012-07-16 17:29:06.000000000 +0200
Karsten Hopp 37f315
***************
Karsten Hopp 37f315
*** 716,717 ****
Karsten Hopp 37f315
--- 716,719 ----
Karsten Hopp 37f315
  {   /* Add new patch number below this line */
Karsten Hopp 37f315
+ /**/
Karsten Hopp 37f315
+     603,
Karsten Hopp 37f315
  /**/
Karsten Hopp 37f315
Karsten Hopp 37f315
-- 
Karsten Hopp 37f315
Birthdays are healthy.  The more you have them, the longer you live.
Karsten Hopp 37f315
Karsten Hopp 37f315
 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
Karsten Hopp 37f315
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
Karsten Hopp 37f315
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
Karsten Hopp 37f315
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///