struct pending_frame_object : public PyObject
{
- /* Frame we are unwinding. */
- frame_info_ptr frame_info;
+ /* Frame we are unwinding. We cannot place a frame_info_ptr
+ directly within this struct as it is not trivially default
+ constructable. */
+ frame_info_ptr *frame_info;
/* Its architecture, passed by the sniffer caller. */
struct gdbarch *gdbarch;
};
+static_assert (gdb::is_python_allocatable_v<pending_frame_object>);
+
/* Saved registers array item. */
struct saved_reg
unwind_info_object *unwind_info = (unwind_info_object *) self;
pending_frame_object *pending_frame
= (pending_frame_object *) (unwind_info->pending_frame);
- frame_info_ptr frame = pending_frame->frame_info;
- if (frame == nullptr)
+ if (pending_frame->frame_info == nullptr)
return PyUnicode_FromFormat ("<%s for an invalid frame>",
gdbpy_py_obj_tp_name (self));
saved_reg_names = (saved_reg_names + ", ") + name;
}
+ const frame_info_ptr &frame (*pending_frame->frame_info);
return PyUnicode_FromFormat ("<%s frame #%d, saved_regs=(%s)>",
gdbpy_py_obj_tp_name (self),
frame_relative_level (frame),
if (regnum >= gdbarch_num_cooked_regs (pending_frame->gdbarch))
{
struct value *user_reg_value
- = value_of_user_reg (regnum, pending_frame->frame_info);
+ = value_of_user_reg (regnum, *pending_frame->frame_info);
if (user_reg_value->lval () == lval_register)
regnum = user_reg_value->regnum ();
if (regnum >= gdbarch_num_cooked_regs (pending_frame->gdbarch))
static PyObject *
pending_framepy_str (PyObject *self)
{
- frame_info_ptr frame = ((pending_frame_object *) self)->frame_info;
+ pending_frame_object *pending_frame = (pending_frame_object *) self;
const char *sp_str = NULL;
const char *pc_str = NULL;
- if (frame == NULL)
+ if (pending_frame->frame_info == nullptr)
return PyUnicode_FromString ("Stale PendingFrame instance");
try
{
+ const frame_info_ptr &frame (*pending_frame->frame_info);
sp_str = core_addr_to_string_nz (get_frame_sp (frame));
pc_str = core_addr_to_string_nz (get_frame_pc (frame));
}
pending_framepy_repr (PyObject *self)
{
pending_frame_object *pending_frame = (pending_frame_object *) self;
- frame_info_ptr frame = pending_frame->frame_info;
- if (frame == nullptr)
+ if (pending_frame->frame_info == nullptr)
return gdb_py_invalid_object_repr (self);
const char *sp_str = nullptr;
const char *pc_str = nullptr;
+ const frame_info_ptr &frame (*pending_frame->frame_info);
+
try
{
sp_str = core_addr_to_string_nz (get_frame_sp (frame));
get_frame_register_value() was used here, which did not
handle the user register case. */
value *val = value_of_register
- (regnum, get_next_frame_sentinel_okay (pending_frame->frame_info));
+ (regnum, get_next_frame_sentinel_okay (*pending_frame->frame_info));
if (val == NULL)
PyErr_Format (PyExc_ValueError,
"Cannot read register %d from frame.",
if (pending_frame->frame_info == nullptr)
return py_false ().release ();
+ /* The frame_info field should never point at an uninitialized
+ object. */
+ gdb_assert (*pending_frame->frame_info != nullptr);
+
return py_true ().release ();
}
try
{
enum language lang;
- frame_info_ptr frame = pending_frame->frame_info;
+ const frame_info_ptr &frame = *pending_frame->frame_info;
name = find_frame_funname (frame, &lang, nullptr);
}
try
{
- pc = get_frame_pc (pending_frame->frame_info);
+ pc = get_frame_pc (*pending_frame->frame_info);
}
catch (const gdb_exception &except)
{
try
{
- frame_info_ptr fi = pending_frame->frame_info;
+ const frame_info_ptr &fi (*pending_frame->frame_info);
enum language lang = get_frame_language (fi);
const language_defn *lang_def = language_def (lang);
try
{
- frame_info_ptr frame = pending_frame->frame_info;
+ const frame_info_ptr &frame (*pending_frame->frame_info);
symtab_and_line sal = find_frame_sal (frame);
return symtab_and_line_to_sal_object (sal).release ();
PENDING_FRAMEPY_REQUIRE_VALID (pending_frame);
- frame_info_ptr frame = pending_frame->frame_info;
+ const frame_info_ptr &frame (*pending_frame->frame_info);
const struct block *block = nullptr, *fn_block;
try
try
{
enum language funlang;
- frame_info_ptr frame = pending_frame->frame_info;
+ const frame_info_ptr &frame (*pending_frame->frame_info);
gdb::unique_xmalloc_ptr<char> funname
= find_frame_funname (frame, &funlang, &sym);
PENDING_FRAMEPY_REQUIRE_VALID (pending_frame);
- int level = frame_relative_level (pending_frame->frame_info);
+ int level = frame_relative_level (*pending_frame->frame_info);
return gdb_py_object_from_longest (level).release ();
}
return 0;
}
pfo->gdbarch = gdbarch;
- pfo->frame_info = nullptr;
- scoped_restore invalidate_frame = make_scoped_restore (&pfo->frame_info,
- this_frame);
+ pfo->frame_info = new frame_info_ptr (this_frame);
+ SCOPE_EXIT
+ {
+ delete pfo->frame_info;
+ pfo->frame_info = nullptr;
+ };
/* Run unwinders. */
if (gdb_python_module == NULL