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

Reply via email to