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:

Raspunde prin e-mail lui