* [python] Make gdb.Frame.read_var_value accept string as argument.
@ 2009-02-27 20:03 Thiago Jung Bauermann
0 siblings, 0 replies; only message in thread
From: Thiago Jung Bauermann @ 2009-02-27 20:03 UTC (permalink / raw)
To: archer ml
Hi,
When working on the testcase for gdb.search_memory, I noticed it would
be convenient if Frame.read_var_value accepted a strings as well as a
symbol as argument. This patch makes the change, and updates the
gdb.python/find.exp testcase to use the Python API instead of cheating
with gdb.parse_and_eval. Committed.
It also seems to me that "read_var" would be a better name than
"read_var_value", any opinions?
gdb/
* python/python-frame.c (frapy_read_var_value): Accept
string as argument.
gdb/testsuite/
* gdb.python/find.exp: Use the Python API instead of parsing
GDB expressions to obtain test values.
---
gdb/python/python-frame.c | 28 ++++++++++++++++++++++++----
gdb/testsuite/gdb.python/find.exp | 27 ++++++++++++++++-----------
2 files changed, 40 insertions(+), 15 deletions(-)
diff --git a/gdb/python/python-frame.c b/gdb/python/python-frame.c
index c2224cf..c468305 100644
--- a/gdb/python/python-frame.c
+++ b/gdb/python/python-frame.c
@@ -355,13 +355,33 @@ frapy_read_var_value (PyObject *self, PyObject *args)
struct value *val = NULL;
volatile struct gdb_exception except;
- if (!PyArg_ParseTuple (args, "O!", &symbol_object_type, &sym_obj))
+ if (!PyArg_ParseTuple (args, "O", &sym_obj))
return NULL;
- var = symbol_object_to_symbol (sym_obj);
- if (! var)
+ if (PyObject_TypeCheck (sym_obj, &symbol_object_type))
+ var = symbol_object_to_symbol (sym_obj);
+ else if (gdbpy_is_string (sym_obj))
{
- PyErr_SetString (PyExc_RuntimeError, "second argument must be symbol");
+ char *var_name;
+ struct block *block;
+ volatile struct gdb_exception except;
+
+ TRY_CATCH (except, RETURN_MASK_ALL)
+ {
+ struct block *block;
+
+ FRAPY_REQUIRE_VALID ((frame_object *) self, frame);
+
+ block = block_for_pc (get_frame_address_in_block (frame));
+ var = lookup_symbol (python_string_to_target_string (sym_obj), block,
+ VAR_DOMAIN, NULL);
+ }
+ GDB_PY_HANDLE_EXCEPTION (except);
+ }
+ else
+ {
+ PyErr_SetString (PyExc_TypeError,
+ _("argument must be a symbol or string"));
return NULL;
}
diff --git a/gdb/testsuite/gdb.python/find.exp b/gdb/testsuite/gdb.python/find.exp
index d563974..a7dad97 100644
--- a/gdb/testsuite/gdb.python/find.exp
+++ b/gdb/testsuite/gdb.python/find.exp
@@ -90,8 +90,9 @@ set two_patterns_found "${newline}.${dec_number}L, ${dec_number}L]"
# Test string pattern.
gdb_test "set *(int32_t*) &int8_search_buf\[10\] = 0x61616161" "" ""
-gdb_test "py start_addr = gdb.parse_and_eval ('&int8_search_buf\[0\]')" "" ""
-gdb_test "py length = gdb.parse_and_eval ('sizeof (int8_search_buf)')" "" ""
+gdb_test "py search_buf = gdb.selected_frame ().read_var_value ('int8_search_buf')" "" ""
+gdb_test "py start_addr = search_buf.address ()" "" ""
+gdb_test "py length = search_buf.type ().sizeof ()" "" ""
gdb_test "py print gdb.search_memory (start_addr, length, 'aaa')" \
"${two_patterns_found}" "find string pattern"
@@ -127,8 +128,9 @@ gdb_test "py print gdb.search_memory (start_addr, length, \['a', 'a'\], max_coun
# Test 16-bit pattern.
gdb_test "set int16_search_buf\[10\] = 0x1234" "" ""
-gdb_test "py start_addr = gdb.parse_and_eval ('&int16_search_buf\[0\]')" "" ""
-gdb_test "py length = gdb.parse_and_eval ('sizeof (int16_search_buf)')" "" ""
+gdb_test "py search_buf = gdb.selected_frame ().read_var_value ('int16_search_buf')" "" ""
+gdb_test "py start_addr = search_buf.address ()" "" ""
+gdb_test "py length = search_buf.type ().sizeof ()" "" ""
gdb_test "py pattern = gdb.parse_and_eval ('(int16_t) 0x1234')" "" ""
gdb_test "py print gdb.search_memory (start_addr, length, 0x1234, 2)" \
@@ -140,8 +142,9 @@ gdb_test "py print gdb.search_memory (start_addr, length, pattern)" \
# Test 32-bit pattern.
gdb_test "set int32_search_buf\[10\] = 0x12345678" "" ""
-gdb_test "py start_addr = gdb.parse_and_eval ('&int32_search_buf\[0\]')" "" ""
-gdb_test "py length = gdb.parse_and_eval ('sizeof (int32_search_buf)')" "" ""
+gdb_test "py search_buf = gdb.selected_frame ().read_var_value ('int32_search_buf')" "" ""
+gdb_test "py start_addr = search_buf.address ()" "" ""
+gdb_test "py length = search_buf.type ().sizeof ()" "" ""
gdb_test "py pattern = gdb.parse_and_eval ('(int32_t) 0x12345678')" "" ""
gdb_test "py print gdb.search_memory (start_addr, length, 0x12345678, 4)" \
@@ -152,8 +155,9 @@ gdb_test "py print gdb.search_memory (start_addr, length, pattern)" \
# Test 64-bit pattern.
gdb_test "set int64_search_buf\[10\] = 0xfedcba9876543210LL" "" ""
-gdb_test "py start_addr = gdb.parse_and_eval ('&int64_search_buf\[0\]')" "" ""
-gdb_test "py length = gdb.parse_and_eval ('sizeof (int64_search_buf)')" "" ""
+gdb_test "py search_buf = gdb.selected_frame ().read_var_value ('int64_search_buf')" "" ""
+gdb_test "py start_addr = search_buf.address ()" "" ""
+gdb_test "py length = search_buf.type ().sizeof ()" "" ""
gdb_test "py pattern = gdb.parse_and_eval ('(int64_t) 0xfedcba9876543210LL')" "" ""
gdb_test "py print gdb.search_memory (start_addr, length, 0xfedcba9876543210, 8)" \
@@ -166,7 +170,8 @@ gdb_test "py print gdb.search_memory (start_addr, length, pattern)" \
gdb_test "set *(int8_t*) &search_buf\[10\] = 0x62" "" ""
gdb_test "set *(int16_t*) &search_buf\[11\] = 0x6363" "" ""
gdb_test "set *(int32_t*) &search_buf\[13\] = 0x64646464" "" ""
-gdb_test "py start_addr = gdb.parse_and_eval ('&search_buf\[0\]')" "" ""
+gdb_test "py search_buf = gdb.selected_frame ().read_var_value ('search_buf')" "" ""
+gdb_test "py start_addr = search_buf\[0\].address ()" "" ""
gdb_test "py pattern1 = gdb.parse_and_eval ('(int8_t) 0x62')" "" ""
gdb_test "py pattern2 = gdb.parse_and_eval ('(int16_t) 0x6363')" "" ""
gdb_test "py pattern3 = gdb.parse_and_eval ('(int32_t) 0x64646464')" "" ""
@@ -182,8 +187,8 @@ set CHUNK_SIZE 16000 ;
gdb_test "set *(int32_t*) &search_buf\[0*${CHUNK_SIZE}+100\] = 0x12345678" "" ""
gdb_test "set *(int32_t*) &search_buf\[1*${CHUNK_SIZE}+100\] = 0x12345678" "" ""
-gdb_test "py start_addr = gdb.parse_and_eval ('search_buf')" "" ""
-gdb_test "py length = gdb.parse_and_eval ('search_buf_size')" "" ""
+gdb_test "py start_addr = gdb.selected_frame ().read_var_value ('search_buf')" "" ""
+gdb_test "py length = gdb.selected_frame ().read_var_value ('search_buf_size')" "" ""
gdb_test "py print gdb.search_memory (start_addr, length, 0x12345678, 4)" \
"${two_patterns_found}" "search spanning large range"
--
1.5.6.5
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2009-02-27 20:03 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-02-27 20:03 [python] Make gdb.Frame.read_var_value accept string as argument Thiago Jung Bauermann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).