gdb/python: convert Frame.read_register to take named arguments
authorAndrew Burgess <aburgess@redhat.com>
Thu, 30 Mar 2023 09:40:41 +0000 (10:40 +0100)
committerAndrew Burgess <aburgess@redhat.com>
Thu, 6 Apr 2023 14:03:55 +0000 (15:03 +0100)
Following on from the previous commit, this updates
Frame.read_register to accept named arguments.  As with the previous
commit there's no huge benefit for the users in accepting named
arguments here -- this function only takes a single argument after
all.

But I do think it is worth keeping Frame.read_register method in sync
with the PendingFrame.read_register method, this allows for the
possibility that the user has some code that can operate on either a
Frame or a Pending frame.

Minor update to allow for named arguments, and an extra test to check
the new functionality.

Reviewed-By: Tom Tromey <tom@tromey.com>
gdb/python/py-frame.c
gdb/testsuite/gdb.python/py-frame.exp

index 00cd4bee49257019ad0ae80bc749098a2d17856b..3a033ac75709d47183f11c6d8cf0f3e144d84e54 100644 (file)
@@ -238,13 +238,15 @@ frapy_pc (PyObject *self, PyObject *args)
    Returns the value of a register in this frame.  */
 
 static PyObject *
-frapy_read_register (PyObject *self, PyObject *args)
+frapy_read_register (PyObject *self, PyObject *args, PyObject *kw)
 {
   PyObject *pyo_reg_id;
   PyObject *result = nullptr;
 
-  if (!PyArg_UnpackTuple (args, "read_register", 1, 1, &pyo_reg_id))
-    return NULL;
+  static const char *keywords[] = { "register", nullptr };
+  if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "O", keywords, &pyo_reg_id))
+    return nullptr;
+
   try
     {
       scoped_value_mark free_values;
@@ -766,7 +768,8 @@ Return the reason why it's not possible to find frames older than this." },
   { "pc", frapy_pc, METH_NOARGS,
     "pc () -> Long.\n\
 Return the frame's resume address." },
-  { "read_register", frapy_read_register, METH_VARARGS,
+  { "read_register", (PyCFunction) frapy_read_register,
+    METH_VARARGS | METH_KEYWORDS,
     "read_register (register_name) -> gdb.Value\n\
 Return the value of the register in the frame." },
   { "block", frapy_block, METH_NOARGS,
index 5aebb6beb5f93ea006d47695ab06b161f3f478b8..07997326d09a57c15203cc17dba5b75ccc73ce75 100644 (file)
@@ -115,6 +115,12 @@ gdb_test "python print ('result = %s' % (f0.read_register('pc') == f0.pc()))" \
   " = True" \
   "test Frame.read_register(pc)"
 
+# Repeat the previous test, but this time use named arguments for the
+# read_register method call.
+gdb_test "python print ('result = %s' % (f0.read_register(register = 'pc') == f0.pc()))" \
+  " = True" \
+  "test Frame.read_register() using named arguments"
+
 # Test arch-specific register name.
 set pc ""
 if {[is_amd64_regs_target]} {