Home | History | Annotate | Line # | Download | only in python
py-breakpoint.c revision 1.3.2.1
      1 /* Python interface to breakpoints
      2 
      3    Copyright (C) 2008-2015 Free Software Foundation, Inc.
      4 
      5    This file is part of GDB.
      6 
      7    This program is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3 of the License, or
     10    (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19 
     20 #include "defs.h"
     21 #include "value.h"
     22 #include "python-internal.h"
     23 #include "python.h"
     24 #include "charset.h"
     25 #include "breakpoint.h"
     26 #include "gdbcmd.h"
     27 #include "gdbthread.h"
     28 #include "observer.h"
     29 #include "cli/cli-script.h"
     30 #include "ada-lang.h"
     31 #include "arch-utils.h"
     32 #include "language.h"
     33 
     34 /* Number of live breakpoints.  */
     35 static int bppy_live;
     36 
     37 /* Variables used to pass information between the Breakpoint
     38    constructor and the breakpoint-created hook function.  */
     39 gdbpy_breakpoint_object *bppy_pending_object;
     40 
     41 /* Function that is called when a Python condition is evaluated.  */
     42 static char * const stop_func = "stop";
     43 
     44 /* This is used to initialize various gdb.bp_* constants.  */
     45 struct pybp_code
     46 {
     47   /* The name.  */
     48   const char *name;
     49   /* The code.  */
     50   int code;
     51 };
     52 
     53 /* Entries related to the type of user set breakpoints.  */
     54 static struct pybp_code pybp_codes[] =
     55 {
     56   { "BP_NONE", bp_none},
     57   { "BP_BREAKPOINT", bp_breakpoint},
     58   { "BP_WATCHPOINT", bp_watchpoint},
     59   { "BP_HARDWARE_WATCHPOINT", bp_hardware_watchpoint},
     60   { "BP_READ_WATCHPOINT", bp_read_watchpoint},
     61   { "BP_ACCESS_WATCHPOINT", bp_access_watchpoint},
     62   {NULL} /* Sentinel.  */
     63 };
     64 
     65 /* Entries related to the type of watchpoint.  */
     66 static struct pybp_code pybp_watch_types[] =
     67 {
     68   { "WP_READ", hw_read},
     69   { "WP_WRITE", hw_write},
     70   { "WP_ACCESS", hw_access},
     71   {NULL} /* Sentinel.  */
     72 };
     73 
     74 /* Python function which checks the validity of a breakpoint object.  */
     75 static PyObject *
     76 bppy_is_valid (PyObject *self, PyObject *args)
     77 {
     78   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
     79 
     80   if (self_bp->bp)
     81     Py_RETURN_TRUE;
     82   Py_RETURN_FALSE;
     83 }
     84 
     85 /* Python function to test whether or not the breakpoint is enabled.  */
     86 static PyObject *
     87 bppy_get_enabled (PyObject *self, void *closure)
     88 {
     89   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
     90 
     91   BPPY_REQUIRE_VALID (self_bp);
     92   if (! self_bp->bp)
     93     Py_RETURN_FALSE;
     94   if (self_bp->bp->enable_state == bp_enabled)
     95     Py_RETURN_TRUE;
     96   Py_RETURN_FALSE;
     97 }
     98 
     99 /* Python function to test whether or not the breakpoint is silent.  */
    100 static PyObject *
    101 bppy_get_silent (PyObject *self, void *closure)
    102 {
    103   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    104 
    105   BPPY_REQUIRE_VALID (self_bp);
    106   if (self_bp->bp->silent)
    107     Py_RETURN_TRUE;
    108   Py_RETURN_FALSE;
    109 }
    110 
    111 /* Python function to set the enabled state of a breakpoint.  */
    112 static int
    113 bppy_set_enabled (PyObject *self, PyObject *newvalue, void *closure)
    114 {
    115   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    116   int cmp;
    117 
    118   BPPY_SET_REQUIRE_VALID (self_bp);
    119 
    120   if (newvalue == NULL)
    121     {
    122       PyErr_SetString (PyExc_TypeError,
    123 		       _("Cannot delete `enabled' attribute."));
    124 
    125       return -1;
    126     }
    127   else if (! PyBool_Check (newvalue))
    128     {
    129       PyErr_SetString (PyExc_TypeError,
    130 		       _("The value of `enabled' must be a boolean."));
    131       return -1;
    132     }
    133 
    134   cmp = PyObject_IsTrue (newvalue);
    135   if (cmp < 0)
    136     return -1;
    137 
    138   TRY
    139     {
    140       if (cmp == 1)
    141 	enable_breakpoint (self_bp->bp);
    142       else
    143 	disable_breakpoint (self_bp->bp);
    144     }
    145   CATCH (except, RETURN_MASK_ALL)
    146     {
    147       GDB_PY_SET_HANDLE_EXCEPTION (except);
    148     }
    149   END_CATCH
    150 
    151   return 0;
    152 }
    153 
    154 /* Python function to set the 'silent' state of a breakpoint.  */
    155 static int
    156 bppy_set_silent (PyObject *self, PyObject *newvalue, void *closure)
    157 {
    158   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    159   int cmp;
    160 
    161   BPPY_SET_REQUIRE_VALID (self_bp);
    162 
    163   if (newvalue == NULL)
    164     {
    165       PyErr_SetString (PyExc_TypeError,
    166 		       _("Cannot delete `silent' attribute."));
    167       return -1;
    168     }
    169   else if (! PyBool_Check (newvalue))
    170     {
    171       PyErr_SetString (PyExc_TypeError,
    172 		       _("The value of `silent' must be a boolean."));
    173       return -1;
    174     }
    175 
    176   cmp = PyObject_IsTrue (newvalue);
    177   if (cmp < 0)
    178     return -1;
    179   else
    180     breakpoint_set_silent (self_bp->bp, cmp);
    181 
    182   return 0;
    183 }
    184 
    185 /* Python function to set the thread of a breakpoint.  */
    186 static int
    187 bppy_set_thread (PyObject *self, PyObject *newvalue, void *closure)
    188 {
    189   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    190   long id;
    191 
    192   BPPY_SET_REQUIRE_VALID (self_bp);
    193 
    194   if (newvalue == NULL)
    195     {
    196       PyErr_SetString (PyExc_TypeError,
    197 		       _("Cannot delete `thread' attribute."));
    198       return -1;
    199     }
    200   else if (PyInt_Check (newvalue))
    201     {
    202       if (! gdb_py_int_as_long (newvalue, &id))
    203 	return -1;
    204 
    205       if (! valid_thread_id (id))
    206 	{
    207 	  PyErr_SetString (PyExc_RuntimeError,
    208 			   _("Invalid thread ID."));
    209 	  return -1;
    210 	}
    211     }
    212   else if (newvalue == Py_None)
    213     id = -1;
    214   else
    215     {
    216       PyErr_SetString (PyExc_TypeError,
    217 		       _("The value of `thread' must be an integer or None."));
    218       return -1;
    219     }
    220 
    221   breakpoint_set_thread (self_bp->bp, id);
    222 
    223   return 0;
    224 }
    225 
    226 /* Python function to set the (Ada) task of a breakpoint.  */
    227 static int
    228 bppy_set_task (PyObject *self, PyObject *newvalue, void *closure)
    229 {
    230   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    231   long id;
    232   int valid_id = 0;
    233 
    234   BPPY_SET_REQUIRE_VALID (self_bp);
    235 
    236   if (newvalue == NULL)
    237     {
    238       PyErr_SetString (PyExc_TypeError,
    239 		       _("Cannot delete `task' attribute."));
    240       return -1;
    241     }
    242   else if (PyInt_Check (newvalue))
    243     {
    244       if (! gdb_py_int_as_long (newvalue, &id))
    245 	return -1;
    246 
    247       TRY
    248 	{
    249 	  valid_id = valid_task_id (id);
    250 	}
    251       CATCH (except, RETURN_MASK_ALL)
    252 	{
    253 	  GDB_PY_SET_HANDLE_EXCEPTION (except);
    254 	}
    255       END_CATCH
    256 
    257       if (! valid_id)
    258 	{
    259 	  PyErr_SetString (PyExc_RuntimeError,
    260 			   _("Invalid task ID."));
    261 	  return -1;
    262 	}
    263     }
    264   else if (newvalue == Py_None)
    265     id = 0;
    266   else
    267     {
    268       PyErr_SetString (PyExc_TypeError,
    269 		       _("The value of `task' must be an integer or None."));
    270       return -1;
    271     }
    272 
    273   breakpoint_set_task (self_bp->bp, id);
    274 
    275   return 0;
    276 }
    277 
    278 /* Python function which deletes the underlying GDB breakpoint.  This
    279    triggers the breakpoint_deleted observer which will call
    280    gdbpy_breakpoint_deleted; that function cleans up the Python
    281    sections.  */
    282 
    283 static PyObject *
    284 bppy_delete_breakpoint (PyObject *self, PyObject *args)
    285 {
    286   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    287 
    288   BPPY_REQUIRE_VALID (self_bp);
    289 
    290   TRY
    291     {
    292       delete_breakpoint (self_bp->bp);
    293     }
    294   CATCH (except, RETURN_MASK_ALL)
    295     {
    296       GDB_PY_HANDLE_EXCEPTION (except);
    297     }
    298   END_CATCH
    299 
    300   Py_RETURN_NONE;
    301 }
    302 
    303 
    304 /* Python function to set the ignore count of a breakpoint.  */
    305 static int
    306 bppy_set_ignore_count (PyObject *self, PyObject *newvalue, void *closure)
    307 {
    308   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    309   long value;
    310 
    311   BPPY_SET_REQUIRE_VALID (self_bp);
    312 
    313   if (newvalue == NULL)
    314     {
    315       PyErr_SetString (PyExc_TypeError,
    316 		       _("Cannot delete `ignore_count' attribute."));
    317       return -1;
    318     }
    319   else if (! PyInt_Check (newvalue))
    320     {
    321       PyErr_SetString (PyExc_TypeError,
    322 		       _("The value of `ignore_count' must be an integer."));
    323       return -1;
    324     }
    325 
    326   if (! gdb_py_int_as_long (newvalue, &value))
    327     return -1;
    328 
    329   if (value < 0)
    330     value = 0;
    331 
    332   TRY
    333     {
    334       set_ignore_count (self_bp->number, (int) value, 0);
    335     }
    336   CATCH (except, RETURN_MASK_ALL)
    337     {
    338       GDB_PY_SET_HANDLE_EXCEPTION (except);
    339     }
    340   END_CATCH
    341 
    342   return 0;
    343 }
    344 
    345 /* Python function to set the hit count of a breakpoint.  */
    346 static int
    347 bppy_set_hit_count (PyObject *self, PyObject *newvalue, void *closure)
    348 {
    349   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    350 
    351   BPPY_SET_REQUIRE_VALID (self_bp);
    352 
    353   if (newvalue == NULL)
    354     {
    355       PyErr_SetString (PyExc_TypeError,
    356 		       _("Cannot delete `hit_count' attribute."));
    357       return -1;
    358     }
    359   else
    360     {
    361       long value;
    362 
    363       if (! gdb_py_int_as_long (newvalue, &value))
    364 	return -1;
    365 
    366       if (value != 0)
    367 	{
    368 	  PyErr_SetString (PyExc_AttributeError,
    369 			   _("The value of `hit_count' must be zero."));
    370 	  return -1;
    371 	}
    372     }
    373 
    374   self_bp->bp->hit_count = 0;
    375 
    376   return 0;
    377 }
    378 
    379 /* Python function to get the location of a breakpoint.  */
    380 static PyObject *
    381 bppy_get_location (PyObject *self, void *closure)
    382 {
    383   char *str;
    384   gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
    385 
    386   BPPY_REQUIRE_VALID (obj);
    387 
    388   if (obj->bp->type != bp_breakpoint)
    389     Py_RETURN_NONE;
    390 
    391   str = obj->bp->addr_string;
    392 
    393   if (! str)
    394     str = "";
    395   return PyString_Decode (str, strlen (str), host_charset (), NULL);
    396 }
    397 
    398 /* Python function to get the breakpoint expression.  */
    399 static PyObject *
    400 bppy_get_expression (PyObject *self, void *closure)
    401 {
    402   char *str;
    403   gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
    404   struct watchpoint *wp;
    405 
    406   BPPY_REQUIRE_VALID (obj);
    407 
    408   if (!is_watchpoint (obj->bp))
    409     Py_RETURN_NONE;
    410 
    411   wp = (struct watchpoint *) obj->bp;
    412 
    413   str = wp->exp_string;
    414   if (! str)
    415     str = "";
    416 
    417   return PyString_Decode (str, strlen (str), host_charset (), NULL);
    418 }
    419 
    420 /* Python function to get the condition expression of a breakpoint.  */
    421 static PyObject *
    422 bppy_get_condition (PyObject *self, void *closure)
    423 {
    424   char *str;
    425   gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
    426 
    427   BPPY_REQUIRE_VALID (obj);
    428 
    429   str = obj->bp->cond_string;
    430   if (! str)
    431     Py_RETURN_NONE;
    432 
    433   return PyString_Decode (str, strlen (str), host_charset (), NULL);
    434 }
    435 
    436 /* Returns 0 on success.  Returns -1 on error, with a python exception set.
    437    */
    438 
    439 static int
    440 bppy_set_condition (PyObject *self, PyObject *newvalue, void *closure)
    441 {
    442   char *exp;
    443   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    444   struct gdb_exception except = exception_none;
    445 
    446   BPPY_SET_REQUIRE_VALID (self_bp);
    447 
    448   if (newvalue == NULL)
    449     {
    450       PyErr_SetString (PyExc_TypeError,
    451 		       _("Cannot delete `condition' attribute."));
    452       return -1;
    453     }
    454   else if (newvalue == Py_None)
    455     exp = "";
    456   else
    457     {
    458       exp = python_string_to_host_string (newvalue);
    459       if (exp == NULL)
    460 	return -1;
    461     }
    462 
    463   TRY
    464     {
    465       set_breakpoint_condition (self_bp->bp, exp, 0);
    466     }
    467   CATCH (ex, RETURN_MASK_ALL)
    468     {
    469       except = ex;
    470     }
    471   END_CATCH
    472 
    473   if (newvalue != Py_None)
    474     xfree (exp);
    475 
    476   GDB_PY_SET_HANDLE_EXCEPTION (except);
    477 
    478   return 0;
    479 }
    480 
    481 /* Python function to get the commands attached to a breakpoint.  */
    482 static PyObject *
    483 bppy_get_commands (PyObject *self, void *closure)
    484 {
    485   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    486   struct breakpoint *bp = self_bp->bp;
    487   long length;
    488   struct ui_file *string_file;
    489   struct cleanup *chain;
    490   PyObject *result;
    491   char *cmdstr;
    492 
    493   BPPY_REQUIRE_VALID (self_bp);
    494 
    495   if (! self_bp->bp->commands)
    496     Py_RETURN_NONE;
    497 
    498   string_file = mem_fileopen ();
    499   chain = make_cleanup_ui_file_delete (string_file);
    500 
    501   ui_out_redirect (current_uiout, string_file);
    502   TRY
    503     {
    504       print_command_lines (current_uiout, breakpoint_commands (bp), 0);
    505     }
    506   CATCH (except, RETURN_MASK_ALL)
    507     {
    508       ui_out_redirect (current_uiout, NULL);
    509       do_cleanups (chain);
    510       gdbpy_convert_exception (except);
    511       return NULL;
    512     }
    513   END_CATCH
    514 
    515   ui_out_redirect (current_uiout, NULL);
    516   cmdstr = ui_file_xstrdup (string_file, &length);
    517   make_cleanup (xfree, cmdstr);
    518   result = PyString_Decode (cmdstr, strlen (cmdstr), host_charset (), NULL);
    519   do_cleanups (chain);
    520   return result;
    521 }
    522 
    523 /* Python function to get the breakpoint type.  */
    524 static PyObject *
    525 bppy_get_type (PyObject *self, void *closure)
    526 {
    527   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    528 
    529   BPPY_REQUIRE_VALID (self_bp);
    530 
    531   return PyInt_FromLong (self_bp->bp->type);
    532 }
    533 
    534 /* Python function to get the visibility of the breakpoint.  */
    535 
    536 static PyObject *
    537 bppy_get_visibility (PyObject *self, void *closure)
    538 {
    539   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    540 
    541   BPPY_REQUIRE_VALID (self_bp);
    542 
    543   if (self_bp->bp->number < 0)
    544     Py_RETURN_FALSE;
    545 
    546   Py_RETURN_TRUE;
    547 }
    548 
    549 /* Python function to determine if the breakpoint is a temporary
    550    breakpoint.  */
    551 
    552 static PyObject *
    553 bppy_get_temporary (PyObject *self, void *closure)
    554 {
    555   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    556 
    557   BPPY_REQUIRE_VALID (self_bp);
    558 
    559   if (self_bp->bp->disposition == disp_del
    560       || self_bp->bp->disposition == disp_del_at_next_stop)
    561     Py_RETURN_TRUE;
    562 
    563   Py_RETURN_FALSE;
    564 }
    565 
    566 /* Python function to get the breakpoint's number.  */
    567 static PyObject *
    568 bppy_get_number (PyObject *self, void *closure)
    569 {
    570   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    571 
    572   BPPY_REQUIRE_VALID (self_bp);
    573 
    574   return PyInt_FromLong (self_bp->number);
    575 }
    576 
    577 /* Python function to get the breakpoint's thread ID.  */
    578 static PyObject *
    579 bppy_get_thread (PyObject *self, void *closure)
    580 {
    581   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    582 
    583   BPPY_REQUIRE_VALID (self_bp);
    584 
    585   if (self_bp->bp->thread == -1)
    586     Py_RETURN_NONE;
    587 
    588   return PyInt_FromLong (self_bp->bp->thread);
    589 }
    590 
    591 /* Python function to get the breakpoint's task ID (in Ada).  */
    592 static PyObject *
    593 bppy_get_task (PyObject *self, void *closure)
    594 {
    595   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    596 
    597   BPPY_REQUIRE_VALID (self_bp);
    598 
    599   if (self_bp->bp->task == 0)
    600     Py_RETURN_NONE;
    601 
    602   return PyInt_FromLong (self_bp->bp->task);
    603 }
    604 
    605 /* Python function to get the breakpoint's hit count.  */
    606 static PyObject *
    607 bppy_get_hit_count (PyObject *self, void *closure)
    608 {
    609   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    610 
    611   BPPY_REQUIRE_VALID (self_bp);
    612 
    613   return PyInt_FromLong (self_bp->bp->hit_count);
    614 }
    615 
    616 /* Python function to get the breakpoint's ignore count.  */
    617 static PyObject *
    618 bppy_get_ignore_count (PyObject *self, void *closure)
    619 {
    620   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    621 
    622   BPPY_REQUIRE_VALID (self_bp);
    623 
    624   return PyInt_FromLong (self_bp->bp->ignore_count);
    625 }
    626 
    627 /* Python function to create a new breakpoint.  */
    628 static int
    629 bppy_init (PyObject *self, PyObject *args, PyObject *kwargs)
    630 {
    631   static char *keywords[] = { "spec", "type", "wp_class", "internal",
    632 			      "temporary", NULL };
    633   const char *spec;
    634   int type = bp_breakpoint;
    635   int access_type = hw_write;
    636   PyObject *internal = NULL;
    637   PyObject *temporary = NULL;
    638   int internal_bp = 0;
    639   int temporary_bp = 0;
    640 
    641   if (! PyArg_ParseTupleAndKeywords (args, kwargs, "s|iiOO", keywords,
    642 				     &spec, &type, &access_type,
    643 				     &internal, &temporary))
    644     return -1;
    645 
    646   if (internal)
    647     {
    648       internal_bp = PyObject_IsTrue (internal);
    649       if (internal_bp == -1)
    650 	return -1;
    651     }
    652 
    653   if (temporary != NULL)
    654     {
    655       temporary_bp = PyObject_IsTrue (temporary);
    656       if (temporary_bp == -1)
    657 	return -1;
    658     }
    659 
    660   bppy_pending_object = (gdbpy_breakpoint_object *) self;
    661   bppy_pending_object->number = -1;
    662   bppy_pending_object->bp = NULL;
    663 
    664   TRY
    665     {
    666       char *copy = xstrdup (spec);
    667       struct cleanup *cleanup = make_cleanup (xfree, copy);
    668 
    669       switch (type)
    670 	{
    671 	case bp_breakpoint:
    672 	  {
    673 	    create_breakpoint (python_gdbarch,
    674 			       copy, NULL, -1, NULL,
    675 			       0,
    676 			       temporary_bp, bp_breakpoint,
    677 			       0,
    678 			       AUTO_BOOLEAN_TRUE,
    679 			       &bkpt_breakpoint_ops,
    680 			       0, 1, internal_bp, 0);
    681 	    break;
    682 	  }
    683         case bp_watchpoint:
    684 	  {
    685 	    if (access_type == hw_write)
    686 	      watch_command_wrapper (copy, 0, internal_bp);
    687 	    else if (access_type == hw_access)
    688 	      awatch_command_wrapper (copy, 0, internal_bp);
    689 	    else if (access_type == hw_read)
    690 	      rwatch_command_wrapper (copy, 0, internal_bp);
    691 	    else
    692 	      error(_("Cannot understand watchpoint access type."));
    693 	    break;
    694 	  }
    695 	default:
    696 	  error(_("Do not understand breakpoint type to set."));
    697 	}
    698 
    699       do_cleanups (cleanup);
    700     }
    701   CATCH (except, RETURN_MASK_ALL)
    702     {
    703       PyErr_Format (except.reason == RETURN_QUIT
    704 		    ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
    705 		    "%s", except.message);
    706       return -1;
    707     }
    708   END_CATCH
    709 
    710   BPPY_SET_REQUIRE_VALID ((gdbpy_breakpoint_object *) self);
    711   return 0;
    712 }
    713 
    714 
    715 
    717 static int
    718 build_bp_list (struct breakpoint *b, void *arg)
    719 {
    720   PyObject *list = arg;
    721   PyObject *bp = (PyObject *) b->py_bp_object;
    722   int iserr = 0;
    723 
    724   /* Not all breakpoints will have a companion Python object.
    725      Only breakpoints that were created via bppy_new, or
    726      breakpoints that were created externally and are tracked by
    727      the Python Scripting API.  */
    728   if (bp)
    729     iserr = PyList_Append (list, bp);
    730 
    731   if (iserr == -1)
    732     return 1;
    733 
    734   return 0;
    735 }
    736 
    737 /* Static function to return a tuple holding all breakpoints.  */
    738 
    739 PyObject *
    740 gdbpy_breakpoints (PyObject *self, PyObject *args)
    741 {
    742   PyObject *list, *tuple;
    743 
    744   if (bppy_live == 0)
    745     Py_RETURN_NONE;
    746 
    747   list = PyList_New (0);
    748   if (!list)
    749     return NULL;
    750 
    751   /* If iteratre_over_breakpoints returns non NULL it signals an error
    752      condition.  In that case abandon building the list and return
    753      NULL.  */
    754   if (iterate_over_breakpoints (build_bp_list, list) != NULL)
    755     {
    756       Py_DECREF (list);
    757       return NULL;
    758     }
    759 
    760   tuple = PyList_AsTuple (list);
    761   Py_DECREF (list);
    762 
    763   return tuple;
    764 }
    765 
    766 /* Call the "stop" method (if implemented) in the breakpoint
    767    class.  If the method returns True, the inferior  will be
    768    stopped at the breakpoint.  Otherwise the inferior will be
    769    allowed to continue.  */
    770 
    771 enum ext_lang_bp_stop
    772 gdbpy_breakpoint_cond_says_stop (const struct extension_language_defn *extlang,
    773 				 struct breakpoint *b)
    774 {
    775   int stop;
    776   struct gdbpy_breakpoint_object *bp_obj = b->py_bp_object;
    777   PyObject *py_bp = (PyObject *) bp_obj;
    778   struct gdbarch *garch;
    779   struct cleanup *cleanup;
    780 
    781   if (bp_obj == NULL)
    782     return EXT_LANG_BP_STOP_UNSET;
    783 
    784   stop = -1;
    785   garch = b->gdbarch ? b->gdbarch : get_current_arch ();
    786   cleanup = ensure_python_env (garch, current_language);
    787 
    788   if (bp_obj->is_finish_bp)
    789     bpfinishpy_pre_stop_hook (bp_obj);
    790 
    791   if (PyObject_HasAttrString (py_bp, stop_func))
    792     {
    793       PyObject *result = PyObject_CallMethod (py_bp, stop_func, NULL);
    794 
    795       stop = 1;
    796       if (result)
    797 	{
    798 	  int evaluate = PyObject_IsTrue (result);
    799 
    800 	  if (evaluate == -1)
    801 	    gdbpy_print_stack ();
    802 
    803 	  /* If the "stop" function returns False that means
    804 	     the Python breakpoint wants GDB to continue.  */
    805 	  if (! evaluate)
    806 	    stop = 0;
    807 
    808 	  Py_DECREF (result);
    809 	}
    810       else
    811 	gdbpy_print_stack ();
    812     }
    813 
    814   if (bp_obj->is_finish_bp)
    815     bpfinishpy_post_stop_hook (bp_obj);
    816 
    817   do_cleanups (cleanup);
    818 
    819   if (stop < 0)
    820     return EXT_LANG_BP_STOP_UNSET;
    821   return stop ? EXT_LANG_BP_STOP_YES : EXT_LANG_BP_STOP_NO;
    822 }
    823 
    824 /* Checks if the  "stop" method exists in this breakpoint.
    825    Used by condition_command to ensure mutual exclusion of breakpoint
    826    conditions.  */
    827 
    828 int
    829 gdbpy_breakpoint_has_cond (const struct extension_language_defn *extlang,
    830 			   struct breakpoint *b)
    831 {
    832   int has_func;
    833   PyObject *py_bp;
    834   struct gdbarch *garch;
    835   struct cleanup *cleanup;
    836 
    837   if (b->py_bp_object == NULL)
    838     return 0;
    839 
    840   py_bp = (PyObject *) b->py_bp_object;
    841   garch = b->gdbarch ? b->gdbarch : get_current_arch ();
    842   cleanup = ensure_python_env (garch, current_language);
    843   has_func = PyObject_HasAttrString (py_bp, stop_func);
    844   do_cleanups (cleanup);
    845 
    846   return has_func;
    847 }
    848 
    849 
    850 
    852 /* Event callback functions.  */
    853 
    854 /* Callback that is used when a breakpoint is created.  This function
    855    will create a new Python breakpoint object.  */
    856 static void
    857 gdbpy_breakpoint_created (struct breakpoint *bp)
    858 {
    859   gdbpy_breakpoint_object *newbp;
    860   PyGILState_STATE state;
    861 
    862   if (bp->number < 0 && bppy_pending_object == NULL)
    863     return;
    864 
    865   if (bp->type != bp_breakpoint
    866       && bp->type != bp_watchpoint
    867       && bp->type != bp_hardware_watchpoint
    868       && bp->type != bp_read_watchpoint
    869       && bp->type != bp_access_watchpoint)
    870     return;
    871 
    872   state = PyGILState_Ensure ();
    873 
    874   if (bppy_pending_object)
    875     {
    876       newbp = bppy_pending_object;
    877       bppy_pending_object = NULL;
    878     }
    879   else
    880     newbp = PyObject_New (gdbpy_breakpoint_object, &breakpoint_object_type);
    881   if (newbp)
    882     {
    883       newbp->number = bp->number;
    884       newbp->bp = bp;
    885       newbp->bp->py_bp_object = newbp;
    886       newbp->is_finish_bp = 0;
    887       Py_INCREF (newbp);
    888       ++bppy_live;
    889     }
    890   else
    891     {
    892       PyErr_SetString (PyExc_RuntimeError,
    893 		       _("Error while creating breakpoint from GDB."));
    894       gdbpy_print_stack ();
    895     }
    896 
    897   PyGILState_Release (state);
    898 }
    899 
    900 /* Callback that is used when a breakpoint is deleted.  This will
    901    invalidate the corresponding Python object.  */
    902 static void
    903 gdbpy_breakpoint_deleted (struct breakpoint *b)
    904 {
    905   int num = b->number;
    906   PyGILState_STATE state;
    907   struct breakpoint *bp = NULL;
    908   gdbpy_breakpoint_object *bp_obj;
    909 
    910   state = PyGILState_Ensure ();
    911   bp = get_breakpoint (num);
    912   if (bp)
    913     {
    914       bp_obj = bp->py_bp_object;
    915       if (bp_obj)
    916 	{
    917 	  bp_obj->bp = NULL;
    918 	  --bppy_live;
    919 	  Py_DECREF (bp_obj);
    920 	}
    921     }
    922   PyGILState_Release (state);
    923 }
    924 
    925 
    926 
    928 /* Initialize the Python breakpoint code.  */
    929 int
    930 gdbpy_initialize_breakpoints (void)
    931 {
    932   int i;
    933 
    934   breakpoint_object_type.tp_new = PyType_GenericNew;
    935   if (PyType_Ready (&breakpoint_object_type) < 0)
    936     return -1;
    937 
    938   if (gdb_pymodule_addobject (gdb_module, "Breakpoint",
    939 			      (PyObject *) &breakpoint_object_type) < 0)
    940     return -1;
    941 
    942   observer_attach_breakpoint_created (gdbpy_breakpoint_created);
    943   observer_attach_breakpoint_deleted (gdbpy_breakpoint_deleted);
    944 
    945   /* Add breakpoint types constants.  */
    946   for (i = 0; pybp_codes[i].name; ++i)
    947     {
    948       if (PyModule_AddIntConstant (gdb_module,
    949 				   /* Cast needed for Python 2.4.  */
    950 				   (char *) pybp_codes[i].name,
    951 				   pybp_codes[i].code) < 0)
    952 	return -1;
    953     }
    954 
    955   /* Add watchpoint types constants.  */
    956   for (i = 0; pybp_watch_types[i].name; ++i)
    957     {
    958       if (PyModule_AddIntConstant (gdb_module,
    959 				   /* Cast needed for Python 2.4.  */
    960 				   (char *) pybp_watch_types[i].name,
    961 				   pybp_watch_types[i].code) < 0)
    962 	return -1;
    963     }
    964 
    965   return 0;
    966 }
    967 
    968 
    969 
    971 /* Helper function that overrides this Python object's
    972    PyObject_GenericSetAttr to allow extra validation of the attribute
    973    being set.  */
    974 
    975 static int
    976 local_setattro (PyObject *self, PyObject *name, PyObject *v)
    977 {
    978   gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
    979   char *attr = python_string_to_host_string (name);
    980 
    981   if (attr == NULL)
    982     return -1;
    983 
    984   /* If the attribute trying to be set is the "stop" method,
    985      but we already have a condition set in the CLI or other extension
    986      language, disallow this operation.  */
    987   if (strcmp (attr, stop_func) == 0)
    988     {
    989       const struct extension_language_defn *extlang = NULL;
    990 
    991       if (obj->bp->cond_string != NULL)
    992 	extlang = get_ext_lang_defn (EXT_LANG_GDB);
    993       if (extlang == NULL)
    994 	extlang = get_breakpoint_cond_ext_lang (obj->bp, EXT_LANG_PYTHON);
    995       if (extlang != NULL)
    996 	{
    997 	  char *error_text;
    998 
    999 	  xfree (attr);
   1000 	  error_text
   1001 	    = xstrprintf (_("Only one stop condition allowed.  There is"
   1002 			    " currently a %s stop condition defined for"
   1003 			    " this breakpoint."),
   1004 			  ext_lang_capitalized_name (extlang));
   1005 	  PyErr_SetString (PyExc_RuntimeError, error_text);
   1006 	  xfree (error_text);
   1007 	  return -1;
   1008 	}
   1009     }
   1010 
   1011   xfree (attr);
   1012 
   1013   return PyObject_GenericSetAttr ((PyObject *)self, name, v);
   1014 }
   1015 
   1016 static PyGetSetDef breakpoint_object_getset[] = {
   1017   { "enabled", bppy_get_enabled, bppy_set_enabled,
   1018     "Boolean telling whether the breakpoint is enabled.", NULL },
   1019   { "silent", bppy_get_silent, bppy_set_silent,
   1020     "Boolean telling whether the breakpoint is silent.", NULL },
   1021   { "thread", bppy_get_thread, bppy_set_thread,
   1022     "Thread ID for the breakpoint.\n\
   1023 If the value is a thread ID (integer), then this is a thread-specific breakpoint.\n\
   1024 If the value is None, then this breakpoint is not thread-specific.\n\
   1025 No other type of value can be used.", NULL },
   1026   { "task", bppy_get_task, bppy_set_task,
   1027     "Thread ID for the breakpoint.\n\
   1028 If the value is a task ID (integer), then this is an Ada task-specific breakpoint.\n\
   1029 If the value is None, then this breakpoint is not task-specific.\n\
   1030 No other type of value can be used.", NULL },
   1031   { "ignore_count", bppy_get_ignore_count, bppy_set_ignore_count,
   1032     "Number of times this breakpoint should be automatically continued.",
   1033     NULL },
   1034   { "number", bppy_get_number, NULL,
   1035     "Breakpoint's number assigned by GDB.", NULL },
   1036   { "hit_count", bppy_get_hit_count, bppy_set_hit_count,
   1037     "Number of times the breakpoint has been hit.\n\
   1038 Can be set to zero to clear the count. No other value is valid\n\
   1039 when setting this property.", NULL },
   1040   { "location", bppy_get_location, NULL,
   1041     "Location of the breakpoint, as specified by the user.", NULL},
   1042   { "expression", bppy_get_expression, NULL,
   1043     "Expression of the breakpoint, as specified by the user.", NULL},
   1044   { "condition", bppy_get_condition, bppy_set_condition,
   1045     "Condition of the breakpoint, as specified by the user,\
   1046 or None if no condition set."},
   1047   { "commands", bppy_get_commands, NULL,
   1048     "Commands of the breakpoint, as specified by the user."},
   1049   { "type", bppy_get_type, NULL,
   1050     "Type of breakpoint."},
   1051   { "visible", bppy_get_visibility, NULL,
   1052     "Whether the breakpoint is visible to the user."},
   1053   { "temporary", bppy_get_temporary, NULL,
   1054     "Whether this breakpoint is a temporary breakpoint."},
   1055   { NULL }  /* Sentinel.  */
   1056 };
   1057 
   1058 static PyMethodDef breakpoint_object_methods[] =
   1059 {
   1060   { "is_valid", bppy_is_valid, METH_NOARGS,
   1061     "Return true if this breakpoint is valid, false if not." },
   1062   { "delete", bppy_delete_breakpoint, METH_NOARGS,
   1063     "Delete the underlying GDB breakpoint." },
   1064   { NULL } /* Sentinel.  */
   1065 };
   1066 
   1067 PyTypeObject breakpoint_object_type =
   1068 {
   1069   PyVarObject_HEAD_INIT (NULL, 0)
   1070   "gdb.Breakpoint",		  /*tp_name*/
   1071   sizeof (gdbpy_breakpoint_object), /*tp_basicsize*/
   1072   0,				  /*tp_itemsize*/
   1073   0,				  /*tp_dealloc*/
   1074   0,				  /*tp_print*/
   1075   0,				  /*tp_getattr*/
   1076   0,				  /*tp_setattr*/
   1077   0,				  /*tp_compare*/
   1078   0,				  /*tp_repr*/
   1079   0,				  /*tp_as_number*/
   1080   0,				  /*tp_as_sequence*/
   1081   0,				  /*tp_as_mapping*/
   1082   0,				  /*tp_hash */
   1083   0,				  /*tp_call*/
   1084   0,				  /*tp_str*/
   1085   0,				  /*tp_getattro*/
   1086   (setattrofunc)local_setattro,   /*tp_setattro */
   1087   0,				  /*tp_as_buffer*/
   1088   Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,  /*tp_flags*/
   1089   "GDB breakpoint object",	  /* tp_doc */
   1090   0,				  /* tp_traverse */
   1091   0,				  /* tp_clear */
   1092   0,				  /* tp_richcompare */
   1093   0,				  /* tp_weaklistoffset */
   1094   0,				  /* tp_iter */
   1095   0,				  /* tp_iternext */
   1096   breakpoint_object_methods,	  /* tp_methods */
   1097   0,				  /* tp_members */
   1098   breakpoint_object_getset,	  /* tp_getset */
   1099   0,				  /* tp_base */
   1100   0,				  /* tp_dict */
   1101   0,				  /* tp_descr_get */
   1102   0,				  /* tp_descr_set */
   1103   0,				  /* tp_dictoffset */
   1104   bppy_init,			  /* tp_init */
   1105   0,				  /* tp_alloc */
   1106 };
   1107