summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPauli Virtanen <pav@iki.fi>2009-02-09 20:18:08 +0000
committerPauli Virtanen <pav@iki.fi>2009-02-09 20:18:08 +0000
commit114c5c609e55f0863a30b1edff7b1c7bf783263f (patch)
tree40da8bb646139f7905900f4868d47bba60e202cc
parentdab616fe622b7669278be1a139169bf323718241 (diff)
downloadnumpy-114c5c609e55f0863a30b1edff7b1c7bf783263f.tar.gz
Fix #955: fix errobj leak in scalarmath floating point error handling
-rw-r--r--numpy/core/src/scalarmathmodule.c.src10
-rw-r--r--numpy/core/tests/test_regression.py14
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()