summaryrefslogtreecommitdiff
path: root/Lib/python/pycontainer.swg
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/python/pycontainer.swg')
-rw-r--r--Lib/python/pycontainer.swg65
1 files changed, 35 insertions, 30 deletions
diff --git a/Lib/python/pycontainer.swg b/Lib/python/pycontainer.swg
index 65223b615..7012b0b1d 100644
--- a/Lib/python/pycontainer.swg
+++ b/Lib/python/pycontainer.swg
@@ -1015,36 +1015,28 @@ namespace swig {
template <class Seq, class T = typename Seq::value_type >
struct IteratorProtocol {
- static int assign(PyObject *obj, Seq **seq) {
- int ret = SWIG_ERROR;
- PyObject *iter = PyObject_GetIter(obj);
+ static void assign(PyObject *obj, Seq *seq) {
+ SwigVar_PyObject iter = PyObject_GetIter(obj);
if (iter) {
- PyObject *item = PyIter_Next(iter);
- ret = SWIG_OK;
- if (seq)
- *seq = new Seq();
+ SwigVar_PyObject item = PyIter_Next(iter);
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;
+ seq->insert(seq->end(), swig::as<T>(item));
+ item = PyIter_Next(iter);
}
- Py_DECREF(iter);
}
+ }
+ static bool check(PyObject *obj) {
+ int ret = false;
+ SwigVar_PyObject iter = PyObject_GetIter(obj);
+ if (iter) {
+ SwigVar_PyObject item = PyIter_Next(iter);
+ ret = true;
+ while (item) {
+ ret = swig::check<T>(item);
+ item = ret ? PyIter_Next(iter) : 0;
+ }
+ }
return ret;
}
};
@@ -1055,11 +1047,9 @@ namespace swig {
typedef T value_type;
static bool is_iterable(PyObject *obj) {
- PyObject *iter = PyObject_GetIter(obj);
- bool is_iter = iter != 0;
- Py_XDECREF(iter);
+ SwigVar_PyObject iter = PyObject_GetIter(obj);
PyErr_Clear();
- return is_iter;
+ return iter != 0;
}
static int asptr(PyObject *obj, sequence **seq) {
@@ -1072,7 +1062,22 @@ namespace swig {
return SWIG_OLDOBJ;
}
} else if (is_iterable(obj)) {
- ret = IteratorProtocol<Seq, T>::assign(obj, seq);
+ try {
+ if (seq) {
+ *seq = new sequence();
+ IteratorProtocol<Seq, T>::assign(obj, *seq);
+ if (!PyErr_Occurred())
+ return SWIG_NEWOBJ;
+ } else {
+ return IteratorProtocol<Seq, T>::check(obj) ? SWIG_OK : SWIG_ERROR;
+ }
+ } catch (std::exception& e) {
+ if (seq && !PyErr_Occurred())
+ PyErr_SetString(PyExc_TypeError, e.what());
+ }
+ if (seq)
+ delete *seq;
+ return SWIG_ERROR;
} else if (PySequence_Check(obj)) {
try {
SwigPySequence_Cont<value_type> swigpyseq(obj);