Use field_signed from Python MI commands
authorTom Tromey <tromey@adacore.com>
Thu, 23 Mar 2023 17:54:46 +0000 (11:54 -0600)
committerTom Tromey <tromey@adacore.com>
Tue, 23 May 2023 16:09:27 +0000 (10:09 -0600)
If an MI command written in Python includes a number in its output,
currently that is simply emitted as a string.  However, it's
convenient for a later patch if these are emitted using field_signed.
This does not make a difference to ordinary MI clients.

gdb/python/py-micmd.c
gdb/python/python-internal.h

index e86807d049f39ab6eee5d0a42dcaa662021b425f..d7d95918cb4d27064f0df021a60874bfff0e2b19 100644 (file)
@@ -293,6 +293,21 @@ serialize_mi_result_1 (PyObject *result, const char *field_name)
     }
   else
     {
+      if (PyLong_Check (result))
+       {
+         int overflow = 0;
+         gdb_py_longest val = gdb_py_long_as_long_and_overflow (result,
+                                                                &overflow);
+         if (PyErr_Occurred () != nullptr)
+           gdbpy_handle_exception ();
+         if (overflow == 0)
+           {
+             uiout->field_signed (field_name, val);
+             return;
+           }
+         /* Fall through to the string case on overflow.  */
+       }
+
       gdb::unique_xmalloc_ptr<char> string (gdbpy_obj_to_string (result));
       if (string == nullptr)
        gdbpy_handle_exception ();
index dbd33570a78310986e717861972e63abc74addc8..1142e0e739df3a09a745d0db3190aa0252e546e2 100644 (file)
 typedef PY_LONG_LONG gdb_py_longest;
 typedef unsigned PY_LONG_LONG gdb_py_ulongest;
 #define gdb_py_long_as_ulongest PyLong_AsUnsignedLongLong
+#define gdb_py_long_as_long_and_overflow PyLong_AsLongLongAndOverflow
 
 #else /* HAVE_LONG_LONG */
 
@@ -118,6 +119,7 @@ typedef unsigned PY_LONG_LONG gdb_py_ulongest;
 typedef long gdb_py_longest;
 typedef unsigned long gdb_py_ulongest;
 #define gdb_py_long_as_ulongest PyLong_AsUnsignedLong
+#define gdb_py_long_as_long_and_overflow PyLong_AsLongAndOverflow
 
 #endif /* HAVE_LONG_LONG */