diff options
author | Pauli Virtanen <pav@iki.fi> | 2009-02-09 20:18:08 +0000 |
---|---|---|
committer | Pauli Virtanen <pav@iki.fi> | 2009-02-09 20:18:08 +0000 |
commit | 114c5c609e55f0863a30b1edff7b1c7bf783263f (patch) | |
tree | 40da8bb646139f7905900f4868d47bba60e202cc | |
parent | dab616fe622b7669278be1a139169bf323718241 (diff) | |
download | numpy-114c5c609e55f0863a30b1edff7b1c7bf783263f.tar.gz |
Fix #955: fix errobj leak in scalarmath floating point error handling
-rw-r--r-- | numpy/core/src/scalarmathmodule.c.src | 10 | ||||
-rw-r--r-- | numpy/core/tests/test_regression.py | 14 |
2 files changed, 21 insertions, 3 deletions
diff --git a/numpy/core/src/scalarmathmodule.c.src b/numpy/core/src/scalarmathmodule.c.src index dd86678a3..3262999a0 100644 --- a/numpy/core/src/scalarmathmodule.c.src +++ b/numpy/core/src/scalarmathmodule.c.src @@ -636,8 +636,11 @@ static PyObject * &errobj) < 0) return NULL; first = 1; - if (PyUFunc_handlefperr(errmask, errobj, retstatus, &first)) + if (PyUFunc_handlefperr(errmask, errobj, retstatus, &first)) { + Py_XDECREF(errobj); return NULL; + } + Py_XDECREF(errobj); } #endif @@ -736,8 +739,11 @@ static PyObject * &errobj) < 0) return NULL; first = 1; - if (PyUFunc_handlefperr(errmask, errobj, retstatus, &first)) + if (PyUFunc_handlefperr(errmask, errobj, retstatus, &first)) { + Py_XDECREF(errobj); return NULL; + } + Py_XDECREF(errobj); } #if @isint@ diff --git a/numpy/core/tests/test_regression.py b/numpy/core/tests/test_regression.py index c6ba51b3e..aab2870dc 100644 --- a/numpy/core/tests/test_regression.py +++ b/numpy/core/tests/test_regression.py @@ -1,7 +1,7 @@ - from StringIO import StringIO import pickle import sys +import gc from os import path from numpy.testing import * import numpy as np @@ -1208,5 +1208,17 @@ class TestRegression(TestCase): a = np.array(1) self.failUnlessRaises(ValueError, lambda x: x.choose([]), a) + def test_errobj_reference_leak(self, level=rlevel): + """Ticket #955""" + z = int(0) + p = np.int32(-1) + + gc.collect() + n_before = len(gc.get_objects()) + z**p # this shouldn't leak a reference to errobj + gc.collect() + n_after = len(gc.get_objects()) + assert n_before >= n_after, (n_before, n_after) + if __name__ == "__main__": run_module_suite() |