diff options
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/python/pycontainer.swg | 69 |
1 files changed, 68 insertions, 1 deletions
diff --git a/Lib/python/pycontainer.swg b/Lib/python/pycontainer.swg index 4910fecc0..a1affa86b 100644 --- a/Lib/python/pycontainer.swg +++ b/Lib/python/pycontainer.swg @@ -1014,11 +1014,46 @@ namespace swig { } template <class Seq, class T = typename Seq::value_type > + static int assign_iterator_protocol(PyObject *obj, Seq **seq) { + int ret = SWIG_ERROR; + PyObject *iter = PyObject_GetIter(obj); + if (iter) { + PyObject *item = PyIter_Next(iter); + ret = SWIG_OK; + if (seq) + *seq = new Seq(); + while (item) { + try { + if (seq) { + (*seq)->insert((*seq)->end(), swig::as<T>(item)); + } else { + if (!swig::check<T>(item)) + ret = SWIG_ERROR; + } + } catch (std::exception& e) { + if (seq) { + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, e.what()); + } + } + ret = SWIG_ERROR; + } + Py_DECREF(item); + item = (ret == SWIG_OK) ? PyIter_Next(iter) : 0; + } + Py_DECREF(iter); + } + + return ret; + } + + template <class Seq, class T = typename Seq::value_type > struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; static int asptr(PyObject *obj, sequence **seq) { + int ret = SWIG_ERROR; if (obj == Py_None || SWIG_Python_GetSwigThis(obj)) { sequence *p; swig_type_info *descriptor = swig::type_info<sequence>(); @@ -1045,8 +1080,40 @@ namespace swig { } return SWIG_ERROR; } + } else { +#if 0 + PyObject *iter = PyObject_GetIter(obj); + if (iter) { + PyObject *item = PyIter_Next(iter); + ret = SWIG_OK; + if (seq) + *seq = new sequence(); + while (item) { + try { + if (seq) { + (*seq)->insert((*seq)->end(), swig::as<value_type>(item)); + } else { + if (!swig::check<value_type>(item)) + ret = SWIG_ERROR; + } + } catch (std::exception& e) { + if (seq) { + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, e.what()); + } + } + ret = SWIG_ERROR; + } + Py_DECREF(item); + item = (ret == SWIG_OK) ? PyIter_Next(iter) : 0; + } + Py_DECREF(iter); + } +#else + ret = swig::assign_iterator_protocol<Seq, T>(obj, seq); +#endif } - return SWIG_ERROR; + return ret; } }; |