2011-10-27 Phil Muldoon <pmuldoon@redhat.com>
authorPhil Muldoon <pmuldoon@redhat.com>
Thu, 27 Oct 2011 09:14:27 +0000 (09:14 +0000)
committerPhil Muldoon <pmuldoon@redhat.com>
Thu, 27 Oct 2011 09:14:27 +0000 (09:14 +0000)
* python/py-breakpoint.c (bppy_set_enabled): Use TRY_CATCH.
(bppy_set_task): Ditto.
(bppy_delete_breakpoint): Ditto.
* python/py-symbol.c (gdbpy_lookup_symbol): Ditto.
(gdbpy_lookup_global_symbol): Ditto.
* python/py-lazy-string.c (stpy_convert_to_value): Ditto.
* python/py-frame.c (frapy_is_valid): Ditto.
(frame_info_to_frame_object): Ditto.
* python/py-type.c (typy_lookup_type): Ditto.
(typy_getitem): Ditto.
(typy_has_key): Ditto.
(typy_richcompare): Use TRY_CATCH.  Do not return Py_NE on error.

gdb/ChangeLog
gdb/python/py-breakpoint.c
gdb/python/py-frame.c
gdb/python/py-lazy-string.c
gdb/python/py-symbol.c
gdb/python/py-type.c

index 3b25e23cd52f95718bf8ed4b445199558f958f10..4acd4e59e632f8429db5f695f34afb69869a830f 100644 (file)
@@ -1,3 +1,18 @@
+2011-10-27  Phil Muldoon  <pmuldoon@redhat.com>
+
+       * python/py-breakpoint.c (bppy_set_enabled): Use TRY_CATCH.
+       (bppy_set_task): Ditto.
+       (bppy_delete_breakpoint): Ditto.
+       * python/py-symbol.c (gdbpy_lookup_symbol): Ditto.
+       (gdbpy_lookup_global_symbol): Ditto.
+       * python/py-lazy-string.c (stpy_convert_to_value): Ditto.
+       * python/py-frame.c (frapy_is_valid): Ditto.
+       (frame_info_to_frame_object): Ditto.
+       * python/py-type.c (typy_lookup_type): Ditto.
+       (typy_getitem): Ditto.
+       (typy_has_key): Ditto.
+       (typy_richcompare): Use TRY_CATCH.  Do not return Py_NE on error.
+
 2011-10-26  Joel Brobecker  <brobecker@adacore.com>
 
        * gdbarch.h: Regenerate.
index daceb99d85e74625f398d65c79d49d190b231d23..f235bbc8a05882125e98c72159dc3062a89caed2 100644 (file)
@@ -150,6 +150,7 @@ bppy_set_enabled (PyObject *self, PyObject *newvalue, void *closure)
 {
   breakpoint_object *self_bp = (breakpoint_object *) self;
   int cmp;
+  volatile struct gdb_exception except;
 
   BPPY_SET_REQUIRE_VALID (self_bp);
 
@@ -170,10 +171,16 @@ bppy_set_enabled (PyObject *self, PyObject *newvalue, void *closure)
   cmp = PyObject_IsTrue (newvalue);
   if (cmp < 0)
     return -1;
-  else if (cmp == 1)
-    enable_breakpoint (self_bp->bp);
-  else 
-    disable_breakpoint (self_bp->bp);
+
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    {
+      if (cmp == 1)
+       enable_breakpoint (self_bp->bp);
+      else
+       disable_breakpoint (self_bp->bp);
+    }
+  GDB_PY_SET_HANDLE_EXCEPTION (except);
+
   return 0;
 }
 
@@ -255,6 +262,8 @@ bppy_set_task (PyObject *self, PyObject *newvalue, void *closure)
 {
   breakpoint_object *self_bp = (breakpoint_object *) self;
   long id;
+  int valid_id = 0;
+  volatile struct gdb_exception except;
 
   BPPY_SET_REQUIRE_VALID (self_bp);
 
@@ -269,7 +278,13 @@ bppy_set_task (PyObject *self, PyObject *newvalue, void *closure)
       if (! gdb_py_int_as_long (newvalue, &id))
        return -1;
 
-      if (! valid_task_id (id))
+      TRY_CATCH (except, RETURN_MASK_ALL)
+       {
+         valid_id = valid_task_id (id);
+       }
+      GDB_PY_SET_HANDLE_EXCEPTION (except);
+
+      if (! valid_id)
        {
          PyErr_SetString (PyExc_RuntimeError, 
                           _("Invalid task ID."));
@@ -299,10 +314,15 @@ static PyObject *
 bppy_delete_breakpoint (PyObject *self, PyObject *args)
 {
   breakpoint_object *self_bp = (breakpoint_object *) self;
+  volatile struct gdb_exception except;
 
   BPPY_REQUIRE_VALID (self_bp);
 
-  delete_breakpoint (self_bp->bp);
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    {
+      delete_breakpoint (self_bp->bp);
+    }
+  GDB_PY_HANDLE_EXCEPTION (except);
 
   Py_RETURN_NONE;
 }
index 398ce84bcd113b0dc566ddef221c8f8e3e191a6a..e192ffab609f1be7989869e898aff1acfa55c63d 100644 (file)
@@ -101,9 +101,15 @@ frapy_str (PyObject *self)
 static PyObject *
 frapy_is_valid (PyObject *self, PyObject *args)
 {
-  struct frame_info *frame;
+  struct frame_info *frame = NULL;
+  volatile struct gdb_exception except;
+
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    {
+      frame = frame_object_to_frame_info ((frame_object *) self);
+    }
+  GDB_PY_HANDLE_EXCEPTION (except);
 
-  frame = frame_object_to_frame_info ((frame_object *) self);
   if (frame == NULL)
     Py_RETURN_FALSE;
 
@@ -276,6 +282,7 @@ PyObject *
 frame_info_to_frame_object (struct frame_info *frame)
 {
   frame_object *frame_obj;
+  volatile struct gdb_exception except;
 
   frame_obj = PyObject_New (frame_object, &frame_object_type);
   if (frame_obj == NULL)
@@ -285,23 +292,27 @@ frame_info_to_frame_object (struct frame_info *frame)
       return NULL;
     }
 
-  /* Try to get the previous frame, to determine if this is the last frame
-     in a corrupt stack.  If so, we need to store the frame_id of the next
-     frame and not of this one (which is possibly invalid).  */
-  if (get_prev_frame (frame) == NULL
-      && get_frame_unwind_stop_reason (frame) != UNWIND_NO_REASON
-      && get_next_frame (frame) != NULL)
-    {
-      frame_obj->frame_id = get_frame_id (get_next_frame (frame));
-      frame_obj->frame_id_is_next = 1;
-    }
-  else
+  TRY_CATCH (except, RETURN_MASK_ALL)
     {
-      frame_obj->frame_id = get_frame_id (frame);
-      frame_obj->frame_id_is_next = 0;
-    }
 
-  frame_obj->gdbarch = get_frame_arch (frame);
+      /* Try to get the previous frame, to determine if this is the last frame
+        in a corrupt stack.  If so, we need to store the frame_id of the next
+        frame and not of this one (which is possibly invalid).  */
+      if (get_prev_frame (frame) == NULL
+         && get_frame_unwind_stop_reason (frame) != UNWIND_NO_REASON
+         && get_next_frame (frame) != NULL)
+       {
+         frame_obj->frame_id = get_frame_id (get_next_frame (frame));
+         frame_obj->frame_id_is_next = 1;
+       }
+      else
+       {
+         frame_obj->frame_id = get_frame_id (frame);
+         frame_obj->frame_id_is_next = 0;
+       }
+      frame_obj->gdbarch = get_frame_arch (frame);
+    }
+  GDB_PY_HANDLE_EXCEPTION (except);
 
   return (PyObject *) frame_obj;
 }
index 940ce88cf5996ad5c54d78856f0b35277c1c7f98..45ba41e0517bffe1753468d059d3824679506951 100644 (file)
@@ -96,7 +96,8 @@ static PyObject *
 stpy_convert_to_value  (PyObject *self, PyObject *args)
 {
   lazy_string_object *self_string = (lazy_string_object *) self;
-  struct value *val;
+  struct value *val = NULL;
+  volatile struct gdb_exception except;
 
   if (self_string->address == 0)
     {
@@ -105,7 +106,12 @@ stpy_convert_to_value  (PyObject *self, PyObject *args)
       return NULL;
     }
 
-  val = value_at_lazy (self_string->type, self_string->address);
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    {
+      val = value_at_lazy (self_string->type, self_string->address);
+    }
+  GDB_PY_HANDLE_EXCEPTION (except);
+
   return value_to_value_object (val);
 }
 
index 3fdbe48dbec5aaded4ab5c46e3ae73478593a669..3f8defa9a22ce0e974682a95d68451b6d65fd75d 100644 (file)
@@ -274,9 +274,10 @@ gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw)
   int domain = VAR_DOMAIN, is_a_field_of_this = 0;
   const char *name;
   static char *keywords[] = { "name", "block", "domain", NULL };
-  struct symbol *symbol;
+  struct symbol *symbol = NULL;
   PyObject *block_obj = NULL, *ret_tuple, *sym_obj, *bool_obj;
   const struct block *block = NULL;
+  volatile struct gdb_exception except;
 
   if (! PyArg_ParseTupleAndKeywords (args, kw, "s|O!i", keywords, &name,
                                     &block_object_type, &block_obj, &domain))
@@ -297,7 +298,11 @@ gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw)
       GDB_PY_HANDLE_EXCEPTION (except);
     }
 
-  symbol = lookup_symbol (name, block, domain, &is_a_field_of_this);
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    {
+      symbol = lookup_symbol (name, block, domain, &is_a_field_of_this);
+    }
+  GDB_PY_HANDLE_EXCEPTION (except);
 
   ret_tuple = PyTuple_New (2);
   if (!ret_tuple)
@@ -335,14 +340,19 @@ gdbpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw)
   int domain = VAR_DOMAIN;
   const char *name;
   static char *keywords[] = { "name", "domain", NULL };
-  struct symbol *symbol;
+  struct symbol *symbol = NULL;
   PyObject *sym_obj;
+  volatile struct gdb_exception except;
 
   if (! PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name,
                                     &domain))
     return NULL;
 
-  symbol = lookup_symbol_global (name, NULL, domain);
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    {
+      symbol = lookup_symbol_global (name, NULL, domain);
+    }
+  GDB_PY_HANDLE_EXCEPTION (except);
 
   if (symbol)
     {
index f155d63d9223dc8743d64bdf0d48677a66e5c863..585100dd25bfb6357783982a0de6003cbe95de03 100644 (file)
@@ -595,9 +595,7 @@ typy_lookup_typename (const char *type_name, const struct block *block)
     }
   if (except.reason < 0)
     {
-      PyErr_Format (except.reason == RETURN_QUIT
-                   ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
-                   "%s", except.message);
+      gdbpy_convert_exception (except);
       return NULL;
     }
 
@@ -609,8 +607,9 @@ typy_lookup_type (struct demangle_component *demangled,
                  const struct block *block)
 {
   struct type *type;
-  char *type_name;
+  char *type_name = NULL;
   enum demangle_component_type demangled_type;
+  volatile struct gdb_exception except;
 
   /* Save the type: typy_lookup_type() may (indirectly) overwrite
      memory pointed by demangled.  */
@@ -625,20 +624,29 @@ typy_lookup_type (struct demangle_component *demangled,
       if (! type)
        return NULL;
 
-      switch (demangled_type)
+      TRY_CATCH (except, RETURN_MASK_ALL)
+       {
+         switch (demangled_type)
+           {
+           case DEMANGLE_COMPONENT_REFERENCE:
+             return lookup_reference_type (type);
+           case DEMANGLE_COMPONENT_POINTER:
+             return lookup_pointer_type (type);
+           case DEMANGLE_COMPONENT_CONST:
+             return make_cv_type (1, 0, type, NULL);
+           case DEMANGLE_COMPONENT_VOLATILE:
+             return make_cv_type (0, 1, type, NULL);
+           }
+
+         type_name = cp_comp_to_string (demangled, 10);
+       }
+      if (except.reason < 0)
        {
-       case DEMANGLE_COMPONENT_REFERENCE:
-         return lookup_reference_type (type);
-       case DEMANGLE_COMPONENT_POINTER:
-         return lookup_pointer_type (type);
-       case DEMANGLE_COMPONENT_CONST:
-         return make_cv_type (1, 0, type, NULL);
-       case DEMANGLE_COMPONENT_VOLATILE:
-         return make_cv_type (0, 1, type, NULL);
+         gdbpy_convert_exception (except);
+         return NULL;
        }
     }
 
-  type_name = cp_comp_to_string (demangled, 10);
   type = typy_lookup_typename (type_name, block);
   xfree (type_name);
 
@@ -1007,11 +1015,13 @@ typy_richcompare (PyObject *self, PyObject *other, int op)
        {
          result = check_types_worklist (&worklist, cache);
        }
-      if (except.reason < 0)
-       result = Py_NE;
-
+      /* check_types_worklist calls several nested Python helper
+        functions, some of which can raise a GDB Exception, so we
+        just check and convert here.  If there is a GDB exception, a
+        comparison is not capable (or trusted), so exit.  */
       bcache_xfree (cache);
       VEC_free (type_equality_entry_d, worklist);
+      GDB_PY_HANDLE_EXCEPTION (except);
     }
 
   if (op == result)
@@ -1112,7 +1122,8 @@ typy_getitem (PyObject *self, PyObject *key)
   struct type *type = ((type_object *) self)->type;
   char *field;
   int i;
-  
+  volatile struct gdb_exception except;
+
   field = python_string_to_host_string (key);
   if (field == NULL)
     return NULL;
@@ -1123,7 +1134,12 @@ typy_getitem (PyObject *self, PyObject *key)
 
   for (;;)
     {
-      CHECK_TYPEDEF (type);
+      TRY_CATCH (except, RETURN_MASK_ALL)
+       {
+         CHECK_TYPEDEF (type);
+       }
+      GDB_PY_HANDLE_EXCEPTION (except);
+
       if (TYPE_CODE (type) != TYPE_CODE_PTR
          && TYPE_CODE (type) != TYPE_CODE_REF)
        break;
@@ -1178,7 +1194,8 @@ typy_has_key (PyObject *self, PyObject *args)
   struct type *type = ((type_object *) self)->type;
   const char *field;
   int i;
-  
+  volatile struct gdb_exception except;
+
   if (!PyArg_ParseTuple (args, "s", &field))
     return NULL;
 
@@ -1188,7 +1205,11 @@ typy_has_key (PyObject *self, PyObject *args)
 
   for (;;)
     {
-      CHECK_TYPEDEF (type);
+      TRY_CATCH (except, RETURN_MASK_ALL)
+       {
+         CHECK_TYPEDEF (type);
+       }
+      GDB_PY_HANDLE_EXCEPTION (except);
       if (TYPE_CODE (type) != TYPE_CODE_PTR
          && TYPE_CODE (type) != TYPE_CODE_REF)
        break;