aboutsummaryrefslogtreecommitdiff
path: root/gdb/python/py-unwind.c
diff options
context:
space:
mode:
authorPedro Alves <pedro@palves.net>2023-11-09 20:44:12 +0000
committerPedro Alves <pedro@palves.net>2023-12-20 20:04:04 +0000
commitd5cebea18e7a9a927f4dd4915d093feb7df0e029 (patch)
tree47a2f86caa6eb4d5ca55b28fd4181087e5ea2eef /gdb/python/py-unwind.c
parent5ac2d81b64af547cd7ac7251e9180730348572ad (diff)
downloadbinutils-d5cebea18e7a9a927f4dd4915d093feb7df0e029.zip
binutils-d5cebea18e7a9a927f4dd4915d093feb7df0e029.tar.gz
binutils-d5cebea18e7a9a927f4dd4915d093feb7df0e029.tar.bz2
Make cached_reg_t own its data
struct cached_reg_t owns its data buffer, but currently that is managed manually. Convert it to use a unique_xmalloc_ptr. Approved-By: Tom Tromey <tom@tromey.com> Change-Id: I05a107098b717299e76de76aaba00d7fbaeac77b
Diffstat (limited to 'gdb/python/py-unwind.c')
-rw-r--r--gdb/python/py-unwind.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c
index f1162f2..31b74c6 100644
--- a/gdb/python/py-unwind.c
+++ b/gdb/python/py-unwind.c
@@ -785,7 +785,7 @@ pyuw_prev_register (frame_info_ptr this_frame, void **cache_ptr,
for (; reg_info < reg_info_end; ++reg_info)
{
if (regnum == reg_info->num)
- return frame_unwind_got_bytes (this_frame, regnum, reg_info->data);
+ return frame_unwind_got_bytes (this_frame, regnum, reg_info->data.get ());
}
return frame_unwind_got_optimized (this_frame, regnum);
@@ -903,15 +903,14 @@ pyuw_sniffer (const struct frame_unwind *self, frame_info_ptr this_frame,
struct value *value = value_object_to_value (reg->value.get ());
size_t data_size = register_size (gdbarch, reg->number);
- cached_frame->reg[i].num = reg->number;
-
/* `value' validation was done before, just assert. */
gdb_assert (value != NULL);
gdb_assert (data_size == value->type ()->length ());
- cached_frame->reg[i].data = (gdb_byte *) xmalloc (data_size);
- memcpy (cached_frame->reg[i].data,
- value->contents ().data (), data_size);
+ cached_reg_t *cached = new (&cached_frame->reg[i]) cached_reg_t ();
+ cached->num = reg->number;
+ cached->data.reset ((gdb_byte *) xmalloc (data_size));
+ memcpy (cached->data.get (), value->contents ().data (), data_size);
}
}
@@ -928,7 +927,7 @@ pyuw_dealloc_cache (frame_info *this_frame, void *cache)
cached_frame_info *cached_frame = (cached_frame_info *) cache;
for (int i = 0; i < cached_frame->reg_count; i++)
- xfree (cached_frame->reg[i].data);
+ cached_frame->reg[i].~cached_reg_t ();
xfree (cache);
}