appropriate Python exception set, and EXT_LANG_BT_OK on success. */
static enum ext_lang_bt_status
-extract_sym (PyObject *obj, char **name, struct symbol **sym,
- struct block **sym_block, const struct language_defn **language)
+extract_sym (PyObject *obj, gdb::unique_xmalloc_ptr<char> *name,
+ struct symbol **sym, struct block **sym_block,
+ const struct language_defn **language)
{
PyObject *result = PyObject_CallMethod (obj, "symbol", NULL);
/* Duplicate the symbol name, so the caller has consistency
in garbage collection. */
- *name = xstrdup (SYMBOL_PRINT_NAME (*sym));
+ name->reset (xstrdup (SYMBOL_PRINT_NAME (*sym)));
/* If a symbol is specified attempt to determine the language
from the symbol. If mode is not "auto", then the language
TRY
{
- struct type *type;
struct ui_file *stb;
struct cleanup *cleanup;
stb = mem_fileopen ();
cleanup = make_cleanup_ui_file_delete (stb);
- type = check_typedef (value_type (val));
+ check_typedef (value_type (val));
type_print (value_type (val), "", stb, -1);
ui_out_field_stream (out, "type", stb);
do_cleanups (cleanup);
while (item)
{
const struct language_defn *language;
- char *sym_name;
+ gdb::unique_xmalloc_ptr<char> sym_name;
struct symbol *sym;
struct block *sym_block;
struct value *val;
success = extract_value (item, &val);
if (success == EXT_LANG_BT_ERROR)
{
- xfree (sym_name);
Py_DECREF (item);
goto error;
}
if (sym && ui_out_is_mi_like_p (out)
&& ! mi_should_print (sym, MI_PRINT_ARGS))
- {
- xfree (sym_name);
- continue;
- }
+ continue;
/* If the object did not provide a value, read it using
read_frame_args and account for entry values, if any. */
{
PyErr_SetString (PyExc_RuntimeError,
_("No symbol or value provided."));
- xfree (sym_name);
goto error;
}
}
CATCH (except, RETURN_MASK_ALL)
{
- xfree (sym_name);
gdbpy_convert_exception (except);
goto error;
}
{
xfree (arg.error);
xfree (entryarg.error);
- xfree (sym_name);
goto error;
}
}
{
xfree (arg.error);
xfree (entryarg.error);
- xfree (sym_name);
gdbpy_convert_exception (except);
goto error;
}
{
xfree (arg.error);
xfree (entryarg.error);
- xfree (sym_name);
goto error;
}
}
/* If the object has provided a value, we just print that. */
if (val != NULL)
{
- if (py_print_single_arg (out, sym_name, NULL, val, &opts,
+ if (py_print_single_arg (out, sym_name.get (), NULL, val, &opts,
args_type, print_args_field,
language) == EXT_LANG_BT_ERROR)
- {
- xfree (sym_name);
- goto error;
- }
+ goto error;
}
}
- xfree (sym_name);
-
/* Collect the next item from the iterator. If
this is the last item, do not print the
comma. */
while ((item = PyIter_Next (iter)))
{
const struct language_defn *language;
- char *sym_name;
+ gdb::unique_xmalloc_ptr<char> sym_name;
struct value *val;
enum ext_lang_bt_status success = EXT_LANG_BT_ERROR;
struct symbol *sym;
goto error;
}
- make_cleanup (xfree, sym_name);
-
success = extract_value (item, &val);
if (success == EXT_LANG_BT_ERROR)
{
ui_out_spaces (out, local_indent);
}
- ui_out_field_string (out, "name", sym_name);
+ ui_out_field_string (out, "name", sym_name.get ());
if (! ui_out_is_mi_like_p (out))
ui_out_text (out, " = ");
struct value_print_options opts;
PyObject *py_inf_frame;
int print_level, print_frame_info, print_args, print_locals;
+ gdb::unique_xmalloc_ptr<char> function_to_free;
/* Extract print settings from FLAGS. */
print_level = (flags & PRINT_LEVEL) ? 1 : 0;
if (paddr != Py_None)
{
- address = PyLong_AsLong (paddr);
+ if (get_addr_from_python (paddr, &address) < 0)
+ {
+ Py_DECREF (paddr);
+ do_cleanups (cleanup_stack);
+ return EXT_LANG_BT_ERROR;
+ }
+
has_addr = 1;
}
Py_DECREF (paddr);
if (gdbpy_is_string (py_func))
{
- char *function_to_free;
-
- function = function_to_free =
- python_string_to_host_string (py_func);
+ function_to_free = python_string_to_host_string (py_func);
- if (function == NULL)
+ if (function_to_free == NULL)
{
do_cleanups (cleanup_stack);
return EXT_LANG_BT_ERROR;
}
- make_cleanup (xfree, function_to_free);
+
+ function = function_to_free.get ();
}
else if (PyLong_Check (py_func))
{
- CORE_ADDR addr = PyLong_AsUnsignedLongLong (py_func);
+ CORE_ADDR addr;
struct bound_minimal_symbol msymbol;
- if (PyErr_Occurred ())
+ if (get_addr_from_python (py_func, &addr) < 0)
{
do_cleanups (cleanup_stack);
return EXT_LANG_BT_ERROR;
if (py_fn != Py_None)
{
- char *filename = python_string_to_host_string (py_fn);
+ gdb::unique_xmalloc_ptr<char>
+ filename (python_string_to_host_string (py_fn));
if (filename == NULL)
{
return EXT_LANG_BT_ERROR;
}
- make_cleanup (xfree, filename);
TRY
{
ui_out_wrap_hint (out, " ");
ui_out_text (out, " at ");
annotate_frame_source_file ();
- ui_out_field_string (out, "file", filename);
+ ui_out_field_string (out, "file", filename.get ());
annotate_frame_source_file_end ();
}
CATCH (except, RETURN_MASK_ERROR)
if (py_line != Py_None)
{
line = PyLong_AsLong (py_line);
+ if (PyErr_Occurred ())
+ {
+ do_cleanups (cleanup_stack);
+ return EXT_LANG_BT_ERROR;
+ }
+
TRY
{
ui_out_text (out, ":");