Mercurial > vim
comparison src/if_py_both.h @ 4635:07c534fe9b6c v7.3.1065
updated for version 7.3.1065
Problem: Python: key mapping is not standard.
Solution: Puthon patch 24: use PyMapping_Keys. (ZyX)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Thu, 30 May 2013 13:22:13 +0200 |
parents | 3857d399ab41 |
children | 59e6c2bd68e3 |
comparison
equal
deleted
inserted
replaced
4634:18c8af5790e9 | 4635:07c534fe9b6c |
---|---|
4610 { | 4610 { |
4611 dict_T *dict; | 4611 dict_T *dict; |
4612 char_u *key; | 4612 char_u *key; |
4613 dictitem_T *di; | 4613 dictitem_T *di; |
4614 PyObject *list; | 4614 PyObject *list; |
4615 PyObject *litem; | 4615 PyObject *iterator; |
4616 PyObject *keyObject; | 4616 PyObject *keyObject; |
4617 PyObject *valObject; | 4617 PyObject *valObject; |
4618 Py_ssize_t lsize; | |
4619 | 4618 |
4620 if (!(dict = dict_alloc())) | 4619 if (!(dict = dict_alloc())) |
4621 return -1; | 4620 return -1; |
4622 | 4621 |
4623 tv->v_type = VAR_DICT; | 4622 tv->v_type = VAR_DICT; |
4624 tv->vval.v_dict = dict; | 4623 tv->vval.v_dict = dict; |
4625 | 4624 |
4626 list = PyMapping_Items(obj); | 4625 if (!(list = PyMapping_Keys(obj))) |
4627 if (list == NULL) | |
4628 { | 4626 { |
4629 dict_unref(dict); | 4627 dict_unref(dict); |
4630 return -1; | 4628 return -1; |
4631 } | 4629 } |
4632 lsize = PyList_Size(list); | 4630 |
4633 while (lsize--) | 4631 if (!(iterator = PyObject_GetIter(list))) |
4632 { | |
4633 dict_unref(dict); | |
4634 Py_DECREF(list); | |
4635 return -1; | |
4636 } | |
4637 Py_DECREF(list); | |
4638 | |
4639 while ((keyObject = PyIter_Next(iterator))) | |
4634 { | 4640 { |
4635 DICTKEY_DECL | 4641 DICTKEY_DECL |
4636 | 4642 |
4637 litem = PyList_GetItem(list, lsize); | |
4638 if (litem == NULL) | |
4639 { | |
4640 Py_DECREF(list); | |
4641 dict_unref(dict); | |
4642 return -1; | |
4643 } | |
4644 | |
4645 if (!(keyObject = PyTuple_GetItem(litem, 0))) | |
4646 { | |
4647 Py_DECREF(list); | |
4648 Py_DECREF(litem); | |
4649 dict_unref(dict); | |
4650 return -1; | |
4651 } | |
4652 | |
4653 if (!DICTKEY_SET_KEY) | 4643 if (!DICTKEY_SET_KEY) |
4654 { | 4644 { |
4655 dict_unref(dict); | 4645 Py_DECREF(iterator); |
4656 Py_DECREF(list); | |
4657 Py_DECREF(litem); | |
4658 DICTKEY_UNREF | |
4659 return -1; | |
4660 } | |
4661 DICTKEY_CHECK_EMPTY(-1) | |
4662 | |
4663 if (!(valObject = PyTuple_GetItem(litem, 1))) | |
4664 { | |
4665 Py_DECREF(list); | |
4666 Py_DECREF(litem); | |
4667 dict_unref(dict); | 4646 dict_unref(dict); |
4668 DICTKEY_UNREF | 4647 DICTKEY_UNREF |
4669 return -1; | 4648 return -1; |
4670 } | 4649 } |
4671 | 4650 DICTKEY_CHECK_EMPTY(-1) |
4672 Py_DECREF(litem); | 4651 |
4652 if (!(valObject = PyObject_GetItem(obj, keyObject))) | |
4653 { | |
4654 Py_DECREF(keyObject); | |
4655 Py_DECREF(iterator); | |
4656 dict_unref(dict); | |
4657 DICTKEY_UNREF | |
4658 return -1; | |
4659 } | |
4673 | 4660 |
4674 di = dictitem_alloc(key); | 4661 di = dictitem_alloc(key); |
4675 | 4662 |
4676 DICTKEY_UNREF | 4663 DICTKEY_UNREF |
4677 | 4664 |
4665 Py_DECREF(keyObject); | |
4666 | |
4678 if (di == NULL) | 4667 if (di == NULL) |
4679 { | 4668 { |
4680 Py_DECREF(list); | 4669 Py_DECREF(iterator); |
4670 Py_DECREF(valObject); | |
4681 dict_unref(dict); | 4671 dict_unref(dict); |
4682 PyErr_NoMemory(); | 4672 PyErr_NoMemory(); |
4683 return -1; | 4673 return -1; |
4684 } | 4674 } |
4685 di->di_tv.v_lock = 0; | 4675 di->di_tv.v_lock = 0; |
4686 | 4676 |
4687 if (_ConvertFromPyObject(valObject, &di->di_tv, lookup_dict) == -1) | 4677 if (_ConvertFromPyObject(valObject, &di->di_tv, lookup_dict) == -1) |
4688 { | 4678 { |
4679 Py_DECREF(iterator); | |
4680 Py_DECREF(valObject); | |
4689 vim_free(di); | 4681 vim_free(di); |
4690 dict_unref(dict); | 4682 dict_unref(dict); |
4691 Py_DECREF(list); | 4683 return -1; |
4692 return -1; | 4684 } |
4693 } | 4685 |
4686 Py_DECREF(valObject); | |
4694 | 4687 |
4695 if (dict_add(dict, di) == FAIL) | 4688 if (dict_add(dict, di) == FAIL) |
4696 { | 4689 { |
4690 Py_DECREF(iterator); | |
4697 dictitem_free(di); | 4691 dictitem_free(di); |
4698 dict_unref(dict); | 4692 dict_unref(dict); |
4699 Py_DECREF(list); | |
4700 PyErr_SetVim(_("failed to add key to dictionary")); | 4693 PyErr_SetVim(_("failed to add key to dictionary")); |
4701 return -1; | 4694 return -1; |
4702 } | 4695 } |
4703 } | 4696 } |
4697 Py_DECREF(iterator); | |
4704 --dict->dv_refcount; | 4698 --dict->dv_refcount; |
4705 Py_DECREF(list); | |
4706 return 0; | 4699 return 0; |
4707 } | 4700 } |
4708 | 4701 |
4709 static int | 4702 static int |
4710 pyseq_to_tv(PyObject *obj, typval_T *tv, PyObject *lookup_dict) | 4703 pyseq_to_tv(PyObject *obj, typval_T *tv, PyObject *lookup_dict) |
4905 { | 4898 { |
4906 tv->v_type = VAR_FLOAT; | 4899 tv->v_type = VAR_FLOAT; |
4907 tv->vval.v_float = (float_T) PyFloat_AsDouble(obj); | 4900 tv->vval.v_float = (float_T) PyFloat_AsDouble(obj); |
4908 } | 4901 } |
4909 #endif | 4902 #endif |
4903 else if (PyObject_HasAttrString(obj, "keys")) | |
4904 return convert_dl(obj, tv, pymap_to_tv, lookup_dict); | |
4910 else if (PyIter_Check(obj) || PySequence_Check(obj)) | 4905 else if (PyIter_Check(obj) || PySequence_Check(obj)) |
4911 return convert_dl(obj, tv, pyseq_to_tv, lookup_dict); | 4906 return convert_dl(obj, tv, pyseq_to_tv, lookup_dict); |
4912 else if (PyMapping_Check(obj)) | 4907 else if (PyMapping_Check(obj)) |
4913 return convert_dl(obj, tv, pymap_to_tv, lookup_dict); | 4908 return convert_dl(obj, tv, pymap_to_tv, lookup_dict); |
4914 else | 4909 else |