Home | History | Annotate | Line # | Download | only in python
py-frame.c revision 1.5
      1  1.1  christos /* Python interface to stack frames
      2  1.1  christos 
      3  1.3  christos    Copyright (C) 2008-2015 Free Software Foundation, Inc.
      4  1.1  christos 
      5  1.1  christos    This file is part of GDB.
      6  1.1  christos 
      7  1.1  christos    This program is free software; you can redistribute it and/or modify
      8  1.1  christos    it under the terms of the GNU General Public License as published by
      9  1.1  christos    the Free Software Foundation; either version 3 of the License, or
     10  1.1  christos    (at your option) any later version.
     11  1.1  christos 
     12  1.1  christos    This program is distributed in the hope that it will be useful,
     13  1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15  1.1  christos    GNU General Public License for more details.
     16  1.1  christos 
     17  1.1  christos    You should have received a copy of the GNU General Public License
     18  1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19  1.1  christos 
     20  1.1  christos #include "defs.h"
     21  1.1  christos #include "charset.h"
     22  1.1  christos #include "block.h"
     23  1.1  christos #include "frame.h"
     24  1.1  christos #include "symtab.h"
     25  1.1  christos #include "stack.h"
     26  1.1  christos #include "value.h"
     27  1.1  christos #include "python-internal.h"
     28  1.1  christos #include "symfile.h"
     29  1.1  christos #include "objfiles.h"
     30  1.3  christos #include "user-regs.h"
     31  1.1  christos 
     32  1.1  christos typedef struct {
     33  1.1  christos   PyObject_HEAD
     34  1.1  christos   struct frame_id frame_id;
     35  1.1  christos   struct gdbarch *gdbarch;
     36  1.1  christos 
     37  1.1  christos   /* Marks that the FRAME_ID member actually holds the ID of the frame next
     38  1.1  christos      to this, and not this frames' ID itself.  This is a hack to permit Python
     39  1.1  christos      frame objects which represent invalid frames (i.e., the last frame_info
     40  1.1  christos      in a corrupt stack).  The problem arises from the fact that this code
     41  1.1  christos      relies on FRAME_ID to uniquely identify a frame, which is not always true
     42  1.1  christos      for the last "frame" in a corrupt stack (it can have a null ID, or the same
     43  1.1  christos      ID as the  previous frame).  Whenever get_prev_frame returns NULL, we
     44  1.1  christos      record the frame_id of the next frame and set FRAME_ID_IS_NEXT to 1.  */
     45  1.1  christos   int frame_id_is_next;
     46  1.1  christos } frame_object;
     47  1.1  christos 
     48  1.1  christos /* Require a valid frame.  This must be called inside a TRY_CATCH, or
     49  1.1  christos    another context in which a gdb exception is allowed.  */
     50  1.1  christos #define FRAPY_REQUIRE_VALID(frame_obj, frame)		\
     51  1.1  christos     do {						\
     52  1.1  christos       frame = frame_object_to_frame_info (frame_obj);	\
     53  1.1  christos       if (frame == NULL)				\
     54  1.1  christos 	error (_("Frame is invalid."));			\
     55  1.1  christos     } while (0)
     56  1.1  christos 
     57  1.1  christos /* Returns the frame_info object corresponding to the given Python Frame
     58  1.1  christos    object.  If the frame doesn't exist anymore (the frame id doesn't
     59  1.1  christos    correspond to any frame in the inferior), returns NULL.  */
     60  1.1  christos 
     61  1.1  christos struct frame_info *
     62  1.1  christos frame_object_to_frame_info (PyObject *obj)
     63  1.1  christos {
     64  1.1  christos   frame_object *frame_obj = (frame_object *) obj;
     65  1.1  christos   struct frame_info *frame;
     66  1.1  christos 
     67  1.1  christos   frame = frame_find_by_id (frame_obj->frame_id);
     68  1.1  christos   if (frame == NULL)
     69  1.1  christos     return NULL;
     70  1.1  christos 
     71  1.1  christos   if (frame_obj->frame_id_is_next)
     72  1.1  christos     frame = get_prev_frame (frame);
     73  1.1  christos 
     74  1.1  christos   return frame;
     75  1.1  christos }
     76  1.1  christos 
     77  1.1  christos /* Called by the Python interpreter to obtain string representation
     78  1.1  christos    of the object.  */
     79  1.1  christos 
     80  1.1  christos static PyObject *
     81  1.1  christos frapy_str (PyObject *self)
     82  1.1  christos {
     83  1.1  christos   char *s;
     84  1.1  christos   PyObject *result;
     85  1.1  christos   struct ui_file *strfile;
     86  1.1  christos 
     87  1.1  christos   strfile = mem_fileopen ();
     88  1.1  christos   fprint_frame_id (strfile, ((frame_object *) self)->frame_id);
     89  1.1  christos   s = ui_file_xstrdup (strfile, NULL);
     90  1.1  christos   result = PyString_FromString (s);
     91  1.1  christos   xfree (s);
     92  1.1  christos 
     93  1.1  christos   return result;
     94  1.1  christos }
     95  1.1  christos 
     96  1.1  christos /* Implementation of gdb.Frame.is_valid (self) -> Boolean.
     97  1.1  christos    Returns True if the frame corresponding to the frame_id of this
     98  1.1  christos    object still exists in the inferior.  */
     99  1.1  christos 
    100  1.1  christos static PyObject *
    101  1.1  christos frapy_is_valid (PyObject *self, PyObject *args)
    102  1.1  christos {
    103  1.1  christos   struct frame_info *frame = NULL;
    104  1.1  christos 
    105  1.5  christos   TRY
    106  1.1  christos     {
    107  1.1  christos       frame = frame_object_to_frame_info (self);
    108  1.1  christos     }
    109  1.5  christos   CATCH (except, RETURN_MASK_ALL)
    110  1.5  christos     {
    111  1.5  christos       GDB_PY_HANDLE_EXCEPTION (except);
    112  1.5  christos     }
    113  1.5  christos   END_CATCH
    114  1.1  christos 
    115  1.1  christos   if (frame == NULL)
    116  1.1  christos     Py_RETURN_FALSE;
    117  1.1  christos 
    118  1.1  christos   Py_RETURN_TRUE;
    119  1.1  christos }
    120  1.1  christos 
    121  1.1  christos /* Implementation of gdb.Frame.name (self) -> String.
    122  1.1  christos    Returns the name of the function corresponding to this frame.  */
    123  1.1  christos 
    124  1.1  christos static PyObject *
    125  1.1  christos frapy_name (PyObject *self, PyObject *args)
    126  1.1  christos {
    127  1.1  christos   struct frame_info *frame;
    128  1.1  christos   char *name = NULL;
    129  1.1  christos   enum language lang;
    130  1.1  christos   PyObject *result;
    131  1.1  christos 
    132  1.5  christos   TRY
    133  1.1  christos     {
    134  1.1  christos       FRAPY_REQUIRE_VALID (self, frame);
    135  1.1  christos 
    136  1.1  christos       find_frame_funname (frame, &name, &lang, NULL);
    137  1.1  christos     }
    138  1.5  christos   CATCH (except, RETURN_MASK_ALL)
    139  1.5  christos     {
    140  1.5  christos       xfree (name);
    141  1.5  christos       GDB_PY_HANDLE_EXCEPTION (except);
    142  1.5  christos     }
    143  1.5  christos   END_CATCH
    144  1.1  christos 
    145  1.1  christos   if (name)
    146  1.1  christos     {
    147  1.1  christos       result = PyUnicode_Decode (name, strlen (name), host_charset (), NULL);
    148  1.1  christos       xfree (name);
    149  1.1  christos     }
    150  1.1  christos   else
    151  1.1  christos     {
    152  1.1  christos       result = Py_None;
    153  1.1  christos       Py_INCREF (Py_None);
    154  1.1  christos     }
    155  1.1  christos 
    156  1.1  christos   return result;
    157  1.1  christos }
    158  1.1  christos 
    159  1.1  christos /* Implementation of gdb.Frame.type (self) -> Integer.
    160  1.1  christos    Returns the frame type, namely one of the gdb.*_FRAME constants.  */
    161  1.1  christos 
    162  1.1  christos static PyObject *
    163  1.1  christos frapy_type (PyObject *self, PyObject *args)
    164  1.1  christos {
    165  1.1  christos   struct frame_info *frame;
    166  1.1  christos   enum frame_type type = NORMAL_FRAME;/* Initialize to appease gcc warning.  */
    167  1.1  christos 
    168  1.5  christos   TRY
    169  1.1  christos     {
    170  1.1  christos       FRAPY_REQUIRE_VALID (self, frame);
    171  1.1  christos 
    172  1.1  christos       type = get_frame_type (frame);
    173  1.1  christos     }
    174  1.5  christos   CATCH (except, RETURN_MASK_ALL)
    175  1.5  christos     {
    176  1.5  christos       GDB_PY_HANDLE_EXCEPTION (except);
    177  1.5  christos     }
    178  1.5  christos   END_CATCH
    179  1.1  christos 
    180  1.1  christos   return PyInt_FromLong (type);
    181  1.1  christos }
    182  1.1  christos 
    183  1.1  christos /* Implementation of gdb.Frame.architecture (self) -> gdb.Architecture.
    184  1.1  christos    Returns the frame's architecture as a gdb.Architecture object.  */
    185  1.1  christos 
    186  1.1  christos static PyObject *
    187  1.1  christos frapy_arch (PyObject *self, PyObject *args)
    188  1.1  christos {
    189  1.1  christos   struct frame_info *frame = NULL;    /* Initialize to appease gcc warning.  */
    190  1.1  christos   frame_object *obj = (frame_object *) self;
    191  1.1  christos 
    192  1.5  christos   TRY
    193  1.1  christos     {
    194  1.1  christos       FRAPY_REQUIRE_VALID (self, frame);
    195  1.1  christos     }
    196  1.5  christos   CATCH (except, RETURN_MASK_ALL)
    197  1.5  christos     {
    198  1.5  christos       GDB_PY_HANDLE_EXCEPTION (except);
    199  1.5  christos     }
    200  1.5  christos   END_CATCH
    201  1.1  christos 
    202  1.1  christos   return gdbarch_to_arch_object (obj->gdbarch);
    203  1.1  christos }
    204  1.1  christos 
    205  1.1  christos /* Implementation of gdb.Frame.unwind_stop_reason (self) -> Integer.
    206  1.1  christos    Returns one of the gdb.FRAME_UNWIND_* constants.  */
    207  1.1  christos 
    208  1.1  christos static PyObject *
    209  1.1  christos frapy_unwind_stop_reason (PyObject *self, PyObject *args)
    210  1.1  christos {
    211  1.1  christos   struct frame_info *frame = NULL;    /* Initialize to appease gcc warning.  */
    212  1.1  christos   enum unwind_stop_reason stop_reason;
    213  1.1  christos 
    214  1.5  christos   TRY
    215  1.1  christos     {
    216  1.1  christos       FRAPY_REQUIRE_VALID (self, frame);
    217  1.1  christos     }
    218  1.5  christos   CATCH (except, RETURN_MASK_ALL)
    219  1.5  christos     {
    220  1.5  christos       GDB_PY_HANDLE_EXCEPTION (except);
    221  1.5  christos     }
    222  1.5  christos   END_CATCH
    223  1.1  christos 
    224  1.1  christos   stop_reason = get_frame_unwind_stop_reason (frame);
    225  1.1  christos 
    226  1.1  christos   return PyInt_FromLong (stop_reason);
    227  1.1  christos }
    228  1.1  christos 
    229  1.1  christos /* Implementation of gdb.Frame.pc (self) -> Long.
    230  1.1  christos    Returns the frame's resume address.  */
    231  1.1  christos 
    232  1.1  christos static PyObject *
    233  1.1  christos frapy_pc (PyObject *self, PyObject *args)
    234  1.1  christos {
    235  1.1  christos   CORE_ADDR pc = 0;	      /* Initialize to appease gcc warning.  */
    236  1.1  christos   struct frame_info *frame;
    237  1.1  christos 
    238  1.5  christos   TRY
    239  1.1  christos     {
    240  1.1  christos       FRAPY_REQUIRE_VALID (self, frame);
    241  1.1  christos 
    242  1.1  christos       pc = get_frame_pc (frame);
    243  1.1  christos     }
    244  1.5  christos   CATCH (except, RETURN_MASK_ALL)
    245  1.5  christos     {
    246  1.5  christos       GDB_PY_HANDLE_EXCEPTION (except);
    247  1.5  christos     }
    248  1.5  christos   END_CATCH
    249  1.1  christos 
    250  1.1  christos   return gdb_py_long_from_ulongest (pc);
    251  1.1  christos }
    252  1.1  christos 
    253  1.3  christos /* Implementation of gdb.Frame.read_register (self, register) -> gdb.Value.
    254  1.3  christos    Returns the value of a register in this frame.  */
    255  1.3  christos 
    256  1.3  christos static PyObject *
    257  1.3  christos frapy_read_register (PyObject *self, PyObject *args)
    258  1.3  christos {
    259  1.3  christos   const char *regnum_str;
    260  1.3  christos   struct value *val = NULL;
    261  1.3  christos 
    262  1.3  christos   if (!PyArg_ParseTuple (args, "s", &regnum_str))
    263  1.3  christos     return NULL;
    264  1.3  christos 
    265  1.5  christos   TRY
    266  1.3  christos     {
    267  1.3  christos       struct frame_info *frame;
    268  1.3  christos       int regnum;
    269  1.3  christos 
    270  1.3  christos       FRAPY_REQUIRE_VALID (self, frame);
    271  1.3  christos 
    272  1.3  christos       regnum = user_reg_map_name_to_regnum (get_frame_arch (frame),
    273  1.3  christos                                             regnum_str,
    274  1.3  christos                                             strlen (regnum_str));
    275  1.3  christos       if (regnum >= 0)
    276  1.3  christos         val = value_of_register (regnum, frame);
    277  1.3  christos 
    278  1.3  christos       if (val == NULL)
    279  1.3  christos         PyErr_SetString (PyExc_ValueError, _("Unknown register."));
    280  1.3  christos     }
    281  1.5  christos   CATCH (except, RETURN_MASK_ALL)
    282  1.5  christos     {
    283  1.5  christos       GDB_PY_HANDLE_EXCEPTION (except);
    284  1.5  christos     }
    285  1.5  christos   END_CATCH
    286  1.3  christos 
    287  1.3  christos   return val == NULL ? NULL : value_to_value_object (val);
    288  1.3  christos }
    289  1.3  christos 
    290  1.1  christos /* Implementation of gdb.Frame.block (self) -> gdb.Block.
    291  1.1  christos    Returns the frame's code block.  */
    292  1.1  christos 
    293  1.1  christos static PyObject *
    294  1.1  christos frapy_block (PyObject *self, PyObject *args)
    295  1.1  christos {
    296  1.1  christos   struct frame_info *frame;
    297  1.3  christos   const struct block *block = NULL, *fn_block;
    298  1.1  christos 
    299  1.5  christos   TRY
    300  1.1  christos     {
    301  1.1  christos       FRAPY_REQUIRE_VALID (self, frame);
    302  1.1  christos       block = get_frame_block (frame, NULL);
    303  1.1  christos     }
    304  1.5  christos   CATCH (except, RETURN_MASK_ALL)
    305  1.5  christos     {
    306  1.5  christos       GDB_PY_HANDLE_EXCEPTION (except);
    307  1.5  christos     }
    308  1.5  christos   END_CATCH
    309  1.1  christos 
    310  1.1  christos   for (fn_block = block;
    311  1.1  christos        fn_block != NULL && BLOCK_FUNCTION (fn_block) == NULL;
    312  1.1  christos        fn_block = BLOCK_SUPERBLOCK (fn_block))
    313  1.1  christos     ;
    314  1.1  christos 
    315  1.1  christos   if (block == NULL || fn_block == NULL || BLOCK_FUNCTION (fn_block) == NULL)
    316  1.1  christos     {
    317  1.1  christos       PyErr_SetString (PyExc_RuntimeError,
    318  1.1  christos 		       _("Cannot locate block for frame."));
    319  1.1  christos       return NULL;
    320  1.1  christos     }
    321  1.1  christos 
    322  1.1  christos   if (block)
    323  1.1  christos     {
    324  1.3  christos       return block_to_block_object
    325  1.3  christos 	(block, symbol_objfile (BLOCK_FUNCTION (fn_block)));
    326  1.1  christos     }
    327  1.1  christos 
    328  1.1  christos   Py_RETURN_NONE;
    329  1.1  christos }
    330  1.1  christos 
    331  1.1  christos 
    332  1.1  christos /* Implementation of gdb.Frame.function (self) -> gdb.Symbol.
    333  1.1  christos    Returns the symbol for the function corresponding to this frame.  */
    334  1.1  christos 
    335  1.1  christos static PyObject *
    336  1.1  christos frapy_function (PyObject *self, PyObject *args)
    337  1.1  christos {
    338  1.1  christos   struct symbol *sym = NULL;
    339  1.1  christos   struct frame_info *frame;
    340  1.1  christos 
    341  1.5  christos   TRY
    342  1.1  christos     {
    343  1.1  christos       FRAPY_REQUIRE_VALID (self, frame);
    344  1.1  christos 
    345  1.1  christos       sym = find_pc_function (get_frame_address_in_block (frame));
    346  1.1  christos     }
    347  1.5  christos   CATCH (except, RETURN_MASK_ALL)
    348  1.5  christos     {
    349  1.5  christos       GDB_PY_HANDLE_EXCEPTION (except);
    350  1.5  christos     }
    351  1.5  christos   END_CATCH
    352  1.1  christos 
    353  1.1  christos   if (sym)
    354  1.1  christos     return symbol_to_symbol_object (sym);
    355  1.1  christos 
    356  1.1  christos   Py_RETURN_NONE;
    357  1.1  christos }
    358  1.1  christos 
    359  1.1  christos /* Convert a frame_info struct to a Python Frame object.
    360  1.1  christos    Sets a Python exception and returns NULL on error.  */
    361  1.1  christos 
    362  1.1  christos PyObject *
    363  1.1  christos frame_info_to_frame_object (struct frame_info *frame)
    364  1.1  christos {
    365  1.1  christos   frame_object *frame_obj;
    366  1.1  christos 
    367  1.1  christos   frame_obj = PyObject_New (frame_object, &frame_object_type);
    368  1.1  christos   if (frame_obj == NULL)
    369  1.1  christos     return NULL;
    370  1.1  christos 
    371  1.5  christos   TRY
    372  1.1  christos     {
    373  1.1  christos 
    374  1.1  christos       /* Try to get the previous frame, to determine if this is the last frame
    375  1.1  christos 	 in a corrupt stack.  If so, we need to store the frame_id of the next
    376  1.1  christos 	 frame and not of this one (which is possibly invalid).  */
    377  1.1  christos       if (get_prev_frame (frame) == NULL
    378  1.1  christos 	  && get_frame_unwind_stop_reason (frame) != UNWIND_NO_REASON
    379  1.1  christos 	  && get_next_frame (frame) != NULL)
    380  1.1  christos 	{
    381  1.1  christos 	  frame_obj->frame_id = get_frame_id (get_next_frame (frame));
    382  1.1  christos 	  frame_obj->frame_id_is_next = 1;
    383  1.1  christos 	}
    384  1.1  christos       else
    385  1.1  christos 	{
    386  1.1  christos 	  frame_obj->frame_id = get_frame_id (frame);
    387  1.1  christos 	  frame_obj->frame_id_is_next = 0;
    388  1.1  christos 	}
    389  1.1  christos       frame_obj->gdbarch = get_frame_arch (frame);
    390  1.1  christos     }
    391  1.5  christos   CATCH (except, RETURN_MASK_ALL)
    392  1.1  christos     {
    393  1.1  christos       Py_DECREF (frame_obj);
    394  1.1  christos       gdbpy_convert_exception (except);
    395  1.1  christos       return NULL;
    396  1.1  christos     }
    397  1.5  christos   END_CATCH
    398  1.5  christos 
    399  1.1  christos   return (PyObject *) frame_obj;
    400  1.1  christos }
    401  1.1  christos 
    402  1.1  christos /* Implementation of gdb.Frame.older (self) -> gdb.Frame.
    403  1.1  christos    Returns the frame immediately older (outer) to this frame, or None if
    404  1.1  christos    there isn't one.  */
    405  1.1  christos 
    406  1.1  christos static PyObject *
    407  1.1  christos frapy_older (PyObject *self, PyObject *args)
    408  1.1  christos {
    409  1.1  christos   struct frame_info *frame, *prev = NULL;
    410  1.1  christos   PyObject *prev_obj = NULL;   /* Initialize to appease gcc warning.  */
    411  1.1  christos 
    412  1.5  christos   TRY
    413  1.1  christos     {
    414  1.1  christos       FRAPY_REQUIRE_VALID (self, frame);
    415  1.1  christos 
    416  1.1  christos       prev = get_prev_frame (frame);
    417  1.1  christos     }
    418  1.5  christos   CATCH (except, RETURN_MASK_ALL)
    419  1.5  christos     {
    420  1.5  christos       GDB_PY_HANDLE_EXCEPTION (except);
    421  1.5  christos     }
    422  1.5  christos   END_CATCH
    423  1.1  christos 
    424  1.1  christos   if (prev)
    425  1.1  christos     prev_obj = (PyObject *) frame_info_to_frame_object (prev);
    426  1.1  christos   else
    427  1.1  christos     {
    428  1.1  christos       Py_INCREF (Py_None);
    429  1.1  christos       prev_obj = Py_None;
    430  1.1  christos     }
    431  1.1  christos 
    432  1.1  christos   return prev_obj;
    433  1.1  christos }
    434  1.1  christos 
    435  1.1  christos /* Implementation of gdb.Frame.newer (self) -> gdb.Frame.
    436  1.1  christos    Returns the frame immediately newer (inner) to this frame, or None if
    437  1.1  christos    there isn't one.  */
    438  1.1  christos 
    439  1.1  christos static PyObject *
    440  1.1  christos frapy_newer (PyObject *self, PyObject *args)
    441  1.1  christos {
    442  1.1  christos   struct frame_info *frame, *next = NULL;
    443  1.1  christos   PyObject *next_obj = NULL;   /* Initialize to appease gcc warning.  */
    444  1.1  christos 
    445  1.5  christos   TRY
    446  1.1  christos     {
    447  1.1  christos       FRAPY_REQUIRE_VALID (self, frame);
    448  1.1  christos 
    449  1.1  christos       next = get_next_frame (frame);
    450  1.1  christos     }
    451  1.5  christos   CATCH (except, RETURN_MASK_ALL)
    452  1.5  christos     {
    453  1.5  christos       GDB_PY_HANDLE_EXCEPTION (except);
    454  1.5  christos     }
    455  1.5  christos   END_CATCH
    456  1.1  christos 
    457  1.1  christos   if (next)
    458  1.1  christos     next_obj = (PyObject *) frame_info_to_frame_object (next);
    459  1.1  christos   else
    460  1.1  christos     {
    461  1.1  christos       Py_INCREF (Py_None);
    462  1.1  christos       next_obj = Py_None;
    463  1.1  christos     }
    464  1.1  christos 
    465  1.1  christos   return next_obj;
    466  1.1  christos }
    467  1.1  christos 
    468  1.1  christos /* Implementation of gdb.Frame.find_sal (self) -> gdb.Symtab_and_line.
    469  1.1  christos    Returns the frame's symtab and line.  */
    470  1.1  christos 
    471  1.1  christos static PyObject *
    472  1.1  christos frapy_find_sal (PyObject *self, PyObject *args)
    473  1.1  christos {
    474  1.1  christos   struct frame_info *frame;
    475  1.1  christos   struct symtab_and_line sal;
    476  1.1  christos   PyObject *sal_obj = NULL;   /* Initialize to appease gcc warning.  */
    477  1.1  christos 
    478  1.5  christos   TRY
    479  1.1  christos     {
    480  1.1  christos       FRAPY_REQUIRE_VALID (self, frame);
    481  1.1  christos 
    482  1.1  christos       find_frame_sal (frame, &sal);
    483  1.1  christos       sal_obj = symtab_and_line_to_sal_object (sal);
    484  1.1  christos     }
    485  1.5  christos   CATCH (except, RETURN_MASK_ALL)
    486  1.5  christos     {
    487  1.5  christos       GDB_PY_HANDLE_EXCEPTION (except);
    488  1.5  christos     }
    489  1.5  christos   END_CATCH
    490  1.1  christos 
    491  1.1  christos   return sal_obj;
    492  1.1  christos }
    493  1.1  christos 
    494  1.1  christos /* Implementation of gdb.Frame.read_var_value (self, variable,
    495  1.1  christos    [block]) -> gdb.Value.  If the optional block argument is provided
    496  1.1  christos    start the search from that block, otherwise search from the frame's
    497  1.1  christos    current block (determined by examining the resume address of the
    498  1.1  christos    frame).  The variable argument must be a string or an instance of a
    499  1.1  christos    gdb.Symbol.  The block argument must be an instance of gdb.Block.  Returns
    500  1.1  christos    NULL on error, with a python exception set.  */
    501  1.1  christos static PyObject *
    502  1.1  christos frapy_read_var (PyObject *self, PyObject *args)
    503  1.1  christos {
    504  1.1  christos   struct frame_info *frame;
    505  1.1  christos   PyObject *sym_obj, *block_obj = NULL;
    506  1.1  christos   struct symbol *var = NULL;	/* gcc-4.3.2 false warning.  */
    507  1.1  christos   struct value *val = NULL;
    508  1.1  christos 
    509  1.1  christos   if (!PyArg_ParseTuple (args, "O|O", &sym_obj, &block_obj))
    510  1.1  christos     return NULL;
    511  1.1  christos 
    512  1.1  christos   if (PyObject_TypeCheck (sym_obj, &symbol_object_type))
    513  1.1  christos     var = symbol_object_to_symbol (sym_obj);
    514  1.1  christos   else if (gdbpy_is_string (sym_obj))
    515  1.1  christos     {
    516  1.1  christos       char *var_name;
    517  1.1  christos       const struct block *block = NULL;
    518  1.1  christos       struct cleanup *cleanup;
    519  1.1  christos 
    520  1.1  christos       var_name = python_string_to_target_string (sym_obj);
    521  1.1  christos       if (!var_name)
    522  1.1  christos 	return NULL;
    523  1.1  christos       cleanup = make_cleanup (xfree, var_name);
    524  1.1  christos 
    525  1.1  christos       if (block_obj)
    526  1.1  christos 	{
    527  1.1  christos 	  block = block_object_to_block (block_obj);
    528  1.1  christos 	  if (!block)
    529  1.1  christos 	    {
    530  1.1  christos 	      PyErr_SetString (PyExc_RuntimeError,
    531  1.1  christos 			       _("Second argument must be block."));
    532  1.1  christos 	      do_cleanups (cleanup);
    533  1.1  christos 	      return NULL;
    534  1.1  christos 	    }
    535  1.1  christos 	}
    536  1.1  christos 
    537  1.5  christos       TRY
    538  1.1  christos 	{
    539  1.1  christos 	  FRAPY_REQUIRE_VALID (self, frame);
    540  1.1  christos 
    541  1.1  christos 	  if (!block)
    542  1.1  christos 	    block = get_frame_block (frame, NULL);
    543  1.1  christos 	  var = lookup_symbol (var_name, block, VAR_DOMAIN, NULL);
    544  1.1  christos 	}
    545  1.5  christos       CATCH (except, RETURN_MASK_ALL)
    546  1.1  christos 	{
    547  1.1  christos 	  do_cleanups (cleanup);
    548  1.1  christos 	  gdbpy_convert_exception (except);
    549  1.1  christos 	  return NULL;
    550  1.1  christos 	}
    551  1.5  christos       END_CATCH
    552  1.1  christos 
    553  1.1  christos       if (!var)
    554  1.1  christos 	{
    555  1.1  christos 	  PyErr_Format (PyExc_ValueError,
    556  1.1  christos 			_("Variable '%s' not found."), var_name);
    557  1.1  christos 	  do_cleanups (cleanup);
    558  1.1  christos 
    559  1.1  christos 	  return NULL;
    560  1.1  christos 	}
    561  1.1  christos 
    562  1.1  christos       do_cleanups (cleanup);
    563  1.1  christos     }
    564  1.1  christos   else
    565  1.1  christos     {
    566  1.1  christos       PyErr_SetString (PyExc_TypeError,
    567  1.1  christos 		       _("Argument must be a symbol or string."));
    568  1.1  christos       return NULL;
    569  1.1  christos     }
    570  1.1  christos 
    571  1.5  christos   TRY
    572  1.1  christos     {
    573  1.1  christos       FRAPY_REQUIRE_VALID (self, frame);
    574  1.1  christos 
    575  1.1  christos       val = read_var_value (var, frame);
    576  1.1  christos     }
    577  1.5  christos   CATCH (except, RETURN_MASK_ALL)
    578  1.5  christos     {
    579  1.5  christos       GDB_PY_HANDLE_EXCEPTION (except);
    580  1.5  christos     }
    581  1.5  christos   END_CATCH
    582  1.1  christos 
    583  1.1  christos   return value_to_value_object (val);
    584  1.1  christos }
    585  1.1  christos 
    586  1.1  christos /* Select this frame.  */
    587  1.1  christos 
    588  1.1  christos static PyObject *
    589  1.1  christos frapy_select (PyObject *self, PyObject *args)
    590  1.1  christos {
    591  1.1  christos   struct frame_info *fi;
    592  1.1  christos 
    593  1.5  christos   TRY
    594  1.1  christos     {
    595  1.1  christos       FRAPY_REQUIRE_VALID (self, fi);
    596  1.1  christos 
    597  1.1  christos       select_frame (fi);
    598  1.1  christos     }
    599  1.5  christos   CATCH (except, RETURN_MASK_ALL)
    600  1.5  christos     {
    601  1.5  christos       GDB_PY_HANDLE_EXCEPTION (except);
    602  1.5  christos     }
    603  1.5  christos   END_CATCH
    604  1.1  christos 
    605  1.1  christos   Py_RETURN_NONE;
    606  1.1  christos }
    607  1.1  christos 
    608  1.1  christos /* Implementation of gdb.newest_frame () -> gdb.Frame.
    609  1.1  christos    Returns the newest frame object.  */
    610  1.1  christos 
    611  1.1  christos PyObject *
    612  1.1  christos gdbpy_newest_frame (PyObject *self, PyObject *args)
    613  1.1  christos {
    614  1.1  christos   struct frame_info *frame = NULL;
    615  1.1  christos 
    616  1.5  christos   TRY
    617  1.1  christos     {
    618  1.1  christos       frame = get_current_frame ();
    619  1.1  christos     }
    620  1.5  christos   CATCH (except, RETURN_MASK_ALL)
    621  1.5  christos     {
    622  1.5  christos       GDB_PY_HANDLE_EXCEPTION (except);
    623  1.5  christos     }
    624  1.5  christos   END_CATCH
    625  1.1  christos 
    626  1.1  christos   return frame_info_to_frame_object (frame);
    627  1.1  christos }
    628  1.1  christos 
    629  1.1  christos /* Implementation of gdb.selected_frame () -> gdb.Frame.
    630  1.1  christos    Returns the selected frame object.  */
    631  1.1  christos 
    632  1.1  christos PyObject *
    633  1.1  christos gdbpy_selected_frame (PyObject *self, PyObject *args)
    634  1.1  christos {
    635  1.1  christos   struct frame_info *frame = NULL;
    636  1.1  christos 
    637  1.5  christos   TRY
    638  1.1  christos     {
    639  1.1  christos       frame = get_selected_frame ("No frame is currently selected.");
    640  1.1  christos     }
    641  1.5  christos   CATCH (except, RETURN_MASK_ALL)
    642  1.5  christos     {
    643  1.5  christos       GDB_PY_HANDLE_EXCEPTION (except);
    644  1.5  christos     }
    645  1.5  christos   END_CATCH
    646  1.1  christos 
    647  1.1  christos   return frame_info_to_frame_object (frame);
    648  1.1  christos }
    649  1.1  christos 
    650  1.1  christos /* Implementation of gdb.stop_reason_string (Integer) -> String.
    651  1.1  christos    Return a string explaining the unwind stop reason.  */
    652  1.1  christos 
    653  1.1  christos PyObject *
    654  1.1  christos gdbpy_frame_stop_reason_string (PyObject *self, PyObject *args)
    655  1.1  christos {
    656  1.1  christos   int reason;
    657  1.1  christos   const char *str;
    658  1.1  christos 
    659  1.1  christos   if (!PyArg_ParseTuple (args, "i", &reason))
    660  1.1  christos     return NULL;
    661  1.1  christos 
    662  1.1  christos   if (reason < UNWIND_FIRST || reason > UNWIND_LAST)
    663  1.1  christos     {
    664  1.1  christos       PyErr_SetString (PyExc_ValueError,
    665  1.1  christos 		       _("Invalid frame stop reason."));
    666  1.1  christos       return NULL;
    667  1.1  christos     }
    668  1.1  christos 
    669  1.3  christos   str = unwind_stop_reason_to_string (reason);
    670  1.1  christos   return PyUnicode_Decode (str, strlen (str), host_charset (), NULL);
    671  1.1  christos }
    672  1.1  christos 
    673  1.1  christos /* Implements the equality comparison for Frame objects.
    674  1.1  christos    All other comparison operators will throw a TypeError Python exception,
    675  1.1  christos    as they aren't valid for frames.  */
    676  1.1  christos 
    677  1.1  christos static PyObject *
    678  1.1  christos frapy_richcompare (PyObject *self, PyObject *other, int op)
    679  1.1  christos {
    680  1.1  christos   int result;
    681  1.1  christos 
    682  1.1  christos   if (!PyObject_TypeCheck (other, &frame_object_type)
    683  1.1  christos       || (op != Py_EQ && op != Py_NE))
    684  1.1  christos     {
    685  1.1  christos       Py_INCREF (Py_NotImplemented);
    686  1.1  christos       return Py_NotImplemented;
    687  1.1  christos     }
    688  1.1  christos 
    689  1.1  christos   if (frame_id_eq (((frame_object *) self)->frame_id,
    690  1.1  christos 		   ((frame_object *) other)->frame_id))
    691  1.1  christos     result = Py_EQ;
    692  1.1  christos   else
    693  1.1  christos     result = Py_NE;
    694  1.1  christos 
    695  1.1  christos   if (op == result)
    696  1.1  christos     Py_RETURN_TRUE;
    697  1.1  christos   Py_RETURN_FALSE;
    698  1.1  christos }
    699  1.1  christos 
    700  1.1  christos /* Sets up the Frame API in the gdb module.  */
    701  1.1  christos 
    702  1.1  christos int
    703  1.1  christos gdbpy_initialize_frames (void)
    704  1.1  christos {
    705  1.1  christos   frame_object_type.tp_new = PyType_GenericNew;
    706  1.1  christos   if (PyType_Ready (&frame_object_type) < 0)
    707  1.1  christos     return -1;
    708  1.1  christos 
    709  1.1  christos   /* Note: These would probably be best exposed as class attributes of
    710  1.1  christos      Frame, but I don't know how to do it except by messing with the
    711  1.1  christos      type's dictionary.  That seems too messy.  */
    712  1.1  christos   if (PyModule_AddIntConstant (gdb_module, "NORMAL_FRAME", NORMAL_FRAME) < 0
    713  1.1  christos       || PyModule_AddIntConstant (gdb_module, "DUMMY_FRAME", DUMMY_FRAME) < 0
    714  1.1  christos       || PyModule_AddIntConstant (gdb_module, "INLINE_FRAME", INLINE_FRAME) < 0
    715  1.1  christos       || PyModule_AddIntConstant (gdb_module, "TAILCALL_FRAME",
    716  1.1  christos 				  TAILCALL_FRAME) < 0
    717  1.1  christos       || PyModule_AddIntConstant (gdb_module, "SIGTRAMP_FRAME",
    718  1.1  christos 				  SIGTRAMP_FRAME) < 0
    719  1.1  christos       || PyModule_AddIntConstant (gdb_module, "ARCH_FRAME", ARCH_FRAME) < 0
    720  1.1  christos       || PyModule_AddIntConstant (gdb_module, "SENTINEL_FRAME",
    721  1.1  christos 				  SENTINEL_FRAME) < 0)
    722  1.1  christos     return -1;
    723  1.1  christos 
    724  1.1  christos #define SET(name, description) \
    725  1.1  christos   if (PyModule_AddIntConstant (gdb_module, "FRAME_"#name, name) < 0) \
    726  1.1  christos     return -1;
    727  1.1  christos #include "unwind_stop_reasons.def"
    728  1.1  christos #undef SET
    729  1.1  christos 
    730  1.1  christos   return gdb_pymodule_addobject (gdb_module, "Frame",
    731  1.1  christos 				 (PyObject *) &frame_object_type);
    732  1.1  christos }
    733  1.1  christos 
    734  1.1  christos 
    735  1.1  christos 
    737  1.1  christos static PyMethodDef frame_object_methods[] = {
    738  1.1  christos   { "is_valid", frapy_is_valid, METH_NOARGS,
    739  1.1  christos     "is_valid () -> Boolean.\n\
    740  1.1  christos Return true if this frame is valid, false if not." },
    741  1.1  christos   { "name", frapy_name, METH_NOARGS,
    742  1.1  christos     "name () -> String.\n\
    743  1.1  christos Return the function name of the frame, or None if it can't be determined." },
    744  1.1  christos   { "type", frapy_type, METH_NOARGS,
    745  1.1  christos     "type () -> Integer.\n\
    746  1.1  christos Return the type of the frame." },
    747  1.1  christos   { "architecture", frapy_arch, METH_NOARGS,
    748  1.1  christos     "architecture () -> gdb.Architecture.\n\
    749  1.1  christos Return the architecture of the frame." },
    750  1.1  christos   { "unwind_stop_reason", frapy_unwind_stop_reason, METH_NOARGS,
    751  1.1  christos     "unwind_stop_reason () -> Integer.\n\
    752  1.1  christos Return the reason why it's not possible to find frames older than this." },
    753  1.1  christos   { "pc", frapy_pc, METH_NOARGS,
    754  1.1  christos     "pc () -> Long.\n\
    755  1.3  christos Return the frame's resume address." },
    756  1.3  christos   { "read_register", frapy_read_register, METH_VARARGS,
    757  1.3  christos     "read_register (register_name) -> gdb.Value\n\
    758  1.1  christos Return the value of the register in the frame." },
    759  1.1  christos   { "block", frapy_block, METH_NOARGS,
    760  1.1  christos     "block () -> gdb.Block.\n\
    761  1.1  christos Return the frame's code block." },
    762  1.1  christos   { "function", frapy_function, METH_NOARGS,
    763  1.1  christos     "function () -> gdb.Symbol.\n\
    764  1.1  christos Returns the symbol for the function corresponding to this frame." },
    765  1.1  christos   { "older", frapy_older, METH_NOARGS,
    766  1.1  christos     "older () -> gdb.Frame.\n\
    767  1.1  christos Return the frame that called this frame." },
    768  1.1  christos   { "newer", frapy_newer, METH_NOARGS,
    769  1.1  christos     "newer () -> gdb.Frame.\n\
    770  1.1  christos Return the frame called by this frame." },
    771  1.1  christos   { "find_sal", frapy_find_sal, METH_NOARGS,
    772  1.1  christos     "find_sal () -> gdb.Symtab_and_line.\n\
    773  1.1  christos Return the frame's symtab and line." },
    774  1.1  christos   { "read_var", frapy_read_var, METH_VARARGS,
    775  1.1  christos     "read_var (variable) -> gdb.Value.\n\
    776  1.1  christos Return the value of the variable in this frame." },
    777  1.1  christos   { "select", frapy_select, METH_NOARGS,
    778  1.1  christos     "Select this frame as the user's current frame." },
    779  1.1  christos   {NULL}  /* Sentinel */
    780  1.1  christos };
    781  1.1  christos 
    782  1.1  christos PyTypeObject frame_object_type = {
    783  1.1  christos   PyVarObject_HEAD_INIT (NULL, 0)
    784  1.1  christos   "gdb.Frame",			  /* tp_name */
    785  1.1  christos   sizeof (frame_object),	  /* tp_basicsize */
    786  1.1  christos   0,				  /* tp_itemsize */
    787  1.1  christos   0,				  /* tp_dealloc */
    788  1.1  christos   0,				  /* tp_print */
    789  1.1  christos   0,				  /* tp_getattr */
    790  1.1  christos   0,				  /* tp_setattr */
    791  1.1  christos   0,				  /* tp_compare */
    792  1.1  christos   0,				  /* tp_repr */
    793  1.1  christos   0,				  /* tp_as_number */
    794  1.1  christos   0,				  /* tp_as_sequence */
    795  1.1  christos   0,				  /* tp_as_mapping */
    796  1.1  christos   0,				  /* tp_hash  */
    797  1.1  christos   0,				  /* tp_call */
    798  1.1  christos   frapy_str,			  /* tp_str */
    799  1.1  christos   0,				  /* tp_getattro */
    800  1.1  christos   0,				  /* tp_setattro */
    801  1.1  christos   0,				  /* tp_as_buffer */
    802  1.1  christos   Py_TPFLAGS_DEFAULT,		  /* tp_flags */
    803  1.1  christos   "GDB frame object",		  /* tp_doc */
    804  1.1  christos   0,				  /* tp_traverse */
    805  1.1  christos   0,				  /* tp_clear */
    806  1.1  christos   frapy_richcompare,		  /* tp_richcompare */
    807  1.1  christos   0,				  /* tp_weaklistoffset */
    808  1.1  christos   0,				  /* tp_iter */
    809  1.1  christos   0,				  /* tp_iternext */
    810  1.1  christos   frame_object_methods,		  /* tp_methods */
    811  1.1  christos   0,				  /* tp_members */
    812  1.1  christos   0,				  /* tp_getset */
    813  1.1  christos   0,				  /* tp_base */
    814  1.1  christos   0,				  /* tp_dict */
    815  1.1  christos   0,				  /* tp_descr_get */
    816  1.1  christos   0,				  /* tp_descr_set */
    817  1.1  christos   0,				  /* tp_dictoffset */
    818  1.1  christos   0,				  /* tp_init */
    819  1.1  christos   0,				  /* tp_alloc */
    820                };
    821