2016-05-24 23:14 GMT+03:00 Christian Brabandt <cbli...@256bit.org>: > Hi Bram! > > On Di, 24 Mai 2016, Bram Moolenaar wrote: > >> >> Patch 7.4.1836 >> Problem: When using a partial on a dictionary it always gets bound to that >> dictionary. >> Solution: Make a difference between binding a function to a dictionary >> explicitly or automatically. >> Files: src/structs.h, src/eval.c, src/testdir/test_partial.vim, >> runtime/doc/eval.txt > > Starting with this patch, I see sporadic failures on appveyor: > https://ci.appveyor.com/project/chrisbra/vim/build/1234/job/wlpgqc4vnyvrdgqo > https://ci.appveyor.com/project/chrisbra/vim/build/1239/job/2p6y8dru0sv216dv#L2073 > https://ci.appveyor.com/project/chrisbra/vim/build/1238/job/q4e5huq9x6opj6id#L2073 > > > test86: > ..\gvim -u dos.vim -U NONE --noplugin --not-a-term "+set ff=unix|f > test.out|wq" dostmp\test86.out > 522c522 > < psa3(self={"20": 1}): !result: [['abcArgsPSA3'], {'abcSelfPSA3': > 'abcSelfPSA3Val'}] > --- >> psa3(self={"20": 1}): !result: [['abcArgsPSA3'], {'20': 1}
Uninitialized memory: set_partial() in if_py_both.h is not setting new attribute. diff -r c35c9121c72b runtime/doc/if_pyth.txt --- a/runtime/doc/if_pyth.txt Tue May 24 22:30:07 2016 +0200 +++ b/runtime/doc/if_pyth.txt Wed May 25 01:14:35 2016 +0300 @@ -659,19 +659,31 @@ `vim.bindeval('function(%s)'%json.dumps(name))`. Attributes (read-only): - Attribute Description ~ - name Function name. - args `None` or a |python-List| object with arguments. Note that - this is a copy of the arguments list, constructed each time - you request this attribute. Modifications made to the list - will be ignored (but not to the containers inside argument - list: this is like |copy()| and not |deepcopy()|). - self `None` or a |python-Dictionary| object with self - dictionary. Note that explicit `self` keyword used when - calling resulting object overrides this attribute. + Attribute Description ~ + name Function name. + args `None` or a |python-List| object with arguments. Note + that this is a copy of the arguments list, constructed + each time you request this attribute. Modifications made + to the list will be ignored (but not to the containers + inside argument list: this is like |copy()| and not + |deepcopy()|). + self `None` or a |python-Dictionary| object with self + dictionary. Note that explicit `self` keyword used when + calling resulting object overrides this attribute. + auto_rebind Boolean. True if partial created from this Python object + and stored in the VimL dictionary should be automatically + rebound to the dictionary it is stored in when this + dictionary is indexed. Exposes Vim internal difference + between `dict.func` (auto_rebind=True) and + `function(dict.func,dict)` (auto_rebind=False). This + attribute makes no sense if `self` attribute is `None`. - Constructor additionally accepts `args` and `self` keywords. If any of - them is given then it constructs a partial, see |function()|. + Constructor additionally accepts `args`, `self` and `auto_rebind` + keywords. If `args` and/or `self` argument is given then it constructs + a partial, see |function()|. `auto_rebind` is only used when `self` + argument is given, otherwise it is assumed to be `True` regardless of + whether it was given or not. If `self` is given then it defaults to + `False`. Examples: > f = vim.Function('tr') # Constructor diff -r c35c9121c72b src/if_py_both.h --- a/src/if_py_both.h Tue May 24 22:30:07 2016 +0200 +++ b/src/if_py_both.h Wed May 25 01:14:35 2016 +0300 @@ -2835,16 +2835,17 @@ typval_T *argv; dict_T *self; pylinkedlist_T ref; + int auto_rebind; } FunctionObject; static PyTypeObject FunctionType; -#define NEW_FUNCTION(name, argc, argv, self) \ - FunctionNew(&FunctionType, name, argc, argv, self) +#define NEW_FUNCTION(name, argc, argv, self, pt_auto) \ + FunctionNew(&FunctionType, (name), (argc), (argv), (self), (pt_auto)) static PyObject * FunctionNew(PyTypeObject *subtype, char_u *name, int argc, typval_T *argv, - dict_T *selfdict) + dict_T *selfdict, int auto_rebind) { FunctionObject *self; @@ -2877,6 +2878,7 @@ self->argc = argc; self->argv = argv; self->self = selfdict; + self->auto_rebind = selfdict == NULL ? TRUE : auto_rebind; if (self->argv || self->self) pyll_add((PyObject *)(self), &self->ref, &lastfunc); @@ -2889,6 +2891,7 @@ { PyObject *self; PyObject *selfdictObject; + PyObject *autoRebindObject; PyObject *argsObject = NULL; char_u *name; typval_T selfdicttv; @@ -2896,6 +2899,7 @@ list_T *argslist = NULL; dict_T *selfdict = NULL; int argc = 0; + int auto_rebind = TRUE; typval_T *argv = NULL; typval_T *curtv; listitem_T *li; @@ -2936,6 +2940,21 @@ } list_unref(argslist); } + if (selfdict != NULL) + { + auto_rebind = FALSE; + autoRebindObject = PyDict_GetItemString(kwargs, "auto_rebind"); + if (autoRebindObject != NULL) + { + auto_rebind = PyObject_IsTrue(autoRebindObject); + if (auto_rebind == -1) + { + dict_unref(selfdict); + list_unref(argslist); + return NULL; + } + } + } } if (!PyArg_ParseTuple(args, "et", "ascii", &name)) @@ -2947,7 +2966,7 @@ return NULL; } - self = FunctionNew(subtype, name, argc, argv, selfdict); + self = FunctionNew(subtype, name, argc, argv, selfdict, auto_rebind); PyMem_Free(name); @@ -2971,7 +2990,7 @@ } static char *FunctionAttrs[] = { - "softspace", "args", "self", + "softspace", "args", "self", "auto_rebind", NULL }; @@ -3001,6 +3020,10 @@ return self->self == NULL ? AlwaysNone(NULL) : NEW_DICTIONARY(self->self); + else if (strcmp(name, "auto_rebind") == 0) + return self->auto_rebind + ? AlwaysTrue(NULL) + : AlwaysFalse(NULL); else if (strcmp(name, "__members__") == 0) return ObjectDir(NULL, FunctionAttrs); return NULL; @@ -3035,6 +3058,7 @@ pt->pt_argc = 0; pt->pt_argv = NULL; } + pt->pt_auto = self->auto_rebind || !exported; pt->pt_dict = self->self; if (exported && self->self) ++pt->pt_dict->dv_refcount; @@ -3148,6 +3172,8 @@ ga_concat(&repr_ga, tv2string(&tv, &tofree, numbuf, get_copyID())); --emsg_silent; vim_free(tofree); + if (self->auto_rebind) + ga_concat(&repr_ga, (char_u *)", auto_rebind=True"); } ga_append(&repr_ga, '>'); ret = PyString_FromString((char *)repr_ga.ga_data); @@ -6269,7 +6295,7 @@ case VAR_FUNC: return NEW_FUNCTION(tv->vval.v_string == NULL ? (char_u *)"" : tv->vval.v_string, - 0, NULL, NULL); + 0, NULL, NULL, TRUE); case VAR_PARTIAL: if (tv->vval.v_partial->pt_argc) { @@ -6284,7 +6310,8 @@ return NEW_FUNCTION(tv->vval.v_partial == NULL ? (char_u *)"" : tv->vval.v_partial->pt_name, tv->vval.v_partial->pt_argc, argv, - tv->vval.v_partial->pt_dict); + tv->vval.v_partial->pt_dict, + tv->vval.v_partial->pt_auto); case VAR_UNKNOWN: case VAR_CHANNEL: case VAR_JOB: diff -r c35c9121c72b src/testdir/test86.in --- a/src/testdir/test86.in Tue May 24 22:30:07 2016 +0200 +++ b/src/testdir/test86.in Wed May 25 01:14:35 2016 +0300 @@ -877,6 +877,12 @@ :$put =string(pyeval('vim.Function(''tr'', args=[])')) :$put =string(pyeval('vim.Function(''tr'', self={})')) :$put =string(pyeval('vim.Function(''tr'', args=[123, 3, 4], self={})')) +:$put ='auto_rebind' +:$put =string(pyeval('vim.Function(''tr'', auto_rebind=False)')) +:$put =string(pyeval('vim.Function(''tr'', args=[123, 3, 4], auto_rebind=False)')) +:$put =string(pyeval('vim.Function(''tr'', args=[], auto_rebind=False)')) +:$put =string(pyeval('vim.Function(''tr'', self={}, auto_rebind=False)')) +:$put =string(pyeval('vim.Function(''tr'', args=[123, 3, 4], self={}, auto_rebind=False)')) :" :" Test vim.Function :function Args(...) @@ -915,11 +921,27 @@ psa2 = vim.Function('SelfArgs', args=[]) psa3 = vim.Function('SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}) psa4 = vim.Function('SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'}) +psa5 = vim.Function('SelfArgs', self={'abcSelfPSA5': 'abcSelfPSA5Val'}, auto_rebind=0) +psa6 = vim.Function('SelfArgs', args=['abcArgsPSA6'], self={'abcSelfPSA6': 'abcSelfPSA6Val'}, auto_rebind=()) +psa7 = vim.Function('SelfArgs', args=['abcArgsPSA7'], auto_rebind=[]) +psa8 = vim.Function('SelfArgs', auto_rebind=False) +psa9 = vim.Function('SelfArgs', self={'abcSelfPSA9': 'abcSelfPSA9Val'}, auto_rebind=True) +psaA = vim.Function('SelfArgs', args=['abcArgsPSAA'], self={'abcSelfPSAA': 'abcSelfPSAAVal'}, auto_rebind=1) +psaB = vim.Function('SelfArgs', args=['abcArgsPSAB'], auto_rebind={'abcARPSAB': 'abcARPSABVal'}) +psaC = vim.Function('SelfArgs', auto_rebind=['abcARPSAC']) cb.append('sa: ' + repr(sa)) cb.append('psa1: ' + repr(psa1)) cb.append('psa2: ' + repr(psa2)) cb.append('psa3: ' + repr(psa3)) cb.append('psa4: ' + repr(psa4)) +cb.append('psa5: ' + repr(psa5)) +cb.append('psa6: ' + repr(psa6)) +cb.append('psa7: ' + repr(psa7)) +cb.append('psa8: ' + repr(psa8)) +cb.append('psa9: ' + repr(psa9)) +cb.append('psaA: ' + repr(psaA)) +cb.append('psaB: ' + repr(psaB)) +cb.append('psaC: ' + repr(psaC)) psar = vim.Function('SelfArgs', args=[{'abcArgsPSAr': 'abcArgsPSArVal'}], self={'abcSelfPSAr': 'abcSelfPSArVal'}) psar.args[0]['abcArgsPSAr2'] = [psar.self, psar.args[0]] @@ -942,6 +964,19 @@ :$put ='s(psa2): '.string(pyeval('psa2')) :$put ='s(psa3): '.string(pyeval('psa3')) :$put ='s(psa4): '.string(pyeval('psa4')) +:$put ='s(psa5): '.string(pyeval('psa5')) +:$put ='s(psa6): '.string(pyeval('psa6')) +:$put ='s(psa7): '.string(pyeval('psa7')) +:$put ='s(psa8): '.string(pyeval('psa8')) +:$put ='s(psa9): '.string(pyeval('psa9')) +:$put ='s(psaA): '.string(pyeval('psaA')) +:$put ='s(psaB): '.string(pyeval('psaB')) +:$put ='s(psaC): '.string(pyeval('psaC')) +: +:for v in ['sa', 'psa1', 'psa2', 'psa3', 'psa4', 'psa5', 'psa6', 'psa7', 'psa8', 'psa9', 'psaA', 'psaB', 'psaC'] +: let d = {'f': pyeval(v)} +: $put ='d.'.v.'(): '.string(d.f()) +:endfor : :py ecall('a()', a, ) :py ecall('pa1()', pa1, ) @@ -1026,6 +1061,25 @@ cb.append('psa3.name: ' + s(psa3.name)) cb.append('psa4.name: ' + s(psa4.name)) +cb.append('a.auto_rebind: ' + s(a.auto_rebind)) +cb.append('pa1.auto_rebind: ' + s(pa1.auto_rebind)) +cb.append('pa2.auto_rebind: ' + s(pa2.auto_rebind)) +cb.append('pa3.auto_rebind: ' + s(pa3.auto_rebind)) +cb.append('pa4.auto_rebind: ' + s(pa4.auto_rebind)) +cb.append('sa.auto_rebind: ' + s(sa.auto_rebind)) +cb.append('psa1.auto_rebind: ' + s(psa1.auto_rebind)) +cb.append('psa2.auto_rebind: ' + s(psa2.auto_rebind)) +cb.append('psa3.auto_rebind: ' + s(psa3.auto_rebind)) +cb.append('psa4.auto_rebind: ' + s(psa4.auto_rebind)) +cb.append('psa5.auto_rebind: ' + s(psa5.auto_rebind)) +cb.append('psa6.auto_rebind: ' + s(psa6.auto_rebind)) +cb.append('psa7.auto_rebind: ' + s(psa7.auto_rebind)) +cb.append('psa8.auto_rebind: ' + s(psa8.auto_rebind)) +cb.append('psa9.auto_rebind: ' + s(psa9.auto_rebind)) +cb.append('psaA.auto_rebind: ' + s(psaA.auto_rebind)) +cb.append('psaB.auto_rebind: ' + s(psaB.auto_rebind)) +cb.append('psaC.auto_rebind: ' + s(psaC.auto_rebind)) + del s del a @@ -1038,6 +1092,14 @@ del psa2 del psa3 del psa4 +del psa5 +del psa6 +del psa7 +del psa8 +del psa9 +del psaA +del psaB +del psaC del psar del ecall diff -r c35c9121c72b src/testdir/test86.ok --- a/src/testdir/test86.ok Tue May 24 22:30:07 2016 +0200 +++ b/src/testdir/test86.ok Wed May 25 01:14:35 2016 +0300 @@ -448,7 +448,7 @@ range:__dir__,__members__,append,end,start dictionary:__dir__,__members__,get,has_key,items,keys,locked,pop,popitem,scope,update,values list:__dir__,__members__,extend,locked -function:__dir__,__members__,args,self,softspace +function:__dir__,__members__,args,auto_rebind,self,softspace output:__dir__,__members__,close,closed,flush,isatty,readable,seekable,softspace,writable,write,writelines {} {'a': 1} @@ -460,6 +460,12 @@ function('tr') function('tr', {}) function('tr', [123, 3, 4], {}) +auto_rebind +function('tr') +function('tr', [123, 3, 4]) +function('tr') +function('tr', {}) +function('tr', [123, 3, 4], {}) a: <vim.Function 'Args'> pa1: <vim.Function 'Args', args=['abcArgsPA1']> pa2: <vim.Function 'Args'> @@ -470,6 +476,14 @@ psa2: <vim.Function 'SelfArgs'> psa3: <vim.Function 'SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}> psa4: <vim.Function 'SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'}> +psa5: <vim.Function 'SelfArgs', self={'abcSelfPSA5': 'abcSelfPSA5Val'}> +psa6: <vim.Function 'SelfArgs', args=['abcArgsPSA6'], self={'abcSelfPSA6': 'abcSelfPSA6Val'}> +psa7: <vim.Function 'SelfArgs', args=['abcArgsPSA7']> +psa8: <vim.Function 'SelfArgs'> +psa9: <vim.Function 'SelfArgs', self={'abcSelfPSA9': 'abcSelfPSA9Val'}, auto_rebind=True> +psaA: <vim.Function 'SelfArgs', args=['abcArgsPSAA'], self={'abcSelfPSAA': 'abcSelfPSAAVal'}, auto_rebind=True> +psaB: <vim.Function 'SelfArgs', args=['abcArgsPSAB']> +psaC: <vim.Function 'SelfArgs'> psar: <vim.Function 'SelfArgs', args=[{'abcArgsPSAr2': [{'rec': function('SelfArgs', [{...}], {...}), 'self': {...}, 'abcSelfPSAr': 'abcSelfPSArVal', 'args': [{...}]}, {...}], 'abcArgsPSAr': 'abcArgsPSArVal'}], self={'rec': function('SelfArgs', [{'abcArgsPSAr2': [{...}, {...}], 'abcArgsPSAr': 'abcArgsPSArVal'}], {...}), 'self': {...}, 'abcSelfPSAr': 'abcSelfPSArVal', 'args': [{...}]}> s(a): function('Args') s(pa1): function('Args', ['abcArgsPA1']) @@ -481,6 +495,27 @@ s(psa2): function('SelfArgs') s(psa3): function('SelfArgs', ['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}) s(psa4): function('SelfArgs', {'abcSelfPSA4': 'abcSelfPSA4Val'}) +s(psa5): function('SelfArgs', {'abcSelfPSA5': 'abcSelfPSA5Val'}) +s(psa6): function('SelfArgs', ['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}) +s(psa7): function('SelfArgs', ['abcArgsPSA7']) +s(psa8): function('SelfArgs') +s(psa9): function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'}) +s(psaA): function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'}) +s(psaB): function('SelfArgs', ['abcArgsPSAB']) +s(psaC): function('SelfArgs') +d.sa(): [[], {'f': function('SelfArgs')}] +d.psa1(): [['abcArgsPSA1'], {'f': function('SelfArgs', ['abcArgsPSA1'])}] +d.psa2(): [[], {'f': function('SelfArgs')}] +d.psa3(): [['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}] +d.psa4(): [[], {'abcSelfPSA4': 'abcSelfPSA4Val'}] +d.psa5(): [[], {'abcSelfPSA5': 'abcSelfPSA5Val'}] +d.psa6(): [['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}] +d.psa7(): [['abcArgsPSA7'], {'f': function('SelfArgs', ['abcArgsPSA7'])}] +d.psa8(): [[], {'f': function('SelfArgs')}] +d.psa9(): [[], {'f': function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'})}] +d.psaA(): [['abcArgsPSAA'], {'f': function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'})}] +d.psaB(): [['abcArgsPSAB'], {'f': function('SelfArgs', ['abcArgsPSAB'])}] +d.psaC(): [[], {'f': function('SelfArgs')}] a(): !result: [] pa1(): !result: ['abcArgsPA1'] pa2(): !result: [] @@ -551,6 +586,24 @@ psa2.name: 'SelfArgs' psa3.name: 'SelfArgs' psa4.name: 'SelfArgs' +a.auto_rebind: 1 +pa1.auto_rebind: 1 +pa2.auto_rebind: 1 +pa3.auto_rebind: 0 +pa4.auto_rebind: 0 +sa.auto_rebind: 1 +psa1.auto_rebind: 1 +psa2.auto_rebind: 1 +psa3.auto_rebind: 0 +psa4.auto_rebind: 0 +psa5.auto_rebind: 0 +psa6.auto_rebind: 0 +psa7.auto_rebind: 1 +psa8.auto_rebind: 1 +psa9.auto_rebind: 1 +psaA.auto_rebind: 1 +psaB.auto_rebind: 1 +psaC.auto_rebind: 1 ' abcdef Error detected while processing function RunTest[]..Test: diff -r c35c9121c72b src/testdir/test87.in --- a/src/testdir/test87.in Tue May 24 22:30:07 2016 +0200 +++ b/src/testdir/test87.in Wed May 25 01:14:35 2016 +0300 @@ -871,6 +871,12 @@ :$put =string(py3eval('vim.Function(''tr'', args=[])')) :$put =string(py3eval('vim.Function(''tr'', self={})')) :$put =string(py3eval('vim.Function(''tr'', args=[123, 3, 4], self={})')) +:$put ='auto_rebind' +:$put =string(py3eval('vim.Function(''tr'', auto_rebind=False)')) +:$put =string(py3eval('vim.Function(''tr'', args=[123, 3, 4], auto_rebind=False)')) +:$put =string(py3eval('vim.Function(''tr'', args=[], auto_rebind=False)')) +:$put =string(py3eval('vim.Function(''tr'', self={}, auto_rebind=False)')) +:$put =string(py3eval('vim.Function(''tr'', args=[123, 3, 4], self={}, auto_rebind=False)')) :" :" Test vim.Function :function Args(...) @@ -909,11 +915,27 @@ psa2 = vim.Function('SelfArgs', args=[]) psa3 = vim.Function('SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}) psa4 = vim.Function('SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'}) +psa5 = vim.Function('SelfArgs', self={'abcSelfPSA5': 'abcSelfPSA5Val'}, auto_rebind=0) +psa6 = vim.Function('SelfArgs', args=['abcArgsPSA6'], self={'abcSelfPSA6': 'abcSelfPSA6Val'}, auto_rebind=()) +psa7 = vim.Function('SelfArgs', args=['abcArgsPSA7'], auto_rebind=[]) +psa8 = vim.Function('SelfArgs', auto_rebind=False) +psa9 = vim.Function('SelfArgs', self={'abcSelfPSA9': 'abcSelfPSA9Val'}, auto_rebind=True) +psaA = vim.Function('SelfArgs', args=['abcArgsPSAA'], self={'abcSelfPSAA': 'abcSelfPSAAVal'}, auto_rebind=1) +psaB = vim.Function('SelfArgs', args=['abcArgsPSAB'], auto_rebind={'abcARPSAB': 'abcARPSABVal'}) +psaC = vim.Function('SelfArgs', auto_rebind=['abcARPSAC']) cb.append('sa: ' + repr(sa)) cb.append('psa1: ' + repr(psa1)) cb.append('psa2: ' + repr(psa2)) cb.append('psa3: ' + repr(psa3)) cb.append('psa4: ' + repr(psa4)) +cb.append('psa5: ' + repr(psa5)) +cb.append('psa6: ' + repr(psa6)) +cb.append('psa7: ' + repr(psa7)) +cb.append('psa8: ' + repr(psa8)) +cb.append('psa9: ' + repr(psa9)) +cb.append('psaA: ' + repr(psaA)) +cb.append('psaB: ' + repr(psaB)) +cb.append('psaC: ' + repr(psaC)) psar = vim.Function('SelfArgs', args=[{'abcArgsPSAr': 'abcArgsPSArVal'}], self={'abcSelfPSAr': 'abcSelfPSArVal'}) psar.args[0]['abcArgsPSAr2'] = [psar.self, psar.args[0]] @@ -936,6 +958,19 @@ :$put ='s(psa2): '.string(py3eval('psa2')) :$put ='s(psa3): '.string(py3eval('psa3')) :$put ='s(psa4): '.string(py3eval('psa4')) +:$put ='s(psa5): '.string(py3eval('psa5')) +:$put ='s(psa6): '.string(py3eval('psa6')) +:$put ='s(psa7): '.string(py3eval('psa7')) +:$put ='s(psa8): '.string(py3eval('psa8')) +:$put ='s(psa9): '.string(py3eval('psa9')) +:$put ='s(psaA): '.string(py3eval('psaA')) +:$put ='s(psaB): '.string(py3eval('psaB')) +:$put ='s(psaC): '.string(py3eval('psaC')) +: +:for v in ['sa', 'psa1', 'psa2', 'psa3', 'psa4', 'psa5', 'psa6', 'psa7', 'psa8', 'psa9', 'psaA', 'psaB', 'psaC'] +: let d = {'f': py3eval(v)} +: $put ='d.'.v.'(): '.string(d.f()) +:endfor : :py3 ecall('a()', a, ) :py3 ecall('pa1()', pa1, ) @@ -1020,6 +1055,25 @@ cb.append('psa3.name: ' + s(psa3.name)) cb.append('psa4.name: ' + s(psa4.name)) +cb.append('a.auto_rebind: ' + s(a.auto_rebind)) +cb.append('pa1.auto_rebind: ' + s(pa1.auto_rebind)) +cb.append('pa2.auto_rebind: ' + s(pa2.auto_rebind)) +cb.append('pa3.auto_rebind: ' + s(pa3.auto_rebind)) +cb.append('pa4.auto_rebind: ' + s(pa4.auto_rebind)) +cb.append('sa.auto_rebind: ' + s(sa.auto_rebind)) +cb.append('psa1.auto_rebind: ' + s(psa1.auto_rebind)) +cb.append('psa2.auto_rebind: ' + s(psa2.auto_rebind)) +cb.append('psa3.auto_rebind: ' + s(psa3.auto_rebind)) +cb.append('psa4.auto_rebind: ' + s(psa4.auto_rebind)) +cb.append('psa5.auto_rebind: ' + s(psa5.auto_rebind)) +cb.append('psa6.auto_rebind: ' + s(psa6.auto_rebind)) +cb.append('psa7.auto_rebind: ' + s(psa7.auto_rebind)) +cb.append('psa8.auto_rebind: ' + s(psa8.auto_rebind)) +cb.append('psa9.auto_rebind: ' + s(psa9.auto_rebind)) +cb.append('psaA.auto_rebind: ' + s(psaA.auto_rebind)) +cb.append('psaB.auto_rebind: ' + s(psaB.auto_rebind)) +cb.append('psaC.auto_rebind: ' + s(psaC.auto_rebind)) + del s del a @@ -1032,6 +1086,14 @@ del psa2 del psa3 del psa4 +del psa5 +del psa6 +del psa7 +del psa8 +del psa9 +del psaA +del psaB +del psaC del psar del ecall diff -r c35c9121c72b src/testdir/test87.ok --- a/src/testdir/test87.ok Tue May 24 22:30:07 2016 +0200 +++ b/src/testdir/test87.ok Wed May 25 01:14:35 2016 +0300 @@ -448,7 +448,7 @@ range:__dir__,append,end,start dictionary:__dir__,get,has_key,items,keys,locked,pop,popitem,scope,update,values list:__dir__,extend,locked -function:__dir__,args,self,softspace +function:__dir__,args,auto_rebind,self,softspace output:__dir__,close,closed,flush,isatty,readable,seekable,softspace,writable,write,writelines {} {'a': 1} @@ -460,6 +460,12 @@ function('tr') function('tr', {}) function('tr', [123, 3, 4], {}) +auto_rebind +function('tr') +function('tr', [123, 3, 4]) +function('tr') +function('tr', {}) +function('tr', [123, 3, 4], {}) a: <vim.Function 'Args'> pa1: <vim.Function 'Args', args=['abcArgsPA1']> pa2: <vim.Function 'Args'> @@ -470,6 +476,14 @@ psa2: <vim.Function 'SelfArgs'> psa3: <vim.Function 'SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}> psa4: <vim.Function 'SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'}> +psa5: <vim.Function 'SelfArgs', self={'abcSelfPSA5': 'abcSelfPSA5Val'}> +psa6: <vim.Function 'SelfArgs', args=['abcArgsPSA6'], self={'abcSelfPSA6': 'abcSelfPSA6Val'}> +psa7: <vim.Function 'SelfArgs', args=['abcArgsPSA7']> +psa8: <vim.Function 'SelfArgs'> +psa9: <vim.Function 'SelfArgs', self={'abcSelfPSA9': 'abcSelfPSA9Val'}, auto_rebind=True> +psaA: <vim.Function 'SelfArgs', args=['abcArgsPSAA'], self={'abcSelfPSAA': 'abcSelfPSAAVal'}, auto_rebind=True> +psaB: <vim.Function 'SelfArgs', args=['abcArgsPSAB']> +psaC: <vim.Function 'SelfArgs'> psar: <vim.Function 'SelfArgs', args=[{'abcArgsPSAr2': [{'rec': function('SelfArgs', [{...}], {...}), 'self': {...}, 'abcSelfPSAr': 'abcSelfPSArVal', 'args': [{...}]}, {...}], 'abcArgsPSAr': 'abcArgsPSArVal'}], self={'rec': function('SelfArgs', [{'abcArgsPSAr2': [{...}, {...}], 'abcArgsPSAr': 'abcArgsPSArVal'}], {...}), 'self': {...}, 'abcSelfPSAr': 'abcSelfPSArVal', 'args': [{...}]}> s(a): function('Args') s(pa1): function('Args', ['abcArgsPA1']) @@ -481,6 +495,27 @@ s(psa2): function('SelfArgs') s(psa3): function('SelfArgs', ['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}) s(psa4): function('SelfArgs', {'abcSelfPSA4': 'abcSelfPSA4Val'}) +s(psa5): function('SelfArgs', {'abcSelfPSA5': 'abcSelfPSA5Val'}) +s(psa6): function('SelfArgs', ['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}) +s(psa7): function('SelfArgs', ['abcArgsPSA7']) +s(psa8): function('SelfArgs') +s(psa9): function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'}) +s(psaA): function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'}) +s(psaB): function('SelfArgs', ['abcArgsPSAB']) +s(psaC): function('SelfArgs') +d.sa(): [[], {'f': function('SelfArgs')}] +d.psa1(): [['abcArgsPSA1'], {'f': function('SelfArgs', ['abcArgsPSA1'])}] +d.psa2(): [[], {'f': function('SelfArgs')}] +d.psa3(): [['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}] +d.psa4(): [[], {'abcSelfPSA4': 'abcSelfPSA4Val'}] +d.psa5(): [[], {'abcSelfPSA5': 'abcSelfPSA5Val'}] +d.psa6(): [['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}] +d.psa7(): [['abcArgsPSA7'], {'f': function('SelfArgs', ['abcArgsPSA7'])}] +d.psa8(): [[], {'f': function('SelfArgs')}] +d.psa9(): [[], {'f': function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'})}] +d.psaA(): [['abcArgsPSAA'], {'f': function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'})}] +d.psaB(): [['abcArgsPSAB'], {'f': function('SelfArgs', ['abcArgsPSAB'])}] +d.psaC(): [[], {'f': function('SelfArgs')}] a(): !result: [] pa1(): !result: ['abcArgsPA1'] pa2(): !result: [] @@ -551,6 +586,24 @@ psa2.name: 'SelfArgs' psa3.name: 'SelfArgs' psa4.name: 'SelfArgs' +a.auto_rebind: 1 +pa1.auto_rebind: 1 +pa2.auto_rebind: 1 +pa3.auto_rebind: 0 +pa4.auto_rebind: 0 +sa.auto_rebind: 1 +psa1.auto_rebind: 1 +psa2.auto_rebind: 1 +psa3.auto_rebind: 0 +psa4.auto_rebind: 0 +psa5.auto_rebind: 0 +psa6.auto_rebind: 0 +psa7.auto_rebind: 1 +psa8.auto_rebind: 1 +psa9.auto_rebind: 1 +psaA.auto_rebind: 1 +psaB.auto_rebind: 1 +psaC.auto_rebind: 1 ' abcdef Error detected while processing function RunTest[]..Test: > > > Best, > Christian > -- > Was ist das Allgemeine? > Der einzelne Fall. > Was ist das Besondere? > Millionen Fälle. > -- Goethe, Maximen und Reflektionen, Nr. 875 > > -- > -- > 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. -- -- 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.
diff -crN vim-upstream.c35c9121c72b/runtime/doc/if_pyth.txt vim-upstream/runtime/doc/if_pyth.txt *** vim-upstream.c35c9121c72b/runtime/doc/if_pyth.txt 2016-05-25 01:14:24.520696433 +0300 --- vim-upstream/runtime/doc/if_pyth.txt 2016-05-25 01:14:24.530691324 +0300 *************** *** 659,677 **** `vim.bindeval('function(%s)'%json.dumps(name))`. Attributes (read-only): ! Attribute Description ~ ! name Function name. ! args `None` or a |python-List| object with arguments. Note that ! this is a copy of the arguments list, constructed each time ! you request this attribute. Modifications made to the list ! will be ignored (but not to the containers inside argument ! list: this is like |copy()| and not |deepcopy()|). ! self `None` or a |python-Dictionary| object with self ! dictionary. Note that explicit `self` keyword used when ! calling resulting object overrides this attribute. ! Constructor additionally accepts `args` and `self` keywords. If any of ! them is given then it constructs a partial, see |function()|. Examples: > f = vim.Function('tr') # Constructor --- 659,689 ---- `vim.bindeval('function(%s)'%json.dumps(name))`. Attributes (read-only): ! Attribute Description ~ ! name Function name. ! args `None` or a |python-List| object with arguments. Note ! that this is a copy of the arguments list, constructed ! each time you request this attribute. Modifications made ! to the list will be ignored (but not to the containers ! inside argument list: this is like |copy()| and not ! |deepcopy()|). ! self `None` or a |python-Dictionary| object with self ! dictionary. Note that explicit `self` keyword used when ! calling resulting object overrides this attribute. ! auto_rebind Boolean. True if partial created from this Python object ! and stored in the VimL dictionary should be automatically ! rebound to the dictionary it is stored in when this ! dictionary is indexed. Exposes Vim internal difference ! between `dict.func` (auto_rebind=True) and ! `function(dict.func,dict)` (auto_rebind=False). This ! attribute makes no sense if `self` attribute is `None`. ! Constructor additionally accepts `args`, `self` and `auto_rebind` ! keywords. If `args` and/or `self` argument is given then it constructs ! a partial, see |function()|. `auto_rebind` is only used when `self` ! argument is given, otherwise it is assumed to be `True` regardless of ! whether it was given or not. If `self` is given then it defaults to ! `False`. Examples: > f = vim.Function('tr') # Constructor diff -crN vim-upstream.c35c9121c72b/src/if_py_both.h vim-upstream/src/if_py_both.h *** vim-upstream.c35c9121c72b/src/if_py_both.h 2016-05-25 01:14:24.530691324 +0300 --- vim-upstream/src/if_py_both.h 2016-05-25 01:14:24.530691324 +0300 *************** *** 2835,2850 **** typval_T *argv; dict_T *self; pylinkedlist_T ref; } FunctionObject; static PyTypeObject FunctionType; ! #define NEW_FUNCTION(name, argc, argv, self) \ ! FunctionNew(&FunctionType, name, argc, argv, self) static PyObject * FunctionNew(PyTypeObject *subtype, char_u *name, int argc, typval_T *argv, ! dict_T *selfdict) { FunctionObject *self; --- 2835,2851 ---- typval_T *argv; dict_T *self; pylinkedlist_T ref; + int auto_rebind; } FunctionObject; static PyTypeObject FunctionType; ! #define NEW_FUNCTION(name, argc, argv, self, pt_auto) \ ! FunctionNew(&FunctionType, (name), (argc), (argv), (self), (pt_auto)) static PyObject * FunctionNew(PyTypeObject *subtype, char_u *name, int argc, typval_T *argv, ! dict_T *selfdict, int auto_rebind) { FunctionObject *self; *************** *** 2877,2882 **** --- 2878,2884 ---- self->argc = argc; self->argv = argv; self->self = selfdict; + self->auto_rebind = selfdict == NULL ? TRUE : auto_rebind; if (self->argv || self->self) pyll_add((PyObject *)(self), &self->ref, &lastfunc); *************** *** 2889,2894 **** --- 2891,2897 ---- { PyObject *self; PyObject *selfdictObject; + PyObject *autoRebindObject; PyObject *argsObject = NULL; char_u *name; typval_T selfdicttv; *************** *** 2896,2901 **** --- 2899,2905 ---- list_T *argslist = NULL; dict_T *selfdict = NULL; int argc = 0; + int auto_rebind = TRUE; typval_T *argv = NULL; typval_T *curtv; listitem_T *li; *************** *** 2936,2941 **** --- 2940,2960 ---- } list_unref(argslist); } + if (selfdict != NULL) + { + auto_rebind = FALSE; + autoRebindObject = PyDict_GetItemString(kwargs, "auto_rebind"); + if (autoRebindObject != NULL) + { + auto_rebind = PyObject_IsTrue(autoRebindObject); + if (auto_rebind == -1) + { + dict_unref(selfdict); + list_unref(argslist); + return NULL; + } + } + } } if (!PyArg_ParseTuple(args, "et", "ascii", &name)) *************** *** 2947,2953 **** return NULL; } ! self = FunctionNew(subtype, name, argc, argv, selfdict); PyMem_Free(name); --- 2966,2972 ---- return NULL; } ! self = FunctionNew(subtype, name, argc, argv, selfdict, auto_rebind); PyMem_Free(name); *************** *** 2971,2977 **** } static char *FunctionAttrs[] = { ! "softspace", "args", "self", NULL }; --- 2990,2996 ---- } static char *FunctionAttrs[] = { ! "softspace", "args", "self", "auto_rebind", NULL }; *************** *** 3001,3006 **** --- 3020,3029 ---- return self->self == NULL ? AlwaysNone(NULL) : NEW_DICTIONARY(self->self); + else if (strcmp(name, "auto_rebind") == 0) + return self->auto_rebind + ? AlwaysTrue(NULL) + : AlwaysFalse(NULL); else if (strcmp(name, "__members__") == 0) return ObjectDir(NULL, FunctionAttrs); return NULL; *************** *** 3035,3040 **** --- 3058,3064 ---- pt->pt_argc = 0; pt->pt_argv = NULL; } + pt->pt_auto = self->auto_rebind || !exported; pt->pt_dict = self->self; if (exported && self->self) ++pt->pt_dict->dv_refcount; *************** *** 3148,3153 **** --- 3172,3179 ---- ga_concat(&repr_ga, tv2string(&tv, &tofree, numbuf, get_copyID())); --emsg_silent; vim_free(tofree); + if (self->auto_rebind) + ga_concat(&repr_ga, (char_u *)", auto_rebind=True"); } ga_append(&repr_ga, '>'); ret = PyString_FromString((char *)repr_ga.ga_data); *************** *** 6269,6275 **** case VAR_FUNC: return NEW_FUNCTION(tv->vval.v_string == NULL ? (char_u *)"" : tv->vval.v_string, ! 0, NULL, NULL); case VAR_PARTIAL: if (tv->vval.v_partial->pt_argc) { --- 6295,6301 ---- case VAR_FUNC: return NEW_FUNCTION(tv->vval.v_string == NULL ? (char_u *)"" : tv->vval.v_string, ! 0, NULL, NULL, TRUE); case VAR_PARTIAL: if (tv->vval.v_partial->pt_argc) { *************** *** 6284,6290 **** return NEW_FUNCTION(tv->vval.v_partial == NULL ? (char_u *)"" : tv->vval.v_partial->pt_name, tv->vval.v_partial->pt_argc, argv, ! tv->vval.v_partial->pt_dict); case VAR_UNKNOWN: case VAR_CHANNEL: case VAR_JOB: --- 6310,6317 ---- return NEW_FUNCTION(tv->vval.v_partial == NULL ? (char_u *)"" : tv->vval.v_partial->pt_name, tv->vval.v_partial->pt_argc, argv, ! tv->vval.v_partial->pt_dict, ! tv->vval.v_partial->pt_auto); case VAR_UNKNOWN: case VAR_CHANNEL: case VAR_JOB: diff -crN vim-upstream.c35c9121c72b/src/testdir/test86.in vim-upstream/src/testdir/test86.in *** vim-upstream.c35c9121c72b/src/testdir/test86.in 2016-05-25 01:14:24.530691324 +0300 --- vim-upstream/src/testdir/test86.in 2016-05-25 01:14:24.530691324 +0300 *************** *** 877,882 **** --- 877,888 ---- :$put =string(pyeval('vim.Function(''tr'', args=[])')) :$put =string(pyeval('vim.Function(''tr'', self={})')) :$put =string(pyeval('vim.Function(''tr'', args=[123, 3, 4], self={})')) + :$put ='auto_rebind' + :$put =string(pyeval('vim.Function(''tr'', auto_rebind=False)')) + :$put =string(pyeval('vim.Function(''tr'', args=[123, 3, 4], auto_rebind=False)')) + :$put =string(pyeval('vim.Function(''tr'', args=[], auto_rebind=False)')) + :$put =string(pyeval('vim.Function(''tr'', self={}, auto_rebind=False)')) + :$put =string(pyeval('vim.Function(''tr'', args=[123, 3, 4], self={}, auto_rebind=False)')) :" :" Test vim.Function :function Args(...) *************** *** 915,925 **** --- 921,947 ---- psa2 = vim.Function('SelfArgs', args=[]) psa3 = vim.Function('SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}) psa4 = vim.Function('SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'}) + psa5 = vim.Function('SelfArgs', self={'abcSelfPSA5': 'abcSelfPSA5Val'}, auto_rebind=0) + psa6 = vim.Function('SelfArgs', args=['abcArgsPSA6'], self={'abcSelfPSA6': 'abcSelfPSA6Val'}, auto_rebind=()) + psa7 = vim.Function('SelfArgs', args=['abcArgsPSA7'], auto_rebind=[]) + psa8 = vim.Function('SelfArgs', auto_rebind=False) + psa9 = vim.Function('SelfArgs', self={'abcSelfPSA9': 'abcSelfPSA9Val'}, auto_rebind=True) + psaA = vim.Function('SelfArgs', args=['abcArgsPSAA'], self={'abcSelfPSAA': 'abcSelfPSAAVal'}, auto_rebind=1) + psaB = vim.Function('SelfArgs', args=['abcArgsPSAB'], auto_rebind={'abcARPSAB': 'abcARPSABVal'}) + psaC = vim.Function('SelfArgs', auto_rebind=['abcARPSAC']) cb.append('sa: ' + repr(sa)) cb.append('psa1: ' + repr(psa1)) cb.append('psa2: ' + repr(psa2)) cb.append('psa3: ' + repr(psa3)) cb.append('psa4: ' + repr(psa4)) + cb.append('psa5: ' + repr(psa5)) + cb.append('psa6: ' + repr(psa6)) + cb.append('psa7: ' + repr(psa7)) + cb.append('psa8: ' + repr(psa8)) + cb.append('psa9: ' + repr(psa9)) + cb.append('psaA: ' + repr(psaA)) + cb.append('psaB: ' + repr(psaB)) + cb.append('psaC: ' + repr(psaC)) psar = vim.Function('SelfArgs', args=[{'abcArgsPSAr': 'abcArgsPSArVal'}], self={'abcSelfPSAr': 'abcSelfPSArVal'}) psar.args[0]['abcArgsPSAr2'] = [psar.self, psar.args[0]] *************** *** 942,947 **** --- 964,982 ---- :$put ='s(psa2): '.string(pyeval('psa2')) :$put ='s(psa3): '.string(pyeval('psa3')) :$put ='s(psa4): '.string(pyeval('psa4')) + :$put ='s(psa5): '.string(pyeval('psa5')) + :$put ='s(psa6): '.string(pyeval('psa6')) + :$put ='s(psa7): '.string(pyeval('psa7')) + :$put ='s(psa8): '.string(pyeval('psa8')) + :$put ='s(psa9): '.string(pyeval('psa9')) + :$put ='s(psaA): '.string(pyeval('psaA')) + :$put ='s(psaB): '.string(pyeval('psaB')) + :$put ='s(psaC): '.string(pyeval('psaC')) + : + :for v in ['sa', 'psa1', 'psa2', 'psa3', 'psa4', 'psa5', 'psa6', 'psa7', 'psa8', 'psa9', 'psaA', 'psaB', 'psaC'] + : let d = {'f': pyeval(v)} + : $put ='d.'.v.'(): '.string(d.f()) + :endfor : :py ecall('a()', a, ) :py ecall('pa1()', pa1, ) *************** *** 1026,1031 **** --- 1061,1085 ---- cb.append('psa3.name: ' + s(psa3.name)) cb.append('psa4.name: ' + s(psa4.name)) + cb.append('a.auto_rebind: ' + s(a.auto_rebind)) + cb.append('pa1.auto_rebind: ' + s(pa1.auto_rebind)) + cb.append('pa2.auto_rebind: ' + s(pa2.auto_rebind)) + cb.append('pa3.auto_rebind: ' + s(pa3.auto_rebind)) + cb.append('pa4.auto_rebind: ' + s(pa4.auto_rebind)) + cb.append('sa.auto_rebind: ' + s(sa.auto_rebind)) + cb.append('psa1.auto_rebind: ' + s(psa1.auto_rebind)) + cb.append('psa2.auto_rebind: ' + s(psa2.auto_rebind)) + cb.append('psa3.auto_rebind: ' + s(psa3.auto_rebind)) + cb.append('psa4.auto_rebind: ' + s(psa4.auto_rebind)) + cb.append('psa5.auto_rebind: ' + s(psa5.auto_rebind)) + cb.append('psa6.auto_rebind: ' + s(psa6.auto_rebind)) + cb.append('psa7.auto_rebind: ' + s(psa7.auto_rebind)) + cb.append('psa8.auto_rebind: ' + s(psa8.auto_rebind)) + cb.append('psa9.auto_rebind: ' + s(psa9.auto_rebind)) + cb.append('psaA.auto_rebind: ' + s(psaA.auto_rebind)) + cb.append('psaB.auto_rebind: ' + s(psaB.auto_rebind)) + cb.append('psaC.auto_rebind: ' + s(psaC.auto_rebind)) + del s del a *************** *** 1038,1043 **** --- 1092,1105 ---- del psa2 del psa3 del psa4 + del psa5 + del psa6 + del psa7 + del psa8 + del psa9 + del psaA + del psaB + del psaC del psar del ecall diff -crN vim-upstream.c35c9121c72b/src/testdir/test86.ok vim-upstream/src/testdir/test86.ok *** vim-upstream.c35c9121c72b/src/testdir/test86.ok 2016-05-25 01:14:24.530691324 +0300 --- vim-upstream/src/testdir/test86.ok 2016-05-25 01:14:24.530691324 +0300 *************** *** 448,454 **** range:__dir__,__members__,append,end,start dictionary:__dir__,__members__,get,has_key,items,keys,locked,pop,popitem,scope,update,values list:__dir__,__members__,extend,locked ! function:__dir__,__members__,args,self,softspace output:__dir__,__members__,close,closed,flush,isatty,readable,seekable,softspace,writable,write,writelines {} {'a': 1} --- 448,454 ---- range:__dir__,__members__,append,end,start dictionary:__dir__,__members__,get,has_key,items,keys,locked,pop,popitem,scope,update,values list:__dir__,__members__,extend,locked ! function:__dir__,__members__,args,auto_rebind,self,softspace output:__dir__,__members__,close,closed,flush,isatty,readable,seekable,softspace,writable,write,writelines {} {'a': 1} *************** *** 460,465 **** --- 460,471 ---- function('tr') function('tr', {}) function('tr', [123, 3, 4], {}) + auto_rebind + function('tr') + function('tr', [123, 3, 4]) + function('tr') + function('tr', {}) + function('tr', [123, 3, 4], {}) a: <vim.Function 'Args'> pa1: <vim.Function 'Args', args=['abcArgsPA1']> pa2: <vim.Function 'Args'> *************** *** 470,475 **** --- 476,489 ---- psa2: <vim.Function 'SelfArgs'> psa3: <vim.Function 'SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}> psa4: <vim.Function 'SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'}> + psa5: <vim.Function 'SelfArgs', self={'abcSelfPSA5': 'abcSelfPSA5Val'}> + psa6: <vim.Function 'SelfArgs', args=['abcArgsPSA6'], self={'abcSelfPSA6': 'abcSelfPSA6Val'}> + psa7: <vim.Function 'SelfArgs', args=['abcArgsPSA7']> + psa8: <vim.Function 'SelfArgs'> + psa9: <vim.Function 'SelfArgs', self={'abcSelfPSA9': 'abcSelfPSA9Val'}, auto_rebind=True> + psaA: <vim.Function 'SelfArgs', args=['abcArgsPSAA'], self={'abcSelfPSAA': 'abcSelfPSAAVal'}, auto_rebind=True> + psaB: <vim.Function 'SelfArgs', args=['abcArgsPSAB']> + psaC: <vim.Function 'SelfArgs'> psar: <vim.Function 'SelfArgs', args=[{'abcArgsPSAr2': [{'rec': function('SelfArgs', [{...}], {...}), 'self': {...}, 'abcSelfPSAr': 'abcSelfPSArVal', 'args': [{...}]}, {...}], 'abcArgsPSAr': 'abcArgsPSArVal'}], self={'rec': function('SelfArgs', [{'abcArgsPSAr2': [{...}, {...}], 'abcArgsPSAr': 'abcArgsPSArVal'}], {...}), 'self': {...}, 'abcSelfPSAr': 'abcSelfPSArVal', 'args': [{...}]}> s(a): function('Args') s(pa1): function('Args', ['abcArgsPA1']) *************** *** 481,486 **** --- 495,521 ---- s(psa2): function('SelfArgs') s(psa3): function('SelfArgs', ['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}) s(psa4): function('SelfArgs', {'abcSelfPSA4': 'abcSelfPSA4Val'}) + s(psa5): function('SelfArgs', {'abcSelfPSA5': 'abcSelfPSA5Val'}) + s(psa6): function('SelfArgs', ['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}) + s(psa7): function('SelfArgs', ['abcArgsPSA7']) + s(psa8): function('SelfArgs') + s(psa9): function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'}) + s(psaA): function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'}) + s(psaB): function('SelfArgs', ['abcArgsPSAB']) + s(psaC): function('SelfArgs') + d.sa(): [[], {'f': function('SelfArgs')}] + d.psa1(): [['abcArgsPSA1'], {'f': function('SelfArgs', ['abcArgsPSA1'])}] + d.psa2(): [[], {'f': function('SelfArgs')}] + d.psa3(): [['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}] + d.psa4(): [[], {'abcSelfPSA4': 'abcSelfPSA4Val'}] + d.psa5(): [[], {'abcSelfPSA5': 'abcSelfPSA5Val'}] + d.psa6(): [['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}] + d.psa7(): [['abcArgsPSA7'], {'f': function('SelfArgs', ['abcArgsPSA7'])}] + d.psa8(): [[], {'f': function('SelfArgs')}] + d.psa9(): [[], {'f': function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'})}] + d.psaA(): [['abcArgsPSAA'], {'f': function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'})}] + d.psaB(): [['abcArgsPSAB'], {'f': function('SelfArgs', ['abcArgsPSAB'])}] + d.psaC(): [[], {'f': function('SelfArgs')}] a(): !result: [] pa1(): !result: ['abcArgsPA1'] pa2(): !result: [] *************** *** 551,556 **** --- 586,609 ---- psa2.name: 'SelfArgs' psa3.name: 'SelfArgs' psa4.name: 'SelfArgs' + a.auto_rebind: 1 + pa1.auto_rebind: 1 + pa2.auto_rebind: 1 + pa3.auto_rebind: 0 + pa4.auto_rebind: 0 + sa.auto_rebind: 1 + psa1.auto_rebind: 1 + psa2.auto_rebind: 1 + psa3.auto_rebind: 0 + psa4.auto_rebind: 0 + psa5.auto_rebind: 0 + psa6.auto_rebind: 0 + psa7.auto_rebind: 1 + psa8.auto_rebind: 1 + psa9.auto_rebind: 1 + psaA.auto_rebind: 1 + psaB.auto_rebind: 1 + psaC.auto_rebind: 1 ' abcdef Error detected while processing function RunTest[]..Test: diff -crN vim-upstream.c35c9121c72b/src/testdir/test87.in vim-upstream/src/testdir/test87.in *** vim-upstream.c35c9121c72b/src/testdir/test87.in 2016-05-25 01:14:24.530691324 +0300 --- vim-upstream/src/testdir/test87.in 2016-05-25 01:14:24.530691324 +0300 *************** *** 871,876 **** --- 871,882 ---- :$put =string(py3eval('vim.Function(''tr'', args=[])')) :$put =string(py3eval('vim.Function(''tr'', self={})')) :$put =string(py3eval('vim.Function(''tr'', args=[123, 3, 4], self={})')) + :$put ='auto_rebind' + :$put =string(py3eval('vim.Function(''tr'', auto_rebind=False)')) + :$put =string(py3eval('vim.Function(''tr'', args=[123, 3, 4], auto_rebind=False)')) + :$put =string(py3eval('vim.Function(''tr'', args=[], auto_rebind=False)')) + :$put =string(py3eval('vim.Function(''tr'', self={}, auto_rebind=False)')) + :$put =string(py3eval('vim.Function(''tr'', args=[123, 3, 4], self={}, auto_rebind=False)')) :" :" Test vim.Function :function Args(...) *************** *** 909,919 **** --- 915,941 ---- psa2 = vim.Function('SelfArgs', args=[]) psa3 = vim.Function('SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}) psa4 = vim.Function('SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'}) + psa5 = vim.Function('SelfArgs', self={'abcSelfPSA5': 'abcSelfPSA5Val'}, auto_rebind=0) + psa6 = vim.Function('SelfArgs', args=['abcArgsPSA6'], self={'abcSelfPSA6': 'abcSelfPSA6Val'}, auto_rebind=()) + psa7 = vim.Function('SelfArgs', args=['abcArgsPSA7'], auto_rebind=[]) + psa8 = vim.Function('SelfArgs', auto_rebind=False) + psa9 = vim.Function('SelfArgs', self={'abcSelfPSA9': 'abcSelfPSA9Val'}, auto_rebind=True) + psaA = vim.Function('SelfArgs', args=['abcArgsPSAA'], self={'abcSelfPSAA': 'abcSelfPSAAVal'}, auto_rebind=1) + psaB = vim.Function('SelfArgs', args=['abcArgsPSAB'], auto_rebind={'abcARPSAB': 'abcARPSABVal'}) + psaC = vim.Function('SelfArgs', auto_rebind=['abcARPSAC']) cb.append('sa: ' + repr(sa)) cb.append('psa1: ' + repr(psa1)) cb.append('psa2: ' + repr(psa2)) cb.append('psa3: ' + repr(psa3)) cb.append('psa4: ' + repr(psa4)) + cb.append('psa5: ' + repr(psa5)) + cb.append('psa6: ' + repr(psa6)) + cb.append('psa7: ' + repr(psa7)) + cb.append('psa8: ' + repr(psa8)) + cb.append('psa9: ' + repr(psa9)) + cb.append('psaA: ' + repr(psaA)) + cb.append('psaB: ' + repr(psaB)) + cb.append('psaC: ' + repr(psaC)) psar = vim.Function('SelfArgs', args=[{'abcArgsPSAr': 'abcArgsPSArVal'}], self={'abcSelfPSAr': 'abcSelfPSArVal'}) psar.args[0]['abcArgsPSAr2'] = [psar.self, psar.args[0]] *************** *** 936,941 **** --- 958,976 ---- :$put ='s(psa2): '.string(py3eval('psa2')) :$put ='s(psa3): '.string(py3eval('psa3')) :$put ='s(psa4): '.string(py3eval('psa4')) + :$put ='s(psa5): '.string(py3eval('psa5')) + :$put ='s(psa6): '.string(py3eval('psa6')) + :$put ='s(psa7): '.string(py3eval('psa7')) + :$put ='s(psa8): '.string(py3eval('psa8')) + :$put ='s(psa9): '.string(py3eval('psa9')) + :$put ='s(psaA): '.string(py3eval('psaA')) + :$put ='s(psaB): '.string(py3eval('psaB')) + :$put ='s(psaC): '.string(py3eval('psaC')) + : + :for v in ['sa', 'psa1', 'psa2', 'psa3', 'psa4', 'psa5', 'psa6', 'psa7', 'psa8', 'psa9', 'psaA', 'psaB', 'psaC'] + : let d = {'f': py3eval(v)} + : $put ='d.'.v.'(): '.string(d.f()) + :endfor : :py3 ecall('a()', a, ) :py3 ecall('pa1()', pa1, ) *************** *** 1020,1025 **** --- 1055,1079 ---- cb.append('psa3.name: ' + s(psa3.name)) cb.append('psa4.name: ' + s(psa4.name)) + cb.append('a.auto_rebind: ' + s(a.auto_rebind)) + cb.append('pa1.auto_rebind: ' + s(pa1.auto_rebind)) + cb.append('pa2.auto_rebind: ' + s(pa2.auto_rebind)) + cb.append('pa3.auto_rebind: ' + s(pa3.auto_rebind)) + cb.append('pa4.auto_rebind: ' + s(pa4.auto_rebind)) + cb.append('sa.auto_rebind: ' + s(sa.auto_rebind)) + cb.append('psa1.auto_rebind: ' + s(psa1.auto_rebind)) + cb.append('psa2.auto_rebind: ' + s(psa2.auto_rebind)) + cb.append('psa3.auto_rebind: ' + s(psa3.auto_rebind)) + cb.append('psa4.auto_rebind: ' + s(psa4.auto_rebind)) + cb.append('psa5.auto_rebind: ' + s(psa5.auto_rebind)) + cb.append('psa6.auto_rebind: ' + s(psa6.auto_rebind)) + cb.append('psa7.auto_rebind: ' + s(psa7.auto_rebind)) + cb.append('psa8.auto_rebind: ' + s(psa8.auto_rebind)) + cb.append('psa9.auto_rebind: ' + s(psa9.auto_rebind)) + cb.append('psaA.auto_rebind: ' + s(psaA.auto_rebind)) + cb.append('psaB.auto_rebind: ' + s(psaB.auto_rebind)) + cb.append('psaC.auto_rebind: ' + s(psaC.auto_rebind)) + del s del a *************** *** 1032,1037 **** --- 1086,1099 ---- del psa2 del psa3 del psa4 + del psa5 + del psa6 + del psa7 + del psa8 + del psa9 + del psaA + del psaB + del psaC del psar del ecall diff -crN vim-upstream.c35c9121c72b/src/testdir/test87.ok vim-upstream/src/testdir/test87.ok *** vim-upstream.c35c9121c72b/src/testdir/test87.ok 2016-05-25 01:14:24.530691324 +0300 --- vim-upstream/src/testdir/test87.ok 2016-05-25 01:14:24.530691324 +0300 *************** *** 448,454 **** range:__dir__,append,end,start dictionary:__dir__,get,has_key,items,keys,locked,pop,popitem,scope,update,values list:__dir__,extend,locked ! function:__dir__,args,self,softspace output:__dir__,close,closed,flush,isatty,readable,seekable,softspace,writable,write,writelines {} {'a': 1} --- 448,454 ---- range:__dir__,append,end,start dictionary:__dir__,get,has_key,items,keys,locked,pop,popitem,scope,update,values list:__dir__,extend,locked ! function:__dir__,args,auto_rebind,self,softspace output:__dir__,close,closed,flush,isatty,readable,seekable,softspace,writable,write,writelines {} {'a': 1} *************** *** 460,465 **** --- 460,471 ---- function('tr') function('tr', {}) function('tr', [123, 3, 4], {}) + auto_rebind + function('tr') + function('tr', [123, 3, 4]) + function('tr') + function('tr', {}) + function('tr', [123, 3, 4], {}) a: <vim.Function 'Args'> pa1: <vim.Function 'Args', args=['abcArgsPA1']> pa2: <vim.Function 'Args'> *************** *** 470,475 **** --- 476,489 ---- psa2: <vim.Function 'SelfArgs'> psa3: <vim.Function 'SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}> psa4: <vim.Function 'SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'}> + psa5: <vim.Function 'SelfArgs', self={'abcSelfPSA5': 'abcSelfPSA5Val'}> + psa6: <vim.Function 'SelfArgs', args=['abcArgsPSA6'], self={'abcSelfPSA6': 'abcSelfPSA6Val'}> + psa7: <vim.Function 'SelfArgs', args=['abcArgsPSA7']> + psa8: <vim.Function 'SelfArgs'> + psa9: <vim.Function 'SelfArgs', self={'abcSelfPSA9': 'abcSelfPSA9Val'}, auto_rebind=True> + psaA: <vim.Function 'SelfArgs', args=['abcArgsPSAA'], self={'abcSelfPSAA': 'abcSelfPSAAVal'}, auto_rebind=True> + psaB: <vim.Function 'SelfArgs', args=['abcArgsPSAB']> + psaC: <vim.Function 'SelfArgs'> psar: <vim.Function 'SelfArgs', args=[{'abcArgsPSAr2': [{'rec': function('SelfArgs', [{...}], {...}), 'self': {...}, 'abcSelfPSAr': 'abcSelfPSArVal', 'args': [{...}]}, {...}], 'abcArgsPSAr': 'abcArgsPSArVal'}], self={'rec': function('SelfArgs', [{'abcArgsPSAr2': [{...}, {...}], 'abcArgsPSAr': 'abcArgsPSArVal'}], {...}), 'self': {...}, 'abcSelfPSAr': 'abcSelfPSArVal', 'args': [{...}]}> s(a): function('Args') s(pa1): function('Args', ['abcArgsPA1']) *************** *** 481,486 **** --- 495,521 ---- s(psa2): function('SelfArgs') s(psa3): function('SelfArgs', ['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}) s(psa4): function('SelfArgs', {'abcSelfPSA4': 'abcSelfPSA4Val'}) + s(psa5): function('SelfArgs', {'abcSelfPSA5': 'abcSelfPSA5Val'}) + s(psa6): function('SelfArgs', ['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}) + s(psa7): function('SelfArgs', ['abcArgsPSA7']) + s(psa8): function('SelfArgs') + s(psa9): function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'}) + s(psaA): function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'}) + s(psaB): function('SelfArgs', ['abcArgsPSAB']) + s(psaC): function('SelfArgs') + d.sa(): [[], {'f': function('SelfArgs')}] + d.psa1(): [['abcArgsPSA1'], {'f': function('SelfArgs', ['abcArgsPSA1'])}] + d.psa2(): [[], {'f': function('SelfArgs')}] + d.psa3(): [['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}] + d.psa4(): [[], {'abcSelfPSA4': 'abcSelfPSA4Val'}] + d.psa5(): [[], {'abcSelfPSA5': 'abcSelfPSA5Val'}] + d.psa6(): [['abcArgsPSA6'], {'abcSelfPSA6': 'abcSelfPSA6Val'}] + d.psa7(): [['abcArgsPSA7'], {'f': function('SelfArgs', ['abcArgsPSA7'])}] + d.psa8(): [[], {'f': function('SelfArgs')}] + d.psa9(): [[], {'f': function('SelfArgs', {'abcSelfPSA9': 'abcSelfPSA9Val'})}] + d.psaA(): [['abcArgsPSAA'], {'f': function('SelfArgs', ['abcArgsPSAA'], {'abcSelfPSAA': 'abcSelfPSAAVal'})}] + d.psaB(): [['abcArgsPSAB'], {'f': function('SelfArgs', ['abcArgsPSAB'])}] + d.psaC(): [[], {'f': function('SelfArgs')}] a(): !result: [] pa1(): !result: ['abcArgsPA1'] pa2(): !result: [] *************** *** 551,556 **** --- 586,609 ---- psa2.name: 'SelfArgs' psa3.name: 'SelfArgs' psa4.name: 'SelfArgs' + a.auto_rebind: 1 + pa1.auto_rebind: 1 + pa2.auto_rebind: 1 + pa3.auto_rebind: 0 + pa4.auto_rebind: 0 + sa.auto_rebind: 1 + psa1.auto_rebind: 1 + psa2.auto_rebind: 1 + psa3.auto_rebind: 0 + psa4.auto_rebind: 0 + psa5.auto_rebind: 0 + psa6.auto_rebind: 0 + psa7.auto_rebind: 1 + psa8.auto_rebind: 1 + psa9.auto_rebind: 1 + psaA.auto_rebind: 1 + psaB.auto_rebind: 1 + psaC.auto_rebind: 1 ' abcdef Error detected while processing function RunTest[]..Test: