diff options
author | Charles Harris <charlesr.harris@gmail.com> | 2010-02-25 17:49:24 +0000 |
---|---|---|
committer | Charles Harris <charlesr.harris@gmail.com> | 2010-02-25 17:49:24 +0000 |
commit | 7004a5a3652d5131ef9144ead7bc7cc549f0fae2 (patch) | |
tree | e685fbb193c5a8039fef07b1c84d0a1820b5a5c7 /numpy | |
parent | f3580687a3f3752a8a8bebbcbe5b594055beb299 (diff) | |
download | numpy-7004a5a3652d5131ef9144ead7bc7cc549f0fae2.tar.gz |
BUG: Make sure that the errors set by the PyCapsule functions are cleared. The
PyCObject functions don't set errors. Note that the error handling in the
current code is spotty and needs to be fixed at some point.
Diffstat (limited to 'numpy')
-rw-r--r-- | numpy/core/src/multiarray/arraytypes.c.src | 9 | ||||
-rw-r--r-- | numpy/core/src/multiarray/ctors.c | 9 | ||||
-rw-r--r-- | numpy/core/src/multiarray/descriptor.c | 18 | ||||
-rw-r--r-- | numpy/core/src/multiarray/getset.c | 9 | ||||
-rw-r--r-- | numpy/core/src/multiarray/multiarraymodule.c | 21 | ||||
-rw-r--r-- | numpy/core/src/multiarray/scalarapi.c | 12 | ||||
-rw-r--r-- | numpy/core/src/multiarray/scalartypes.c.src | 8 | ||||
-rw-r--r-- | numpy/core/src/multiarray/usertypes.c | 3 | ||||
-rw-r--r-- | numpy/core/src/umath/ufunc_object.c | 12 | ||||
-rw-r--r-- | numpy/core/src/umath/umathmodule.c.src | 3 |
10 files changed, 98 insertions, 6 deletions
diff --git a/numpy/core/src/multiarray/arraytypes.c.src b/numpy/core/src/multiarray/arraytypes.c.src index 3a9356edf..992164f06 100644 --- a/numpy/core/src/multiarray/arraytypes.c.src +++ b/numpy/core/src/multiarray/arraytypes.c.src @@ -3533,10 +3533,17 @@ _init_datetime_descr(PyArray_Descr *descr) dt_data->den = 1; dt_data->events = 1; +/* FIXME + * There is no error check here and no way to indicate an error + * until the metadata turns up NULL. + */ #if defined(NPY_PY3K) cobj = PyCapsule_New((void *)dt_data, NULL, simple_capsule_dtor); + if (cobj == NULL) { + PyErr_Clear(); + } #else - cobj = PyCObject_FromVoidPtr((void *)dt_data, _pya_free); + cobj = PyCObject_FromVoidPtr((void *)dt_data, simple_capsule_dtor); #endif descr->metadata = PyDict_New(); PyDict_SetItemString(descr->metadata, NPY_METADATA_DTSTR, cobj); diff --git a/numpy/core/src/multiarray/ctors.c b/numpy/core/src/multiarray/ctors.c index 844aacd71..745cfdb4d 100644 --- a/numpy/core/src/multiarray/ctors.c +++ b/numpy/core/src/multiarray/ctors.c @@ -1144,6 +1144,9 @@ discover_depth(PyObject *s, int max, int stop_at_string, int stop_at_tuple) if (PyCapsule_CheckExact(e)) { PyArrayInterface *inter; inter = (PyArrayInterface *)PyCapsule_GetPointer(e, NULL); + if (inter == NULL) { + PyErr_Clear(); + } #else if (PyCObject_Check(e)) { PyArrayInterface *inter; @@ -1576,6 +1579,9 @@ PyArray_NewFromDescr(PyTypeObject *subtype, PyArray_Descr *descr, int nd, /* A C-function is stored here */ PyArray_FinalizeFunc *cfunc; cfunc = PyCapsule_GetPointer(func, NULL); + if (cfunc == NULL) { + PyErr_Clear(); + } #else if PyCObject_Check(func) { /* A C-function is stored here */ @@ -2127,6 +2133,9 @@ PyArray_FromStructInterface(PyObject *input) goto fail; } inter = PyCapsule_GetPointer(attr, NULL); + if (inter == NULL) { + PyErr_Clear(); + } #else if (!PyCObject_Check(attr)) { goto fail; diff --git a/numpy/core/src/multiarray/descriptor.c b/numpy/core/src/multiarray/descriptor.c index 9a1e60b0e..3cc2f28ac 100644 --- a/numpy/core/src/multiarray/descriptor.c +++ b/numpy/core/src/multiarray/descriptor.c @@ -648,6 +648,9 @@ _get_datetime_tuple_from_cobj(PyObject *cobj) #if defined(NPY_PY3K) dt_data = PyCapsule_GetPointer(cobj, NULL); + if (dt_data == NULL) { + PyErr_Clear(); + } #else dt_data = PyCObject_AsVoidPtr(cobj); #endif @@ -669,6 +672,7 @@ static PyObject * _convert_datetime_tuple_to_cobj(PyObject *tuple) { PyArray_DatetimeMetaData *dt_data; + PyObject *ret; dt_data = _pya_malloc(sizeof(PyArray_DatetimeMetaData)); dt_data->base = _unit_from_str( @@ -685,11 +689,18 @@ _convert_datetime_tuple_to_cobj(PyObject *tuple) } } +/* FIXME + * There is no error handling here. + */ #if defined(NPY_PY3K) - return PyCapsule_New((void *)dt_data, NULL, simple_capsule_dtor); + ret = PyCapsule_New((void *)dt_data, NULL, simple_capsule_dtor); + if (ret == NULL) { + PyErr_Clear(); + } #else - return PyCObject_FromVoidPtr((void *)dt_data, _pya_free); + ret = PyCObject_FromVoidPtr((void *)dt_data, simple_capsule_dtor); #endif + return ret; } static PyArray_Descr * @@ -1554,6 +1565,9 @@ _append_to_datetime_typestr(PyArray_Descr *self, PyObject *ret) tmp = PyDict_GetItemString(self->metadata, NPY_METADATA_DTSTR); #if defined(NPY_PY3K) dt_data = PyCapsule_GetPointer(tmp, NULL); + if (dt_data == NULL) { + PyErr_Clear(); + } #else dt_data = PyCObject_AsVoidPtr(tmp); #endif diff --git a/numpy/core/src/multiarray/getset.c b/numpy/core/src/multiarray/getset.c index 4200569af..211327bfe 100644 --- a/numpy/core/src/multiarray/getset.c +++ b/numpy/core/src/multiarray/getset.c @@ -554,7 +554,14 @@ array_struct_get(PyArrayObject *self) Py_INCREF(self); #if defined(NPY_PY3K) ret = PyCapsule_New(inter, NULL, gentype_struct_free); - PyCapsule_SetContext(ret, self); + if (ret == NULL) { + PyErr_Clear(); + } + else if (PyCapsule_SetContext(ret, self) != 0) { + PyErr_Clear(); + Py_DECREF(ret); + ret = NULL; + } #else ret = PyCObject_FromVoidPtrAndDesc(inter, self, gentype_struct_free); #endif diff --git a/numpy/core/src/multiarray/multiarraymodule.c b/numpy/core/src/multiarray/multiarraymodule.c index 5c707779d..f06c266fe 100644 --- a/numpy/core/src/multiarray/multiarraymodule.c +++ b/numpy/core/src/multiarray/multiarraymodule.c @@ -1350,9 +1350,18 @@ _equivalent_units(PyObject *meta1, PyObject *meta2) return 1; } +/* FIXME + * There is no err handling here. + */ #if defined(NPY_PY3K) data1 = PyCapsule_GetPointer(cobj1, NULL); + if (data1 == NULL) { + PyErr_Clear(); + } data2 = PyCapsule_GetPointer(cobj2, NULL); + if (data2 == NULL) { + PyErr_Clear(); + } #else data1 = PyCObject_AsVoidPtr(cobj1); data2 = PyCObject_AsVoidPtr(cobj2); @@ -3050,8 +3059,14 @@ PyMODINIT_FUNC initmultiarray(void) { if (PyType_Ready(&PyArrayFlags_Type) < 0) { return RETVAL; } +/* FIXME + * There is no error handling here + */ #if defined(NPY_PY3K) c_api = PyCapsule_New((void *)PyArray_API, NULL, NULL); + if (c_api == NULL) { + PyErr_Clear(); + } #else c_api = PyCObject_FromVoidPtr((void *)PyArray_API, NULL); #endif @@ -3085,8 +3100,14 @@ PyMODINIT_FUNC initmultiarray(void) { PyDict_SetItemString(d, "METADATA_DTSTR", s); Py_DECREF(s); +/* FIXME + * There is no error handling here + */ #if defined(NPY_PY3K) s = PyCapsule_New((void *)_datetime_strings, NULL, NULL); + if (s == NULL) { + PyErr_Clear(); + } #else s = PyCObject_FromVoidPtr((void *)_datetime_strings, NULL); #endif diff --git a/numpy/core/src/multiarray/scalarapi.c b/numpy/core/src/multiarray/scalarapi.c index 5b0ecd2c5..74193f4f0 100644 --- a/numpy/core/src/multiarray/scalarapi.c +++ b/numpy/core/src/multiarray/scalarapi.c @@ -536,8 +536,11 @@ PyArray_DescrFromScalar(PyObject *sc) } #if defined(NPY_PY3K) cobj = PyCapsule_New((void *)dt_data, NULL, simple_capsule_dtor); + if (cobj == NULL) { + PyErr_Clear(); + } #else - cobj = PyCObject_FromVoidPtr((void *)dt_data, _pya_free); + cobj = PyCObject_FromVoidPtr((void *)dt_data, simple_capsule_dtor); #endif /* Add correct meta-data to the data-type */ @@ -670,8 +673,15 @@ PyArray_Scalar(void *data, PyArray_Descr *descr, PyObject *base) PyObject *cobj; PyArray_DatetimeMetaData *dt_data; cobj = PyDict_GetItemString(descr->metadata, NPY_METADATA_DTSTR); + +/* FIXME + * There is no error handling here. + */ #if defined(NPY_PY3K) dt_data = PyCapsule_GetPointer(cobj, NULL); + if (dt_data == NULL) { + PyErr_Clear(); + } #else dt_data = PyCObject_AsVoidPtr(cobj); #endif diff --git a/numpy/core/src/multiarray/scalartypes.c.src b/numpy/core/src/multiarray/scalartypes.c.src index 96a3abeed..173416b08 100644 --- a/numpy/core/src/multiarray/scalartypes.c.src +++ b/numpy/core/src/multiarray/scalartypes.c.src @@ -859,7 +859,13 @@ gentype_struct_get(PyObject *self) #if defined(NPY_PY3K) ret = PyCapsule_New(inter, NULL, gentype_struct_free); - PyCapsule_SetContext(ret, arr); + if (ret == NULL) { + PyErr_Clear(); + } + else if (PyCapsule_SetContext(ret, arr) != 0) { + PyErr_Clear(); + ret == NULL; + } #else ret = PyCObject_FromVoidPtrAndDesc(inter, arr, gentype_struct_free); #endif diff --git a/numpy/core/src/multiarray/usertypes.c b/numpy/core/src/multiarray/usertypes.c index 07bca8b92..5105c48a6 100644 --- a/numpy/core/src/multiarray/usertypes.c +++ b/numpy/core/src/multiarray/usertypes.c @@ -208,6 +208,9 @@ PyArray_RegisterCastFunc(PyArray_Descr *descr, int totype, } #if defined(NPY_PY3K) cobj = PyCapsule_New((void *)castfunc, NULL, NULL); + if (cobj == NULL) { + PyErr_Clear(); + } #else cobj = PyCObject_FromVoidPtr((void *)castfunc, NULL); #endif diff --git a/numpy/core/src/umath/ufunc_object.c b/numpy/core/src/umath/ufunc_object.c index e2479ed50..843e6abde 100644 --- a/numpy/core/src/umath/ufunc_object.c +++ b/numpy/core/src/umath/ufunc_object.c @@ -374,6 +374,9 @@ _find_matching_userloop(PyObject *obj, int *arg_types, #if defined(NPY_PY3K) funcdata = (PyUFunc_Loop1d *)PyCapsule_GetPointer(obj, NULL); + if (funcdata == NULL) { + PyErr_Clear(); + } #else funcdata = (PyUFunc_Loop1d *)PyCObject_AsVoidPtr(obj); #endif @@ -523,6 +526,9 @@ extract_specified_loop(PyUFuncObject *self, int *arg_types, */ #if defined(NPY_PY3K) funcdata = (PyUFunc_Loop1d *)PyCapsule_GetPointer(obj, NULL); + if (funcdata == NULL) { + PyErr_Clear(); + } #else funcdata = (PyUFunc_Loop1d *)PyCObject_AsVoidPtr(obj); #endif @@ -3976,6 +3982,9 @@ PyUFunc_RegisterLoopForType(PyUFuncObject *ufunc, if (cobj == NULL) { #if defined(NPY_PY3K) cobj = PyCapsule_New((void *)funcdata, NULL, _loop1d_list_free); + if (cobj == NULL) { + PyErr_Clear(); + } #else cobj = PyCObject_FromVoidPtr((void *)funcdata, _loop1d_list_free); #endif @@ -3998,6 +4007,9 @@ PyUFunc_RegisterLoopForType(PyUFuncObject *ufunc, */ #if defined(NPY_PY3K) current = (PyUFunc_Loop1d *)PyCapsule_GetPointer(cobj, NULL); + if (current == NULL) { + PyErr_Clear(); + } #else current = (PyUFunc_Loop1d *)PyCObject_AsVoidPtr(cobj); #endif diff --git a/numpy/core/src/umath/umathmodule.c.src b/numpy/core/src/umath/umathmodule.c.src index f105b90bd..39240cec2 100644 --- a/numpy/core/src/umath/umathmodule.c.src +++ b/numpy/core/src/umath/umathmodule.c.src @@ -307,6 +307,9 @@ PyMODINIT_FUNC initumath(void) #if defined(NPY_PY3K) c_api = PyCapsule_New((void *)PyUFunc_API, NULL, NULL); + if (c_api == NULL) { + PyErr_Clear(); + } #else c_api = PyCObject_FromVoidPtr((void *)PyUFunc_API, NULL); #endif |