To: vim_dev@googlegroups.com Subject: Patch 7.4.1839 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@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 ///