Patch 7.4.1839
Problem:    Cannot get the items stored in a partial.
Solution:   Support using get() on a partial.
Files:      src/eval.c, src/testdir/test_partial.vim, runtime/doc/eval.txt


*** ../vim-7.4.1838/src/eval.c  2016-05-24 17:33:29.139206088 +0200
--- src/eval.c  2016-05-24 18:26:06.919162650 +0200
***************
*** 12423,12428 ****
--- 12423,12467 ----
                tv = &di->di_tv;
        }
      }
+     else if (argvars[0].v_type == VAR_PARTIAL)
+     {
+       partial_T       *pt = argvars[0].vval.v_partial;
+ 
+       if (pt != NULL)
+       {
+           char_u *what = get_tv_string(&argvars[1]);
+ 
+           if (STRCMP(what, "func") == 0)
+           {
+               rettv->v_type = VAR_STRING;
+               if (pt->pt_name == NULL)
+                   rettv->vval.v_string = NULL;
+               else
+                   rettv->vval.v_string = vim_strsave(pt->pt_name);
+           }
+           else if (STRCMP(what, "dict") == 0)
+           {
+               rettv->v_type = VAR_DICT;
+               rettv->vval.v_dict = pt->pt_dict;
+               if (pt->pt_dict != NULL)
+                   ++pt->pt_dict->dv_refcount;
+           }
+           else if (STRCMP(what, "args") == 0)
+           {
+               rettv->v_type = VAR_LIST;
+               if (rettv_list_alloc(rettv) == OK)
+               {
+                   int i;
+ 
+                   for (i = 0; i < pt->pt_argc; ++i)
+                       list_append_tv(rettv->vval.v_list, &pt->pt_argv[i]);
+               }
+           }
+           else
+               EMSG2(_(e_invarg2), what);
+           return;
+       }
+     }
      else
        EMSG2(_(e_listdictarg), "get()");
  
*** ../vim-7.4.1838/src/testdir/test_partial.vim        2016-05-24 
15:43:46.699296634 +0200
--- src/testdir/test_partial.vim        2016-05-24 18:35:10.563155171 +0200
***************
*** 279,281 ****
--- 279,290 ----
    call assert_equal('dict1', dict2.f2())
    call assert_equal('dict1', dict2['f2']())
  endfunc
+ 
+ func Test_get_partial_items()
+   let dict = {'name': 'hello'}
+   let Cb = function('MyDictFunc', ["foo", "bar"], dict)
+   call assert_equal('MyDictFunc', get(Cb, 'func'))
+   call assert_equal(["foo", "bar"], get(Cb, 'args'))
+   call assert_equal(dict, get(Cb, 'dict'))
+   call assert_fails('call get(Cb, "xxx")', 'E475:')
+ endfunc
*** ../vim-7.4.1838/runtime/doc/eval.txt        2016-05-24 17:33:29.143206087 
+0200
--- runtime/doc/eval.txt        2016-05-24 18:05:54.387179329 +0200
***************
*** 3721,3726 ****
--- 3771,3782 ----
                Get item with key {key} from |Dictionary| {dict}.  When this
                item is not available return {default}.  Return zero when
                {default} is omitted.
+ get({partial}, {what})
+               Get an item with from Funcref {partial}.  Possible values for
+               {what} are:
+                       'func'  The function
+                       'dict'  The dictionary
+                       'args'  The list with arguments
  
                                                        *getbufline()*
  getbufline({expr}, {lnum} [, {end}])
*** ../vim-7.4.1838/src/version.c       2016-05-24 17:33:29.143206087 +0200
--- src/version.c       2016-05-24 18:01:48.043182718 +0200
***************
*** 755,756 ****
--- 755,758 ----
  {   /* Add new patch number below this line */
+ /**/
+     1839,
  /**/

-- 
Never enter the boss's office unless it's absolutely necessary.  Every boss
saves one corner of the desk for useless assignments that are doled out like
Halloween candy to each visitor.
                                (Scott Adams - The Dilbert principle)

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