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