Better error handling in SWIG_Python_NewShadowInstance and SWIG_Python_NewPointerObj to fix seg fault as mentioned on swig-devel mailing list email thread - 'Fix python3 abc set'

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@13618 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
William S Fulton 2012-08-15 22:35:24 +00:00
commit 81b755dadc

View file

@ -1331,23 +1331,29 @@ SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this)
} else { } else {
#if PY_VERSION_HEX >= 0x03000000 #if PY_VERSION_HEX >= 0x03000000
inst = PyBaseObject_Type.tp_new((PyTypeObject*) data->newargs, Py_None, Py_None); inst = PyBaseObject_Type.tp_new((PyTypeObject*) data->newargs, Py_None, Py_None);
if (inst) {
PyObject_SetAttr(inst, SWIG_This(), swig_this); PyObject_SetAttr(inst, SWIG_This(), swig_this);
Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG;
}
#else #else
PyObject *dict = PyDict_New(); PyObject *dict = PyDict_New();
if (dict) {
PyDict_SetItem(dict, SWIG_This(), swig_this); PyDict_SetItem(dict, SWIG_This(), swig_this);
inst = PyInstance_NewRaw(data->newargs, dict); inst = PyInstance_NewRaw(data->newargs, dict);
Py_DECREF(dict); Py_DECREF(dict);
}
#endif #endif
} }
return inst; return inst;
#else #else
#if (PY_VERSION_HEX >= 0x02010000) #if (PY_VERSION_HEX >= 0x02010000)
PyObject *inst; PyObject *inst = 0;
PyObject *dict = PyDict_New(); PyObject *dict = PyDict_New();
if (dict) {
PyDict_SetItem(dict, SWIG_This(), swig_this); PyDict_SetItem(dict, SWIG_This(), swig_this);
inst = PyInstance_NewRaw(data->newargs, dict); inst = PyInstance_NewRaw(data->newargs, dict);
Py_DECREF(dict); Py_DECREF(dict);
}
return (PyObject *) inst; return (PyObject *) inst;
#else #else
PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type); PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
@ -1454,13 +1460,11 @@ SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int f
assert(!(flags & SWIG_BUILTIN_TP_INIT)); assert(!(flags & SWIG_BUILTIN_TP_INIT));
robj = SwigPyObject_New(ptr, type, own); robj = SwigPyObject_New(ptr, type, own);
if (clientdata && !(flags & SWIG_POINTER_NOSHADOW)) { if (robj && clientdata && !(flags & SWIG_POINTER_NOSHADOW)) {
PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj); PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj);
if (inst) {
Py_DECREF(robj); Py_DECREF(robj);
robj = inst; robj = inst;
} }
}
return robj; return robj;
} }