This is the mail archive of the archer@sourceware.org mailing list for the Archer project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[python] Make gdb.Frame.read_var_value accept string as argument.


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



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]