diff options
author | Simon Marchi <simon.marchi@efficios.com> | 2024-02-19 13:07:47 -0500 |
---|---|---|
committer | Simon Marchi <simon.marchi@efficios.com> | 2024-02-20 10:42:25 -0500 |
commit | 8480a37e146c40e82a93c0ecf6144571516c95c5 (patch) | |
tree | bfa5d1e14e5212821ee29ae5099be72399137036 /gdb/python | |
parent | 1b2c120daf9e2d935453f9051bbeafbac7f9f14d (diff) | |
download | binutils-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.h | 2 | ||||
-rw-r--r-- | gdb/python/py-frame.c | 2 | ||||
-rw-r--r-- | gdb/python/py-framefilter.c | 14 | ||||
-rw-r--r-- | gdb/python/py-inferior.c | 2 | ||||
-rw-r--r-- | gdb/python/py-infevents.c | 4 | ||||
-rw-r--r-- | gdb/python/py-unwind.c | 6 | ||||
-rw-r--r-- | gdb/python/python-internal.h | 4 |
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 (®ister_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 *); |