Patch 7.4.1589
Problem:    Combining dict and args with partial doesn't always work.
Solution:   Use the arguments from the partial.
Files:      src/eval.c, src/testdir/test_partial.vim


*** ../vim-7.4.1588/src/eval.c  2016-03-17 21:11:48.392657218 +0100
--- src/eval.c  2016-03-17 23:05:26.715794142 +0100
***************
*** 3461,3467 ****
      int               doesrange;
      int               failed = FALSE;
      funcdict_T        fudi;
!     partial_T *partial;
  
      if (eap->skip)
      {
--- 3461,3467 ----
      int               doesrange;
      int               failed = FALSE;
      funcdict_T        fudi;
!     partial_T *partial = NULL;
  
      if (eap->skip)
      {
***************
*** 3497,3508 ****
      name = deref_func_name(tofree, &len,
                                    partial != NULL ? NULL : &partial, FALSE);
  
-     /* When calling fdict.func(), where "func" is a partial, use "fdict"
-      * instead of the dict in the partial, for backwards compatibility.
-      * TODO: Do use the arguments in the partial? */
-     if (fudi.fd_dict != NULL)
-       partial = NULL;
- 
      /* Skip white space to allow ":call func ()".  Not good, but required for
       * backward compatibility. */
      startarg = skipwhite(arg);
--- 3497,3502 ----
***************
*** 21734,21750 ****
        }
      }
  
!     if (rettv->v_type == VAR_FUNC && selfdict != NULL)
      {
!       char_u      *fname;
        char_u      *tofree = NULL;
        ufunc_T     *fp;
        char_u      fname_buf[FLEN_FIXED + 1];
        int         error;
  
        /* Translate "s:func" to the stored function name. */
!       fname = fname_trans_sid(rettv->vval.v_string, fname_buf,
!                                                            &tofree, &error);
        fp = find_func(fname);
        vim_free(tofree);
  
--- 21728,21745 ----
        }
      }
  
!     if ((rettv->v_type == VAR_FUNC || rettv->v_type == VAR_PARTIAL)
!                                                         && selfdict != NULL)
      {
!       char_u      *fname = rettv->v_type == VAR_FUNC ? rettv->vval.v_string
!                                            : rettv->vval.v_partial->pt_name;
        char_u      *tofree = NULL;
        ufunc_T     *fp;
        char_u      fname_buf[FLEN_FIXED + 1];
        int         error;
  
        /* Translate "s:func" to the stored function name. */
!       fname = fname_trans_sid(fname, fname_buf, &tofree, &error);
        fp = find_func(fname);
        vim_free(tofree);
  
***************
*** 21758,21764 ****
                pt->pt_refcount = 1;
                pt->pt_dict = selfdict;
                selfdict = NULL;
!               pt->pt_name = rettv->vval.v_string;
                func_ref(pt->pt_name);
                rettv->v_type = VAR_PARTIAL;
                rettv->vval.v_partial = pt;
--- 21753,21786 ----
                pt->pt_refcount = 1;
                pt->pt_dict = selfdict;
                selfdict = NULL;
!               if (rettv->v_type == VAR_FUNC)
!               {
!                   /* just a function: use selfdict */
!                   pt->pt_name = rettv->vval.v_string;
!               }
!               else
!               {
!                   partial_T   *ret_pt = rettv->vval.v_partial;
!                   int         i;
! 
!                   /* partial: use selfdict and copy args */
!                   pt->pt_name = vim_strsave(ret_pt->pt_name);
!                   if (ret_pt->pt_argc > 0)
!                   {
!                       pt->pt_argv = (typval_T *)alloc(
!                                         sizeof(typval_T) * ret_pt->pt_argc);
!                       if (pt->pt_argv == NULL)
!                           /* out of memory: drop the arguments */
!                           pt->pt_argc = 0;
!                       else
!                       {
!                           pt->pt_argc = ret_pt->pt_argc;
!                           for (i = 0; i < pt->pt_argc; i++)
!                               copy_tv(&ret_pt->pt_argv[i], &pt->pt_argv[i]);
!                       }
!                   }
!                   partial_unref(ret_pt);
!               }
                func_ref(pt->pt_name);
                rettv->v_type = VAR_PARTIAL;
                rettv->vval.v_partial = pt;
***************
*** 23915,23920 ****
--- 23937,23944 ----
        {
            name = vim_strsave(lv.ll_tv->vval.v_partial->pt_name);
            *pp = end;
+           if (partial != NULL)
+               *partial = lv.ll_tv->vval.v_partial;
        }
        else
        {
*** ../vim-7.4.1588/src/testdir/test_partial.vim        2016-03-17 
21:11:48.392657218 +0100
--- src/testdir/test_partial.vim        2016-03-17 23:07:28.030494682 +0100
***************
*** 115,120 ****
--- 115,150 ----
    call assert_equal('bar', B())
  endfunc
  
+ function! s:cache_arg(arg) dict
+   let s:result = self.name . '/' . a:arg
+   return s:result
+ endfunction
+ 
+ func Test_script_function_in_dict_arg()
+   let s:obj = {'name': 'foo'}
+   let s:obj['clear'] = function('s:cache_arg')
+ 
+   call assert_equal('foo/bar', s:obj.clear('bar'))
+   let F = s:obj.clear
+   let s:result = ''
+   call assert_equal('foo/bar', F('bar'))
+   call assert_equal('foo/bar', s:result)
+ 
+   let s:obj['clear'] = function('s:cache_arg', ['bar'])
+   call assert_equal('foo/bar', s:obj.clear())
+   let s:result = ''
+   call s:obj.clear()
+   call assert_equal('foo/bar', s:result)
+ 
+   let F = s:obj.clear
+   call assert_equal('foo/bar', F())
+   let s:result = ''
+   call F()
+   call assert_equal('foo/bar', s:result)
+ 
+   call assert_equal('foo/bar', call(s:obj.clear, [], s:obj))
+ endfunc
+ 
  func Test_partial_exists()
    let F = function('MyFunc')
    call assert_true(exists('*F'))
*** ../vim-7.4.1588/src/version.c       2016-03-17 22:06:49.933452325 +0100
--- src/version.c       2016-03-17 23:10:28.724559618 +0100
***************
*** 750,751 ****
--- 750,753 ----
  {   /* Add new patch number below this line */
+ /**/
+     1589,
  /**/


-- 
hundred-and-one symptoms of being an internet addict:
72. Somebody at IRC just mentioned a way to obtain full motion video without
    a PC using a wireless protocol called NTSC, you wonder how you never
    heard about it

 /// 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