From: Andrew Burgess <aburgess@redhat.com>
To: Simon Marchi <simon.marchi@efficios.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH] gdb/python: remove gdb._mi_commands dict
Date: Fri, 18 Mar 2022 22:44:31 +0000 [thread overview]
Message-ID: <20220318224431.GS1212730@redhat.com> (raw)
In-Reply-To: <20220318195526.1263787-1-simon.marchi@efficios.com>
* Simon Marchi via Gdb-patches <gdb-patches@sourceware.org> [2022-03-18 15:55:26 -0400]:
> The motivation for this patch is the fact that py-micmd.c doesn't build
> with Python 2, due to PyDict_GetItemWithError being a Python 3-only
> function:
>
> CXX python/py-micmd.o
> /home/smarchi/src/binutils-gdb/gdb/python/py-micmd.c: In function ‘int micmdpy_uninstall_command(micmdpy_object*)’:
> /home/smarchi/src/binutils-gdb/gdb/python/py-micmd.c:430:20: error: ‘PyDict_GetItemWithError’ was not declared in this scope; did you mean ‘PyDict_GetItemString’?
> 430 | PyObject *curr = PyDict_GetItemWithError (mi_cmd_dict.get (),
> | ^~~~~~~~~~~~~~~~~~~~~~~
> | PyDict_GetItemString
>
> A first solution to fix this would be to try to replace
> PyDict_GetItemWithError equivalent Python 2 code. But I looked at why
> we are doing this in the first place: it is to maintain the
> `gdb._mi_commands` Python dictionary that we use as a `name ->
> gdb.MICommand object` map. Since the `gdb._mi_commands` dictionary is
> never actually used in Python, it seems like a lot of trouble to use a
> Python object for this.
>
> My first idea was to replace it with a C++ map
> (std::unordered_map<std::string, gdbpy_ref<micmdpy_object>>). While
> implementing this, I realized we don't really need this map at all. The
> mi_command_py objects registered in the main MI command table can own
> their backing micmdpy_object (that's a gdb.MICommand, but seen from the
> C++ code). To know whether an mi_command is an mi_command_py, we can
> use a dynamic cast. Since there's one less data structure to maintain,
> there are less chances of messing things up.
>
> - Change mi_command_py::m_pyobj to a gdbpy_ref, the mi_command_py is
> now what keeps the MICommand alive.
> - Set micmdpy_object::mi_command in the constructor of mi_command_py.
> If mi_command_py manages setting/clearing that field in
> swap_python_object, I think it makes sense that it also takes care of
> setting it initially.
> - Move a bunch of checks from micmdpy_install_command to
> swap_python_object, and make them gdb_asserts.
> - In micmdpy_install_command, start by doing an mi_cmd_lookup. This is
> needed to know whether there's a Python MI command already registered
> with that name. But we can already tell if there's a non-Python
> command registered with that name. Return an error if that happens,
> rather than waiting for insert_mi_cmd_entry to fail. Change the
> error message to "name is already in use" rather than "may already be
> in use", since it's more precise.
This all looks good to me. I think the small patch below should also
be included though.
Thanks,
Andrew
---
diff --git a/gdb/python/py-micmd.c b/gdb/python/py-micmd.c
index 18a199de6b9..9b2b7863827 100644
--- a/gdb/python/py-micmd.c
+++ b/gdb/python/py-micmd.c
@@ -579,11 +579,10 @@ micmdpy_dealloc (PyObject *obj)
(cmd->mi_command_name == nullptr
? "(null)" : cmd->mi_command_name));
- /* Remove the command from the MI command table if needed. This will
- cause the mi_command_py object to be deleted, which, in turn, will
- clear the cmd->mi_command member variable, hence the assert. */
- if (cmd->mi_command != nullptr)
- remove_mi_cmd_entry (cmd->mi_command->name ());
+ /* As the mi_command_py object holds a reference to the micmdpy_object,
+ the only way the dealloc function can be called is if he mi_command_py
+ object has been deleted, in which case the following assert will
+ hold. */
gdb_assert (cmd->mi_command == nullptr);
/* Free the memory that holds the command name. */
next prev parent reply other threads:[~2022-03-18 22:44 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-18 19:55 Simon Marchi
2022-03-18 22:44 ` Andrew Burgess [this message]
2022-03-19 0:29 ` Simon Marchi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220318224431.GS1212730@redhat.com \
--to=aburgess@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=simon.marchi@efficios.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).