[pypy-commit] pypy default: Fix an horrible reference counting issue, discovered in pygame
amauryfa
noreply at buildbot.pypy.org
Sat Jun 4 01:11:19 CEST 2011
Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch:
Changeset: r44679:c126b3c45f21
Date: 2011-05-29 23:51 +0200
http://bitbucket.org/pypy/pypy/changeset/c126b3c45f21/
Log: Fix an horrible reference counting issue, discovered in pygame
diff --git a/pypy/module/cpyext/src/modsupport.c b/pypy/module/cpyext/src/modsupport.c
--- a/pypy/module/cpyext/src/modsupport.c
+++ b/pypy/module/cpyext/src/modsupport.c
@@ -611,8 +611,8 @@
if (result != NULL && n > 0) {
for (i = 0; i < n; ++i) {
tmp = (PyObject *)va_arg(va, PyObject *);
+ Py_INCREF(tmp);
PyTuple_SET_ITEM(result, i, tmp);
- Py_INCREF(tmp);
}
}
return result;
diff --git a/pypy/module/cpyext/test/test_eval.py b/pypy/module/cpyext/test/test_eval.py
--- a/pypy/module/cpyext/test/test_eval.py
+++ b/pypy/module/cpyext/test/test_eval.py
@@ -193,3 +193,32 @@
return args
assert module.call_func(f) == ("text", 42, None)
assert module.call_method("text") == 2
+
+ def test_CallFunctionObjArgs(self):
+ module = self.import_extension('foo', [
+ ("call_func", "METH_VARARGS",
+ """
+ PyObject *t = PyString_FromString("t");
+ PyObject *res = PyObject_CallFunctionObjArgs(
+ PyTuple_GetItem(args, 0),
+ Py_None, NULL);
+ Py_DECREF(t);
+ return res;
+ """),
+ ("call_method", "METH_VARARGS",
+ """
+ PyObject *t = PyString_FromString("t");
+ PyObject *count = PyString_FromString("count");
+ PyObject *res = PyObject_CallMethodObjArgs(
+ PyTuple_GetItem(args, 0),
+ count, t, NULL);
+ Py_DECREF(t);
+ Py_DECREF(count);
+ return res;
+ """),
+ ])
+ def f(*args):
+ return args
+ assert module.call_func(f) == (None,)
+ assert module.call_method("text") == 2
+
More information about the pypy-commit
mailing list