2011-11-28 Phil Muldoon <pmuldoon@redhat.com>
authorPhil Muldoon <pmuldoon@redhat.com>
Mon, 28 Nov 2011 15:49:43 +0000 (15:49 +0000)
committerPhil Muldoon <pmuldoon@redhat.com>
Mon, 28 Nov 2011 15:49:43 +0000 (15:49 +0000)
PR python/13369
PR python/13374

* python/python.c (gdbpy_decode_line): Do not acquire GIL.
* python/py-inferior.c (inferior_to_inferior_object): Ditto.
* python/py-value.c (valpy_nonzero): Use TRY_CATCH to catch GDB
exceptions.
* python/py-type.c (typy_strip_typedefs): Ditto.
(typy_legacy_template_argument): Ditto.
* python/py-inferior.c (inferior_to_inferior_object): Ditto.
* python/py-breakpoint.c (bppy_set_ignore_count): Ditto.

gdb/ChangeLog
gdb/python/py-block.c
gdb/python/py-breakpoint.c
gdb/python/py-inferior.c
gdb/python/py-type.c
gdb/python/py-value.c
gdb/python/python.c

index d6551d646a876301b71520a220dd1f34575019c4..7a6aaeaaa97d5ab3fe133c4bb6606bfe3eef1536 100644 (file)
@@ -1,3 +1,17 @@
+2011-11-28  Phil Muldoon  <pmuldoon@redhat.com>
+
+       PR python/13369
+       PR python/13374
+
+       * python/python.c (gdbpy_decode_line): Do not acquire GIL.
+       * python/py-inferior.c (inferior_to_inferior_object): Ditto.
+       * python/py-value.c (valpy_nonzero): Use TRY_CATCH to catch GDB
+       exceptions.
+       * python/py-type.c (typy_strip_typedefs): Ditto.
+       (typy_legacy_template_argument): Ditto.
+       * python/py-inferior.c (inferior_to_inferior_object): Ditto.
+       * python/py-breakpoint.c (bppy_set_ignore_count): Ditto.
+
 2011-11-27  Joel Brobecker  <brobecker@acacore.com>
 
        * remote.c (remote_get_tracepoint_status): Delete addrbuf
index 3f4467aedc74a1a295323e2ba172a49e903fbdd3..6c6df2e739b77f8f16f39bed7fa6ff2be84d5f9d 100644 (file)
@@ -371,14 +371,20 @@ gdbpy_block_for_pc (PyObject *self, PyObject *args)
 {
   gdb_py_ulongest pc;
   struct block *block;
-  struct obj_section *section;
-  struct symtab *symtab;
+  struct obj_section *section = NULL;
+  struct symtab *symtab = NULL;
+  volatile struct gdb_exception except;
 
   if (!PyArg_ParseTuple (args, GDB_PY_LLU_ARG, &pc))
     return NULL;
 
-  section = find_pc_mapped_section (pc);
-  symtab = find_pc_sect_symtab (pc, section);
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    {
+      section = find_pc_mapped_section (pc);
+      symtab = find_pc_sect_symtab (pc, section);
+    }
+  GDB_PY_HANDLE_EXCEPTION (except);
+
   if (!symtab || symtab->objfile == NULL)
     {
       PyErr_SetString (PyExc_RuntimeError,
index f235bbc8a05882125e98c72159dc3062a89caed2..11d60fe09d6e436f333a822b14500b815f9fbe9d 100644 (file)
@@ -334,6 +334,7 @@ bppy_set_ignore_count (PyObject *self, PyObject *newvalue, void *closure)
 {
   breakpoint_object *self_bp = (breakpoint_object *) self;
   long value;
+  volatile struct gdb_exception except;
 
   BPPY_SET_REQUIRE_VALID (self_bp);
 
@@ -355,7 +356,12 @@ bppy_set_ignore_count (PyObject *self, PyObject *newvalue, void *closure)
 
   if (value < 0)
     value = 0;
-  set_ignore_count (self_bp->number, (int) value, 0);
+
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    {
+      set_ignore_count (self_bp->number, (int) value, 0);
+    }
+  GDB_PY_SET_HANDLE_EXCEPTION (except);
 
   return 0;
 }
index d6086dc9dc1fce89c6a446d894ce36dec5ab2a9e..7b2981ee6978636d137bc84c47c3e896258cb9be 100644 (file)
@@ -157,15 +157,9 @@ inferior_to_inferior_object (struct inferior *inferior)
   inf_obj = inferior_data (inferior, infpy_inf_data_key);
   if (!inf_obj)
     {
-      struct cleanup *cleanup;
-      cleanup = ensure_python_env (python_gdbarch, python_language);
-
       inf_obj = PyObject_New (inferior_object, &inferior_object_type);
       if (!inf_obj)
-       {
-         do_cleanups (cleanup);
          return NULL;
-       }
 
       inf_obj->inferior = inferior;
       inf_obj->threads = NULL;
@@ -173,7 +167,6 @@ inferior_to_inferior_object (struct inferior *inferior)
 
       set_inferior_data (inferior, infpy_inf_data_key, inf_obj);
 
-      do_cleanups (cleanup);
     }
   else
     Py_INCREF ((PyObject *)inf_obj);
@@ -266,10 +259,15 @@ delete_thread_object (struct thread_info *tp, int ignore)
   inferior_object *inf_obj;
   thread_object *thread_obj;
   struct threadlist_entry **entry, *tmp;
+  
+  cleanup = ensure_python_env (python_gdbarch, python_language);
 
   inf_obj = (inferior_object *) find_inferior_object (PIDGET(tp->ptid));
   if (!inf_obj)
-    return;
+    {
+      do_cleanups (cleanup);
+      return;
+    }
 
   /* Find thread entry in its inferior's thread_list.  */
   for (entry = &inf_obj->threads; *entry != NULL; entry =
@@ -280,11 +278,10 @@ delete_thread_object (struct thread_info *tp, int ignore)
   if (!*entry)
     {
       Py_DECREF (inf_obj);
+      do_cleanups (cleanup);
       return;
     }
 
-  cleanup = ensure_python_env (python_gdbarch, python_language);
-
   tmp = *entry;
   tmp->thread_obj->thread = NULL;
 
index f76b1c74aa179e2fd0042521ea9da519c060f3e6..b671cef0b1e0bf66d14ec6ab3d84bdfa2a434552 100644 (file)
@@ -395,6 +395,13 @@ static PyObject *
 typy_strip_typedefs (PyObject *self, PyObject *args)
 {
   struct type *type = ((type_object *) self)->type;
+  volatile struct gdb_exception except;
+
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    {
+      type = check_typedef (type);
+    }
+  GDB_PY_HANDLE_EXCEPTION (except);
 
   return type_to_type_object (check_typedef (type));
 }
@@ -768,10 +775,11 @@ typy_legacy_template_argument (struct type *type, const struct block *block,
 {
   int i;
   struct demangle_component *demangled;
-  struct demangle_parse_info *info;
+  struct demangle_parse_info *info = NULL;
   const char *err;
   struct type *argtype;
   struct cleanup *cleanup;
+  volatile struct gdb_exception except;
 
   if (TYPE_NAME (type) == NULL)
     {
@@ -779,8 +787,13 @@ typy_legacy_template_argument (struct type *type, const struct block *block,
       return NULL;
     }
 
-  /* Note -- this is not thread-safe.  */
-  info = cp_demangled_name_to_comp (TYPE_NAME (type), &err);
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    {
+      /* Note -- this is not thread-safe.  */
+      info = cp_demangled_name_to_comp (TYPE_NAME (type), &err);
+    }
+  GDB_PY_HANDLE_EXCEPTION (except);
+
   if (! info)
     {
       PyErr_SetString (PyExc_RuntimeError, err);
index 15c183a3017fba80df276a4c09cad26fa4bc9438..05e592f12e079f191bc58459cc10b6c738b724f1 100644 (file)
@@ -880,10 +880,10 @@ valpy_nonzero (PyObject *self)
   struct type *type;
   int nonzero = 0; /* Appease GCC warning.  */
 
-  type = check_typedef (value_type (self_value->value));
-
   TRY_CATCH (except, RETURN_MASK_ALL)
     {
+      type = check_typedef (value_type (self_value->value));
+
       if (is_integral_type (type) || TYPE_CODE (type) == TYPE_CODE_PTR)
        nonzero = !!value_as_long (self_value->value);
       else if (TYPE_CODE (type) == TYPE_CODE_FLT)
index 108e5428a604fab4ef3584fd3a375431a8cf24ee..60225720af106027b13c92268183801b4f0634bb 100644 (file)
@@ -504,7 +504,7 @@ gdbpy_decode_line (PyObject *self, PyObject *args)
   if (! PyArg_ParseTuple (args, "|s", &arg))
     return NULL;
 
-  cleanups = ensure_python_env (get_current_arch (), current_language);
+  cleanups = make_cleanup (null_cleanup, NULL);
 
   TRY_CATCH (except, RETURN_MASK_ALL)
     {