On Thu, Jun 26, 2008 at 11:48 AM, James Henstridge
<[EMAIL PROTECTED]> wrote:
> Vote: Approve
> The str leak and None reference leak appear to be from
> UnsupportedDatabaseTest.test_exception_when_unsupported() and is independent
> of cextensions use, so is not something to worry about here. I have tracked
> down the Undef leak to Variable_set_state(), and will send a bundle that
> resolves the leak.
Hi Gustavo,
Attached is a patch to fix the Variable_set_state() leak. The patch
also fixes some cases of mixing declarations and code, which cause
problems for compilers that aren't C99 compliant.
James.
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: [EMAIL PROTECTED]
# target_branch: bzr+ssh://[EMAIL PROTECTED]/%7Eniemeyer\
# /storm/need-for-speed-revenge/
# testament_sha1: 8517e7d17dc129eb2bf5f9eb3c89ffd507b1645f
# timestamp: 2008-06-26 12:37:51 +0800
# base_revision_id: [EMAIL PROTECTED]
# fdzxcr5e212euoeb
#
# Begin patch
=== modified file 'storm/cextensions.c'
--- storm/cextensions.c 2008-06-19 11:40:42 +0000
+++ storm/cextensions.c 2008-06-26 04:36:31 +0000
@@ -250,12 +250,11 @@
{
static char *kwlist[] = {"owner", NULL};
PyObject *owner;
+ int result = -1;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", kwlist, &owner))
return -1;
- int result = -1;
-
/* self._owner_ref = weakref.ref(owner) */
self->_owner_ref = PyWeakref_NewRef(owner, NULL);
if (self->_owner_ref) {
@@ -296,17 +295,18 @@
EventSystem_hook(EventSystemObject *self, PyObject *args)
{
PyObject *result = NULL;
+ PyObject *name, *callback, *data;
if (PyTuple_GET_SIZE(args) < 2) {
PyErr_SetString(PyExc_TypeError, "Invalid number of arguments");
return NULL;
}
- PyObject *name = PyTuple_GET_ITEM(args, 0);
- PyObject *callback = PyTuple_GET_ITEM(args, 1);
- PyObject *data = PyTuple_GetSlice(args, 2, PyTuple_GET_SIZE(args));
+ name = PyTuple_GET_ITEM(args, 0);
+ callback = PyTuple_GET_ITEM(args, 1);
+ data = PyTuple_GetSlice(args, 2, PyTuple_GET_SIZE(args));
if (data) {
- /*
+ /*
callbacks = self._hooks.get(name)
if callbacks is None:
self._hooks.setdefault(name, set()).add((callback, data))
@@ -351,15 +351,16 @@
EventSystem_unhook(EventSystemObject *self, PyObject *args)
{
PyObject *result = NULL;
+ PyObject *name, *callback, *data;
if (PyTuple_GET_SIZE(args) < 2) {
PyErr_SetString(PyExc_TypeError, "Invalid number of arguments");
return NULL;
}
- PyObject *name = PyTuple_GET_ITEM(args, 0);
- PyObject *callback = PyTuple_GET_ITEM(args, 1);
- PyObject *data = PyTuple_GetSlice(args, 2, PyTuple_GET_SIZE(args));
+ name = PyTuple_GET_ITEM(args, 0);
+ callback = PyTuple_GET_ITEM(args, 1);
+ data = PyTuple_GetSlice(args, 2, PyTuple_GET_SIZE(args));
if (data) {
/*
callbacks = self._hooks.get(name)
@@ -399,9 +400,10 @@
PyObject *tuple = PyTuple_New(PyTuple_GET_SIZE(args) +
PyTuple_GET_SIZE(data) + 1);
if (tuple) {
+ Py_ssize_t i, tuple_i;
+
Py_INCREF(owner);
PyTuple_SET_ITEM(tuple, 0, owner);
- Py_ssize_t i, tuple_i;
tuple_i = 1;
for (i = 0; i != PyTuple_GET_SIZE(args); i++) {
PyObject *item = PyTuple_GET_ITEM(args, i);
@@ -423,6 +425,7 @@
EventSystem_emit(EventSystemObject *self, PyObject *all_args)
{
PyObject *result = NULL;
+ PyObject *name, *args;
if (PyTuple_GET_SIZE(all_args) == 0) {
PyErr_SetString(PyExc_TypeError, "Invalid number of arguments");
@@ -432,16 +435,16 @@
/* XXX In the following code we trust on the format inserted by
* the hook() method. If it's hacked somehow, it may blow up. */
- PyObject *name = PyTuple_GET_ITEM(all_args, 0);
- PyObject *args = PyTuple_GetSlice(all_args, 1, PyTuple_GET_SIZE(all_args));
+ name = PyTuple_GET_ITEM(all_args, 0);
+ args = PyTuple_GetSlice(all_args, 1, PyTuple_GET_SIZE(all_args));
if (args) {
/* owner = self._owner_ref() */
PyObject *owner = PyWeakref_GET_OBJECT(self->_owner_ref);
/* if owner is not None: */
if (owner != Py_None) {
- Py_INCREF(owner);
/* callbacks = self._hooks.get(name) */
PyObject *callbacks = PyDict_GetItem(self->_hooks, name);
+ Py_INCREF(owner);
/* if callbacks: */
if (callbacks && PySet_GET_SIZE(callbacks) != 0) {
/* for callback, data in tuple(callbacks): */
@@ -1039,11 +1042,13 @@
Variable_set_state(VariableObject *self, PyObject *args)
{
/* self._lazy_value, self._value = state */
- if (!PyArg_ParseTuple(args, "(OO):set_state",
- &self->_lazy_value, &self->_value))
+ PyObject *lazy_value, *value;
+ if (!PyArg_ParseTuple(args, "(OO):set_state", &lazy_value, &value))
return NULL;
- Py_INCREF(self->_lazy_value);
- Py_INCREF(self->_value);
+ Py_INCREF(lazy_value);
+ REPLACE(self->_lazy_value, lazy_value);
+ Py_INCREF(value);
+ REPLACE(self->_value, value);
Py_RETURN_NONE;
}
@@ -1509,13 +1514,15 @@
*/
PyObject *handler = PyDict_GetItem(self->_dispatch_table, cls);
if (!handler) {
+ PyObject *mro;
+ Py_ssize_t size, i;
+
if (PyErr_Occurred())
goto error;
/* for mro_cls in cls.__mro__: */
- PyObject *mro = expr->ob_type->tp_mro;
- Py_ssize_t size = PyTuple_GET_SIZE(mro);
- int i;
+ mro = expr->ob_type->tp_mro;
+ size = PyTuple_GET_SIZE(mro);
for (i = 0; i != size; i++) {
PyObject *mro_cls = PyTuple_GET_ITEM(mro, i);
/*
@@ -1560,11 +1567,12 @@
/* if inner_precedence < outer_precedence: */
if (PyObject_Compare(inner_precedence, outer_precedence) == -1) {
+ PyObject *args, *tmp;
+
if (PyErr_Occurred())
goto error;
/* return "(%s)" % statement */
- PyObject *args, *tmp;
CATCH(NULL, args = PyTuple_Pack(1, statement));
tmp = PyUnicode_Format(parenthesis_format, args);
Py_DECREF(args);
@@ -1721,18 +1729,20 @@
static PyObject *
Compile__call__(CompileObject *self, PyObject *args, PyObject *kwargs)
{
- if (!initialize_globals())
- return NULL;
-
static char *kwlist[] = {"expr", "state", "join", "raw", "token", NULL};
PyObject *expr = NULL;
PyObject *state = Py_None;
- PyObject *join = default_compile_join;
+ PyObject *join;
char raw = 0;
char token = 0;
PyObject *result = NULL;
+ if (!initialize_globals())
+ return NULL;
+
+ join = default_compile_join;
+
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|OSbb", kwlist,
&expr, &state, &join, &raw, &token)) {
return NULL;
@@ -2022,7 +2032,7 @@
Py_CLEAR(self->event);
Py_CLEAR(self->variables);
Py_CLEAR(self->primary_vars);
- return PyDict_Type.tp_dealloc((PyObject *)self);
+ PyDict_Type.tp_dealloc((PyObject *)self);
}
static PyMethodDef ObjectInfo_methods[] = {
# Begin bundle
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
V99oDjwZFpglAHSRAzomR/4u5IpwoSHVWvuU
--
storm mailing list
[email protected]
Modify settings or unsubscribe at:
https://lists.ubuntu.com/mailman/listinfo/storm