1
0
forked from aniani/vim

patch 7.4.1843

Problem:    Tests involving Python are flaky.
Solution:   Set the pt_auto field.  Add tests. (Nikolai Pavlov)
This commit is contained in:
Bram Moolenaar
2016-05-25 20:39:09 +02:00
parent 03e19a04ac
commit 2177f9fe18
7 changed files with 293 additions and 21 deletions

View File

@@ -659,19 +659,31 @@ vim.Function object *python-Function*
`vim.bindeval('function(%s)'%json.dumps(name))`. `vim.bindeval('function(%s)'%json.dumps(name))`.
Attributes (read-only): Attributes (read-only):
Attribute Description ~ Attribute Description ~
name Function name. name Function name.
args `None` or a |python-List| object with arguments. Note that args `None` or a |python-List| object with arguments. Note
this is a copy of the arguments list, constructed each time that this is a copy of the arguments list, constructed
you request this attribute. Modifications made to the list each time you request this attribute. Modifications made
will be ignored (but not to the containers inside argument to the list will be ignored (but not to the containers
list: this is like |copy()| and not |deepcopy()|). inside argument list: this is like |copy()| and not
self `None` or a |python-Dictionary| object with self |deepcopy()|).
dictionary. Note that explicit `self` keyword used when self `None` or a |python-Dictionary| object with self
calling resulting object overrides this attribute. 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 Constructor additionally accepts `args`, `self` and `auto_rebind`
them is given then it constructs a partial, see |function()|. 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: > Examples: >
f = vim.Function('tr') # Constructor f = vim.Function('tr') # Constructor

View File

@@ -2835,16 +2835,17 @@ typedef struct
typval_T *argv; typval_T *argv;
dict_T *self; dict_T *self;
pylinkedlist_T ref; pylinkedlist_T ref;
int auto_rebind;
} FunctionObject; } FunctionObject;
static PyTypeObject FunctionType; static PyTypeObject FunctionType;
#define NEW_FUNCTION(name, argc, argv, self) \ #define NEW_FUNCTION(name, argc, argv, self, pt_auto) \
FunctionNew(&FunctionType, name, argc, argv, self) FunctionNew(&FunctionType, (name), (argc), (argv), (self), (pt_auto))
static PyObject * static PyObject *
FunctionNew(PyTypeObject *subtype, char_u *name, int argc, typval_T *argv, FunctionNew(PyTypeObject *subtype, char_u *name, int argc, typval_T *argv,
dict_T *selfdict) dict_T *selfdict, int auto_rebind)
{ {
FunctionObject *self; FunctionObject *self;
@@ -2877,6 +2878,7 @@ FunctionNew(PyTypeObject *subtype, char_u *name, int argc, typval_T *argv,
self->argc = argc; self->argc = argc;
self->argv = argv; self->argv = argv;
self->self = selfdict; self->self = selfdict;
self->auto_rebind = selfdict == NULL ? TRUE : auto_rebind;
if (self->argv || self->self) if (self->argv || self->self)
pyll_add((PyObject *)(self), &self->ref, &lastfunc); pyll_add((PyObject *)(self), &self->ref, &lastfunc);
@@ -2889,6 +2891,7 @@ FunctionConstructor(PyTypeObject *subtype, PyObject *args, PyObject *kwargs)
{ {
PyObject *self; PyObject *self;
PyObject *selfdictObject; PyObject *selfdictObject;
PyObject *autoRebindObject;
PyObject *argsObject = NULL; PyObject *argsObject = NULL;
char_u *name; char_u *name;
typval_T selfdicttv; typval_T selfdicttv;
@@ -2896,6 +2899,7 @@ FunctionConstructor(PyTypeObject *subtype, PyObject *args, PyObject *kwargs)
list_T *argslist = NULL; list_T *argslist = NULL;
dict_T *selfdict = NULL; dict_T *selfdict = NULL;
int argc = 0; int argc = 0;
int auto_rebind = TRUE;
typval_T *argv = NULL; typval_T *argv = NULL;
typval_T *curtv; typval_T *curtv;
listitem_T *li; listitem_T *li;
@@ -2936,6 +2940,21 @@ FunctionConstructor(PyTypeObject *subtype, PyObject *args, PyObject *kwargs)
} }
list_unref(argslist); 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)) if (!PyArg_ParseTuple(args, "et", "ascii", &name))
@@ -2947,7 +2966,7 @@ FunctionConstructor(PyTypeObject *subtype, PyObject *args, PyObject *kwargs)
return NULL; return NULL;
} }
self = FunctionNew(subtype, name, argc, argv, selfdict); self = FunctionNew(subtype, name, argc, argv, selfdict, auto_rebind);
PyMem_Free(name); PyMem_Free(name);
@@ -2971,7 +2990,7 @@ FunctionDestructor(FunctionObject *self)
} }
static char *FunctionAttrs[] = { static char *FunctionAttrs[] = {
"softspace", "args", "self", "softspace", "args", "self", "auto_rebind",
NULL NULL
}; };
@@ -3001,6 +3020,10 @@ FunctionAttr(FunctionObject *self, char *name)
return self->self == NULL return self->self == NULL
? AlwaysNone(NULL) ? AlwaysNone(NULL)
: NEW_DICTIONARY(self->self); : 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) else if (strcmp(name, "__members__") == 0)
return ObjectDir(NULL, FunctionAttrs); return ObjectDir(NULL, FunctionAttrs);
return NULL; return NULL;
@@ -3035,6 +3058,7 @@ set_partial(FunctionObject *self, partial_T *pt, int exported)
pt->pt_argc = 0; pt->pt_argc = 0;
pt->pt_argv = NULL; pt->pt_argv = NULL;
} }
pt->pt_auto = self->auto_rebind || !exported;
pt->pt_dict = self->self; pt->pt_dict = self->self;
if (exported && self->self) if (exported && self->self)
++pt->pt_dict->dv_refcount; ++pt->pt_dict->dv_refcount;
@@ -3076,6 +3100,7 @@ FunctionCall(FunctionObject *self, PyObject *argsObject, PyObject *kwargs)
if (self->argv || self->self) if (self->argv || self->self)
{ {
vim_memset(&pt, 0, sizeof(partial_T));
set_partial(self, &pt, FALSE); set_partial(self, &pt, FALSE);
pt_ptr = &pt; pt_ptr = &pt;
} }
@@ -3148,6 +3173,8 @@ FunctionRepr(FunctionObject *self)
ga_concat(&repr_ga, tv2string(&tv, &tofree, numbuf, get_copyID())); ga_concat(&repr_ga, tv2string(&tv, &tofree, numbuf, get_copyID()));
--emsg_silent; --emsg_silent;
vim_free(tofree); vim_free(tofree);
if (self->auto_rebind)
ga_concat(&repr_ga, (char_u *)", auto_rebind=True");
} }
ga_append(&repr_ga, '>'); ga_append(&repr_ga, '>');
ret = PyString_FromString((char *)repr_ga.ga_data); ret = PyString_FromString((char *)repr_ga.ga_data);
@@ -6269,7 +6296,7 @@ ConvertToPyObject(typval_T *tv)
case VAR_FUNC: case VAR_FUNC:
return NEW_FUNCTION(tv->vval.v_string == NULL return NEW_FUNCTION(tv->vval.v_string == NULL
? (char_u *)"" : tv->vval.v_string, ? (char_u *)"" : tv->vval.v_string,
0, NULL, NULL); 0, NULL, NULL, TRUE);
case VAR_PARTIAL: case VAR_PARTIAL:
if (tv->vval.v_partial->pt_argc) if (tv->vval.v_partial->pt_argc)
{ {
@@ -6284,7 +6311,8 @@ ConvertToPyObject(typval_T *tv)
return NEW_FUNCTION(tv->vval.v_partial == NULL return NEW_FUNCTION(tv->vval.v_partial == NULL
? (char_u *)"" : tv->vval.v_partial->pt_name, ? (char_u *)"" : tv->vval.v_partial->pt_name,
tv->vval.v_partial->pt_argc, argv, 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_UNKNOWN:
case VAR_CHANNEL: case VAR_CHANNEL:
case VAR_JOB: case VAR_JOB:

View File

@@ -877,6 +877,12 @@ EOF
:$put =string(pyeval('vim.Function(''tr'', args=[])')) :$put =string(pyeval('vim.Function(''tr'', args=[])'))
:$put =string(pyeval('vim.Function(''tr'', self={})')) :$put =string(pyeval('vim.Function(''tr'', self={})'))
:$put =string(pyeval('vim.Function(''tr'', args=[123, 3, 4], 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 :" Test vim.Function
:function Args(...) :function Args(...)
@@ -915,11 +921,27 @@ psa1 = vim.Function('SelfArgs', args=['abcArgsPSA1'])
psa2 = vim.Function('SelfArgs', args=[]) psa2 = vim.Function('SelfArgs', args=[])
psa3 = vim.Function('SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}) psa3 = vim.Function('SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'})
psa4 = vim.Function('SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'}) 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('sa: ' + repr(sa))
cb.append('psa1: ' + repr(psa1)) cb.append('psa1: ' + repr(psa1))
cb.append('psa2: ' + repr(psa2)) cb.append('psa2: ' + repr(psa2))
cb.append('psa3: ' + repr(psa3)) cb.append('psa3: ' + repr(psa3))
cb.append('psa4: ' + repr(psa4)) 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 = vim.Function('SelfArgs', args=[{'abcArgsPSAr': 'abcArgsPSArVal'}], self={'abcSelfPSAr': 'abcSelfPSArVal'})
psar.args[0]['abcArgsPSAr2'] = [psar.self, psar.args[0]] psar.args[0]['abcArgsPSAr2'] = [psar.self, psar.args[0]]
@@ -942,6 +964,19 @@ EOF
:$put ='s(psa2): '.string(pyeval('psa2')) :$put ='s(psa2): '.string(pyeval('psa2'))
:$put ='s(psa3): '.string(pyeval('psa3')) :$put ='s(psa3): '.string(pyeval('psa3'))
:$put ='s(psa4): '.string(pyeval('psa4')) :$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('a()', a, )
:py ecall('pa1()', pa1, ) :py ecall('pa1()', pa1, )
@@ -1026,6 +1061,25 @@ cb.append('psa2.name: ' + s(psa2.name))
cb.append('psa3.name: ' + s(psa3.name)) cb.append('psa3.name: ' + s(psa3.name))
cb.append('psa4.name: ' + s(psa4.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 s
del a del a
@@ -1038,6 +1092,14 @@ del psa1
del psa2 del psa2
del psa3 del psa3
del psa4 del psa4
del psa5
del psa6
del psa7
del psa8
del psa9
del psaA
del psaB
del psaC
del psar del psar
del ecall del ecall

View File

@@ -448,7 +448,7 @@ tabpage:__dir__,__members__,number,valid,vars,window,windows
range:__dir__,__members__,append,end,start range:__dir__,__members__,append,end,start
dictionary:__dir__,__members__,get,has_key,items,keys,locked,pop,popitem,scope,update,values dictionary:__dir__,__members__,get,has_key,items,keys,locked,pop,popitem,scope,update,values
list:__dir__,__members__,extend,locked 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 output:__dir__,__members__,close,closed,flush,isatty,readable,seekable,softspace,writable,write,writelines
{} {}
{'a': 1} {'a': 1}
@@ -460,6 +460,12 @@ function('tr', [123, 3, 4])
function('tr') function('tr')
function('tr', {}) function('tr', {})
function('tr', [123, 3, 4], {}) 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'> a: <vim.Function 'Args'>
pa1: <vim.Function 'Args', args=['abcArgsPA1']> pa1: <vim.Function 'Args', args=['abcArgsPA1']>
pa2: <vim.Function 'Args'> pa2: <vim.Function 'Args'>
@@ -470,6 +476,14 @@ psa1: <vim.Function 'SelfArgs', args=['abcArgsPSA1']>
psa2: <vim.Function 'SelfArgs'> psa2: <vim.Function 'SelfArgs'>
psa3: <vim.Function 'SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}> psa3: <vim.Function 'SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}>
psa4: <vim.Function 'SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'}> 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': [{...}]}> 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(a): function('Args')
s(pa1): function('Args', ['abcArgsPA1']) s(pa1): function('Args', ['abcArgsPA1'])
@@ -481,6 +495,27 @@ s(psa1): function('SelfArgs', ['abcArgsPSA1'])
s(psa2): function('SelfArgs') s(psa2): function('SelfArgs')
s(psa3): function('SelfArgs', ['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}) s(psa3): function('SelfArgs', ['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'})
s(psa4): function('SelfArgs', {'abcSelfPSA4': 'abcSelfPSA4Val'}) 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: [] a(): !result: []
pa1(): !result: ['abcArgsPA1'] pa1(): !result: ['abcArgsPA1']
pa2(): !result: [] pa2(): !result: []
@@ -551,6 +586,24 @@ psa1.name: 'SelfArgs'
psa2.name: 'SelfArgs' psa2.name: 'SelfArgs'
psa3.name: 'SelfArgs' psa3.name: 'SelfArgs'
psa4.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 abcdef
Error detected while processing function RunTest[]..Test: Error detected while processing function RunTest[]..Test:

View File

@@ -871,6 +871,12 @@ EOF
:$put =string(py3eval('vim.Function(''tr'', args=[])')) :$put =string(py3eval('vim.Function(''tr'', args=[])'))
:$put =string(py3eval('vim.Function(''tr'', self={})')) :$put =string(py3eval('vim.Function(''tr'', self={})'))
:$put =string(py3eval('vim.Function(''tr'', args=[123, 3, 4], 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 :" Test vim.Function
:function Args(...) :function Args(...)
@@ -909,11 +915,27 @@ psa1 = vim.Function('SelfArgs', args=['abcArgsPSA1'])
psa2 = vim.Function('SelfArgs', args=[]) psa2 = vim.Function('SelfArgs', args=[])
psa3 = vim.Function('SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}) psa3 = vim.Function('SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'})
psa4 = vim.Function('SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'}) 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('sa: ' + repr(sa))
cb.append('psa1: ' + repr(psa1)) cb.append('psa1: ' + repr(psa1))
cb.append('psa2: ' + repr(psa2)) cb.append('psa2: ' + repr(psa2))
cb.append('psa3: ' + repr(psa3)) cb.append('psa3: ' + repr(psa3))
cb.append('psa4: ' + repr(psa4)) 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 = vim.Function('SelfArgs', args=[{'abcArgsPSAr': 'abcArgsPSArVal'}], self={'abcSelfPSAr': 'abcSelfPSArVal'})
psar.args[0]['abcArgsPSAr2'] = [psar.self, psar.args[0]] psar.args[0]['abcArgsPSAr2'] = [psar.self, psar.args[0]]
@@ -936,6 +958,19 @@ EOF
:$put ='s(psa2): '.string(py3eval('psa2')) :$put ='s(psa2): '.string(py3eval('psa2'))
:$put ='s(psa3): '.string(py3eval('psa3')) :$put ='s(psa3): '.string(py3eval('psa3'))
:$put ='s(psa4): '.string(py3eval('psa4')) :$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('a()', a, )
:py3 ecall('pa1()', pa1, ) :py3 ecall('pa1()', pa1, )
@@ -1020,6 +1055,25 @@ cb.append('psa2.name: ' + s(psa2.name))
cb.append('psa3.name: ' + s(psa3.name)) cb.append('psa3.name: ' + s(psa3.name))
cb.append('psa4.name: ' + s(psa4.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 s
del a del a
@@ -1032,6 +1086,14 @@ del psa1
del psa2 del psa2
del psa3 del psa3
del psa4 del psa4
del psa5
del psa6
del psa7
del psa8
del psa9
del psaA
del psaB
del psaC
del psar del psar
del ecall del ecall

View File

@@ -448,7 +448,7 @@ tabpage:__dir__,number,valid,vars,window,windows
range:__dir__,append,end,start range:__dir__,append,end,start
dictionary:__dir__,get,has_key,items,keys,locked,pop,popitem,scope,update,values dictionary:__dir__,get,has_key,items,keys,locked,pop,popitem,scope,update,values
list:__dir__,extend,locked 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 output:__dir__,close,closed,flush,isatty,readable,seekable,softspace,writable,write,writelines
{} {}
{'a': 1} {'a': 1}
@@ -460,6 +460,12 @@ function('tr', [123, 3, 4])
function('tr') function('tr')
function('tr', {}) function('tr', {})
function('tr', [123, 3, 4], {}) 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'> a: <vim.Function 'Args'>
pa1: <vim.Function 'Args', args=['abcArgsPA1']> pa1: <vim.Function 'Args', args=['abcArgsPA1']>
pa2: <vim.Function 'Args'> pa2: <vim.Function 'Args'>
@@ -470,6 +476,14 @@ psa1: <vim.Function 'SelfArgs', args=['abcArgsPSA1']>
psa2: <vim.Function 'SelfArgs'> psa2: <vim.Function 'SelfArgs'>
psa3: <vim.Function 'SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}> psa3: <vim.Function 'SelfArgs', args=['abcArgsPSA3'], self={'abcSelfPSA3': 'abcSelfPSA3Val'}>
psa4: <vim.Function 'SelfArgs', self={'abcSelfPSA4': 'abcSelfPSA4Val'}> 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': [{...}]}> 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(a): function('Args')
s(pa1): function('Args', ['abcArgsPA1']) s(pa1): function('Args', ['abcArgsPA1'])
@@ -481,6 +495,27 @@ s(psa1): function('SelfArgs', ['abcArgsPSA1'])
s(psa2): function('SelfArgs') s(psa2): function('SelfArgs')
s(psa3): function('SelfArgs', ['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'}) s(psa3): function('SelfArgs', ['abcArgsPSA3'], {'abcSelfPSA3': 'abcSelfPSA3Val'})
s(psa4): function('SelfArgs', {'abcSelfPSA4': 'abcSelfPSA4Val'}) 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: [] a(): !result: []
pa1(): !result: ['abcArgsPA1'] pa1(): !result: ['abcArgsPA1']
pa2(): !result: [] pa2(): !result: []
@@ -551,6 +586,24 @@ psa1.name: 'SelfArgs'
psa2.name: 'SelfArgs' psa2.name: 'SelfArgs'
psa3.name: 'SelfArgs' psa3.name: 'SelfArgs'
psa4.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 abcdef
Error detected while processing function RunTest[]..Test: Error detected while processing function RunTest[]..Test:

View File

@@ -753,6 +753,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1843,
/**/ /**/
1842, 1842,
/**/ /**/