0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

updated for version 7.3.1065

Problem:    Python: key mapping is not standard.
Solution:   Puthon patch 24: use PyMapping_Keys. (ZyX)
This commit is contained in:
Bram Moolenaar 2013-05-30 13:22:13 +02:00
parent 494ff7e850
commit bcb40977c3
4 changed files with 46 additions and 43 deletions

View File

@ -4612,10 +4612,9 @@ pymap_to_tv(PyObject *obj, typval_T *tv, PyObject *lookup_dict)
char_u *key; char_u *key;
dictitem_T *di; dictitem_T *di;
PyObject *list; PyObject *list;
PyObject *litem; PyObject *iterator;
PyObject *keyObject; PyObject *keyObject;
PyObject *valObject; PyObject *valObject;
Py_ssize_t lsize;
if (!(dict = dict_alloc())) if (!(dict = dict_alloc()))
return -1; return -1;
@ -4623,61 +4622,52 @@ pymap_to_tv(PyObject *obj, typval_T *tv, PyObject *lookup_dict)
tv->v_type = VAR_DICT; tv->v_type = VAR_DICT;
tv->vval.v_dict = dict; tv->vval.v_dict = dict;
list = PyMapping_Items(obj); if (!(list = PyMapping_Keys(obj)))
if (list == NULL)
{ {
dict_unref(dict); dict_unref(dict);
return -1; return -1;
} }
lsize = PyList_Size(list);
while (lsize--) if (!(iterator = PyObject_GetIter(list)))
{
dict_unref(dict);
Py_DECREF(list);
return -1;
}
Py_DECREF(list);
while ((keyObject = PyIter_Next(iterator)))
{ {
DICTKEY_DECL DICTKEY_DECL
litem = PyList_GetItem(list, lsize);
if (litem == NULL)
{
Py_DECREF(list);
dict_unref(dict);
return -1;
}
if (!(keyObject = PyTuple_GetItem(litem, 0)))
{
Py_DECREF(list);
Py_DECREF(litem);
dict_unref(dict);
return -1;
}
if (!DICTKEY_SET_KEY) if (!DICTKEY_SET_KEY)
{ {
Py_DECREF(iterator);
dict_unref(dict); dict_unref(dict);
Py_DECREF(list);
Py_DECREF(litem);
DICTKEY_UNREF DICTKEY_UNREF
return -1; return -1;
} }
DICTKEY_CHECK_EMPTY(-1) DICTKEY_CHECK_EMPTY(-1)
if (!(valObject = PyTuple_GetItem(litem, 1))) if (!(valObject = PyObject_GetItem(obj, keyObject)))
{ {
Py_DECREF(list); Py_DECREF(keyObject);
Py_DECREF(litem); Py_DECREF(iterator);
dict_unref(dict); dict_unref(dict);
DICTKEY_UNREF DICTKEY_UNREF
return -1; return -1;
} }
Py_DECREF(litem);
di = dictitem_alloc(key); di = dictitem_alloc(key);
DICTKEY_UNREF DICTKEY_UNREF
Py_DECREF(keyObject);
if (di == NULL) if (di == NULL)
{ {
Py_DECREF(list); Py_DECREF(iterator);
Py_DECREF(valObject);
dict_unref(dict); dict_unref(dict);
PyErr_NoMemory(); PyErr_NoMemory();
return -1; return -1;
@ -4686,23 +4676,26 @@ pymap_to_tv(PyObject *obj, typval_T *tv, PyObject *lookup_dict)
if (_ConvertFromPyObject(valObject, &di->di_tv, lookup_dict) == -1) if (_ConvertFromPyObject(valObject, &di->di_tv, lookup_dict) == -1)
{ {
Py_DECREF(iterator);
Py_DECREF(valObject);
vim_free(di); vim_free(di);
dict_unref(dict); dict_unref(dict);
Py_DECREF(list);
return -1; return -1;
} }
Py_DECREF(valObject);
if (dict_add(dict, di) == FAIL) if (dict_add(dict, di) == FAIL)
{ {
Py_DECREF(iterator);
dictitem_free(di); dictitem_free(di);
dict_unref(dict); dict_unref(dict);
Py_DECREF(list);
PyErr_SetVim(_("failed to add key to dictionary")); PyErr_SetVim(_("failed to add key to dictionary"));
return -1; return -1;
} }
} }
Py_DECREF(iterator);
--dict->dv_refcount; --dict->dv_refcount;
Py_DECREF(list);
return 0; return 0;
} }
@ -4907,6 +4900,8 @@ _ConvertFromPyObject(PyObject *obj, typval_T *tv, PyObject *lookup_dict)
tv->vval.v_float = (float_T) PyFloat_AsDouble(obj); tv->vval.v_float = (float_T) PyFloat_AsDouble(obj);
} }
#endif #endif
else if (PyObject_HasAttrString(obj, "keys"))
return convert_dl(obj, tv, pymap_to_tv, lookup_dict);
else if (PyIter_Check(obj) || PySequence_Check(obj)) else if (PyIter_Check(obj) || PySequence_Check(obj))
return convert_dl(obj, tv, pyseq_to_tv, lookup_dict); return convert_dl(obj, tv, pyseq_to_tv, lookup_dict);
else if (PyMapping_Check(obj)) else if (PyMapping_Check(obj))

View File

@ -197,11 +197,12 @@ struct PyMethodDef { Py_ssize_t a; };
# define PyDict_GetItemString dll_PyDict_GetItemString # define PyDict_GetItemString dll_PyDict_GetItemString
# define PyDict_Next dll_PyDict_Next # define PyDict_Next dll_PyDict_Next
# define PyDict_Type (*dll_PyDict_Type) # define PyDict_Type (*dll_PyDict_Type)
# ifdef PyMapping_Items # ifdef PyMapping_Keys
# define PY_NO_MAPPING_ITEMS # define PY_NO_MAPPING_KEYS
# else # else
# define PyMapping_Items dll_PyMapping_Items # define PyMapping_Keys dll_PyMapping_Keys
# endif # endif
# define PyObject_GetItem dll_PyObject_GetItem
# define PyObject_CallMethod dll_PyObject_CallMethod # define PyObject_CallMethod dll_PyObject_CallMethod
# define PyMapping_Check dll_PyMapping_Check # define PyMapping_Check dll_PyMapping_Check
# define PyIter_Next dll_PyIter_Next # define PyIter_Next dll_PyIter_Next
@ -331,9 +332,10 @@ static PyObject*(*dll_PyDict_New)(void);
static PyObject*(*dll_PyDict_GetItemString)(PyObject *, const char *); static PyObject*(*dll_PyDict_GetItemString)(PyObject *, const char *);
static int (*dll_PyDict_Next)(PyObject *, PyInt *, PyObject **, PyObject **); static int (*dll_PyDict_Next)(PyObject *, PyInt *, PyObject **, PyObject **);
static PyTypeObject* dll_PyDict_Type; static PyTypeObject* dll_PyDict_Type;
# ifndef PY_NO_MAPPING_ITEMS # ifndef PY_NO_MAPPING_KEYS
static PyObject* (*dll_PyMapping_Items)(PyObject *); static PyObject* (*dll_PyMapping_Keys)(PyObject *);
# endif # endif
static PyObject* (*dll_PyObject_GetItem)(PyObject *, PyObject *);
static PyObject* (*dll_PyObject_CallMethod)(PyObject *, char *, PyObject *); static PyObject* (*dll_PyObject_CallMethod)(PyObject *, char *, PyObject *);
static int (*dll_PyMapping_Check)(PyObject *); static int (*dll_PyMapping_Check)(PyObject *);
static PyObject* (*dll_PyIter_Next)(PyObject *); static PyObject* (*dll_PyIter_Next)(PyObject *);
@ -494,9 +496,10 @@ static struct
{"PyDict_Next", (PYTHON_PROC*)&dll_PyDict_Next}, {"PyDict_Next", (PYTHON_PROC*)&dll_PyDict_Next},
{"PyDict_New", (PYTHON_PROC*)&dll_PyDict_New}, {"PyDict_New", (PYTHON_PROC*)&dll_PyDict_New},
{"PyDict_Type", (PYTHON_PROC*)&dll_PyDict_Type}, {"PyDict_Type", (PYTHON_PROC*)&dll_PyDict_Type},
# ifndef PY_NO_MAPPING_ITEMS # ifndef PY_NO_MAPPING_KEYS
{"PyMapping_Items", (PYTHON_PROC*)&dll_PyMapping_Items}, {"PyMapping_Keys", (PYTHON_PROC*)&dll_PyMapping_Keys},
# endif # endif
{"PyObject_GetItem", (PYTHON_PROC*)&dll_PyObject_GetItem},
{"PyObject_CallMethod", (PYTHON_PROC*)&dll_PyObject_CallMethod}, {"PyObject_CallMethod", (PYTHON_PROC*)&dll_PyObject_CallMethod},
{"PyMapping_Check", (PYTHON_PROC*)&dll_PyMapping_Check}, {"PyMapping_Check", (PYTHON_PROC*)&dll_PyMapping_Check},
{"PyIter_Next", (PYTHON_PROC*)&dll_PyIter_Next}, {"PyIter_Next", (PYTHON_PROC*)&dll_PyIter_Next},

View File

@ -160,9 +160,10 @@
# define PyDict_GetItemString py3_PyDict_GetItemString # define PyDict_GetItemString py3_PyDict_GetItemString
# define PyDict_Next py3_PyDict_Next # define PyDict_Next py3_PyDict_Next
# define PyMapping_Check py3_PyMapping_Check # define PyMapping_Check py3_PyMapping_Check
# define PyMapping_Items py3_PyMapping_Items # define PyMapping_Keys py3_PyMapping_Keys
# define PyIter_Next py3_PyIter_Next # define PyIter_Next py3_PyIter_Next
# define PyObject_GetIter py3_PyObject_GetIter # define PyObject_GetIter py3_PyObject_GetIter
# define PyObject_GetItem py3_PyObject_GetItem
# define PyObject_IsTrue py3_PyObject_IsTrue # define PyObject_IsTrue py3_PyObject_IsTrue
# define PyModule_GetDict py3_PyModule_GetDict # define PyModule_GetDict py3_PyModule_GetDict
#undef PyRun_SimpleString #undef PyRun_SimpleString
@ -276,7 +277,7 @@ static PyObject* (*py3_PySequence_Fast)(PyObject *, const char *);
static Py_ssize_t (*py3_PyTuple_Size)(PyObject *); static Py_ssize_t (*py3_PyTuple_Size)(PyObject *);
static PyObject* (*py3_PyTuple_GetItem)(PyObject *, Py_ssize_t); static PyObject* (*py3_PyTuple_GetItem)(PyObject *, Py_ssize_t);
static int (*py3_PyMapping_Check)(PyObject *); static int (*py3_PyMapping_Check)(PyObject *);
static PyObject* (*py3_PyMapping_Items)(PyObject *); static PyObject* (*py3_PyMapping_Keys)(PyObject *);
static int (*py3_PySlice_GetIndicesEx)(PyObject *r, Py_ssize_t length, static int (*py3_PySlice_GetIndicesEx)(PyObject *r, Py_ssize_t length,
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, Py_ssize_t *slicelength); Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, Py_ssize_t *slicelength);
static PyObject* (*py3_PyErr_NoMemory)(void); static PyObject* (*py3_PyErr_NoMemory)(void);
@ -304,6 +305,7 @@ static PyObject* (*py3_PyLong_FromLong)(long);
static PyObject* (*py3_PyDict_New)(void); static PyObject* (*py3_PyDict_New)(void);
static PyObject* (*py3_PyIter_Next)(PyObject *); static PyObject* (*py3_PyIter_Next)(PyObject *);
static PyObject* (*py3_PyObject_GetIter)(PyObject *); static PyObject* (*py3_PyObject_GetIter)(PyObject *);
static PyObject* (*py3_PyObject_GetItem)(PyObject *, PyObject *);
static int (*py3_PyObject_IsTrue)(PyObject *); static int (*py3_PyObject_IsTrue)(PyObject *);
static PyObject* (*py3_Py_BuildValue)(char *, ...); static PyObject* (*py3_Py_BuildValue)(char *, ...);
static int (*py3_PyType_Ready)(PyTypeObject *type); static int (*py3_PyType_Ready)(PyTypeObject *type);
@ -456,9 +458,10 @@ static struct
{"PyDict_GetItemString", (PYTHON_PROC*)&py3_PyDict_GetItemString}, {"PyDict_GetItemString", (PYTHON_PROC*)&py3_PyDict_GetItemString},
{"PyDict_Next", (PYTHON_PROC*)&py3_PyDict_Next}, {"PyDict_Next", (PYTHON_PROC*)&py3_PyDict_Next},
{"PyMapping_Check", (PYTHON_PROC*)&py3_PyMapping_Check}, {"PyMapping_Check", (PYTHON_PROC*)&py3_PyMapping_Check},
{"PyMapping_Items", (PYTHON_PROC*)&py3_PyMapping_Items}, {"PyMapping_Keys", (PYTHON_PROC*)&py3_PyMapping_Keys},
{"PyIter_Next", (PYTHON_PROC*)&py3_PyIter_Next}, {"PyIter_Next", (PYTHON_PROC*)&py3_PyIter_Next},
{"PyObject_GetIter", (PYTHON_PROC*)&py3_PyObject_GetIter}, {"PyObject_GetIter", (PYTHON_PROC*)&py3_PyObject_GetIter},
{"PyObject_GetItem", (PYTHON_PROC*)&py3_PyObject_GetItem},
{"PyObject_IsTrue", (PYTHON_PROC*)&py3_PyObject_IsTrue}, {"PyObject_IsTrue", (PYTHON_PROC*)&py3_PyObject_IsTrue},
{"PyLong_FromLong", (PYTHON_PROC*)&py3_PyLong_FromLong}, {"PyLong_FromLong", (PYTHON_PROC*)&py3_PyLong_FromLong},
{"PyDict_New", (PYTHON_PROC*)&py3_PyDict_New}, {"PyDict_New", (PYTHON_PROC*)&py3_PyDict_New},

View File

@ -728,6 +728,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 */
/**/
1065,
/**/ /**/
1064, 1064,
/**/ /**/