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);
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);
}
}
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);
}
struct cached_reg_t
{
int num;
- gdb_byte *data;
+ gdb::unique_xmalloc_ptr<gdb_byte> data;
+
+ cached_reg_t () = default;
+ cached_reg_t (cached_reg_t &&rhs) = default;
};
/* Buffer of registers. */
struct stop_reply : public notif_event
{
- ~stop_reply ();
-
/* The identifier of the thread about this event */
ptid_t ptid;
return 0;
}
-stop_reply::~stop_reply ()
-{
- for (cached_reg_t ® : regcache)
- xfree (reg.data);
-}
-
static notif_event_up
remote_notif_stop_alloc_reply ()
{
hex_string (pnum), p, buf);
cached_reg.num = reg->regnum;
- cached_reg.data = (gdb_byte *)
- xmalloc (register_size (event->arch, reg->regnum));
+ cached_reg.data.reset ((gdb_byte *)
+ xmalloc (register_size (event->arch,
+ reg->regnum)));
p = p1 + 1;
- fieldsize = hex2bin (p, cached_reg.data,
+ fieldsize = hex2bin (p, cached_reg.data.get (),
register_size (event->arch, reg->regnum));
p += 2 * fieldsize;
if (fieldsize < register_size (event->arch, reg->regnum))
warning (_("Remote reply is too short: %s"), buf);
- event->regcache.push_back (cached_reg);
+ event->regcache.push_back (std::move (cached_reg));
}
else
{
stop_reply->arch);
for (cached_reg_t ® : stop_reply->regcache)
- {
- regcache->raw_supply (reg.num, reg.data);
- xfree (reg.data);
- }
-
- stop_reply->regcache.clear ();
+ regcache->raw_supply (reg.num, reg.data.get ());
}
remote_thread_info *remote_thr = get_remote_thread_info (this, ptid);