aboutsummaryrefslogtreecommitdiff
path: root/gdb/python
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@efficios.com>2024-02-19 13:07:47 -0500
committerSimon Marchi <simon.marchi@efficios.com>2024-02-20 10:42:25 -0500
commit8480a37e146c40e82a93c0ecf6144571516c95c5 (patch)
treebfa5d1e14e5212821ee29ae5099be72399137036 /gdb/python
parent1b2c120daf9e2d935453f9051bbeafbac7f9f14d (diff)
downloadbinutils-8480a37e146c40e82a93c0ecf6144571516c95c5.zip
binutils-8480a37e146c40e82a93c0ecf6144571516c95c5.tar.gz
binutils-8480a37e146c40e82a93c0ecf6144571516c95c5.tar.bz2
gdb: pass frames as `const frame_info_ptr &`
We currently pass frames to function by value, as `frame_info_ptr`. This is somewhat expensive: - the size of `frame_info_ptr` is 64 bytes, which is a bit big to pass by value - the constructors and destructor link/unlink the object in the global `frame_info_ptr::frame_list` list. This is an `intrusive_list`, so it's not so bad: it's just assigning a few points, there's no memory allocation as if it was `std::list`, but still it's useless to do that over and over. As suggested by Tom Tromey, change many function signatures to accept `const frame_info_ptr &` instead of `frame_info_ptr`. Some functions reassign their `frame_info_ptr` parameter, like: void the_func (frame_info_ptr frame) { for (; frame != nullptr; frame = get_prev_frame (frame)) { ... } } I wondered what to do about them, do I leave them as-is or change them (and need to introduce a separate local variable that can be re-assigned). I opted for the later for consistency. It might not be clear why some functions take `const frame_info_ptr &` while others take `frame_info_ptr`. Also, if a function took a `frame_info_ptr` because it did re-assign its parameter, I doubt that we would think to change it to `const frame_info_ptr &` should the implementation change such that it doesn't need to take `frame_info_ptr` anymore. It seems better to have a simple rule and apply it everywhere. Change-Id: I59d10addef687d157f82ccf4d54f5dde9a963fd0 Approved-By: Andrew Burgess <aburgess@redhat.com>
Diffstat (limited to 'gdb/python')
-rw-r--r--gdb/python/py-event.h2
-rw-r--r--gdb/python/py-frame.c2
-rw-r--r--gdb/python/py-framefilter.c14
-rw-r--r--gdb/python/py-inferior.c2
-rw-r--r--gdb/python/py-infevents.c4
-rw-r--r--gdb/python/py-unwind.c6
-rw-r--r--gdb/python/python-internal.h4
7 files changed, 17 insertions, 17 deletions
diff --git a/gdb/python/py-event.h b/gdb/python/py-event.h
index 30dd054..388c513 100644
--- a/gdb/python/py-event.h
+++ b/gdb/python/py-event.h
@@ -55,7 +55,7 @@ enum inferior_call_kind
extern int emit_inferior_call_event (inferior_call_kind kind,
ptid_t thread, CORE_ADDR addr);
-extern int emit_register_changed_event (frame_info_ptr frame,
+extern int emit_register_changed_event (const frame_info_ptr &frame,
int regnum);
extern int emit_memory_changed_event (CORE_ADDR addr, ssize_t len);
extern int evpy_emit_event (PyObject *event,
diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c
index a1061fc..7467f84 100644
--- a/gdb/python/py-frame.c
+++ b/gdb/python/py-frame.c
@@ -361,7 +361,7 @@ frapy_function (PyObject *self, PyObject *args)
Sets a Python exception and returns NULL on error. */
PyObject *
-frame_info_to_frame_object (frame_info_ptr frame)
+frame_info_to_frame_object (const frame_info_ptr &frame)
{
gdbpy_ref<frame_object> frame_obj (PyObject_New (frame_object,
&frame_object_type));
diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c
index fd2757d..768e3a6 100644
--- a/gdb/python/py-framefilter.c
+++ b/gdb/python/py-framefilter.c
@@ -416,7 +416,7 @@ enumerate_args (PyObject *iter,
enum ext_lang_frame_args args_type,
bool raw_frame_args,
int print_args_field,
- frame_info_ptr frame)
+ const frame_info_ptr &frame)
{
struct value_print_options opts;
@@ -548,7 +548,7 @@ enumerate_locals (PyObject *iter,
int indent,
enum ext_lang_frame_args args_type,
int print_args_field,
- frame_info_ptr frame)
+ const frame_info_ptr &frame)
{
struct value_print_options opts;
@@ -636,7 +636,7 @@ static enum ext_lang_bt_status
py_mi_print_variables (PyObject *filter, struct ui_out *out,
struct value_print_options *opts,
enum ext_lang_frame_args args_type,
- frame_info_ptr frame,
+ const frame_info_ptr &frame,
bool raw_frame_args_p)
{
gdbpy_ref<> args_iter (get_py_iter_from_func (filter, "frame_args"));
@@ -671,7 +671,7 @@ py_print_locals (PyObject *filter,
struct ui_out *out,
enum ext_lang_frame_args args_type,
int indent,
- frame_info_ptr frame)
+ const frame_info_ptr &frame)
{
gdbpy_ref<> locals_iter (get_py_iter_from_func (filter, "frame_locals"));
if (locals_iter == NULL)
@@ -697,7 +697,7 @@ py_print_args (PyObject *filter,
struct ui_out *out,
enum ext_lang_frame_args args_type,
bool raw_frame_args,
- frame_info_ptr frame)
+ const frame_info_ptr &frame)
{
gdbpy_ref<> args_iter (get_py_iter_from_func (filter, "frame_args"));
if (args_iter == NULL)
@@ -1082,7 +1082,7 @@ py_print_frame (PyObject *filter, frame_filter_flags flags,
frame FRAME. */
static PyObject *
-bootstrap_python_frame_filters (frame_info_ptr frame,
+bootstrap_python_frame_filters (const frame_info_ptr &frame,
int frame_low, int frame_high)
{
gdbpy_ref<> frame_obj (frame_info_to_frame_object (frame));
@@ -1137,7 +1137,7 @@ bootstrap_python_frame_filters (frame_info_ptr frame,
enum ext_lang_bt_status
gdbpy_apply_frame_filter (const struct extension_language_defn *extlang,
- frame_info_ptr frame, frame_filter_flags flags,
+ const frame_info_ptr &frame, frame_filter_flags flags,
enum ext_lang_frame_args args_type,
struct ui_out *out, int frame_low, int frame_high)
{
diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c
index 834f727..caf6c1b 100644
--- a/gdb/python/py-inferior.c
+++ b/gdb/python/py-inferior.c
@@ -159,7 +159,7 @@ python_on_memory_change (struct inferior *inferior, CORE_ADDR addr, ssize_t len,
command). */
static void
-python_on_register_change (frame_info_ptr frame, int regnum)
+python_on_register_change (const frame_info_ptr &frame, int regnum)
{
gdbpy_enter enter_py (current_inferior ()->arch ());
diff --git a/gdb/python/py-infevents.c b/gdb/python/py-infevents.c
index 39677af..8a15085 100644
--- a/gdb/python/py-infevents.c
+++ b/gdb/python/py-infevents.c
@@ -62,7 +62,7 @@ create_inferior_call_event_object (inferior_call_kind flag, ptid_t ptid,
register number. */
static gdbpy_ref<>
-create_register_changed_event_object (frame_info_ptr frame,
+create_register_changed_event_object (const frame_info_ptr &frame,
int regnum)
{
gdbpy_ref<> event = create_event_object (&register_changed_event_object_type);
@@ -151,7 +151,7 @@ emit_memory_changed_event (CORE_ADDR addr, ssize_t len)
will create a new Python register changed event object. */
int
-emit_register_changed_event (frame_info_ptr frame, int regnum)
+emit_register_changed_event (const frame_info_ptr &frame, int regnum)
{
if (evregpy_no_listeners_p (gdb_py_events.register_changed))
return 0;
diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c
index c55b5aa..56f925b 100644
--- a/gdb/python/py-unwind.c
+++ b/gdb/python/py-unwind.c
@@ -769,7 +769,7 @@ pending_framepy_level (PyObject *self, PyObject *args)
/* frame_unwind.this_id method. */
static void
-pyuw_this_id (frame_info_ptr this_frame, void **cache_ptr,
+pyuw_this_id (const frame_info_ptr &this_frame, void **cache_ptr,
struct frame_id *this_id)
{
*this_id = ((cached_frame_info *) *cache_ptr)->frame_id;
@@ -779,7 +779,7 @@ pyuw_this_id (frame_info_ptr this_frame, void **cache_ptr,
/* frame_unwind.prev_register. */
static struct value *
-pyuw_prev_register (frame_info_ptr this_frame, void **cache_ptr,
+pyuw_prev_register (const frame_info_ptr &this_frame, void **cache_ptr,
int regnum)
{
PYUW_SCOPED_DEBUG_ENTER_EXIT;
@@ -802,7 +802,7 @@ pyuw_prev_register (frame_info_ptr this_frame, void **cache_ptr,
/* Frame sniffer dispatch. */
static int
-pyuw_sniffer (const struct frame_unwind *self, frame_info_ptr this_frame,
+pyuw_sniffer (const struct frame_unwind *self, const frame_info_ptr &this_frame,
void **cache_ptr)
{
PYUW_SCOPED_DEBUG_ENTER_EXIT;
diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h
index 7c05007..c68aff5 100644
--- a/gdb/python/python-internal.h
+++ b/gdb/python/python-internal.h
@@ -384,7 +384,7 @@ extern enum ext_lang_rc gdbpy_apply_val_pretty_printer
const struct language_defn *language);
extern enum ext_lang_bt_status gdbpy_apply_frame_filter
(const struct extension_language_defn *,
- frame_info_ptr frame, frame_filter_flags flags,
+ const frame_info_ptr &frame, frame_filter_flags flags,
enum ext_lang_frame_args args_type,
struct ui_out *out, int frame_low, int frame_high);
extern void gdbpy_preserve_values (const struct extension_language_defn *,
@@ -444,7 +444,7 @@ PyObject *block_to_block_object (const struct block *block,
struct objfile *objfile);
PyObject *value_to_value_object (struct value *v);
PyObject *type_to_type_object (struct type *);
-PyObject *frame_info_to_frame_object (frame_info_ptr frame);
+PyObject *frame_info_to_frame_object (const frame_info_ptr &frame);
PyObject *symtab_to_linetable_object (PyObject *symtab);
gdbpy_ref<> pspace_to_pspace_object (struct program_space *);
PyObject *pspy_get_printers (PyObject *, void *);