diff options
author | Phil Muldoon <pmuldoon@redhat.com> | 2011-10-20 12:31:30 +0000 |
---|---|---|
committer | Phil Muldoon <pmuldoon@redhat.com> | 2011-10-20 12:31:30 +0000 |
commit | 9df2fbc4c1a6c94711bc9393b8f5ff8f77dcd8f5 (patch) | |
tree | 5a792741ff5c031147b8d3b26cd24beaac8e5c48 /gdb/python | |
parent | 5468810dda30d115069fc8fa41e68ed2caa34fc1 (diff) | |
download | gdb-9df2fbc4c1a6c94711bc9393b8f5ff8f77dcd8f5.zip gdb-9df2fbc4c1a6c94711bc9393b8f5ff8f77dcd8f5.tar.gz gdb-9df2fbc4c1a6c94711bc9393b8f5ff8f77dcd8f5.tar.bz2 |
2011-10-20 Phil Muldoon <pmuldoon@redhat.com>
PR python/12656
* python/py-frame.c (frapy_read_var): Use const struct *block.
* python/py-type.c (typy_lookup_typename): Likewise.
(typy_lookup_type): Likewise.
(typy_legacy_template_argument): Likewise.
(typy_template_argument): Likewise.
(gdbpy_lookup_type): Likewise.
* python/py-symbol.c (gdbpy_lookup_symbol): Likewise.
* python/py-block.c (blpy_block_object): Likewise.
(blpy_iter): Likewise.
(blpy_get_start): Likewise.
(blpy_get_end): Likewise.
(blpy_get_function): Likewise.
(blpy_get_superblock): Likewise.
(set_block): Likewise.
(block_to_block_object): Likewise.
(block_object_to_block): Likewise.
(blpy_is_valid): Likewise.
(blpy_get_global_block): New function.
(blpy_get_static_block): New function.
(blpy_is_global): New function.
(blpy_is_static): New function.
* blockframe.c (block_innermost_frame): Likewise.
* valops.c (value_of_variable): Likewise.
* frame.h: Update prototypes.
* python/python-internal.h: Likewise.
* value.h: Likewise.
2011-10-20 Phil Muldoon <pmuldoon@redhat.com>
PR python/12656
* gdb.texinfo (Blocks In Python): Document is_static, is_global,
global_block, static_block function.
2011-10-20 Phil Muldoon <pmuldoon@redhat.com>
PR python/12656
* gdb.python/py-block.exp: Add is_global, is_static, static_block,
global_block tests.
Diffstat (limited to 'gdb/python')
-rw-r--r-- | gdb/python/py-block.c | 101 | ||||
-rw-r--r-- | gdb/python/py-frame.c | 2 | ||||
-rw-r--r-- | gdb/python/py-symbol.c | 2 | ||||
-rw-r--r-- | gdb/python/py-type.c | 10 | ||||
-rw-r--r-- | gdb/python/python-internal.h | 5 |
5 files changed, 100 insertions, 20 deletions
diff --git a/gdb/python/py-block.c b/gdb/python/py-block.c index 08d4455..3f4467a 100644 --- a/gdb/python/py-block.c +++ b/gdb/python/py-block.c @@ -28,7 +28,7 @@ typedef struct blpy_block_object { PyObject_HEAD /* The GDB block structure that represents a frame's code block. */ - struct block *block; + const struct block *block; /* The backing object file. There is no direct relationship in GDB between a block and an object file. When a block is created also store a pointer to the object file for later use. */ @@ -85,7 +85,7 @@ static PyObject * blpy_iter (PyObject *self) { block_syms_iterator_object *block_iter_obj; - struct block *block = NULL; + const struct block *block = NULL; BLPY_REQUIRE_VALID (self, block); @@ -105,7 +105,7 @@ blpy_iter (PyObject *self) static PyObject * blpy_get_start (PyObject *self, void *closure) { - struct block *block = NULL; + const struct block *block = NULL; BLPY_REQUIRE_VALID (self, block); @@ -115,7 +115,7 @@ blpy_get_start (PyObject *self, void *closure) static PyObject * blpy_get_end (PyObject *self, void *closure) { - struct block *block = NULL; + const struct block *block = NULL; BLPY_REQUIRE_VALID (self, block); @@ -126,7 +126,7 @@ static PyObject * blpy_get_function (PyObject *self, void *closure) { struct symbol *sym; - struct block *block = NULL; + const struct block *block; BLPY_REQUIRE_VALID (self, block); @@ -140,8 +140,8 @@ blpy_get_function (PyObject *self, void *closure) static PyObject * blpy_get_superblock (PyObject *self, void *closure) { - struct block *block = NULL; - struct block *super_block = NULL; + const struct block *block; + const struct block *super_block; block_object *self_obj = (block_object *) self; BLPY_REQUIRE_VALID (self, block); @@ -153,6 +153,77 @@ blpy_get_superblock (PyObject *self, void *closure) Py_RETURN_NONE; } +/* Return the global block associated to this block. */ + +static PyObject * +blpy_get_global_block (PyObject *self, void *closure) +{ + const struct block *block; + const struct block *global_block; + block_object *self_obj = (block_object *) self; + + BLPY_REQUIRE_VALID (self, block); + + global_block = block_global_block (block); + + return block_to_block_object (global_block, + self_obj->objfile); + +} + +/* Return the static block associated to this block. Return None + if we cannot get the static block (this is the global block). */ + +static PyObject * +blpy_get_static_block (PyObject *self, void *closure) +{ + const struct block *block; + const struct block *static_block; + block_object *self_obj = (block_object *) self; + + BLPY_REQUIRE_VALID (self, block); + + if (BLOCK_SUPERBLOCK (block) == NULL) + Py_RETURN_NONE; + + static_block = block_static_block (block); + + return block_to_block_object (static_block, self_obj->objfile); +} + +/* Implementation of gdb.Block.is_global (self) -> Boolean. + Returns True if this block object is a global block. */ + +static PyObject * +blpy_is_global (PyObject *self, void *closure) +{ + const struct block *block; + + BLPY_REQUIRE_VALID (self, block); + + if (BLOCK_SUPERBLOCK (block)) + Py_RETURN_FALSE; + + Py_RETURN_TRUE; +} + +/* Implementation of gdb.Block.is_static (self) -> Boolean. + Returns True if this block object is a static block. */ + +static PyObject * +blpy_is_static (PyObject *self, void *closure) +{ + const struct block *block; + + BLPY_REQUIRE_VALID (self, block); + + if (BLOCK_SUPERBLOCK (block) != NULL + && BLOCK_SUPERBLOCK (BLOCK_SUPERBLOCK (block)) == NULL) + Py_RETURN_TRUE; + + Py_RETURN_FALSE; +} + static void blpy_dealloc (PyObject *obj) { @@ -176,7 +247,7 @@ blpy_dealloc (PyObject *obj) with the life-cycle of the object file associated with this block, if needed. */ static void -set_block (block_object *obj, struct block *block, +set_block (block_object *obj, const struct block *block, struct objfile *objfile) { obj->block = block; @@ -196,7 +267,7 @@ set_block (block_object *obj, struct block *block, /* Create a new block object (gdb.Block) that encapsulates the struct block object from GDB. */ PyObject * -block_to_block_object (struct block *block, struct objfile *objfile) +block_to_block_object (const struct block *block, struct objfile *objfile) { block_object *block_obj; @@ -208,7 +279,7 @@ block_to_block_object (struct block *block, struct objfile *objfile) } /* Return struct block reference that is wrapped by this object. */ -struct block * +const struct block * block_object_to_block (PyObject *obj) { if (! PyObject_TypeCheck (obj, &block_object_type)) @@ -269,7 +340,7 @@ blpy_block_syms_dealloc (PyObject *obj) static PyObject * blpy_is_valid (PyObject *self, PyObject *args) { - struct block *block; + const struct block *block; block = block_object_to_block (self); if (block == NULL) @@ -386,6 +457,14 @@ static PyGetSetDef block_object_getset[] = { "Symbol that names the block, or None.", NULL }, { "superblock", blpy_get_superblock, NULL, "Block containing the block, or None.", NULL }, + { "global_block", blpy_get_global_block, NULL, + "Block containing the global block.", NULL }, + { "static_block", blpy_get_static_block, NULL, + "Block containing the static block.", NULL }, + { "is_static", blpy_is_static, NULL, + "Whether this block is a static block.", NULL }, + { "is_global", blpy_is_global, NULL, + "Whether this block is a global block.", NULL }, { NULL } /* Sentinel */ }; diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c index 75aa44e..398ce84 100644 --- a/gdb/python/py-frame.c +++ b/gdb/python/py-frame.c @@ -411,7 +411,7 @@ frapy_read_var (PyObject *self, PyObject *args) else if (gdbpy_is_string (sym_obj)) { char *var_name; - struct block *block = NULL; + const struct block *block = NULL; struct cleanup *cleanup; volatile struct gdb_exception except; diff --git a/gdb/python/py-symbol.c b/gdb/python/py-symbol.c index 8a8510e..3fdbe48 100644 --- a/gdb/python/py-symbol.c +++ b/gdb/python/py-symbol.c @@ -276,7 +276,7 @@ gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw) static char *keywords[] = { "name", "block", "domain", NULL }; struct symbol *symbol; PyObject *block_obj = NULL, *ret_tuple, *sym_obj, *bool_obj; - struct block *block = NULL; + const struct block *block = NULL; if (! PyArg_ParseTupleAndKeywords (args, kw, "s|O!i", keywords, &name, &block_object_type, &block_obj, &domain)) diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index 875f7aa..f155d63 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -576,7 +576,7 @@ typy_get_sizeof (PyObject *self, void *closure) } static struct type * -typy_lookup_typename (const char *type_name, struct block *block) +typy_lookup_typename (const char *type_name, const struct block *block) { struct type *type = NULL; volatile struct gdb_exception except; @@ -606,7 +606,7 @@ typy_lookup_typename (const char *type_name, struct block *block) static struct type * typy_lookup_type (struct demangle_component *demangled, - struct block *block) + const struct block *block) { struct type *type; char *type_name; @@ -651,7 +651,7 @@ typy_lookup_type (struct demangle_component *demangled, versions of GCC, that do not emit DW_TAG_template_*. */ static PyObject * -typy_legacy_template_argument (struct type *type, struct block *block, +typy_legacy_template_argument (struct type *type, const struct block *block, int argno) { int i; @@ -716,7 +716,7 @@ typy_template_argument (PyObject *self, PyObject *args) { int argno; struct type *type = ((type_object *) self)->type; - struct block *block = NULL; + const struct block *block = NULL; PyObject *block_obj = NULL; struct symbol *sym; struct value *val = NULL; @@ -1328,7 +1328,7 @@ gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw) const char *type_name = NULL; struct type *type = NULL; PyObject *block_obj = NULL; - struct block *block = NULL; + const struct block *block = NULL; if (! PyArg_ParseTupleAndKeywords (args, kw, "s|O", keywords, &type_name, &block_obj)) diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index 71325e2..e593612 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -164,7 +164,8 @@ char *gdbpy_parse_command_name (const char *name, PyObject *symtab_and_line_to_sal_object (struct symtab_and_line sal); PyObject *symtab_to_symtab_object (struct symtab *symtab); PyObject *symbol_to_symbol_object (struct symbol *sym); -PyObject *block_to_block_object (struct block *block, struct objfile *objfile); +PyObject *block_to_block_object (const struct block *block, + struct objfile *objfile); PyObject *value_to_value_object (struct value *v); PyObject *type_to_type_object (struct type *); PyObject *frame_info_to_frame_object (struct frame_info *frame); @@ -180,7 +181,7 @@ thread_object *find_thread_object (ptid_t ptid); PyObject *find_inferior_object (int pid); PyObject *inferior_to_inferior_object (struct inferior *inferior); -struct block *block_object_to_block (PyObject *obj); +const struct block *block_object_to_block (PyObject *obj); struct symbol *symbol_object_to_symbol (PyObject *obj); struct value *value_object_to_value (PyObject *self); struct value *convert_value_from_python (PyObject *obj); |