2019-01-01 07:01:51 +01:00
|
|
|
/* Copyright (C) 2013-2019 Free Software Foundation, Inc.
|
2013-08-30 03:44:46 +02:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
|
|
|
|
#include "defs.h"
|
|
|
|
#include "python-internal.h"
|
|
|
|
#include "varobj.h"
|
|
|
|
#include "varobj-iter.h"
|
|
|
|
|
|
|
|
/* A dynamic varobj iterator "class" for python pretty-printed
|
|
|
|
varobjs. This inherits struct varobj_iter. */
|
|
|
|
|
|
|
|
struct py_varobj_iter
|
|
|
|
{
|
|
|
|
/* The 'base class'. */
|
|
|
|
struct varobj_iter base;
|
|
|
|
|
|
|
|
/* The python iterator returned by the printer's 'children' method,
|
|
|
|
or NULL if not available. */
|
|
|
|
PyObject *iter;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Implementation of the 'dtor' method of pretty-printed varobj
|
|
|
|
iterators. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
py_varobj_iter_dtor (struct varobj_iter *self)
|
|
|
|
{
|
|
|
|
struct py_varobj_iter *dis = (struct py_varobj_iter *) self;
|
2016-11-09 04:14:32 +01:00
|
|
|
gdbpy_enter_varobj enter_py (self->var);
|
2013-08-30 03:44:46 +02:00
|
|
|
Py_XDECREF (dis->iter);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Implementation of the 'next' method of pretty-printed varobj
|
|
|
|
iterators. */
|
|
|
|
|
|
|
|
static varobj_item *
|
|
|
|
py_varobj_iter_next (struct varobj_iter *self)
|
|
|
|
{
|
|
|
|
struct py_varobj_iter *t = (struct py_varobj_iter *) self;
|
2013-11-12 13:49:52 +01:00
|
|
|
PyObject *py_v;
|
|
|
|
varobj_item *vitem;
|
|
|
|
const char *name = NULL;
|
|
|
|
|
|
|
|
if (!gdb_python_initialized)
|
|
|
|
return NULL;
|
2013-08-30 03:44:46 +02:00
|
|
|
|
2016-11-09 04:14:32 +01:00
|
|
|
gdbpy_enter_varobj enter_py (self->var);
|
2013-08-30 03:44:46 +02:00
|
|
|
|
Turn gdbpy_ref into a template
This turns gdbpy_ref into a template class, so that it can be used to
wrap subclasses of PyObject. The default argument remains PyObject;
and this necessitated renaming uses of "gdbpy_ref" to "gdbpy_ref<>".
gdb/ChangeLog
2017-02-10 Tom Tromey <tom@tromey.com>
* python/py-ref.h (gdbpy_ref_policy): Now a template.
(gdbpy_ref): Now a template; allow subclasses of PyObject to be
used.
* python/py-arch.c, python/py-bpevent.c, python/py-breakpoint.c,
python/py-cmd.c, python/py-continueevent.c, python/py-event.c,
python/py-exitedevent.c, python/py-finishbreakpoint.c,
python/py-framefilter.c, python/py-function.c,
python/py-inferior.c, python/py-infevents.c,
python/py-linetable.c, python/py-newobjfileevent.c,
python/py-param.c, python/py-prettyprint.c, python/py-ref.h,
python/py-signalevent.c, python/py-stopevent.c,
python/py-symbol.c, python/py-threadevent.c, python/py-type.c,
python/py-unwind.c, python/py-utils.c, python/py-value.c,
python/py-varobj.c, python/py-xmethods.c, python/python.c,
varobj.c: Change gdbpy_ref to gdbpy_ref<>.
2017-02-09 21:16:36 +01:00
|
|
|
gdbpy_ref<> item (PyIter_Next (t->iter));
|
2013-08-30 03:44:46 +02:00
|
|
|
|
|
|
|
if (item == NULL)
|
|
|
|
{
|
|
|
|
/* Normal end of iteration. */
|
|
|
|
if (!PyErr_Occurred ())
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
/* If we got a memory error, just use the text as the item. */
|
|
|
|
if (PyErr_ExceptionMatches (gdbpy_gdb_memory_error))
|
|
|
|
{
|
2018-12-27 19:32:01 +01:00
|
|
|
gdbpy_err_fetch fetched_error;
|
|
|
|
gdb::unique_xmalloc_ptr<char> value_str = fetched_error.to_string ();
|
2013-08-30 03:44:46 +02:00
|
|
|
if (value_str == NULL)
|
|
|
|
{
|
|
|
|
gdbpy_print_stack ();
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2017-05-01 06:10:41 +02:00
|
|
|
std::string name_str = string_printf ("<error at %d>",
|
|
|
|
self->next_raw_index++);
|
|
|
|
item.reset (Py_BuildValue ("(ss)", name_str.c_str (),
|
|
|
|
value_str.get ()));
|
2013-08-30 03:44:46 +02:00
|
|
|
if (item == NULL)
|
|
|
|
{
|
|
|
|
gdbpy_print_stack ();
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Any other kind of error. */
|
|
|
|
gdbpy_print_stack ();
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-09 04:14:32 +01:00
|
|
|
if (!PyArg_ParseTuple (item.get (), "sO", &name, &py_v))
|
2013-11-12 13:49:52 +01:00
|
|
|
{
|
|
|
|
gdbpy_print_stack ();
|
|
|
|
error (_("Invalid item from the child list"));
|
|
|
|
}
|
|
|
|
|
Use ui_file_as_string throughout more
This replaces most of the remaining ui_file_xstrdup calls with
ui_file_as_string calls. Whenever a call was replaced, that led to a
cascade of other necessary adjustments throughout, to make the code
use std::string instead of raw pointers. And then whenever I added a
std::string as member of a struct, I needed to adjust
allocation/destruction of said struct to use new/delete instead of
xmalloc/xfree.
The stopping point was once gdb built again. These doesn't seem to be
a way to reasonably split this out further.
Maybe-not-obvious changes:
- demangle_for_lookup returns a cleanup today. To get rid of that,
and avoid unnecessary string dupping/copying, this introduces a
demangle_result_storage type that the caller instantiates and
passes to demangle_for_lookup.
- Many methods returned a "char *" to indicate that the caller owns
the memory and must free it. Those are switched to return a
std::string instead. Methods that return a "view" into some
internal string return a "const char *" instead. I.e., we only
copy/allocate when necessary.
gdb/ChangeLog:
2016-11-08 Pedro Alves <palves@redhat.com>
* ada-lang.c (ada_name_for_lookup, type_as_string): Use and return
std::string.
(type_as_string_and_cleanup): Delete.
(ada_lookup_struct_elt_type): Use type_as_string.
* ada-lang.h (ada_name_for_lookup): Now returns std::string.
* ada-varobj.c (ada_varobj_scalar_image): Return a std::string.
(ada_varobj_describe_child): Make 'child_name' and
'child_path_expr' parameters std::string pointers.
(ada_varobj_describe_struct_child, ada_varobj_describe_ptr_child):
Likewise, and use string_printf.
(ada_varobj_describe_simple_array_child)
(ada_varobj_describe_child): Likewise.
(ada_varobj_get_name_of_child, ada_varobj_get_path_expr_of_child)
(ada_varobj_get_value_image)
(ada_varobj_get_value_of_array_variable)
(ada_varobj_get_value_of_variable, ada_name_of_variable)
(ada_name_of_child, ada_path_expr_of_child)
(ada_value_of_variable): Now returns std::string. Use
string_printf.
(ada_value_of_child): Adjust.
* break-catch-throw.c (check_status_exception_catchpoint): Adjust
to use std::string.
* breakpoint.c (watch_command_1): Adjust to use std::string.
* c-lang.c (c_get_string): Adjust to use std::string.
* c-typeprint.c (print_name_maybe_canonical): Use std::string.
* c-varobj.c (varobj_is_anonymous_child): Use ==/!= std::string
operators.
(c_name_of_variable): Now returns a std::string.
(c_describe_child): The 'cname' and 'cfull_expression' output
parameters are now std::string pointers. Adjust.
(c_name_of_child, c_path_expr_of_child, c_value_of_variable)
(cplus_number_of_children): Adjust to use std::string and
string_printf.
(cplus_name_of_variable): Now returns a std::string.
(cplus_describe_child): The 'cname' and 'cfull_expression' output
parameters are now std::string pointers. Adjust.
(cplus_name_of_child, cplus_path_expr_of_child)
(cplus_value_of_variable): Now returns a std::string.
* cp-abi.c (cplus_typename_from_type_info): Return std::string.
* cp-abi.h (cplus_typename_from_type_info): Return std::string.
(struct cp_abi_ops) <get_typename_from_type_info>: Return
std::string.
* cp-support.c (inspect_type): Use std::string.
(cp_canonicalize_string_full, cp_canonicalize_string_no_typedefs)
(cp_canonicalize_string): Return std::string and adjust.
* cp-support.h (cp_canonicalize_string)
(cp_canonicalize_string_no_typedefs, cp_canonicalize_string_full):
Return std::string.
* dbxread.c (read_dbx_symtab): Use std::string.
* dwarf2read.c (dwarf2_canonicalize_name): Adjust to use std::string.
* gdbcmd.h (lookup_struct_elt_type): Adjust to use std::string.
* gnu-v3-abi.c (gnuv3_get_typeid): Use std::string.
(gnuv3_get_typename_from_type_info): Return a std::string and
adjust.
(gnuv3_get_type_from_type_info): Adjust to use std::string.
* guile/guile.c (gdbscm_execute_gdb_command): Adjust to use
std::string.
* infcmd.c (print_return_value_1): Adjust to use std::string.
* linespec.c (find_linespec_symbols): Adjust to
demangle_for_lookup API change. Use std::string.
* mi/mi-cmd-var.c (print_varobj, mi_cmd_var_set_format)
(mi_cmd_var_info_type, mi_cmd_var_info_path_expression)
(mi_cmd_var_info_expression, mi_cmd_var_evaluate_expression)
(mi_cmd_var_assign, varobj_update_one): Adjust to use std::string.
* minsyms.c (lookup_minimal_symbol): Use std::string.
* python/py-varobj.c (py_varobj_iter_next): Use new instead of
XNEW. vitem->name is a std::string now, adjust.
* rust-exp.y (convert_ast_to_type, convert_name): Adjust to use
std::string.
* stabsread.c (define_symbol): Adjust to use std::string.
* symtab.c (demangle_for_lookup): Now returns 'const char *'. Add
a demangle_result_storage parameter. Use it for storage.
(lookup_symbol_in_language)
(lookup_symbol_in_objfile_from_linkage_name): Adjust to new
demangle_for_lookup API.
* symtab.h (struct demangle_result_storage): New type.
(demangle_for_lookup): Now returns 'const char *'. Add a
demangle_result_storage parameter.
* typeprint.c (type_to_string): Return std::string and use
ui_file_as_string.
* value.h (type_to_string): Change return type to std::string.
* varobj-iter.h (struct varobj_item) <name>: Now a std::string.
(varobj_iter_delete): Use delete instead of xfree.
* varobj.c (create_child): Return std::string instead of char * in
output parameter.
(name_of_variable, name_of_child, my_value_of_variable): Return
std::string instead of char *.
(varobj_create, varobj_get_handle): Constify 'objname' parameter.
Adjust to std::string fields.
(varobj_get_objname): Return a const char * instead of a char *.
(varobj_get_expression): Return a std::string.
(varobj_list_children): Adjust to use std::string.
(varobj_get_type): Return a std::string.
(varobj_get_path_expr): Return a const char * instead of a char *.
Adjust to std::string fields.
(varobj_get_formatted_value, varobj_get_value): Return a
std::string.
(varobj_set_value): Change type of 'expression' parameter to
std::string. Use std::string.
(install_new_value): Use std::string.
(delete_variable_1): Adjust to use std::string.
(create_child): Change the 'name' parameter to a std::string
reference. Swap it into the new item's name.
(create_child_with_value): Swap item's name into the new child's
name. Use string_printf.
(new_variable): Use new instead of XNEW.
(free_variable): Don't xfree fields that are now std::string.
(name_of_variable, name_of_child): Now returns std::string.
(value_of_root): Adjust to use std::string.
(my_value_of_variable, varobj_value_get_print_value): Return
and use std::string.
(varobj_value_get_print_value): Adjust to use ui_file_as_string
and std::string.
* varobj.h (struct varobj) <name, path_expr, obj_name,
print_value>: Now std::string's.
<name_of_variable, name_of_child, path_expr_of_child,
value_of_variable>: Return std::string.
(varobj_create, varobj_get_handle): Constify 'objname' parameter.
(varobj_get_objname): Return a const char * instead of a char *.
(varobj_get_expression, varobj_get_type): Return a std::string.
(varobj_get_path_expr): Return a const char * instead of a char *.
(varobj_get_formatted_value, varobj_get_value): Return a
std::string.
(varobj_set_value): Constify 'expression' parameter.
(varobj_value_get_print_value): Return a std::string.
2016-11-08 16:26:47 +01:00
|
|
|
vitem = new varobj_item ();
|
2013-11-12 13:49:52 +01:00
|
|
|
vitem->value = convert_value_from_python (py_v);
|
|
|
|
if (vitem->value == NULL)
|
|
|
|
gdbpy_print_stack ();
|
Use ui_file_as_string throughout more
This replaces most of the remaining ui_file_xstrdup calls with
ui_file_as_string calls. Whenever a call was replaced, that led to a
cascade of other necessary adjustments throughout, to make the code
use std::string instead of raw pointers. And then whenever I added a
std::string as member of a struct, I needed to adjust
allocation/destruction of said struct to use new/delete instead of
xmalloc/xfree.
The stopping point was once gdb built again. These doesn't seem to be
a way to reasonably split this out further.
Maybe-not-obvious changes:
- demangle_for_lookup returns a cleanup today. To get rid of that,
and avoid unnecessary string dupping/copying, this introduces a
demangle_result_storage type that the caller instantiates and
passes to demangle_for_lookup.
- Many methods returned a "char *" to indicate that the caller owns
the memory and must free it. Those are switched to return a
std::string instead. Methods that return a "view" into some
internal string return a "const char *" instead. I.e., we only
copy/allocate when necessary.
gdb/ChangeLog:
2016-11-08 Pedro Alves <palves@redhat.com>
* ada-lang.c (ada_name_for_lookup, type_as_string): Use and return
std::string.
(type_as_string_and_cleanup): Delete.
(ada_lookup_struct_elt_type): Use type_as_string.
* ada-lang.h (ada_name_for_lookup): Now returns std::string.
* ada-varobj.c (ada_varobj_scalar_image): Return a std::string.
(ada_varobj_describe_child): Make 'child_name' and
'child_path_expr' parameters std::string pointers.
(ada_varobj_describe_struct_child, ada_varobj_describe_ptr_child):
Likewise, and use string_printf.
(ada_varobj_describe_simple_array_child)
(ada_varobj_describe_child): Likewise.
(ada_varobj_get_name_of_child, ada_varobj_get_path_expr_of_child)
(ada_varobj_get_value_image)
(ada_varobj_get_value_of_array_variable)
(ada_varobj_get_value_of_variable, ada_name_of_variable)
(ada_name_of_child, ada_path_expr_of_child)
(ada_value_of_variable): Now returns std::string. Use
string_printf.
(ada_value_of_child): Adjust.
* break-catch-throw.c (check_status_exception_catchpoint): Adjust
to use std::string.
* breakpoint.c (watch_command_1): Adjust to use std::string.
* c-lang.c (c_get_string): Adjust to use std::string.
* c-typeprint.c (print_name_maybe_canonical): Use std::string.
* c-varobj.c (varobj_is_anonymous_child): Use ==/!= std::string
operators.
(c_name_of_variable): Now returns a std::string.
(c_describe_child): The 'cname' and 'cfull_expression' output
parameters are now std::string pointers. Adjust.
(c_name_of_child, c_path_expr_of_child, c_value_of_variable)
(cplus_number_of_children): Adjust to use std::string and
string_printf.
(cplus_name_of_variable): Now returns a std::string.
(cplus_describe_child): The 'cname' and 'cfull_expression' output
parameters are now std::string pointers. Adjust.
(cplus_name_of_child, cplus_path_expr_of_child)
(cplus_value_of_variable): Now returns a std::string.
* cp-abi.c (cplus_typename_from_type_info): Return std::string.
* cp-abi.h (cplus_typename_from_type_info): Return std::string.
(struct cp_abi_ops) <get_typename_from_type_info>: Return
std::string.
* cp-support.c (inspect_type): Use std::string.
(cp_canonicalize_string_full, cp_canonicalize_string_no_typedefs)
(cp_canonicalize_string): Return std::string and adjust.
* cp-support.h (cp_canonicalize_string)
(cp_canonicalize_string_no_typedefs, cp_canonicalize_string_full):
Return std::string.
* dbxread.c (read_dbx_symtab): Use std::string.
* dwarf2read.c (dwarf2_canonicalize_name): Adjust to use std::string.
* gdbcmd.h (lookup_struct_elt_type): Adjust to use std::string.
* gnu-v3-abi.c (gnuv3_get_typeid): Use std::string.
(gnuv3_get_typename_from_type_info): Return a std::string and
adjust.
(gnuv3_get_type_from_type_info): Adjust to use std::string.
* guile/guile.c (gdbscm_execute_gdb_command): Adjust to use
std::string.
* infcmd.c (print_return_value_1): Adjust to use std::string.
* linespec.c (find_linespec_symbols): Adjust to
demangle_for_lookup API change. Use std::string.
* mi/mi-cmd-var.c (print_varobj, mi_cmd_var_set_format)
(mi_cmd_var_info_type, mi_cmd_var_info_path_expression)
(mi_cmd_var_info_expression, mi_cmd_var_evaluate_expression)
(mi_cmd_var_assign, varobj_update_one): Adjust to use std::string.
* minsyms.c (lookup_minimal_symbol): Use std::string.
* python/py-varobj.c (py_varobj_iter_next): Use new instead of
XNEW. vitem->name is a std::string now, adjust.
* rust-exp.y (convert_ast_to_type, convert_name): Adjust to use
std::string.
* stabsread.c (define_symbol): Adjust to use std::string.
* symtab.c (demangle_for_lookup): Now returns 'const char *'. Add
a demangle_result_storage parameter. Use it for storage.
(lookup_symbol_in_language)
(lookup_symbol_in_objfile_from_linkage_name): Adjust to new
demangle_for_lookup API.
* symtab.h (struct demangle_result_storage): New type.
(demangle_for_lookup): Now returns 'const char *'. Add a
demangle_result_storage parameter.
* typeprint.c (type_to_string): Return std::string and use
ui_file_as_string.
* value.h (type_to_string): Change return type to std::string.
* varobj-iter.h (struct varobj_item) <name>: Now a std::string.
(varobj_iter_delete): Use delete instead of xfree.
* varobj.c (create_child): Return std::string instead of char * in
output parameter.
(name_of_variable, name_of_child, my_value_of_variable): Return
std::string instead of char *.
(varobj_create, varobj_get_handle): Constify 'objname' parameter.
Adjust to std::string fields.
(varobj_get_objname): Return a const char * instead of a char *.
(varobj_get_expression): Return a std::string.
(varobj_list_children): Adjust to use std::string.
(varobj_get_type): Return a std::string.
(varobj_get_path_expr): Return a const char * instead of a char *.
Adjust to std::string fields.
(varobj_get_formatted_value, varobj_get_value): Return a
std::string.
(varobj_set_value): Change type of 'expression' parameter to
std::string. Use std::string.
(install_new_value): Use std::string.
(delete_variable_1): Adjust to use std::string.
(create_child): Change the 'name' parameter to a std::string
reference. Swap it into the new item's name.
(create_child_with_value): Swap item's name into the new child's
name. Use string_printf.
(new_variable): Use new instead of XNEW.
(free_variable): Don't xfree fields that are now std::string.
(name_of_variable, name_of_child): Now returns std::string.
(value_of_root): Adjust to use std::string.
(my_value_of_variable, varobj_value_get_print_value): Return
and use std::string.
(varobj_value_get_print_value): Adjust to use ui_file_as_string
and std::string.
* varobj.h (struct varobj) <name, path_expr, obj_name,
print_value>: Now std::string's.
<name_of_variable, name_of_child, path_expr_of_child,
value_of_variable>: Return std::string.
(varobj_create, varobj_get_handle): Constify 'objname' parameter.
(varobj_get_objname): Return a const char * instead of a char *.
(varobj_get_expression, varobj_get_type): Return a std::string.
(varobj_get_path_expr): Return a const char * instead of a char *.
(varobj_get_formatted_value, varobj_get_value): Return a
std::string.
(varobj_set_value): Constify 'expression' parameter.
(varobj_value_get_print_value): Return a std::string.
2016-11-08 16:26:47 +01:00
|
|
|
vitem->name = name;
|
2013-11-12 13:49:52 +01:00
|
|
|
|
2013-08-30 03:44:46 +02:00
|
|
|
self->next_raw_index++;
|
2013-11-12 13:49:52 +01:00
|
|
|
return vitem;
|
2013-08-30 03:44:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* The 'vtable' of pretty-printed python varobj iterators. */
|
|
|
|
|
|
|
|
static const struct varobj_iter_ops py_varobj_iter_ops =
|
|
|
|
{
|
|
|
|
py_varobj_iter_dtor,
|
|
|
|
py_varobj_iter_next
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Constructor of pretty-printed varobj iterators. VAR is the varobj
|
|
|
|
whose children the iterator will be iterating over. PYITER is the
|
|
|
|
python iterator actually responsible for the iteration. */
|
|
|
|
|
2018-09-16 15:32:23 +02:00
|
|
|
static void
|
2013-08-30 03:44:46 +02:00
|
|
|
py_varobj_iter_ctor (struct py_varobj_iter *self,
|
2018-09-16 15:32:23 +02:00
|
|
|
struct varobj *var, gdbpy_ref<> &&pyiter)
|
2013-08-30 03:44:46 +02:00
|
|
|
{
|
|
|
|
self->base.var = var;
|
|
|
|
self->base.ops = &py_varobj_iter_ops;
|
|
|
|
self->base.next_raw_index = 0;
|
2018-09-16 15:32:23 +02:00
|
|
|
self->iter = pyiter.release ();
|
2013-08-30 03:44:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Allocate and construct a pretty-printed varobj iterator. VAR is
|
|
|
|
the varobj whose children the iterator will be iterating over.
|
|
|
|
PYITER is the python iterator actually responsible for the
|
|
|
|
iteration. */
|
|
|
|
|
2018-09-16 15:32:23 +02:00
|
|
|
static struct py_varobj_iter *
|
|
|
|
py_varobj_iter_new (struct varobj *var, gdbpy_ref<> &&pyiter)
|
2013-08-30 03:44:46 +02:00
|
|
|
{
|
|
|
|
struct py_varobj_iter *self;
|
|
|
|
|
|
|
|
self = XNEW (struct py_varobj_iter);
|
2018-09-16 15:32:23 +02:00
|
|
|
py_varobj_iter_ctor (self, var, std::move (pyiter));
|
2013-08-30 03:44:46 +02:00
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Return a new pretty-printed varobj iterator suitable to iterate
|
|
|
|
over VAR's children. */
|
|
|
|
|
|
|
|
struct varobj_iter *
|
|
|
|
py_varobj_get_iterator (struct varobj *var, PyObject *printer)
|
|
|
|
{
|
|
|
|
struct py_varobj_iter *py_iter;
|
2016-11-09 00:18:24 +01:00
|
|
|
|
|
|
|
gdbpy_enter_varobj enter_py (var);
|
2013-08-30 03:44:46 +02:00
|
|
|
|
|
|
|
if (!PyObject_HasAttr (printer, gdbpy_children_cst))
|
2016-11-09 00:18:24 +01:00
|
|
|
return NULL;
|
2013-08-30 03:44:46 +02:00
|
|
|
|
Turn gdbpy_ref into a template
This turns gdbpy_ref into a template class, so that it can be used to
wrap subclasses of PyObject. The default argument remains PyObject;
and this necessitated renaming uses of "gdbpy_ref" to "gdbpy_ref<>".
gdb/ChangeLog
2017-02-10 Tom Tromey <tom@tromey.com>
* python/py-ref.h (gdbpy_ref_policy): Now a template.
(gdbpy_ref): Now a template; allow subclasses of PyObject to be
used.
* python/py-arch.c, python/py-bpevent.c, python/py-breakpoint.c,
python/py-cmd.c, python/py-continueevent.c, python/py-event.c,
python/py-exitedevent.c, python/py-finishbreakpoint.c,
python/py-framefilter.c, python/py-function.c,
python/py-inferior.c, python/py-infevents.c,
python/py-linetable.c, python/py-newobjfileevent.c,
python/py-param.c, python/py-prettyprint.c, python/py-ref.h,
python/py-signalevent.c, python/py-stopevent.c,
python/py-symbol.c, python/py-threadevent.c, python/py-type.c,
python/py-unwind.c, python/py-utils.c, python/py-value.c,
python/py-varobj.c, python/py-xmethods.c, python/python.c,
varobj.c: Change gdbpy_ref to gdbpy_ref<>.
2017-02-09 21:16:36 +01:00
|
|
|
gdbpy_ref<> children (PyObject_CallMethodObjArgs (printer, gdbpy_children_cst,
|
|
|
|
NULL));
|
2013-08-30 03:44:46 +02:00
|
|
|
if (children == NULL)
|
|
|
|
{
|
|
|
|
gdbpy_print_stack ();
|
|
|
|
error (_("Null value returned for children"));
|
|
|
|
}
|
|
|
|
|
2018-09-16 15:32:23 +02:00
|
|
|
gdbpy_ref<> iter (PyObject_GetIter (children.get ()));
|
2013-08-30 03:44:46 +02:00
|
|
|
if (iter == NULL)
|
|
|
|
{
|
|
|
|
gdbpy_print_stack ();
|
|
|
|
error (_("Could not get children iterator"));
|
|
|
|
}
|
|
|
|
|
2018-09-16 15:32:23 +02:00
|
|
|
py_iter = py_varobj_iter_new (var, std::move (iter));
|
2013-08-30 03:44:46 +02:00
|
|
|
|
|
|
|
return &py_iter->base;
|
|
|
|
}
|