Like the previous commit, I discovered that in micmdpy_set_installed
we were calling PyObject_IsTrue, but not checking for a possible error
value being returned.
The micmdpy_set_installed function implements the
gdb.MICommand.installed attribute, and the documentation indicates that
this attribute should only be assigned a bool:
This attribute is read-write, setting this attribute to 'False'
will uninstall the command, removing it from the set of available
commands. Setting this attribute to 'True' will install the
command for use.
So I propose that instead of using PyObject_IsTrue we use
PyBool_Check, and if the new value fails this check we raise an
error. We can then compare the new value to Py_True directly instead
of calling PyObject_IsTrue.
This is a potentially breaking change to the Python API, but hopefully
this will not impact too many people, and the fix is pretty
easy (switch to using a bool). I've added a NEWS entry to draw
attention to this change.
Approved-By: Tom Tromey <tom@tromey.com>
** The 'signed' argument to gdb.Architecture.integer_type() will no
longer accept non-bool types.
+ ** The gdb.MICommand.installed property can only be set to True or
+ False.
+
* Debugger Adapter Protocol changes
** The "scopes" request will now return a scope holding global
{
struct micmdpy_object *micmd_obj = (struct micmdpy_object *) self;
- bool installed_p = PyObject_IsTrue (newvalue);
+ if (!PyBool_Check (newvalue))
+ {
+ PyErr_Format (PyExc_TypeError,
+ _("gdb.MICommand.installed must be set to a bool, not %s"),
+ newvalue == Py_None ? "None" : Py_TYPE(newvalue)->tp_name);
+ return -1;
+ }
+
+ bool installed_p = newvalue == Py_True;
+
if (installed_p == (micmd_obj->mi_command != nullptr))
return 0;
"\\^error,msg=\"Undefined MI command: abc\",code=\"undefined-command\"" \
"-abc str, but now the command is gone"
+mi_gdb_test "python cmd.installed = None" \
+ ".*\r\n\\^error,msg=\"Error occurred in Python: gdb\\.MICommand\\.installed must be set to a bool, not None\"" \
+ "re-install the mi command using value None"
+
+mi_gdb_test "python cmd.installed = 1" \
+ ".*\r\n\\^error,msg=\"Error occurred in Python: gdb\\.MICommand\\.installed must be set to a bool, not int\"" \
+ "re-install the mi command using an int value"
+
+mi_gdb_test "python print(cmd.installed)" \
+ [multi_line \
+ ".*" \
+ "~\"False\\\\n\"" \
+ "\\^done"] \
+ "cmd is still not installed"
+
mi_gdb_test "python cmd.installed = True" \
".*\\^done" \
"re-install the mi command"