Home | History | Annotate | Line # | Download | only in python
py-breakpoint.c revision 1.1.1.6
      1 /* Python interface to breakpoints
      2 
      3    Copyright (C) 2008-2019 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 "observable.h"
     29 #include "cli/cli-script.h"
     30 #include "ada-lang.h"
     31 #include "arch-utils.h"
     32 #include "language.h"
     33 #include "location.h"
     34 #include "py-event.h"
     35 #include "linespec.h"
     36 
     37 /* Number of live breakpoints.  */
     38 static int bppy_live;
     39 
     40 /* Variables used to pass information between the Breakpoint
     41    constructor and the breakpoint-created hook function.  */
     42 gdbpy_breakpoint_object *bppy_pending_object;
     43 
     44 /* Function that is called when a Python condition is evaluated.  */
     45 static const char stop_func[] = "stop";
     46 
     47 /* This is used to initialize various gdb.bp_* constants.  */
     48 struct pybp_code
     49 {
     50   /* The name.  */
     51   const char *name;
     52   /* The code.  */
     53   int code;
     54 };
     55 
     56 /* Entries related to the type of user set breakpoints.  */
     57 static struct pybp_code pybp_codes[] =
     58 {
     59   { "BP_NONE", bp_none},
     60   { "BP_BREAKPOINT", bp_breakpoint},
     61   { "BP_WATCHPOINT", bp_watchpoint},
     62   { "BP_HARDWARE_WATCHPOINT", bp_hardware_watchpoint},
     63   { "BP_READ_WATCHPOINT", bp_read_watchpoint},
     64   { "BP_ACCESS_WATCHPOINT", bp_access_watchpoint},
     65   {NULL} /* Sentinel.  */
     66 };
     67 
     68 /* Entries related to the type of watchpoint.  */
     69 static struct pybp_code pybp_watch_types[] =
     70 {
     71   { "WP_READ", hw_read},
     72   { "WP_WRITE", hw_write},
     73   { "WP_ACCESS", hw_access},
     74   {NULL} /* Sentinel.  */
     75 };
     76 
     77 /* Python function which checks the validity of a breakpoint object.  */
     78 static PyObject *
     79 bppy_is_valid (PyObject *self, PyObject *args)
     80 {
     81   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
     82 
     83   if (self_bp->bp)
     84     Py_RETURN_TRUE;
     85   Py_RETURN_FALSE;
     86 }
     87 
     88 /* Python function to test whether or not the breakpoint is enabled.  */
     89 static PyObject *
     90 bppy_get_enabled (PyObject *self, void *closure)
     91 {
     92   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
     93 
     94   BPPY_REQUIRE_VALID (self_bp);
     95   if (! self_bp->bp)
     96     Py_RETURN_FALSE;
     97   if (self_bp->bp->enable_state == bp_enabled)
     98     Py_RETURN_TRUE;
     99   Py_RETURN_FALSE;
    100 }
    101 
    102 /* Python function to test whether or not the breakpoint is silent.  */
    103 static PyObject *
    104 bppy_get_silent (PyObject *self, void *closure)
    105 {
    106   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    107 
    108   BPPY_REQUIRE_VALID (self_bp);
    109   if (self_bp->bp->silent)
    110     Py_RETURN_TRUE;
    111   Py_RETURN_FALSE;
    112 }
    113 
    114 /* Python function to set the enabled state of a breakpoint.  */
    115 static int
    116 bppy_set_enabled (PyObject *self, PyObject *newvalue, void *closure)
    117 {
    118   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    119   int cmp;
    120 
    121   BPPY_SET_REQUIRE_VALID (self_bp);
    122 
    123   if (newvalue == NULL)
    124     {
    125       PyErr_SetString (PyExc_TypeError,
    126 		       _("Cannot delete `enabled' attribute."));
    127 
    128       return -1;
    129     }
    130   else if (! PyBool_Check (newvalue))
    131     {
    132       PyErr_SetString (PyExc_TypeError,
    133 		       _("The value of `enabled' must be a boolean."));
    134       return -1;
    135     }
    136 
    137   cmp = PyObject_IsTrue (newvalue);
    138   if (cmp < 0)
    139     return -1;
    140 
    141   TRY
    142     {
    143       if (cmp == 1)
    144 	enable_breakpoint (self_bp->bp);
    145       else
    146 	disable_breakpoint (self_bp->bp);
    147     }
    148   CATCH (except, RETURN_MASK_ALL)
    149     {
    150       GDB_PY_SET_HANDLE_EXCEPTION (except);
    151     }
    152   END_CATCH
    153 
    154   return 0;
    155 }
    156 
    157 /* Python function to set the 'silent' state of a breakpoint.  */
    158 static int
    159 bppy_set_silent (PyObject *self, PyObject *newvalue, void *closure)
    160 {
    161   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    162   int cmp;
    163 
    164   BPPY_SET_REQUIRE_VALID (self_bp);
    165 
    166   if (newvalue == NULL)
    167     {
    168       PyErr_SetString (PyExc_TypeError,
    169 		       _("Cannot delete `silent' attribute."));
    170       return -1;
    171     }
    172   else if (! PyBool_Check (newvalue))
    173     {
    174       PyErr_SetString (PyExc_TypeError,
    175 		       _("The value of `silent' must be a boolean."));
    176       return -1;
    177     }
    178 
    179   cmp = PyObject_IsTrue (newvalue);
    180   if (cmp < 0)
    181     return -1;
    182   else
    183     breakpoint_set_silent (self_bp->bp, cmp);
    184 
    185   return 0;
    186 }
    187 
    188 /* Python function to set the thread of a breakpoint.  */
    189 static int
    190 bppy_set_thread (PyObject *self, PyObject *newvalue, void *closure)
    191 {
    192   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    193   long id;
    194 
    195   BPPY_SET_REQUIRE_VALID (self_bp);
    196 
    197   if (newvalue == NULL)
    198     {
    199       PyErr_SetString (PyExc_TypeError,
    200 		       _("Cannot delete `thread' attribute."));
    201       return -1;
    202     }
    203   else if (PyInt_Check (newvalue))
    204     {
    205       if (! gdb_py_int_as_long (newvalue, &id))
    206 	return -1;
    207 
    208       if (!valid_global_thread_id (id))
    209 	{
    210 	  PyErr_SetString (PyExc_RuntimeError,
    211 			   _("Invalid thread ID."));
    212 	  return -1;
    213 	}
    214     }
    215   else if (newvalue == Py_None)
    216     id = -1;
    217   else
    218     {
    219       PyErr_SetString (PyExc_TypeError,
    220 		       _("The value of `thread' must be an integer or None."));
    221       return -1;
    222     }
    223 
    224   breakpoint_set_thread (self_bp->bp, id);
    225 
    226   return 0;
    227 }
    228 
    229 /* Python function to set the (Ada) task of a breakpoint.  */
    230 static int
    231 bppy_set_task (PyObject *self, PyObject *newvalue, void *closure)
    232 {
    233   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    234   long id;
    235   int valid_id = 0;
    236 
    237   BPPY_SET_REQUIRE_VALID (self_bp);
    238 
    239   if (newvalue == NULL)
    240     {
    241       PyErr_SetString (PyExc_TypeError,
    242 		       _("Cannot delete `task' attribute."));
    243       return -1;
    244     }
    245   else if (PyInt_Check (newvalue))
    246     {
    247       if (! gdb_py_int_as_long (newvalue, &id))
    248 	return -1;
    249 
    250       TRY
    251 	{
    252 	  valid_id = valid_task_id (id);
    253 	}
    254       CATCH (except, RETURN_MASK_ALL)
    255 	{
    256 	  GDB_PY_SET_HANDLE_EXCEPTION (except);
    257 	}
    258       END_CATCH
    259 
    260       if (! valid_id)
    261 	{
    262 	  PyErr_SetString (PyExc_RuntimeError,
    263 			   _("Invalid task ID."));
    264 	  return -1;
    265 	}
    266     }
    267   else if (newvalue == Py_None)
    268     id = 0;
    269   else
    270     {
    271       PyErr_SetString (PyExc_TypeError,
    272 		       _("The value of `task' must be an integer or None."));
    273       return -1;
    274     }
    275 
    276   breakpoint_set_task (self_bp->bp, id);
    277 
    278   return 0;
    279 }
    280 
    281 /* Python function which deletes the underlying GDB breakpoint.  This
    282    triggers the breakpoint_deleted observer which will call
    283    gdbpy_breakpoint_deleted; that function cleans up the Python
    284    sections.  */
    285 
    286 static PyObject *
    287 bppy_delete_breakpoint (PyObject *self, PyObject *args)
    288 {
    289   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    290 
    291   BPPY_REQUIRE_VALID (self_bp);
    292 
    293   TRY
    294     {
    295       delete_breakpoint (self_bp->bp);
    296     }
    297   CATCH (except, RETURN_MASK_ALL)
    298     {
    299       GDB_PY_HANDLE_EXCEPTION (except);
    300     }
    301   END_CATCH
    302 
    303   Py_RETURN_NONE;
    304 }
    305 
    306 
    307 /* Python function to set the ignore count of a breakpoint.  */
    308 static int
    309 bppy_set_ignore_count (PyObject *self, PyObject *newvalue, void *closure)
    310 {
    311   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    312   long value;
    313 
    314   BPPY_SET_REQUIRE_VALID (self_bp);
    315 
    316   if (newvalue == NULL)
    317     {
    318       PyErr_SetString (PyExc_TypeError,
    319 		       _("Cannot delete `ignore_count' attribute."));
    320       return -1;
    321     }
    322   else if (! PyInt_Check (newvalue))
    323     {
    324       PyErr_SetString (PyExc_TypeError,
    325 		       _("The value of `ignore_count' must be an integer."));
    326       return -1;
    327     }
    328 
    329   if (! gdb_py_int_as_long (newvalue, &value))
    330     return -1;
    331 
    332   if (value < 0)
    333     value = 0;
    334 
    335   TRY
    336     {
    337       set_ignore_count (self_bp->number, (int) value, 0);
    338     }
    339   CATCH (except, RETURN_MASK_ALL)
    340     {
    341       GDB_PY_SET_HANDLE_EXCEPTION (except);
    342     }
    343   END_CATCH
    344 
    345   return 0;
    346 }
    347 
    348 /* Python function to set the hit count of a breakpoint.  */
    349 static int
    350 bppy_set_hit_count (PyObject *self, PyObject *newvalue, void *closure)
    351 {
    352   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    353 
    354   BPPY_SET_REQUIRE_VALID (self_bp);
    355 
    356   if (newvalue == NULL)
    357     {
    358       PyErr_SetString (PyExc_TypeError,
    359 		       _("Cannot delete `hit_count' attribute."));
    360       return -1;
    361     }
    362   else
    363     {
    364       long value;
    365 
    366       if (! gdb_py_int_as_long (newvalue, &value))
    367 	return -1;
    368 
    369       if (value != 0)
    370 	{
    371 	  PyErr_SetString (PyExc_AttributeError,
    372 			   _("The value of `hit_count' must be zero."));
    373 	  return -1;
    374 	}
    375     }
    376 
    377   self_bp->bp->hit_count = 0;
    378 
    379   return 0;
    380 }
    381 
    382 /* Python function to get the location of a breakpoint.  */
    383 static PyObject *
    384 bppy_get_location (PyObject *self, void *closure)
    385 {
    386   const char *str;
    387   gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
    388 
    389   BPPY_REQUIRE_VALID (obj);
    390 
    391   if (obj->bp->type != bp_breakpoint)
    392     Py_RETURN_NONE;
    393 
    394   struct event_location *location = obj->bp->location.get ();
    395   /* "catch throw" makes a breakpoint of type bp_breakpoint that does
    396      not have a location.  */
    397   if (location == nullptr)
    398     Py_RETURN_NONE;
    399   str = event_location_to_string (location);
    400   if (! str)
    401     str = "";
    402   return host_string_to_python_string (str).release ();
    403 }
    404 
    405 /* Python function to get the breakpoint expression.  */
    406 static PyObject *
    407 bppy_get_expression (PyObject *self, void *closure)
    408 {
    409   const char *str;
    410   gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
    411   struct watchpoint *wp;
    412 
    413   BPPY_REQUIRE_VALID (obj);
    414 
    415   if (!is_watchpoint (obj->bp))
    416     Py_RETURN_NONE;
    417 
    418   wp = (struct watchpoint *) obj->bp;
    419 
    420   str = wp->exp_string;
    421   if (! str)
    422     str = "";
    423 
    424   return host_string_to_python_string (str).release ();
    425 }
    426 
    427 /* Python function to get the condition expression of a breakpoint.  */
    428 static PyObject *
    429 bppy_get_condition (PyObject *self, void *closure)
    430 {
    431   char *str;
    432   gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
    433 
    434   BPPY_REQUIRE_VALID (obj);
    435 
    436   str = obj->bp->cond_string;
    437   if (! str)
    438     Py_RETURN_NONE;
    439 
    440   return host_string_to_python_string (str).release ();
    441 }
    442 
    443 /* Returns 0 on success.  Returns -1 on error, with a python exception set.
    444    */
    445 
    446 static int
    447 bppy_set_condition (PyObject *self, PyObject *newvalue, void *closure)
    448 {
    449   gdb::unique_xmalloc_ptr<char> exp_holder;
    450   const char *exp = NULL;
    451   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    452   struct gdb_exception except = exception_none;
    453 
    454   BPPY_SET_REQUIRE_VALID (self_bp);
    455 
    456   if (newvalue == NULL)
    457     {
    458       PyErr_SetString (PyExc_TypeError,
    459 		       _("Cannot delete `condition' attribute."));
    460       return -1;
    461     }
    462   else if (newvalue == Py_None)
    463     exp = "";
    464   else
    465     {
    466       exp_holder = python_string_to_host_string (newvalue);
    467       if (exp_holder == NULL)
    468 	return -1;
    469       exp = exp_holder.get ();
    470     }
    471 
    472   TRY
    473     {
    474       set_breakpoint_condition (self_bp->bp, exp, 0);
    475     }
    476   CATCH (ex, RETURN_MASK_ALL)
    477     {
    478       except = ex;
    479     }
    480   END_CATCH
    481 
    482   GDB_PY_SET_HANDLE_EXCEPTION (except);
    483 
    484   return 0;
    485 }
    486 
    487 /* Python function to get the commands attached to a breakpoint.  */
    488 static PyObject *
    489 bppy_get_commands (PyObject *self, void *closure)
    490 {
    491   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    492   struct breakpoint *bp = self_bp->bp;
    493 
    494   BPPY_REQUIRE_VALID (self_bp);
    495 
    496   if (! self_bp->bp->commands)
    497     Py_RETURN_NONE;
    498 
    499   string_file stb;
    500 
    501   current_uiout->redirect (&stb);
    502   TRY
    503     {
    504       print_command_lines (current_uiout, breakpoint_commands (bp), 0);
    505     }
    506   CATCH (except, RETURN_MASK_ALL)
    507     {
    508       current_uiout->redirect (NULL);
    509       gdbpy_convert_exception (except);
    510       return NULL;
    511     }
    512   END_CATCH
    513 
    514   current_uiout->redirect (NULL);
    515   return host_string_to_python_string (stb.c_str ()).release ();
    516 }
    517 
    518 /* Set the commands attached to a breakpoint.  Returns 0 on success.
    519    Returns -1 on error, with a python exception set.  */
    520 static int
    521 bppy_set_commands (PyObject *self, PyObject *newvalue, void *closure)
    522 {
    523   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    524   struct gdb_exception except = exception_none;
    525 
    526   BPPY_SET_REQUIRE_VALID (self_bp);
    527 
    528   gdb::unique_xmalloc_ptr<char> commands
    529     (python_string_to_host_string (newvalue));
    530   if (commands == nullptr)
    531     return -1;
    532 
    533   TRY
    534     {
    535       bool first = true;
    536       char *save_ptr = nullptr;
    537       auto reader
    538 	= [&] ()
    539 	  {
    540 	    const char *result = strtok_r (first ? commands.get () : nullptr,
    541 					   "\n", &save_ptr);
    542 	    first = false;
    543 	    return result;
    544 	  };
    545 
    546       counted_command_line lines = read_command_lines_1 (reader, 1, nullptr);
    547       breakpoint_set_commands (self_bp->bp, std::move (lines));
    548     }
    549   CATCH (ex, RETURN_MASK_ALL)
    550     {
    551       except = ex;
    552     }
    553   END_CATCH
    554 
    555   GDB_PY_SET_HANDLE_EXCEPTION (except);
    556 
    557   return 0;
    558 }
    559 
    560 /* Python function to get the breakpoint type.  */
    561 static PyObject *
    562 bppy_get_type (PyObject *self, void *closure)
    563 {
    564   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    565 
    566   BPPY_REQUIRE_VALID (self_bp);
    567 
    568   return PyInt_FromLong (self_bp->bp->type);
    569 }
    570 
    571 /* Python function to get the visibility of the breakpoint.  */
    572 
    573 static PyObject *
    574 bppy_get_visibility (PyObject *self, void *closure)
    575 {
    576   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    577 
    578   BPPY_REQUIRE_VALID (self_bp);
    579 
    580   if (user_breakpoint_p (self_bp->bp))
    581     Py_RETURN_TRUE;
    582 
    583   Py_RETURN_FALSE;
    584 }
    585 
    586 /* Python function to determine if the breakpoint is a temporary
    587    breakpoint.  */
    588 
    589 static PyObject *
    590 bppy_get_temporary (PyObject *self, void *closure)
    591 {
    592   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    593 
    594   BPPY_REQUIRE_VALID (self_bp);
    595 
    596   if (self_bp->bp->disposition == disp_del
    597       || self_bp->bp->disposition == disp_del_at_next_stop)
    598     Py_RETURN_TRUE;
    599 
    600   Py_RETURN_FALSE;
    601 }
    602 
    603 /* Python function to determine if the breakpoint is a pending
    604    breakpoint.  */
    605 
    606 static PyObject *
    607 bppy_get_pending (PyObject *self, void *closure)
    608 {
    609   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    610 
    611   BPPY_REQUIRE_VALID (self_bp);
    612 
    613   if (is_watchpoint (self_bp->bp))
    614     Py_RETURN_FALSE;
    615   if (pending_breakpoint_p (self_bp->bp))
    616     Py_RETURN_TRUE;
    617 
    618   Py_RETURN_FALSE;
    619 }
    620 
    621 /* Python function to get the breakpoint's number.  */
    622 static PyObject *
    623 bppy_get_number (PyObject *self, void *closure)
    624 {
    625   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    626 
    627   BPPY_REQUIRE_VALID (self_bp);
    628 
    629   return PyInt_FromLong (self_bp->number);
    630 }
    631 
    632 /* Python function to get the breakpoint's thread ID.  */
    633 static PyObject *
    634 bppy_get_thread (PyObject *self, void *closure)
    635 {
    636   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    637 
    638   BPPY_REQUIRE_VALID (self_bp);
    639 
    640   if (self_bp->bp->thread == -1)
    641     Py_RETURN_NONE;
    642 
    643   return PyInt_FromLong (self_bp->bp->thread);
    644 }
    645 
    646 /* Python function to get the breakpoint's task ID (in Ada).  */
    647 static PyObject *
    648 bppy_get_task (PyObject *self, void *closure)
    649 {
    650   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    651 
    652   BPPY_REQUIRE_VALID (self_bp);
    653 
    654   if (self_bp->bp->task == 0)
    655     Py_RETURN_NONE;
    656 
    657   return PyInt_FromLong (self_bp->bp->task);
    658 }
    659 
    660 /* Python function to get the breakpoint's hit count.  */
    661 static PyObject *
    662 bppy_get_hit_count (PyObject *self, void *closure)
    663 {
    664   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    665 
    666   BPPY_REQUIRE_VALID (self_bp);
    667 
    668   return PyInt_FromLong (self_bp->bp->hit_count);
    669 }
    670 
    671 /* Python function to get the breakpoint's ignore count.  */
    672 static PyObject *
    673 bppy_get_ignore_count (PyObject *self, void *closure)
    674 {
    675   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
    676 
    677   BPPY_REQUIRE_VALID (self_bp);
    678 
    679   return PyInt_FromLong (self_bp->bp->ignore_count);
    680 }
    681 
    682 /* Internal function to validate the Python parameters/keywords
    683    provided to bppy_init.  */
    684 
    685 static int
    686 bppy_init_validate_args (const char *spec, char *source,
    687 			 char *function, char *label,
    688 			 char *line, enum bptype type)
    689 {
    690   /* If spec is defined, ensure that none of the explicit location
    691      keywords are also defined.  */
    692   if (spec != NULL)
    693     {
    694       if (source != NULL || function != NULL || label != NULL || line != NULL)
    695 	{
    696 	  PyErr_SetString (PyExc_RuntimeError,
    697 			   _("Breakpoints specified with spec cannot "
    698 			     "have source, function, label or line defined."));
    699 	  return -1;
    700 	}
    701     }
    702   else
    703     {
    704       /* If spec isn't defined, ensure that the user is not trying to
    705 	 define a watchpoint with an explicit location.  */
    706       if (type == bp_watchpoint)
    707 	{
    708 	  PyErr_SetString (PyExc_RuntimeError,
    709 			   _("Watchpoints cannot be set by explicit "
    710 			     "location parameters."));
    711 	  return -1;
    712 	}
    713       else
    714 	{
    715 	  /* Otherwise, ensure some explicit locations are defined.  */
    716 	  if (source == NULL && function == NULL && label == NULL
    717 	      && line == NULL)
    718 	    {
    719 	      PyErr_SetString (PyExc_RuntimeError,
    720 			       _("Neither spec nor explicit location set."));
    721 	      return -1;
    722 	    }
    723 	  /* Finally, if source is specified, ensure that line, label
    724 	     or function are specified too.  */
    725 	  if (source != NULL && function == NULL && label == NULL
    726 	      && line == NULL)
    727 	    {
    728 	      PyErr_SetString (PyExc_RuntimeError,
    729 			       _("Specifying a source must also include a "
    730 				 "line, label or function."));
    731 	      return -1;
    732 	    }
    733 	}
    734     }
    735   return 1;
    736 }
    737 
    738 /* Python function to create a new breakpoint.  */
    739 static int
    740 bppy_init (PyObject *self, PyObject *args, PyObject *kwargs)
    741 {
    742   static const char *keywords[] = { "spec", "type", "wp_class", "internal",
    743 				    "temporary","source", "function",
    744 				    "label", "line", "qualified", NULL };
    745   const char *spec = NULL;
    746   enum bptype type = bp_breakpoint;
    747   int access_type = hw_write;
    748   PyObject *internal = NULL;
    749   PyObject *temporary = NULL;
    750   PyObject *lineobj = NULL;;
    751   int internal_bp = 0;
    752   int temporary_bp = 0;
    753   gdb::unique_xmalloc_ptr<char> line;
    754   char *label = NULL;
    755   char *source = NULL;
    756   char *function = NULL;
    757   PyObject * qualified = NULL;
    758 
    759   if (!gdb_PyArg_ParseTupleAndKeywords (args, kwargs, "|siiOOsssOO", keywords,
    760 					&spec, &type, &access_type,
    761 					&internal,
    762 					&temporary, &source,
    763 					&function, &label, &lineobj,
    764 					&qualified))
    765     return -1;
    766 
    767 
    768   if (lineobj != NULL)
    769     {
    770       if (PyInt_Check (lineobj))
    771 	line.reset (xstrprintf ("%ld", PyInt_AsLong (lineobj)));
    772       else if (PyString_Check (lineobj))
    773 	line = python_string_to_host_string (lineobj);
    774       else
    775 	{
    776 	  PyErr_SetString (PyExc_RuntimeError,
    777 			   _("Line keyword should be an integer or a string. "));
    778 	  return -1;
    779 	}
    780     }
    781 
    782   if (internal)
    783     {
    784       internal_bp = PyObject_IsTrue (internal);
    785       if (internal_bp == -1)
    786 	return -1;
    787     }
    788 
    789   if (temporary != NULL)
    790     {
    791       temporary_bp = PyObject_IsTrue (temporary);
    792       if (temporary_bp == -1)
    793 	return -1;
    794     }
    795 
    796   if (bppy_init_validate_args (spec, source, function, label, line.get (),
    797 			       type) == -1)
    798     return -1;
    799 
    800   bppy_pending_object = (gdbpy_breakpoint_object *) self;
    801   bppy_pending_object->number = -1;
    802   bppy_pending_object->bp = NULL;
    803 
    804   TRY
    805     {
    806       switch (type)
    807 	{
    808 	case bp_breakpoint:
    809 	  {
    810 	    event_location_up location;
    811 	    symbol_name_match_type func_name_match_type
    812 	      = (qualified != NULL && PyObject_IsTrue (qualified)
    813 		  ? symbol_name_match_type::FULL
    814 		  : symbol_name_match_type::WILD);
    815 
    816 	    if (spec != NULL)
    817 	      {
    818 		gdb::unique_xmalloc_ptr<char>
    819 		  copy_holder (xstrdup (skip_spaces (spec)));
    820 		const char *copy = copy_holder.get ();
    821 
    822 		location  = string_to_event_location (&copy,
    823 						      current_language,
    824 						      func_name_match_type);
    825 	      }
    826 	    else
    827 	      {
    828 		struct explicit_location explicit_loc;
    829 
    830 		initialize_explicit_location (&explicit_loc);
    831 		explicit_loc.source_filename = source;
    832 		explicit_loc.function_name = function;
    833 		explicit_loc.label_name = label;
    834 
    835 		if (line != NULL)
    836 		  explicit_loc.line_offset =
    837 		    linespec_parse_line_offset (line.get ());
    838 
    839 		explicit_loc.func_name_match_type = func_name_match_type;
    840 
    841 		location = new_explicit_location (&explicit_loc);
    842 	      }
    843 
    844 	    create_breakpoint (python_gdbarch,
    845 			       location.get (), NULL, -1, NULL,
    846 			       0,
    847 			       temporary_bp, bp_breakpoint,
    848 			       0,
    849 			       AUTO_BOOLEAN_TRUE,
    850 			       &bkpt_breakpoint_ops,
    851 			       0, 1, internal_bp, 0);
    852 	    break;
    853 	  }
    854 	case bp_watchpoint:
    855 	  {
    856 	    gdb::unique_xmalloc_ptr<char>
    857 	      copy_holder (xstrdup (skip_spaces (spec)));
    858 	    char *copy = copy_holder.get ();
    859 
    860 	    if (access_type == hw_write)
    861 	      watch_command_wrapper (copy, 0, internal_bp);
    862 	    else if (access_type == hw_access)
    863 	      awatch_command_wrapper (copy, 0, internal_bp);
    864 	    else if (access_type == hw_read)
    865 	      rwatch_command_wrapper (copy, 0, internal_bp);
    866 	    else
    867 	      error(_("Cannot understand watchpoint access type."));
    868 	    break;
    869 	  }
    870 	default:
    871 	  error(_("Do not understand breakpoint type to set."));
    872 	}
    873     }
    874   CATCH (except, RETURN_MASK_ALL)
    875     {
    876       bppy_pending_object = NULL;
    877       gdbpy_convert_exception (except);
    878       return -1;
    879     }
    880   END_CATCH
    881 
    882   BPPY_SET_REQUIRE_VALID ((gdbpy_breakpoint_object *) self);
    883   return 0;
    884 }
    885 
    886 
    887 
    889 static int
    890 build_bp_list (struct breakpoint *b, void *arg)
    891 {
    892   PyObject *list = (PyObject *) arg;
    893   PyObject *bp = (PyObject *) b->py_bp_object;
    894   int iserr = 0;
    895 
    896   /* Not all breakpoints will have a companion Python object.
    897      Only breakpoints that were created via bppy_new, or
    898      breakpoints that were created externally and are tracked by
    899      the Python Scripting API.  */
    900   if (bp)
    901     iserr = PyList_Append (list, bp);
    902 
    903   if (iserr == -1)
    904     return 1;
    905 
    906   return 0;
    907 }
    908 
    909 /* Static function to return a tuple holding all breakpoints.  */
    910 
    911 PyObject *
    912 gdbpy_breakpoints (PyObject *self, PyObject *args)
    913 {
    914   if (bppy_live == 0)
    915     return PyTuple_New (0);
    916 
    917   gdbpy_ref<> list (PyList_New (0));
    918   if (list == NULL)
    919     return NULL;
    920 
    921   /* If iterate_over_breakpoints returns non NULL it signals an error
    922      condition.  In that case abandon building the list and return
    923      NULL.  */
    924   if (iterate_over_breakpoints (build_bp_list, list.get ()) != NULL)
    925     return NULL;
    926 
    927   return PyList_AsTuple (list.get ());
    928 }
    929 
    930 /* Call the "stop" method (if implemented) in the breakpoint
    931    class.  If the method returns True, the inferior  will be
    932    stopped at the breakpoint.  Otherwise the inferior will be
    933    allowed to continue.  */
    934 
    935 enum ext_lang_bp_stop
    936 gdbpy_breakpoint_cond_says_stop (const struct extension_language_defn *extlang,
    937 				 struct breakpoint *b)
    938 {
    939   int stop;
    940   struct gdbpy_breakpoint_object *bp_obj = b->py_bp_object;
    941   PyObject *py_bp = (PyObject *) bp_obj;
    942   struct gdbarch *garch;
    943 
    944   if (bp_obj == NULL)
    945     return EXT_LANG_BP_STOP_UNSET;
    946 
    947   stop = -1;
    948   garch = b->gdbarch ? b->gdbarch : get_current_arch ();
    949 
    950   gdbpy_enter enter_py (garch, current_language);
    951 
    952   if (bp_obj->is_finish_bp)
    953     bpfinishpy_pre_stop_hook (bp_obj);
    954 
    955   if (PyObject_HasAttrString (py_bp, stop_func))
    956     {
    957       gdbpy_ref<> result (PyObject_CallMethod (py_bp, stop_func, NULL));
    958 
    959       stop = 1;
    960       if (result != NULL)
    961 	{
    962 	  int evaluate = PyObject_IsTrue (result.get ());
    963 
    964 	  if (evaluate == -1)
    965 	    gdbpy_print_stack ();
    966 
    967 	  /* If the "stop" function returns False that means
    968 	     the Python breakpoint wants GDB to continue.  */
    969 	  if (! evaluate)
    970 	    stop = 0;
    971 	}
    972       else
    973 	gdbpy_print_stack ();
    974     }
    975 
    976   if (bp_obj->is_finish_bp)
    977     bpfinishpy_post_stop_hook (bp_obj);
    978 
    979   if (stop < 0)
    980     return EXT_LANG_BP_STOP_UNSET;
    981   return stop ? EXT_LANG_BP_STOP_YES : EXT_LANG_BP_STOP_NO;
    982 }
    983 
    984 /* Checks if the  "stop" method exists in this breakpoint.
    985    Used by condition_command to ensure mutual exclusion of breakpoint
    986    conditions.  */
    987 
    988 int
    989 gdbpy_breakpoint_has_cond (const struct extension_language_defn *extlang,
    990 			   struct breakpoint *b)
    991 {
    992   PyObject *py_bp;
    993   struct gdbarch *garch;
    994 
    995   if (b->py_bp_object == NULL)
    996     return 0;
    997 
    998   py_bp = (PyObject *) b->py_bp_object;
    999   garch = b->gdbarch ? b->gdbarch : get_current_arch ();
   1000 
   1001   gdbpy_enter enter_py (garch, current_language);
   1002   return PyObject_HasAttrString (py_bp, stop_func);
   1003 }
   1004 
   1005 
   1006 
   1008 /* Event callback functions.  */
   1009 
   1010 /* Callback that is used when a breakpoint is created.  This function
   1011    will create a new Python breakpoint object.  */
   1012 static void
   1013 gdbpy_breakpoint_created (struct breakpoint *bp)
   1014 {
   1015   gdbpy_breakpoint_object *newbp;
   1016   PyGILState_STATE state;
   1017 
   1018   if (!user_breakpoint_p (bp) && bppy_pending_object == NULL)
   1019     return;
   1020 
   1021   if (bp->type != bp_breakpoint
   1022       && bp->type != bp_watchpoint
   1023       && bp->type != bp_hardware_watchpoint
   1024       && bp->type != bp_read_watchpoint
   1025       && bp->type != bp_access_watchpoint)
   1026     return;
   1027 
   1028   state = PyGILState_Ensure ();
   1029 
   1030   if (bppy_pending_object)
   1031     {
   1032       newbp = bppy_pending_object;
   1033       bppy_pending_object = NULL;
   1034     }
   1035   else
   1036     newbp = PyObject_New (gdbpy_breakpoint_object, &breakpoint_object_type);
   1037   if (newbp)
   1038     {
   1039       newbp->number = bp->number;
   1040       newbp->bp = bp;
   1041       newbp->bp->py_bp_object = newbp;
   1042       newbp->is_finish_bp = 0;
   1043       Py_INCREF (newbp);
   1044       ++bppy_live;
   1045     }
   1046   else
   1047     {
   1048       PyErr_SetString (PyExc_RuntimeError,
   1049 		       _("Error while creating breakpoint from GDB."));
   1050       gdbpy_print_stack ();
   1051     }
   1052 
   1053   if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_created))
   1054     {
   1055       if (evpy_emit_event ((PyObject *) newbp,
   1056 			   gdb_py_events.breakpoint_created) < 0)
   1057 	gdbpy_print_stack ();
   1058     }
   1059 
   1060   PyGILState_Release (state);
   1061 }
   1062 
   1063 /* Callback that is used when a breakpoint is deleted.  This will
   1064    invalidate the corresponding Python object.  */
   1065 static void
   1066 gdbpy_breakpoint_deleted (struct breakpoint *b)
   1067 {
   1068   int num = b->number;
   1069   PyGILState_STATE state;
   1070   struct breakpoint *bp = NULL;
   1071 
   1072   state = PyGILState_Ensure ();
   1073   bp = get_breakpoint (num);
   1074   if (bp)
   1075     {
   1076       gdbpy_ref<gdbpy_breakpoint_object> bp_obj (bp->py_bp_object);
   1077       if (bp_obj != NULL)
   1078 	{
   1079 	  if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_deleted))
   1080 	    {
   1081 	      if (evpy_emit_event ((PyObject *) bp_obj.get (),
   1082 				   gdb_py_events.breakpoint_deleted) < 0)
   1083 		gdbpy_print_stack ();
   1084 	    }
   1085 
   1086 	  bp_obj->bp = NULL;
   1087 	  --bppy_live;
   1088 	}
   1089     }
   1090   PyGILState_Release (state);
   1091 }
   1092 
   1093 /* Callback that is used when a breakpoint is modified.  */
   1094 
   1095 static void
   1096 gdbpy_breakpoint_modified (struct breakpoint *b)
   1097 {
   1098   int num = b->number;
   1099   PyGILState_STATE state;
   1100   struct breakpoint *bp = NULL;
   1101 
   1102   state = PyGILState_Ensure ();
   1103   bp = get_breakpoint (num);
   1104   if (bp)
   1105     {
   1106       PyObject *bp_obj = (PyObject *) bp->py_bp_object;
   1107       if (bp_obj)
   1108 	{
   1109 	  if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_modified))
   1110 	    {
   1111 	      if (evpy_emit_event (bp_obj,
   1112 				   gdb_py_events.breakpoint_modified) < 0)
   1113 		gdbpy_print_stack ();
   1114 	    }
   1115 	}
   1116     }
   1117   PyGILState_Release (state);
   1118 }
   1119 
   1120 
   1121 
   1123 /* Initialize the Python breakpoint code.  */
   1124 int
   1125 gdbpy_initialize_breakpoints (void)
   1126 {
   1127   int i;
   1128 
   1129   breakpoint_object_type.tp_new = PyType_GenericNew;
   1130   if (PyType_Ready (&breakpoint_object_type) < 0)
   1131     return -1;
   1132 
   1133   if (gdb_pymodule_addobject (gdb_module, "Breakpoint",
   1134 			      (PyObject *) &breakpoint_object_type) < 0)
   1135     return -1;
   1136 
   1137   gdb::observers::breakpoint_created.attach (gdbpy_breakpoint_created);
   1138   gdb::observers::breakpoint_deleted.attach (gdbpy_breakpoint_deleted);
   1139   gdb::observers::breakpoint_modified.attach (gdbpy_breakpoint_modified);
   1140 
   1141   /* Add breakpoint types constants.  */
   1142   for (i = 0; pybp_codes[i].name; ++i)
   1143     {
   1144       if (PyModule_AddIntConstant (gdb_module,
   1145 				   /* Cast needed for Python 2.4.  */
   1146 				   (char *) pybp_codes[i].name,
   1147 				   pybp_codes[i].code) < 0)
   1148 	return -1;
   1149     }
   1150 
   1151   /* Add watchpoint types constants.  */
   1152   for (i = 0; pybp_watch_types[i].name; ++i)
   1153     {
   1154       if (PyModule_AddIntConstant (gdb_module,
   1155 				   /* Cast needed for Python 2.4.  */
   1156 				   (char *) pybp_watch_types[i].name,
   1157 				   pybp_watch_types[i].code) < 0)
   1158 	return -1;
   1159     }
   1160 
   1161   return 0;
   1162 }
   1163 
   1164 
   1165 
   1167 /* Helper function that overrides this Python object's
   1168    PyObject_GenericSetAttr to allow extra validation of the attribute
   1169    being set.  */
   1170 
   1171 static int
   1172 local_setattro (PyObject *self, PyObject *name, PyObject *v)
   1173 {
   1174   gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
   1175   gdb::unique_xmalloc_ptr<char> attr (python_string_to_host_string (name));
   1176 
   1177   if (attr == NULL)
   1178     return -1;
   1179 
   1180   /* If the attribute trying to be set is the "stop" method,
   1181      but we already have a condition set in the CLI or other extension
   1182      language, disallow this operation.  */
   1183   if (strcmp (attr.get (), stop_func) == 0)
   1184     {
   1185       const struct extension_language_defn *extlang = NULL;
   1186 
   1187       if (obj->bp->cond_string != NULL)
   1188 	extlang = get_ext_lang_defn (EXT_LANG_GDB);
   1189       if (extlang == NULL)
   1190 	extlang = get_breakpoint_cond_ext_lang (obj->bp, EXT_LANG_PYTHON);
   1191       if (extlang != NULL)
   1192 	{
   1193 	  std::string error_text
   1194 	    = string_printf (_("Only one stop condition allowed.  There is"
   1195 			       " currently a %s stop condition defined for"
   1196 			       " this breakpoint."),
   1197 			     ext_lang_capitalized_name (extlang));
   1198 	  PyErr_SetString (PyExc_RuntimeError, error_text.c_str ());
   1199 	  return -1;
   1200 	}
   1201     }
   1202 
   1203   return PyObject_GenericSetAttr (self, name, v);
   1204 }
   1205 
   1206 static gdb_PyGetSetDef breakpoint_object_getset[] = {
   1207   { "enabled", bppy_get_enabled, bppy_set_enabled,
   1208     "Boolean telling whether the breakpoint is enabled.", NULL },
   1209   { "silent", bppy_get_silent, bppy_set_silent,
   1210     "Boolean telling whether the breakpoint is silent.", NULL },
   1211   { "thread", bppy_get_thread, bppy_set_thread,
   1212     "Thread ID for the breakpoint.\n\
   1213 If the value is a thread ID (integer), then this is a thread-specific breakpoint.\n\
   1214 If the value is None, then this breakpoint is not thread-specific.\n\
   1215 No other type of value can be used.", NULL },
   1216   { "task", bppy_get_task, bppy_set_task,
   1217     "Thread ID for the breakpoint.\n\
   1218 If the value is a task ID (integer), then this is an Ada task-specific breakpoint.\n\
   1219 If the value is None, then this breakpoint is not task-specific.\n\
   1220 No other type of value can be used.", NULL },
   1221   { "ignore_count", bppy_get_ignore_count, bppy_set_ignore_count,
   1222     "Number of times this breakpoint should be automatically continued.",
   1223     NULL },
   1224   { "number", bppy_get_number, NULL,
   1225     "Breakpoint's number assigned by GDB.", NULL },
   1226   { "hit_count", bppy_get_hit_count, bppy_set_hit_count,
   1227     "Number of times the breakpoint has been hit.\n\
   1228 Can be set to zero to clear the count. No other value is valid\n\
   1229 when setting this property.", NULL },
   1230   { "location", bppy_get_location, NULL,
   1231     "Location of the breakpoint, as specified by the user.", NULL},
   1232   { "expression", bppy_get_expression, NULL,
   1233     "Expression of the breakpoint, as specified by the user.", NULL},
   1234   { "condition", bppy_get_condition, bppy_set_condition,
   1235     "Condition of the breakpoint, as specified by the user,\
   1236 or None if no condition set."},
   1237   { "commands", bppy_get_commands, bppy_set_commands,
   1238     "Commands of the breakpoint, as specified by the user."},
   1239   { "type", bppy_get_type, NULL,
   1240     "Type of breakpoint."},
   1241   { "visible", bppy_get_visibility, NULL,
   1242     "Whether the breakpoint is visible to the user."},
   1243   { "temporary", bppy_get_temporary, NULL,
   1244     "Whether this breakpoint is a temporary breakpoint."},
   1245   { "pending", bppy_get_pending, NULL,
   1246     "Whether this breakpoint is a pending breakpoint."},
   1247   { NULL }  /* Sentinel.  */
   1248 };
   1249 
   1250 static PyMethodDef breakpoint_object_methods[] =
   1251 {
   1252   { "is_valid", bppy_is_valid, METH_NOARGS,
   1253     "Return true if this breakpoint is valid, false if not." },
   1254   { "delete", bppy_delete_breakpoint, METH_NOARGS,
   1255     "Delete the underlying GDB breakpoint." },
   1256   { NULL } /* Sentinel.  */
   1257 };
   1258 
   1259 PyTypeObject breakpoint_object_type =
   1260 {
   1261   PyVarObject_HEAD_INIT (NULL, 0)
   1262   "gdb.Breakpoint",		  /*tp_name*/
   1263   sizeof (gdbpy_breakpoint_object), /*tp_basicsize*/
   1264   0,				  /*tp_itemsize*/
   1265   0,				  /*tp_dealloc*/
   1266   0,				  /*tp_print*/
   1267   0,				  /*tp_getattr*/
   1268   0,				  /*tp_setattr*/
   1269   0,				  /*tp_compare*/
   1270   0,				  /*tp_repr*/
   1271   0,				  /*tp_as_number*/
   1272   0,				  /*tp_as_sequence*/
   1273   0,				  /*tp_as_mapping*/
   1274   0,				  /*tp_hash */
   1275   0,				  /*tp_call*/
   1276   0,				  /*tp_str*/
   1277   0,				  /*tp_getattro*/
   1278   (setattrofunc)local_setattro,   /*tp_setattro */
   1279   0,				  /*tp_as_buffer*/
   1280   Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,  /*tp_flags*/
   1281   "GDB breakpoint object",	  /* tp_doc */
   1282   0,				  /* tp_traverse */
   1283   0,				  /* tp_clear */
   1284   0,				  /* tp_richcompare */
   1285   0,				  /* tp_weaklistoffset */
   1286   0,				  /* tp_iter */
   1287   0,				  /* tp_iternext */
   1288   breakpoint_object_methods,	  /* tp_methods */
   1289   0,				  /* tp_members */
   1290   breakpoint_object_getset,	  /* tp_getset */
   1291   0,				  /* tp_base */
   1292   0,				  /* tp_dict */
   1293   0,				  /* tp_descr_get */
   1294   0,				  /* tp_descr_set */
   1295   0,				  /* tp_dictoffset */
   1296   bppy_init,			  /* tp_init */
   1297   0,				  /* tp_alloc */
   1298 };
   1299