Add gdb.lookup_global_symbol python function.

* NEWS: Add entry.
	* python/py-symbol.c (gdbpy_lookup_global_symbol): New function.
	* python/python-internal.h (gdbpy_lookup_global_symbol): Declare it.
	* python/python.c (GdbMethods): Add entry for lookup_global_symbol.

	doc/
	* gdb.texinfo (Symbols In Python): Document lookup_global_symbol.
	Clarify behaviour of lookup_symbol when `block' argument is omitted,
	add description of result, fix @defun formatting.

	testsuite/
	* gdb.python/py-symbol.exp: Test lookup_global_symbol.
This commit is contained in:
Doug Evans 2011-02-22 22:48:12 +00:00
parent 1d41d745ca
commit 6e6fbe60bc
9 changed files with 92 additions and 2 deletions

View file

@ -1,3 +1,11 @@
2011-02-22 Doug Evans <dje@google.com>
Add gdb.lookup_global_symbol python function.
* NEWS: Add entry.
* python/py-symbol.c (gdbpy_lookup_global_symbol): New function.
* python/python-internal.h (gdbpy_lookup_global_symbol): Declare it.
* python/python.c (GdbMethods): Add entry for lookup_global_symbol.
2011-02-22 Tom Tromey <tromey@redhat.com> 2011-02-22 Tom Tromey <tromey@redhat.com>
* language.c (language_class_name_from_physname): Rename * language.c (language_class_name_from_physname): Rename

View file

@ -38,6 +38,8 @@
* Python scripting * Python scripting
** New function gdb.lookup_global_symbol looks up a global symbol.
** GDB values in Python are now callable if the value represents a ** GDB values in Python are now callable if the value represents a
function. For example, if 'some_value' represents a function that function. For example, if 'some_value' represents a function that
takes two integer parameters and returns a value, you can call takes two integer parameters and returns a value, you can call

View file

@ -1,3 +1,9 @@
2011-02-22 Doug Evans <dje@google.com>
* gdb.texinfo (Symbols In Python): Document lookup_global_symbol.
Clarify behaviour of lookup_symbol when `block' argument is omitted,
add description of result, fix @defun formatting.
2011-02-21 Hui Zhu <teawater@gmail.com> 2011-02-21 Hui Zhu <teawater@gmail.com>
* agentexpr.texi (Bytecode Descriptions): Add printf. * agentexpr.texi (Bytecode Descriptions): Add printf.

View file

@ -22829,7 +22829,7 @@ The following symbol-related functions are available in the @code{gdb}
module: module:
@findex gdb.lookup_symbol @findex gdb.lookup_symbol
@defun lookup_symbol name [block] [domain] @defun lookup_symbol name @r{[}block@r{]} @r{[}domain@r{]}
This function searches for a symbol by name. The search scope can be This function searches for a symbol by name. The search scope can be
restricted to the parameters defined in the optional domain and block restricted to the parameters defined in the optional domain and block
arguments. arguments.
@ -22837,10 +22837,33 @@ arguments.
@var{name} is the name of the symbol. It must be a string. The @var{name} is the name of the symbol. It must be a string. The
optional @var{block} argument restricts the search to symbols visible optional @var{block} argument restricts the search to symbols visible
in that @var{block}. The @var{block} argument must be a in that @var{block}. The @var{block} argument must be a
@code{gdb.Block} object. The optional @var{domain} argument restricts @code{gdb.Block} object. If omitted, the block for the current frame
is used. The optional @var{domain} argument restricts
the search to the domain type. The @var{domain} argument must be a the search to the domain type. The @var{domain} argument must be a
domain constant defined in the @code{gdb} module and described later domain constant defined in the @code{gdb} module and described later
in this chapter. in this chapter.
The result is a tuple of two elements.
The first element is a @code{gdb.Symbol} object or @code{None} if the symbol
is not found.
If the symbol is found, the second element is @code{True} if the symbol
is a field of a method's object (e.g., @code{this} in @code{C++}),
otherwise it is @code{False}.
If the symbol is not found, the second element is @code{False}.
@end defun
@findex gdb.lookup_global_symbol
@defun lookup_global_symbol name @r{[}domain@r{]}
This function searches for a global symbol by name.
The search scope can be restricted to by the domain argument.
@var{name} is the name of the symbol. It must be a string.
The optional @var{domain} argument restricts the search to the domain type.
The @var{domain} argument must be a domain constant defined in the @code{gdb}
module and described later in this chapter.
The result is a @code{gdb.Symbol} object or @code{None} if the symbol
is not found.
@end defun @end defun
A @code{gdb.Symbol} object has the following attributes: A @code{gdb.Symbol} object has the following attributes:

View file

@ -236,6 +236,7 @@ sympy_dealloc (PyObject *obj)
A tuple with 2 elements is always returned. The first is the symbol A tuple with 2 elements is always returned. The first is the symbol
object or None, the second is a boolean with the value of object or None, the second is a boolean with the value of
is_a_field_of_this (see comment in lookup_symbol_in_language). */ is_a_field_of_this (see comment in lookup_symbol_in_language). */
PyObject * PyObject *
gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw) gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw)
{ {
@ -294,6 +295,39 @@ gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw)
return ret_tuple; return ret_tuple;
} }
/* Implementation of
gdb.lookup_global_symbol (name [, domain]) -> symbol or None. */
PyObject *
gdbpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw)
{
int domain = VAR_DOMAIN;
const char *name;
static char *keywords[] = { "name", "domain", NULL };
struct symbol *symbol;
PyObject *sym_obj;
if (! PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name,
&domain))
return NULL;
symbol = lookup_symbol_global (name, NULL, domain);
if (symbol)
{
sym_obj = symbol_to_symbol_object (symbol);
if (!sym_obj)
return NULL;
}
else
{
sym_obj = Py_None;
Py_INCREF (Py_None);
}
return sym_obj;
}
/* This function is called when an objfile is about to be freed. /* This function is called when an objfile is about to be freed.
Invalidate the symbol as further actions on the symbol would result Invalidate the symbol as further actions on the symbol would result
in bad data. All access to obj->symbol should be gated by in bad data. All access to obj->symbol should be gated by

View file

@ -136,6 +136,8 @@ PyObject *gdbpy_history (PyObject *self, PyObject *args);
PyObject *gdbpy_breakpoints (PyObject *, PyObject *); PyObject *gdbpy_breakpoints (PyObject *, PyObject *);
PyObject *gdbpy_frame_stop_reason_string (PyObject *, PyObject *); PyObject *gdbpy_frame_stop_reason_string (PyObject *, PyObject *);
PyObject *gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw); PyObject *gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw);
PyObject *gdbpy_lookup_global_symbol (PyObject *self, PyObject *args,
PyObject *kw);
PyObject *gdbpy_newest_frame (PyObject *self, PyObject *args); PyObject *gdbpy_newest_frame (PyObject *self, PyObject *args);
PyObject *gdbpy_selected_frame (PyObject *self, PyObject *args); PyObject *gdbpy_selected_frame (PyObject *self, PyObject *args);
PyObject *gdbpy_block_for_pc (PyObject *self, PyObject *args); PyObject *gdbpy_block_for_pc (PyObject *self, PyObject *args);

View file

@ -1145,6 +1145,10 @@ Return a Type corresponding to the given name." },
Return a tuple with the symbol corresponding to the given name (or None) and\n\ Return a tuple with the symbol corresponding to the given name (or None) and\n\
a boolean indicating if name is a field of the current implied argument\n\ a boolean indicating if name is a field of the current implied argument\n\
`this' (when the current language is object-oriented)." }, `this' (when the current language is object-oriented)." },
{ "lookup_global_symbol", (PyCFunction) gdbpy_lookup_global_symbol,
METH_VARARGS | METH_KEYWORDS,
"lookup_global_symbol (name [, domain]) -> symbol\n\
Return the symbol corresponding to the given name (or None)." },
{ "block_for_pc", gdbpy_block_for_pc, METH_VARARGS, { "block_for_pc", gdbpy_block_for_pc, METH_VARARGS,
"Return the block containing the given pc value, or None." }, "Return the block containing the given pc value, or None." },
{ "solib_name", gdbpy_solib_name, METH_VARARGS, { "solib_name", gdbpy_solib_name, METH_VARARGS,

View file

@ -1,3 +1,7 @@
2011-02-22 Doug Evans <dje@google.com>
* gdb.python/py-symbol.exp: Test lookup_global_symbol.
2011-02-22 Michael Snyder <msnyder@vmware.com> 2011-02-22 Michael Snyder <msnyder@vmware.com>
* Makefile.in: Make more clean. * Makefile.in: Make more clean.

View file

@ -39,6 +39,13 @@ gdb_load ${binfile}
# Skip all tests if Python scripting is not enabled. # Skip all tests if Python scripting is not enabled.
if { [skip_python_tests] } { continue } if { [skip_python_tests] } { continue }
# Test looking up a global symbol before we runto_main as this is the
# point where we don't have a current frame, and we don't want to
# require one.
gdb_py_test_silent_cmd "python main_func = gdb.lookup_global_symbol(\"main\")" "Lookup main" 1
gdb_test "python print main_func.is_function" "True" "Test main_func.is_function"
gdb_test "python print gdb.lookup_global_symbol(\"junk\")" "None" "Test lookup_global_symbol(\"junk\")"
if ![runto_main] then { if ![runto_main] then {
fail "Can't run to main" fail "Can't run to main"
return 0 return 0