* python/py-arch.c (arch_object_type): Use
[deliverable/binutils-gdb.git] / gdb / python / py-symtab.c
index 6c805b72b2ae8f8efab9b1f6338df503df04acab..94c05be90a2a6170e6ce1f0867fd3de1273d871d 100644 (file)
@@ -1,6 +1,6 @@
 /* Python interface to symbol tables.
 
-   Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2008-2013 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -23,6 +23,7 @@
 #include "source.h"
 #include "python-internal.h"
 #include "objfiles.h"
+#include "block.h"
 
 typedef struct stpy_symtab_object {
   PyObject_HEAD
@@ -36,7 +37,8 @@ typedef struct stpy_symtab_object {
   struct stpy_symtab_object *next;
 } symtab_object;
 
-static PyTypeObject symtab_object_type;
+static PyTypeObject symtab_object_type
+    CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("symtab_object");
 static const struct objfile_data *stpy_objfile_data_key;
 
 /* Require a valid symbol table.  All access to symtab_object->symtab
@@ -66,7 +68,8 @@ typedef struct salpy_sal_object {
   struct salpy_sal_object *next;
 } sal_object;
 
-static PyTypeObject sal_object_type;
+static PyTypeObject sal_object_type
+    CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("sal_object");
 static const struct objfile_data *salpy_objfile_data_key;
 
 /* Require a valid symbol table and line object.  All access to
@@ -90,7 +93,7 @@ stpy_str (PyObject *self)
 
   STPY_REQUIRE_VALID (self, symtab);
 
-  result = PyString_FromString (symtab->filename);
+  result = PyString_FromString (symtab_to_filename_for_display (symtab));
 
   return result;
 }
@@ -100,11 +103,12 @@ stpy_get_filename (PyObject *self, void *closure)
 {
   PyObject *str_obj;
   struct symtab *symtab = NULL;
+  const char *filename;
 
   STPY_REQUIRE_VALID (self, symtab);
+  filename = symtab_to_filename_for_display (symtab);
 
-  str_obj = PyString_Decode (symtab->filename,
-                            strlen (symtab->filename),
+  str_obj = PyString_Decode (filename, strlen (filename),
                             host_charset (), NULL);
   return str_obj;
 }
@@ -125,23 +129,68 @@ stpy_get_objfile (PyObject *self, void *closure)
 static PyObject *
 stpy_fullname (PyObject *self, PyObject *args)
 {
-  char *fullname;
+  const char *fullname;
   struct symtab *symtab = NULL;
 
   STPY_REQUIRE_VALID (self, symtab);
 
   fullname = symtab_to_fullname (symtab);
-  if (fullname)
-    return PyString_Decode (fullname, strlen (fullname),
-                           host_charset (), NULL);
 
-  Py_RETURN_NONE;
+  return PyString_Decode (fullname, strlen (fullname), host_charset (), NULL);
+}
+
+/* Implementation of gdb.Symtab.is_valid (self) -> Boolean.
+   Returns True if this Symbol table still exists in GDB.  */
+
+static PyObject *
+stpy_is_valid (PyObject *self, PyObject *args)
+{
+  struct symtab *symtab = NULL;
+
+  symtab = symtab_object_to_symtab (self);
+  if (symtab == NULL)
+    Py_RETURN_FALSE;
+
+  Py_RETURN_TRUE;
+}
+
+/* Return the GLOBAL_BLOCK of the underlying symtab.  */
+
+static PyObject *
+stpy_global_block (PyObject *self, PyObject *args)
+{
+  struct symtab *symtab = NULL;
+  struct block *block = NULL;
+  struct blockvector *blockvector;
+
+  STPY_REQUIRE_VALID (self, symtab);
+
+  blockvector = BLOCKVECTOR (symtab);
+  block = BLOCKVECTOR_BLOCK (blockvector, GLOBAL_BLOCK);
+  return block_to_block_object (block, symtab->objfile);
+}
+
+/* Return the STATIC_BLOCK of the underlying symtab.  */
+
+static PyObject *
+stpy_static_block (PyObject *self, PyObject *args)
+{
+  struct symtab *symtab = NULL;
+  struct block *block = NULL;
+  struct blockvector *blockvector;
+
+  STPY_REQUIRE_VALID (self, symtab);
+
+  blockvector = BLOCKVECTOR (symtab);
+  block = BLOCKVECTOR_BLOCK (blockvector, STATIC_BLOCK);
+  return block_to_block_object (block, symtab->objfile);
 }
 
 static PyObject *
 salpy_str (PyObject *self)
 {
-  char *s, *filename;
+  char *s;
+  const char *filename;
   sal_object *sal_obj;
   PyObject *result;
   struct symtab_and_line *sal = NULL;
@@ -150,7 +199,7 @@ salpy_str (PyObject *self)
 
   sal_obj = (sal_object *) self;
   filename = (sal_obj->symtab == (symtab_object *) Py_None)
-    ? "<unknown>" : sal_obj->symtab->symtab->filename;
+    ? "<unknown>" : symtab_to_filename_for_display (sal_obj->symtab->symtab);
 
   s = xstrprintf ("symbol and line for %s, line %d", filename,
                  sal->line);
@@ -186,7 +235,23 @@ salpy_get_pc (PyObject *self, void *closure)
 
   SALPY_REQUIRE_VALID (self, sal);
 
-  return PyLong_FromUnsignedLongLong (sal->pc);
+  return gdb_py_long_from_ulongest (sal->pc);
+}
+
+/* Implementation of the get method for the 'last' attribute of
+   gdb.Symtab_and_line.  */
+
+static PyObject *
+salpy_get_last (PyObject *self, void *closure)
+{
+  struct symtab_and_line *sal = NULL;
+
+  SALPY_REQUIRE_VALID (self, sal);
+
+  if (sal->end > 0)
+    return gdb_py_long_from_ulongest (sal->end - 1);
+  else
+    Py_RETURN_NONE;
 }
 
 static PyObject *
@@ -196,7 +261,7 @@ salpy_get_line (PyObject *self, void *closure)
 
   SALPY_REQUIRE_VALID (self, sal);
 
-  return PyLong_FromUnsignedLongLong (sal->line);
+  return PyInt_FromLong (sal->line);
 }
 
 static PyObject *
@@ -212,6 +277,21 @@ salpy_get_symtab (PyObject *self, void *closure)
   return (PyObject *) self_sal->symtab;
 }
 
+/* Implementation of gdb.Symtab_and_line.is_valid (self) -> Boolean.
+   Returns True if this Symbol table and line object still exists GDB.  */
+
+static PyObject *
+salpy_is_valid (PyObject *self, PyObject *args)
+{
+  struct symtab_and_line *sal;
+
+  sal = sal_object_to_symtab_and_line (self);
+  if (sal == NULL)
+    Py_RETURN_FALSE;
+
+  Py_RETURN_TRUE;
+}
+
 static void
 salpy_dealloc (PyObject *self)
 {
@@ -228,15 +308,15 @@ salpy_dealloc (PyObject *self)
 
   Py_DECREF (self_sal->symtab);
   xfree (self_sal->sal);
-  self_sal->ob_type->tp_free (self);
+  Py_TYPE (self)->tp_free (self);
 }
 
-/* Given a sal, and a sal_object that has previously been
-   allocated and initialized, populate the sal_object with the
-   struct sal data.  Also, register the sal_object life-cycle with the
-   life-cycle of the the object file associated with this sal, if
-   needed.  If a failure occurs during the sal population,  this
-   function will return NULL.  */
+/* Given a sal, and a sal_object that has previously been allocated
+   and initialized, populate the sal_object with the struct sal data.
+   Also, register the sal_object life-cycle with the life-cycle of the
+   object file associated with this sal, if needed.  If a failure
+   occurs during the sal population, this function will return
+   NULL.  */
 static int
 set_sal (sal_object *sal_obj, struct symtab_and_line sal)
 {
@@ -282,7 +362,7 @@ set_sal (sal_object *sal_obj, struct symtab_and_line sal)
 /* Given a symtab, and a symtab_object that has previously been
    allocated and initialized, populate the symtab_object with the
    struct symtab data.  Also, register the symtab_object life-cycle
-   with the life-cycle of the the object file associated with this
+   with the life-cycle of the object file associated with this
    symtab, if needed.  */
 static void
 set_symtab (symtab_object *obj, struct symtab *symtab)
@@ -322,8 +402,8 @@ symtab_and_line_to_sal_object (struct symtab_and_line sal)
 {
   sal_object *sal_obj;
   int success = 0;
-  sal_obj = PyObject_New (sal_object, &sal_object_type);
 
+  sal_obj = PyObject_New (sal_object, &sal_object_type);
   if (sal_obj)
     {
       success = set_sal (sal_obj, sal);
@@ -365,6 +445,7 @@ static void
 del_objfile_symtab (struct objfile *objfile, void *datum)
 {
   symtab_object *obj = datum;
+
   while (obj)
     {
       symtab_object *next = obj->next;
@@ -385,11 +466,15 @@ static void
 del_objfile_sal (struct objfile *objfile, void *datum)
 {
   sal_object *obj = datum;
+
   while (obj)
     {
       sal_object *next = obj->next;
 
-      obj->symtab = NULL;
+      Py_DECREF (obj->symtab);
+      obj->symtab = (symtab_object *) Py_None;
+      Py_INCREF (Py_None);
+
       obj->next = NULL;
       obj->prev = NULL;
       xfree (obj->sal);
@@ -439,15 +524,23 @@ static PyGetSetDef symtab_object_getset[] = {
 };
 
 static PyMethodDef symtab_object_methods[] = {
+  { "is_valid", stpy_is_valid, METH_NOARGS,
+    "is_valid () -> Boolean.\n\
+Return true if this symbol table is valid, false if not." },
   { "fullname", stpy_fullname, METH_NOARGS,
     "fullname () -> String.\n\
 Return the symtab's full source filename." },
+  { "global_block", stpy_global_block, METH_NOARGS,
+    "global_block () -> gdb.Block.\n\
+Return the global block of the symbol table." },
+  { "static_block", stpy_static_block, METH_NOARGS,
+    "static_block () -> gdb.Block.\n\
+Return the static block of the symbol table." },
   {NULL}  /* Sentinel */
 };
 
 static PyTypeObject symtab_object_type = {
-  PyObject_HEAD_INIT (NULL)
-  0,                             /*ob_size*/
+  PyVarObject_HEAD_INIT (NULL, 0)
   "gdb.Symtab",                          /*tp_name*/
   sizeof (symtab_object),        /*tp_basicsize*/
   0,                             /*tp_itemsize*/
@@ -482,14 +575,22 @@ static PyTypeObject symtab_object_type = {
 static PyGetSetDef sal_object_getset[] = {
   { "symtab", salpy_get_symtab, NULL, "Symtab object.", NULL },
   { "pc", salpy_get_pc, NULL, "Return the symtab_and_line's pc.", NULL },
+  { "last", salpy_get_last, NULL,
+    "Return the symtab_and_line's last address.", NULL },
   { "line", salpy_get_line, NULL,
     "Return the symtab_and_line's line.", NULL },
   {NULL}  /* Sentinel */
 };
 
+static PyMethodDef sal_object_methods[] = {
+  { "is_valid", salpy_is_valid, METH_NOARGS,
+    "is_valid () -> Boolean.\n\
+Return true if this symbol table and line is valid, false if not." },
+  {NULL}  /* Sentinel */
+};
+
 static PyTypeObject sal_object_type = {
-  PyObject_HEAD_INIT (NULL)
-  0,                             /*ob_size*/
+  PyVarObject_HEAD_INIT (NULL, 0)
   "gdb.Symtab_and_line",         /*tp_name*/
   sizeof (sal_object),           /*tp_basicsize*/
   0,                             /*tp_itemsize*/
@@ -516,7 +617,7 @@ static PyTypeObject sal_object_type = {
   0,                             /*tp_weaklistoffset */
   0,                             /*tp_iter */
   0,                             /*tp_iternext */
-  0,                             /*tp_methods */
+  sal_object_methods,            /*tp_methods */
   0,                             /*tp_members */
   sal_object_getset              /*tp_getset */
 };
This page took 0.027795 seconds and 4 git commands to generate.