PR python/14387:
authorTom Tromey <tromey@redhat.com>
Wed, 15 Aug 2012 14:22:02 +0000 (14:22 +0000)
committerTom Tromey <tromey@redhat.com>
Wed, 15 Aug 2012 14:22:02 +0000 (14:22 +0000)
* python/py-bpevent.c (create_breakpoint_event_object): Update
comment.
* python/py-event.c (evpy_add_attribute): Update comment.
* python/py-exitedevent.c (create_exited_event_object): Fix
reference counting and error handling.
* python/py-newobjfileevent.c (create_new_objfile_event_object):
Fix reference counting.
* python/py-signalevent.c (create_signal_event_object): Fix
reference counting and error handling.
* python/py-stopevent.c (emit_stop_event): Fix reference
counting.
* python/py-threadevent.c (get_event_thread): Return a
borrowed reference.
* python/py-type.c (convert_field): Fix reference counting.

gdb/ChangeLog
gdb/python/py-bpevent.c
gdb/python/py-event.c
gdb/python/py-exitedevent.c
gdb/python/py-newobjfileevent.c
gdb/python/py-signalevent.c
gdb/python/py-stopevent.c
gdb/python/py-threadevent.c
gdb/python/py-type.c

index 2df92f45160a9766b705f6f3c46d0afba9f06633..8886b8cf526cedf7fe153d39e21144fdf3629948 100644 (file)
@@ -1,3 +1,21 @@
+2012-08-15  Tom Tromey  <tromey@redhat.com>
+
+       PR python/14387:
+       * python/py-bpevent.c (create_breakpoint_event_object): Update
+       comment.
+       * python/py-event.c (evpy_add_attribute): Update comment.
+       * python/py-exitedevent.c (create_exited_event_object): Fix
+       reference counting and error handling.
+       * python/py-newobjfileevent.c (create_new_objfile_event_object):
+       Fix reference counting.
+       * python/py-signalevent.c (create_signal_event_object): Fix
+       reference counting and error handling.
+       * python/py-stopevent.c (emit_stop_event): Fix reference
+       counting.
+       * python/py-threadevent.c (get_event_thread): Return a
+       borrowed reference.
+       * python/py-type.c (convert_field): Fix reference counting.
+
 2012-08-15  Tom Tromey  <tromey@redhat.com>
 
        * dwarf2read.c (dwarf_decode_macro_bytes)
index 138c39f0b2b2b1016a4cee83ef43c8014e45afd2..8e4afe47e21bcbbcef2b8091666f82ee2c3aa8dc 100644 (file)
@@ -21,7 +21,8 @@
 
 static PyTypeObject breakpoint_event_object_type;
 
-/* Create and initialize a BreakpointEvent object.  */
+/* Create and initialize a BreakpointEvent object.  This acquires new
+   references to BREAKPOINT_LIST and FIRST_BP.  */
 
 PyObject *
 create_breakpoint_event_object (PyObject *breakpoint_list, PyObject *first_bp)
index 4789761f2d6337c7eeb2148fb0345b8ca5ed8786..7c88fcd1b1e5267fe39a7e990ec834ac0c030be3 100644 (file)
@@ -48,7 +48,8 @@ create_event_object (PyTypeObject *py_type)
 
 /* Add the attribute ATTR to the event object EVENT.  In
    python this attribute will be accessible by the name NAME.
-   returns 0 if the operation succeeds and -1 otherwise.  */
+   returns 0 if the operation succeeds and -1 otherwise.  This
+   function acquires a new reference to ATTR.  */
 
 int
 evpy_add_attribute (PyObject *event, char *name, PyObject *attr)
index 272fd30395d25a71f0e60d49220fde8d42d019fe..d062f5f736c7c95f668b0efe5d198cf283b4fbed 100644 (file)
@@ -25,30 +25,41 @@ static PyObject *
 create_exited_event_object (const LONGEST *exit_code, struct inferior *inf)
 {
   PyObject *exited_event;
-  PyObject *inf_obj;
+  PyObject *inf_obj = NULL;
 
   exited_event = create_event_object (&exited_event_object_type);
 
   if (!exited_event)
     goto fail;
 
-  if (exit_code
-      && evpy_add_attribute (exited_event,
-                            "exit_code",
-                            PyLong_FromLongLong (*exit_code)) < 0)
-    goto fail;
+  if (exit_code)
+    {
+      PyObject *exit_code_obj = PyLong_FromLongLong (*exit_code);
+      int failed;
+
+      if (exit_code_obj == NULL)
+       goto fail;
+
+      failed = evpy_add_attribute (exited_event, "exit_code",
+                                  exit_code_obj) < 0;
+      Py_DECREF (exit_code_obj);
+      if (failed)
+       goto fail;
+    }
 
   inf_obj = inferior_to_inferior_object (inf);
   if (!inf_obj || evpy_add_attribute (exited_event,
                                       "inferior",
                                       inf_obj) < 0)
     goto fail;
+  Py_DECREF (inf_obj);
 
   return exited_event;
 
-  fail:
-   Py_XDECREF (exited_event);
-   return NULL;
+ fail:
+  Py_XDECREF (inf_obj);
+  Py_XDECREF (exited_event);
+  return NULL;
 }
 
 /* Callback that is used when an exit event occurs.  This function
index d014be60961abf4f6f3f3a75e2be2174ae17f518..3059ae4b6a1d6c692567e9ac0d7fa26eb019ac08 100644 (file)
@@ -25,7 +25,7 @@ static PyObject *
 create_new_objfile_event_object (struct objfile *objfile)
 {
   PyObject *objfile_event;
-  PyObject *py_objfile;
+  PyObject *py_objfile = NULL;
 
   objfile_event = create_event_object (&new_objfile_event_object_type);
   if (!objfile_event)
@@ -36,10 +36,12 @@ create_new_objfile_event_object (struct objfile *objfile)
                                          "new_objfile",
                                          py_objfile) < 0)
     goto fail;
+  Py_DECREF (py_objfile);
 
   return objfile_event;
 
  fail:
+  Py_XDECREF (py_objfile);
   Py_XDECREF (objfile_event);
   return NULL;
 }
index 304b847f74fc932e86860b4c68abc3f943721183..40da31aa1bcc198bf49bdd14363a88e1f6383a2a 100644 (file)
@@ -25,6 +25,7 @@ PyObject *
 create_signal_event_object (enum gdb_signal stop_signal)
 {
   const char *signal_name;
+  PyObject *signal_name_obj = NULL;
   PyObject *signal_event_obj =
       create_stop_event_object (&signal_event_object_type);
 
@@ -33,16 +34,21 @@ create_signal_event_object (enum gdb_signal stop_signal)
 
   signal_name = gdb_signal_to_name (stop_signal);
 
+  signal_name_obj = PyString_FromString (signal_name);
+  if (signal_name_obj == NULL)
+    goto fail;
   if (evpy_add_attribute (signal_event_obj,
                           "stop_signal",
-                          PyString_FromString (signal_name)) < 0)
+                          signal_name_obj) < 0)
     goto fail;
+  Py_DECREF (signal_name_obj);
 
   return signal_event_obj;
 
-  fail:
-   Py_XDECREF (signal_event_obj);
-   return NULL;
+ fail:
+  Py_XDECREF (signal_name_obj);
+  Py_XDECREF (signal_event_obj);
+  return NULL;
 }
 
 GDBPY_NEW_EVENT_TYPE (signal,
index 7e0094848dd51fafb7c1cd63a1f854e456bc4c1e..d351915951fee242dd2875420b3950e569c6c406 100644 (file)
@@ -81,6 +81,7 @@ emit_stop_event (struct bpstats *bs, enum gdb_signal stop_signal)
       stop_event_obj = create_breakpoint_event_object (list, first_bp);
       if (!stop_event_obj)
         goto fail;
+      Py_DECREF (list);
     }
 
   /* Check if the signal is "Signal 0" or "Trace/breakpoint trap".  */
index 67f9e2006aa5e563bebe48182a0f45335ff786fe..d5139450c6c6fea27fb4822145ff02efdf99f807 100644 (file)
@@ -21,7 +21,7 @@
    running in non-stop mode then the event is thread specific, otherwise
    it is process wide.
    This function returns the currently stopped thread in non-stop mode and
-   Py_None otherwise.  */
+   Py_None otherwise.  In each case it returns a borrowed reference.  */
 
 static PyObject *
 get_event_thread (void)
@@ -39,8 +39,6 @@ get_event_thread (void)
       return NULL;
     }
 
-  Py_INCREF (thread);
-
   return thread;
 }
 
index b10f9d034d4e6a6aa8845652e8a9d6ea70b0507c..3d8ab293738112fc9dda4346a0e3a74241f2fbd8 100644 (file)
@@ -186,6 +186,7 @@ convert_field (struct type *type, int field)
       /* At least python-2.4 had the second parameter non-const.  */
       if (PyObject_SetAttrString (result, (char *) attrstring, arg) < 0)
        goto failarg;
+      Py_DECREF (arg);
     }
 
   if (TYPE_FIELD_NAME (type, field))
@@ -199,11 +200,13 @@ convert_field (struct type *type, int field)
     goto fail;
   if (PyObject_SetAttrString (result, "name", arg) < 0)
     goto failarg;
+  Py_DECREF (arg);
 
   arg = TYPE_FIELD_ARTIFICIAL (type, field) ? Py_True : Py_False;
   Py_INCREF (arg);
   if (PyObject_SetAttrString (result, "artificial", arg) < 0)
     goto failarg;
+  Py_DECREF (arg);
 
   if (TYPE_CODE (type) == TYPE_CODE_CLASS)
     arg = field < TYPE_N_BASECLASSES (type) ? Py_True : Py_False;
@@ -212,12 +215,14 @@ convert_field (struct type *type, int field)
   Py_INCREF (arg);
   if (PyObject_SetAttrString (result, "is_base_class", arg) < 0)
     goto failarg;
+  Py_DECREF (arg);
 
   arg = PyLong_FromLong (TYPE_FIELD_BITSIZE (type, field));
   if (!arg)
     goto fail;
   if (PyObject_SetAttrString (result, "bitsize", arg) < 0)
     goto failarg;
+  Py_DECREF (arg);
 
   /* A field can have a NULL type in some situations.  */
   if (TYPE_FIELD_TYPE (type, field) == NULL)
@@ -231,6 +236,7 @@ convert_field (struct type *type, int field)
     goto fail;
   if (PyObject_SetAttrString (result, "type", arg) < 0)
     goto failarg;
+  Py_DECREF (arg);
 
   return result;