xref: /dflybsd-src/contrib/gdb-7/gdb/varobj.c (revision 5796c8dc12c637f18a1740c26afd8d40ffa9b719)
1*5796c8dcSSimon Schubert /* Implementation of the GDB variable objects API.
2*5796c8dcSSimon Schubert 
3*5796c8dcSSimon Schubert    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
4*5796c8dcSSimon Schubert    2009 Free Software Foundation, Inc.
5*5796c8dcSSimon Schubert 
6*5796c8dcSSimon Schubert    This program is free software; you can redistribute it and/or modify
7*5796c8dcSSimon Schubert    it under the terms of the GNU General Public License as published by
8*5796c8dcSSimon Schubert    the Free Software Foundation; either version 3 of the License, or
9*5796c8dcSSimon Schubert    (at your option) any later version.
10*5796c8dcSSimon Schubert 
11*5796c8dcSSimon Schubert    This program is distributed in the hope that it will be useful,
12*5796c8dcSSimon Schubert    but WITHOUT ANY WARRANTY; without even the implied warranty of
13*5796c8dcSSimon Schubert    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*5796c8dcSSimon Schubert    GNU General Public License for more details.
15*5796c8dcSSimon Schubert 
16*5796c8dcSSimon Schubert    You should have received a copy of the GNU General Public License
17*5796c8dcSSimon Schubert    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18*5796c8dcSSimon Schubert 
19*5796c8dcSSimon Schubert #include "defs.h"
20*5796c8dcSSimon Schubert #include "exceptions.h"
21*5796c8dcSSimon Schubert #include "value.h"
22*5796c8dcSSimon Schubert #include "expression.h"
23*5796c8dcSSimon Schubert #include "frame.h"
24*5796c8dcSSimon Schubert #include "language.h"
25*5796c8dcSSimon Schubert #include "wrapper.h"
26*5796c8dcSSimon Schubert #include "gdbcmd.h"
27*5796c8dcSSimon Schubert #include "block.h"
28*5796c8dcSSimon Schubert #include "valprint.h"
29*5796c8dcSSimon Schubert 
30*5796c8dcSSimon Schubert #include "gdb_assert.h"
31*5796c8dcSSimon Schubert #include "gdb_string.h"
32*5796c8dcSSimon Schubert #include "gdb_regex.h"
33*5796c8dcSSimon Schubert 
34*5796c8dcSSimon Schubert #include "varobj.h"
35*5796c8dcSSimon Schubert #include "vec.h"
36*5796c8dcSSimon Schubert #include "gdbthread.h"
37*5796c8dcSSimon Schubert #include "inferior.h"
38*5796c8dcSSimon Schubert 
39*5796c8dcSSimon Schubert #if HAVE_PYTHON
40*5796c8dcSSimon Schubert #include "python/python.h"
41*5796c8dcSSimon Schubert #include "python/python-internal.h"
42*5796c8dcSSimon Schubert #else
43*5796c8dcSSimon Schubert typedef int PyObject;
44*5796c8dcSSimon Schubert #endif
45*5796c8dcSSimon Schubert 
46*5796c8dcSSimon Schubert /* Non-zero if we want to see trace of varobj level stuff.  */
47*5796c8dcSSimon Schubert 
48*5796c8dcSSimon Schubert int varobjdebug = 0;
49*5796c8dcSSimon Schubert static void
50*5796c8dcSSimon Schubert show_varobjdebug (struct ui_file *file, int from_tty,
51*5796c8dcSSimon Schubert 		  struct cmd_list_element *c, const char *value)
52*5796c8dcSSimon Schubert {
53*5796c8dcSSimon Schubert   fprintf_filtered (file, _("Varobj debugging is %s.\n"), value);
54*5796c8dcSSimon Schubert }
55*5796c8dcSSimon Schubert 
56*5796c8dcSSimon Schubert /* String representations of gdb's format codes */
57*5796c8dcSSimon Schubert char *varobj_format_string[] =
58*5796c8dcSSimon Schubert   { "natural", "binary", "decimal", "hexadecimal", "octal" };
59*5796c8dcSSimon Schubert 
60*5796c8dcSSimon Schubert /* String representations of gdb's known languages */
61*5796c8dcSSimon Schubert char *varobj_language_string[] = { "unknown", "C", "C++", "Java" };
62*5796c8dcSSimon Schubert 
63*5796c8dcSSimon Schubert /* True if we want to allow Python-based pretty-printing.  */
64*5796c8dcSSimon Schubert static int pretty_printing = 0;
65*5796c8dcSSimon Schubert 
66*5796c8dcSSimon Schubert void
67*5796c8dcSSimon Schubert varobj_enable_pretty_printing (void)
68*5796c8dcSSimon Schubert {
69*5796c8dcSSimon Schubert   pretty_printing = 1;
70*5796c8dcSSimon Schubert }
71*5796c8dcSSimon Schubert 
72*5796c8dcSSimon Schubert /* Data structures */
73*5796c8dcSSimon Schubert 
74*5796c8dcSSimon Schubert /* Every root variable has one of these structures saved in its
75*5796c8dcSSimon Schubert    varobj. Members which must be free'd are noted. */
76*5796c8dcSSimon Schubert struct varobj_root
77*5796c8dcSSimon Schubert {
78*5796c8dcSSimon Schubert 
79*5796c8dcSSimon Schubert   /* Alloc'd expression for this parent. */
80*5796c8dcSSimon Schubert   struct expression *exp;
81*5796c8dcSSimon Schubert 
82*5796c8dcSSimon Schubert   /* Block for which this expression is valid */
83*5796c8dcSSimon Schubert   struct block *valid_block;
84*5796c8dcSSimon Schubert 
85*5796c8dcSSimon Schubert   /* The frame for this expression.  This field is set iff valid_block is
86*5796c8dcSSimon Schubert      not NULL.  */
87*5796c8dcSSimon Schubert   struct frame_id frame;
88*5796c8dcSSimon Schubert 
89*5796c8dcSSimon Schubert   /* The thread ID that this varobj_root belong to.  This field
90*5796c8dcSSimon Schubert      is only valid if valid_block is not NULL.
91*5796c8dcSSimon Schubert      When not 0, indicates which thread 'frame' belongs to.
92*5796c8dcSSimon Schubert      When 0, indicates that the thread list was empty when the varobj_root
93*5796c8dcSSimon Schubert      was created.  */
94*5796c8dcSSimon Schubert   int thread_id;
95*5796c8dcSSimon Schubert 
96*5796c8dcSSimon Schubert   /* If 1, the -var-update always recomputes the value in the
97*5796c8dcSSimon Schubert      current thread and frame.  Otherwise, variable object is
98*5796c8dcSSimon Schubert      always updated in the specific scope/thread/frame  */
99*5796c8dcSSimon Schubert   int floating;
100*5796c8dcSSimon Schubert 
101*5796c8dcSSimon Schubert   /* Flag that indicates validity: set to 0 when this varobj_root refers
102*5796c8dcSSimon Schubert      to symbols that do not exist anymore.  */
103*5796c8dcSSimon Schubert   int is_valid;
104*5796c8dcSSimon Schubert 
105*5796c8dcSSimon Schubert   /* Language info for this variable and its children */
106*5796c8dcSSimon Schubert   struct language_specific *lang;
107*5796c8dcSSimon Schubert 
108*5796c8dcSSimon Schubert   /* The varobj for this root node. */
109*5796c8dcSSimon Schubert   struct varobj *rootvar;
110*5796c8dcSSimon Schubert 
111*5796c8dcSSimon Schubert   /* Next root variable */
112*5796c8dcSSimon Schubert   struct varobj_root *next;
113*5796c8dcSSimon Schubert };
114*5796c8dcSSimon Schubert 
115*5796c8dcSSimon Schubert /* Every variable in the system has a structure of this type defined
116*5796c8dcSSimon Schubert    for it. This structure holds all information necessary to manipulate
117*5796c8dcSSimon Schubert    a particular object variable. Members which must be freed are noted. */
118*5796c8dcSSimon Schubert struct varobj
119*5796c8dcSSimon Schubert {
120*5796c8dcSSimon Schubert 
121*5796c8dcSSimon Schubert   /* Alloc'd name of the variable for this object.. If this variable is a
122*5796c8dcSSimon Schubert      child, then this name will be the child's source name.
123*5796c8dcSSimon Schubert      (bar, not foo.bar) */
124*5796c8dcSSimon Schubert   /* NOTE: This is the "expression" */
125*5796c8dcSSimon Schubert   char *name;
126*5796c8dcSSimon Schubert 
127*5796c8dcSSimon Schubert   /* Alloc'd expression for this child.  Can be used to create a
128*5796c8dcSSimon Schubert      root variable corresponding to this child.  */
129*5796c8dcSSimon Schubert   char *path_expr;
130*5796c8dcSSimon Schubert 
131*5796c8dcSSimon Schubert   /* The alloc'd name for this variable's object. This is here for
132*5796c8dcSSimon Schubert      convenience when constructing this object's children. */
133*5796c8dcSSimon Schubert   char *obj_name;
134*5796c8dcSSimon Schubert 
135*5796c8dcSSimon Schubert   /* Index of this variable in its parent or -1 */
136*5796c8dcSSimon Schubert   int index;
137*5796c8dcSSimon Schubert 
138*5796c8dcSSimon Schubert   /* The type of this variable.  This can be NULL
139*5796c8dcSSimon Schubert      for artifial variable objects -- currently, the "accessibility"
140*5796c8dcSSimon Schubert      variable objects in C++.  */
141*5796c8dcSSimon Schubert   struct type *type;
142*5796c8dcSSimon Schubert 
143*5796c8dcSSimon Schubert   /* The value of this expression or subexpression.  A NULL value
144*5796c8dcSSimon Schubert      indicates there was an error getting this value.
145*5796c8dcSSimon Schubert      Invariant: if varobj_value_is_changeable_p (this) is non-zero,
146*5796c8dcSSimon Schubert      the value is either NULL, or not lazy.  */
147*5796c8dcSSimon Schubert   struct value *value;
148*5796c8dcSSimon Schubert 
149*5796c8dcSSimon Schubert   /* The number of (immediate) children this variable has */
150*5796c8dcSSimon Schubert   int num_children;
151*5796c8dcSSimon Schubert 
152*5796c8dcSSimon Schubert   /* If this object is a child, this points to its immediate parent. */
153*5796c8dcSSimon Schubert   struct varobj *parent;
154*5796c8dcSSimon Schubert 
155*5796c8dcSSimon Schubert   /* Children of this object.  */
156*5796c8dcSSimon Schubert   VEC (varobj_p) *children;
157*5796c8dcSSimon Schubert 
158*5796c8dcSSimon Schubert   /* Whether the children of this varobj were requested.  This field is
159*5796c8dcSSimon Schubert      used to decide if dynamic varobj should recompute their children.
160*5796c8dcSSimon Schubert      In the event that the frontend never asked for the children, we
161*5796c8dcSSimon Schubert      can avoid that.  */
162*5796c8dcSSimon Schubert   int children_requested;
163*5796c8dcSSimon Schubert 
164*5796c8dcSSimon Schubert   /* Description of the root variable. Points to root variable for children. */
165*5796c8dcSSimon Schubert   struct varobj_root *root;
166*5796c8dcSSimon Schubert 
167*5796c8dcSSimon Schubert   /* The format of the output for this object */
168*5796c8dcSSimon Schubert   enum varobj_display_formats format;
169*5796c8dcSSimon Schubert 
170*5796c8dcSSimon Schubert   /* Was this variable updated via a varobj_set_value operation */
171*5796c8dcSSimon Schubert   int updated;
172*5796c8dcSSimon Schubert 
173*5796c8dcSSimon Schubert   /* Last print value.  */
174*5796c8dcSSimon Schubert   char *print_value;
175*5796c8dcSSimon Schubert 
176*5796c8dcSSimon Schubert   /* Is this variable frozen.  Frozen variables are never implicitly
177*5796c8dcSSimon Schubert      updated by -var-update *
178*5796c8dcSSimon Schubert      or -var-update <direct-or-indirect-parent>.  */
179*5796c8dcSSimon Schubert   int frozen;
180*5796c8dcSSimon Schubert 
181*5796c8dcSSimon Schubert   /* Is the value of this variable intentionally not fetched?  It is
182*5796c8dcSSimon Schubert      not fetched if either the variable is frozen, or any parents is
183*5796c8dcSSimon Schubert      frozen.  */
184*5796c8dcSSimon Schubert   int not_fetched;
185*5796c8dcSSimon Schubert 
186*5796c8dcSSimon Schubert   /* Sub-range of children which the MI consumer has requested.  If
187*5796c8dcSSimon Schubert      FROM < 0 or TO < 0, means that all children have been
188*5796c8dcSSimon Schubert      requested.  */
189*5796c8dcSSimon Schubert   int from;
190*5796c8dcSSimon Schubert   int to;
191*5796c8dcSSimon Schubert 
192*5796c8dcSSimon Schubert   /* The pretty-printer constructor.  If NULL, then the default
193*5796c8dcSSimon Schubert      pretty-printer will be looked up.  If None, then no
194*5796c8dcSSimon Schubert      pretty-printer will be installed.  */
195*5796c8dcSSimon Schubert   PyObject *constructor;
196*5796c8dcSSimon Schubert 
197*5796c8dcSSimon Schubert   /* The pretty-printer that has been constructed.  If NULL, then a
198*5796c8dcSSimon Schubert      new printer object is needed, and one will be constructed.  */
199*5796c8dcSSimon Schubert   PyObject *pretty_printer;
200*5796c8dcSSimon Schubert 
201*5796c8dcSSimon Schubert   /* The iterator returned by the printer's 'children' method, or NULL
202*5796c8dcSSimon Schubert      if not available.  */
203*5796c8dcSSimon Schubert   PyObject *child_iter;
204*5796c8dcSSimon Schubert 
205*5796c8dcSSimon Schubert   /* We request one extra item from the iterator, so that we can
206*5796c8dcSSimon Schubert      report to the caller whether there are more items than we have
207*5796c8dcSSimon Schubert      already reported.  However, we don't want to install this value
208*5796c8dcSSimon Schubert      when we read it, because that will mess up future updates.  So,
209*5796c8dcSSimon Schubert      we stash it here instead.  */
210*5796c8dcSSimon Schubert   PyObject *saved_item;
211*5796c8dcSSimon Schubert };
212*5796c8dcSSimon Schubert 
213*5796c8dcSSimon Schubert struct cpstack
214*5796c8dcSSimon Schubert {
215*5796c8dcSSimon Schubert   char *name;
216*5796c8dcSSimon Schubert   struct cpstack *next;
217*5796c8dcSSimon Schubert };
218*5796c8dcSSimon Schubert 
219*5796c8dcSSimon Schubert /* A list of varobjs */
220*5796c8dcSSimon Schubert 
221*5796c8dcSSimon Schubert struct vlist
222*5796c8dcSSimon Schubert {
223*5796c8dcSSimon Schubert   struct varobj *var;
224*5796c8dcSSimon Schubert   struct vlist *next;
225*5796c8dcSSimon Schubert };
226*5796c8dcSSimon Schubert 
227*5796c8dcSSimon Schubert /* Private function prototypes */
228*5796c8dcSSimon Schubert 
229*5796c8dcSSimon Schubert /* Helper functions for the above subcommands. */
230*5796c8dcSSimon Schubert 
231*5796c8dcSSimon Schubert static int delete_variable (struct cpstack **, struct varobj *, int);
232*5796c8dcSSimon Schubert 
233*5796c8dcSSimon Schubert static void delete_variable_1 (struct cpstack **, int *,
234*5796c8dcSSimon Schubert 			       struct varobj *, int, int);
235*5796c8dcSSimon Schubert 
236*5796c8dcSSimon Schubert static int install_variable (struct varobj *);
237*5796c8dcSSimon Schubert 
238*5796c8dcSSimon Schubert static void uninstall_variable (struct varobj *);
239*5796c8dcSSimon Schubert 
240*5796c8dcSSimon Schubert static struct varobj *create_child (struct varobj *, int, char *);
241*5796c8dcSSimon Schubert 
242*5796c8dcSSimon Schubert static struct varobj *
243*5796c8dcSSimon Schubert create_child_with_value (struct varobj *parent, int index, const char *name,
244*5796c8dcSSimon Schubert 			 struct value *value);
245*5796c8dcSSimon Schubert 
246*5796c8dcSSimon Schubert /* Utility routines */
247*5796c8dcSSimon Schubert 
248*5796c8dcSSimon Schubert static struct varobj *new_variable (void);
249*5796c8dcSSimon Schubert 
250*5796c8dcSSimon Schubert static struct varobj *new_root_variable (void);
251*5796c8dcSSimon Schubert 
252*5796c8dcSSimon Schubert static void free_variable (struct varobj *var);
253*5796c8dcSSimon Schubert 
254*5796c8dcSSimon Schubert static struct cleanup *make_cleanup_free_variable (struct varobj *var);
255*5796c8dcSSimon Schubert 
256*5796c8dcSSimon Schubert static struct type *get_type (struct varobj *var);
257*5796c8dcSSimon Schubert 
258*5796c8dcSSimon Schubert static struct type *get_value_type (struct varobj *var);
259*5796c8dcSSimon Schubert 
260*5796c8dcSSimon Schubert static struct type *get_target_type (struct type *);
261*5796c8dcSSimon Schubert 
262*5796c8dcSSimon Schubert static enum varobj_display_formats variable_default_display (struct varobj *);
263*5796c8dcSSimon Schubert 
264*5796c8dcSSimon Schubert static void cppush (struct cpstack **pstack, char *name);
265*5796c8dcSSimon Schubert 
266*5796c8dcSSimon Schubert static char *cppop (struct cpstack **pstack);
267*5796c8dcSSimon Schubert 
268*5796c8dcSSimon Schubert static int install_new_value (struct varobj *var, struct value *value,
269*5796c8dcSSimon Schubert 			      int initial);
270*5796c8dcSSimon Schubert 
271*5796c8dcSSimon Schubert /* Language-specific routines. */
272*5796c8dcSSimon Schubert 
273*5796c8dcSSimon Schubert static enum varobj_languages variable_language (struct varobj *var);
274*5796c8dcSSimon Schubert 
275*5796c8dcSSimon Schubert static int number_of_children (struct varobj *);
276*5796c8dcSSimon Schubert 
277*5796c8dcSSimon Schubert static char *name_of_variable (struct varobj *);
278*5796c8dcSSimon Schubert 
279*5796c8dcSSimon Schubert static char *name_of_child (struct varobj *, int);
280*5796c8dcSSimon Schubert 
281*5796c8dcSSimon Schubert static struct value *value_of_root (struct varobj **var_handle, int *);
282*5796c8dcSSimon Schubert 
283*5796c8dcSSimon Schubert static struct value *value_of_child (struct varobj *parent, int index);
284*5796c8dcSSimon Schubert 
285*5796c8dcSSimon Schubert static char *my_value_of_variable (struct varobj *var,
286*5796c8dcSSimon Schubert 				   enum varobj_display_formats format);
287*5796c8dcSSimon Schubert 
288*5796c8dcSSimon Schubert static char *value_get_print_value (struct value *value,
289*5796c8dcSSimon Schubert 				    enum varobj_display_formats format,
290*5796c8dcSSimon Schubert 				    struct varobj *var);
291*5796c8dcSSimon Schubert 
292*5796c8dcSSimon Schubert static int varobj_value_is_changeable_p (struct varobj *var);
293*5796c8dcSSimon Schubert 
294*5796c8dcSSimon Schubert static int is_root_p (struct varobj *var);
295*5796c8dcSSimon Schubert 
296*5796c8dcSSimon Schubert static struct varobj *
297*5796c8dcSSimon Schubert varobj_add_child (struct varobj *var, const char *name, struct value *value);
298*5796c8dcSSimon Schubert 
299*5796c8dcSSimon Schubert /* C implementation */
300*5796c8dcSSimon Schubert 
301*5796c8dcSSimon Schubert static int c_number_of_children (struct varobj *var);
302*5796c8dcSSimon Schubert 
303*5796c8dcSSimon Schubert static char *c_name_of_variable (struct varobj *parent);
304*5796c8dcSSimon Schubert 
305*5796c8dcSSimon Schubert static char *c_name_of_child (struct varobj *parent, int index);
306*5796c8dcSSimon Schubert 
307*5796c8dcSSimon Schubert static char *c_path_expr_of_child (struct varobj *child);
308*5796c8dcSSimon Schubert 
309*5796c8dcSSimon Schubert static struct value *c_value_of_root (struct varobj **var_handle);
310*5796c8dcSSimon Schubert 
311*5796c8dcSSimon Schubert static struct value *c_value_of_child (struct varobj *parent, int index);
312*5796c8dcSSimon Schubert 
313*5796c8dcSSimon Schubert static struct type *c_type_of_child (struct varobj *parent, int index);
314*5796c8dcSSimon Schubert 
315*5796c8dcSSimon Schubert static char *c_value_of_variable (struct varobj *var,
316*5796c8dcSSimon Schubert 				  enum varobj_display_formats format);
317*5796c8dcSSimon Schubert 
318*5796c8dcSSimon Schubert /* C++ implementation */
319*5796c8dcSSimon Schubert 
320*5796c8dcSSimon Schubert static int cplus_number_of_children (struct varobj *var);
321*5796c8dcSSimon Schubert 
322*5796c8dcSSimon Schubert static void cplus_class_num_children (struct type *type, int children[3]);
323*5796c8dcSSimon Schubert 
324*5796c8dcSSimon Schubert static char *cplus_name_of_variable (struct varobj *parent);
325*5796c8dcSSimon Schubert 
326*5796c8dcSSimon Schubert static char *cplus_name_of_child (struct varobj *parent, int index);
327*5796c8dcSSimon Schubert 
328*5796c8dcSSimon Schubert static char *cplus_path_expr_of_child (struct varobj *child);
329*5796c8dcSSimon Schubert 
330*5796c8dcSSimon Schubert static struct value *cplus_value_of_root (struct varobj **var_handle);
331*5796c8dcSSimon Schubert 
332*5796c8dcSSimon Schubert static struct value *cplus_value_of_child (struct varobj *parent, int index);
333*5796c8dcSSimon Schubert 
334*5796c8dcSSimon Schubert static struct type *cplus_type_of_child (struct varobj *parent, int index);
335*5796c8dcSSimon Schubert 
336*5796c8dcSSimon Schubert static char *cplus_value_of_variable (struct varobj *var,
337*5796c8dcSSimon Schubert 				      enum varobj_display_formats format);
338*5796c8dcSSimon Schubert 
339*5796c8dcSSimon Schubert /* Java implementation */
340*5796c8dcSSimon Schubert 
341*5796c8dcSSimon Schubert static int java_number_of_children (struct varobj *var);
342*5796c8dcSSimon Schubert 
343*5796c8dcSSimon Schubert static char *java_name_of_variable (struct varobj *parent);
344*5796c8dcSSimon Schubert 
345*5796c8dcSSimon Schubert static char *java_name_of_child (struct varobj *parent, int index);
346*5796c8dcSSimon Schubert 
347*5796c8dcSSimon Schubert static char *java_path_expr_of_child (struct varobj *child);
348*5796c8dcSSimon Schubert 
349*5796c8dcSSimon Schubert static struct value *java_value_of_root (struct varobj **var_handle);
350*5796c8dcSSimon Schubert 
351*5796c8dcSSimon Schubert static struct value *java_value_of_child (struct varobj *parent, int index);
352*5796c8dcSSimon Schubert 
353*5796c8dcSSimon Schubert static struct type *java_type_of_child (struct varobj *parent, int index);
354*5796c8dcSSimon Schubert 
355*5796c8dcSSimon Schubert static char *java_value_of_variable (struct varobj *var,
356*5796c8dcSSimon Schubert 				     enum varobj_display_formats format);
357*5796c8dcSSimon Schubert 
358*5796c8dcSSimon Schubert /* The language specific vector */
359*5796c8dcSSimon Schubert 
360*5796c8dcSSimon Schubert struct language_specific
361*5796c8dcSSimon Schubert {
362*5796c8dcSSimon Schubert 
363*5796c8dcSSimon Schubert   /* The language of this variable */
364*5796c8dcSSimon Schubert   enum varobj_languages language;
365*5796c8dcSSimon Schubert 
366*5796c8dcSSimon Schubert   /* The number of children of PARENT. */
367*5796c8dcSSimon Schubert   int (*number_of_children) (struct varobj * parent);
368*5796c8dcSSimon Schubert 
369*5796c8dcSSimon Schubert   /* The name (expression) of a root varobj. */
370*5796c8dcSSimon Schubert   char *(*name_of_variable) (struct varobj * parent);
371*5796c8dcSSimon Schubert 
372*5796c8dcSSimon Schubert   /* The name of the INDEX'th child of PARENT. */
373*5796c8dcSSimon Schubert   char *(*name_of_child) (struct varobj * parent, int index);
374*5796c8dcSSimon Schubert 
375*5796c8dcSSimon Schubert   /* Returns the rooted expression of CHILD, which is a variable
376*5796c8dcSSimon Schubert      obtain that has some parent.  */
377*5796c8dcSSimon Schubert   char *(*path_expr_of_child) (struct varobj * child);
378*5796c8dcSSimon Schubert 
379*5796c8dcSSimon Schubert   /* The ``struct value *'' of the root variable ROOT. */
380*5796c8dcSSimon Schubert   struct value *(*value_of_root) (struct varobj ** root_handle);
381*5796c8dcSSimon Schubert 
382*5796c8dcSSimon Schubert   /* The ``struct value *'' of the INDEX'th child of PARENT. */
383*5796c8dcSSimon Schubert   struct value *(*value_of_child) (struct varobj * parent, int index);
384*5796c8dcSSimon Schubert 
385*5796c8dcSSimon Schubert   /* The type of the INDEX'th child of PARENT. */
386*5796c8dcSSimon Schubert   struct type *(*type_of_child) (struct varobj * parent, int index);
387*5796c8dcSSimon Schubert 
388*5796c8dcSSimon Schubert   /* The current value of VAR. */
389*5796c8dcSSimon Schubert   char *(*value_of_variable) (struct varobj * var,
390*5796c8dcSSimon Schubert 			      enum varobj_display_formats format);
391*5796c8dcSSimon Schubert };
392*5796c8dcSSimon Schubert 
393*5796c8dcSSimon Schubert /* Array of known source language routines. */
394*5796c8dcSSimon Schubert static struct language_specific languages[vlang_end] = {
395*5796c8dcSSimon Schubert   /* Unknown (try treating as C */
396*5796c8dcSSimon Schubert   {
397*5796c8dcSSimon Schubert    vlang_unknown,
398*5796c8dcSSimon Schubert    c_number_of_children,
399*5796c8dcSSimon Schubert    c_name_of_variable,
400*5796c8dcSSimon Schubert    c_name_of_child,
401*5796c8dcSSimon Schubert    c_path_expr_of_child,
402*5796c8dcSSimon Schubert    c_value_of_root,
403*5796c8dcSSimon Schubert    c_value_of_child,
404*5796c8dcSSimon Schubert    c_type_of_child,
405*5796c8dcSSimon Schubert    c_value_of_variable}
406*5796c8dcSSimon Schubert   ,
407*5796c8dcSSimon Schubert   /* C */
408*5796c8dcSSimon Schubert   {
409*5796c8dcSSimon Schubert    vlang_c,
410*5796c8dcSSimon Schubert    c_number_of_children,
411*5796c8dcSSimon Schubert    c_name_of_variable,
412*5796c8dcSSimon Schubert    c_name_of_child,
413*5796c8dcSSimon Schubert    c_path_expr_of_child,
414*5796c8dcSSimon Schubert    c_value_of_root,
415*5796c8dcSSimon Schubert    c_value_of_child,
416*5796c8dcSSimon Schubert    c_type_of_child,
417*5796c8dcSSimon Schubert    c_value_of_variable}
418*5796c8dcSSimon Schubert   ,
419*5796c8dcSSimon Schubert   /* C++ */
420*5796c8dcSSimon Schubert   {
421*5796c8dcSSimon Schubert    vlang_cplus,
422*5796c8dcSSimon Schubert    cplus_number_of_children,
423*5796c8dcSSimon Schubert    cplus_name_of_variable,
424*5796c8dcSSimon Schubert    cplus_name_of_child,
425*5796c8dcSSimon Schubert    cplus_path_expr_of_child,
426*5796c8dcSSimon Schubert    cplus_value_of_root,
427*5796c8dcSSimon Schubert    cplus_value_of_child,
428*5796c8dcSSimon Schubert    cplus_type_of_child,
429*5796c8dcSSimon Schubert    cplus_value_of_variable}
430*5796c8dcSSimon Schubert   ,
431*5796c8dcSSimon Schubert   /* Java */
432*5796c8dcSSimon Schubert   {
433*5796c8dcSSimon Schubert    vlang_java,
434*5796c8dcSSimon Schubert    java_number_of_children,
435*5796c8dcSSimon Schubert    java_name_of_variable,
436*5796c8dcSSimon Schubert    java_name_of_child,
437*5796c8dcSSimon Schubert    java_path_expr_of_child,
438*5796c8dcSSimon Schubert    java_value_of_root,
439*5796c8dcSSimon Schubert    java_value_of_child,
440*5796c8dcSSimon Schubert    java_type_of_child,
441*5796c8dcSSimon Schubert    java_value_of_variable}
442*5796c8dcSSimon Schubert };
443*5796c8dcSSimon Schubert 
444*5796c8dcSSimon Schubert /* A little convenience enum for dealing with C++/Java */
445*5796c8dcSSimon Schubert enum vsections
446*5796c8dcSSimon Schubert {
447*5796c8dcSSimon Schubert   v_public = 0, v_private, v_protected
448*5796c8dcSSimon Schubert };
449*5796c8dcSSimon Schubert 
450*5796c8dcSSimon Schubert /* Private data */
451*5796c8dcSSimon Schubert 
452*5796c8dcSSimon Schubert /* Mappings of varobj_display_formats enums to gdb's format codes */
453*5796c8dcSSimon Schubert static int format_code[] = { 0, 't', 'd', 'x', 'o' };
454*5796c8dcSSimon Schubert 
455*5796c8dcSSimon Schubert /* Header of the list of root variable objects */
456*5796c8dcSSimon Schubert static struct varobj_root *rootlist;
457*5796c8dcSSimon Schubert 
458*5796c8dcSSimon Schubert /* Prime number indicating the number of buckets in the hash table */
459*5796c8dcSSimon Schubert /* A prime large enough to avoid too many colisions */
460*5796c8dcSSimon Schubert #define VAROBJ_TABLE_SIZE 227
461*5796c8dcSSimon Schubert 
462*5796c8dcSSimon Schubert /* Pointer to the varobj hash table (built at run time) */
463*5796c8dcSSimon Schubert static struct vlist **varobj_table;
464*5796c8dcSSimon Schubert 
465*5796c8dcSSimon Schubert /* Is the variable X one of our "fake" children? */
466*5796c8dcSSimon Schubert #define CPLUS_FAKE_CHILD(x) \
467*5796c8dcSSimon Schubert ((x) != NULL && (x)->type == NULL && (x)->value == NULL)
468*5796c8dcSSimon Schubert 
469*5796c8dcSSimon Schubert 
470*5796c8dcSSimon Schubert /* API Implementation */
471*5796c8dcSSimon Schubert static int
472*5796c8dcSSimon Schubert is_root_p (struct varobj *var)
473*5796c8dcSSimon Schubert {
474*5796c8dcSSimon Schubert   return (var->root->rootvar == var);
475*5796c8dcSSimon Schubert }
476*5796c8dcSSimon Schubert 
477*5796c8dcSSimon Schubert #ifdef HAVE_PYTHON
478*5796c8dcSSimon Schubert /* Helper function to install a Python environment suitable for
479*5796c8dcSSimon Schubert    use during operations on VAR.  */
480*5796c8dcSSimon Schubert struct cleanup *
481*5796c8dcSSimon Schubert varobj_ensure_python_env (struct varobj *var)
482*5796c8dcSSimon Schubert {
483*5796c8dcSSimon Schubert   return ensure_python_env (var->root->exp->gdbarch,
484*5796c8dcSSimon Schubert 			    var->root->exp->language_defn);
485*5796c8dcSSimon Schubert }
486*5796c8dcSSimon Schubert #endif
487*5796c8dcSSimon Schubert 
488*5796c8dcSSimon Schubert /* Creates a varobj (not its children) */
489*5796c8dcSSimon Schubert 
490*5796c8dcSSimon Schubert /* Return the full FRAME which corresponds to the given CORE_ADDR
491*5796c8dcSSimon Schubert    or NULL if no FRAME on the chain corresponds to CORE_ADDR.  */
492*5796c8dcSSimon Schubert 
493*5796c8dcSSimon Schubert static struct frame_info *
494*5796c8dcSSimon Schubert find_frame_addr_in_frame_chain (CORE_ADDR frame_addr)
495*5796c8dcSSimon Schubert {
496*5796c8dcSSimon Schubert   struct frame_info *frame = NULL;
497*5796c8dcSSimon Schubert 
498*5796c8dcSSimon Schubert   if (frame_addr == (CORE_ADDR) 0)
499*5796c8dcSSimon Schubert     return NULL;
500*5796c8dcSSimon Schubert 
501*5796c8dcSSimon Schubert   for (frame = get_current_frame ();
502*5796c8dcSSimon Schubert        frame != NULL;
503*5796c8dcSSimon Schubert        frame = get_prev_frame (frame))
504*5796c8dcSSimon Schubert     {
505*5796c8dcSSimon Schubert       /* The CORE_ADDR we get as argument was parsed from a string GDB
506*5796c8dcSSimon Schubert 	 output as $fp.  This output got truncated to gdbarch_addr_bit.
507*5796c8dcSSimon Schubert 	 Truncate the frame base address in the same manner before
508*5796c8dcSSimon Schubert 	 comparing it against our argument.  */
509*5796c8dcSSimon Schubert       CORE_ADDR frame_base = get_frame_base_address (frame);
510*5796c8dcSSimon Schubert       int addr_bit = gdbarch_addr_bit (get_frame_arch (frame));
511*5796c8dcSSimon Schubert       if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT))
512*5796c8dcSSimon Schubert 	frame_base &= ((CORE_ADDR) 1 << addr_bit) - 1;
513*5796c8dcSSimon Schubert 
514*5796c8dcSSimon Schubert       if (frame_base == frame_addr)
515*5796c8dcSSimon Schubert 	return frame;
516*5796c8dcSSimon Schubert     }
517*5796c8dcSSimon Schubert 
518*5796c8dcSSimon Schubert   return NULL;
519*5796c8dcSSimon Schubert }
520*5796c8dcSSimon Schubert 
521*5796c8dcSSimon Schubert struct varobj *
522*5796c8dcSSimon Schubert varobj_create (char *objname,
523*5796c8dcSSimon Schubert 	       char *expression, CORE_ADDR frame, enum varobj_type type)
524*5796c8dcSSimon Schubert {
525*5796c8dcSSimon Schubert   struct varobj *var;
526*5796c8dcSSimon Schubert   struct frame_info *fi;
527*5796c8dcSSimon Schubert   struct frame_info *old_fi = NULL;
528*5796c8dcSSimon Schubert   struct block *block;
529*5796c8dcSSimon Schubert   struct cleanup *old_chain;
530*5796c8dcSSimon Schubert 
531*5796c8dcSSimon Schubert   /* Fill out a varobj structure for the (root) variable being constructed. */
532*5796c8dcSSimon Schubert   var = new_root_variable ();
533*5796c8dcSSimon Schubert   old_chain = make_cleanup_free_variable (var);
534*5796c8dcSSimon Schubert 
535*5796c8dcSSimon Schubert   if (expression != NULL)
536*5796c8dcSSimon Schubert     {
537*5796c8dcSSimon Schubert       char *p;
538*5796c8dcSSimon Schubert       enum varobj_languages lang;
539*5796c8dcSSimon Schubert       struct value *value = NULL;
540*5796c8dcSSimon Schubert 
541*5796c8dcSSimon Schubert       /* Parse and evaluate the expression, filling in as much of the
542*5796c8dcSSimon Schubert          variable's data as possible.  */
543*5796c8dcSSimon Schubert 
544*5796c8dcSSimon Schubert       if (has_stack_frames ())
545*5796c8dcSSimon Schubert 	{
546*5796c8dcSSimon Schubert 	  /* Allow creator to specify context of variable */
547*5796c8dcSSimon Schubert 	  if ((type == USE_CURRENT_FRAME) || (type == USE_SELECTED_FRAME))
548*5796c8dcSSimon Schubert 	    fi = get_selected_frame (NULL);
549*5796c8dcSSimon Schubert 	  else
550*5796c8dcSSimon Schubert 	    /* FIXME: cagney/2002-11-23: This code should be doing a
551*5796c8dcSSimon Schubert 	       lookup using the frame ID and not just the frame's
552*5796c8dcSSimon Schubert 	       ``address''.  This, of course, means an interface
553*5796c8dcSSimon Schubert 	       change.  However, with out that interface change ISAs,
554*5796c8dcSSimon Schubert 	       such as the ia64 with its two stacks, won't work.
555*5796c8dcSSimon Schubert 	       Similar goes for the case where there is a frameless
556*5796c8dcSSimon Schubert 	       function.  */
557*5796c8dcSSimon Schubert 	    fi = find_frame_addr_in_frame_chain (frame);
558*5796c8dcSSimon Schubert 	}
559*5796c8dcSSimon Schubert       else
560*5796c8dcSSimon Schubert 	fi = NULL;
561*5796c8dcSSimon Schubert 
562*5796c8dcSSimon Schubert       /* frame = -2 means always use selected frame */
563*5796c8dcSSimon Schubert       if (type == USE_SELECTED_FRAME)
564*5796c8dcSSimon Schubert 	var->root->floating = 1;
565*5796c8dcSSimon Schubert 
566*5796c8dcSSimon Schubert       block = NULL;
567*5796c8dcSSimon Schubert       if (fi != NULL)
568*5796c8dcSSimon Schubert 	block = get_frame_block (fi, 0);
569*5796c8dcSSimon Schubert 
570*5796c8dcSSimon Schubert       p = expression;
571*5796c8dcSSimon Schubert       innermost_block = NULL;
572*5796c8dcSSimon Schubert       /* Wrap the call to parse expression, so we can
573*5796c8dcSSimon Schubert          return a sensible error. */
574*5796c8dcSSimon Schubert       if (!gdb_parse_exp_1 (&p, block, 0, &var->root->exp))
575*5796c8dcSSimon Schubert 	{
576*5796c8dcSSimon Schubert 	  return NULL;
577*5796c8dcSSimon Schubert 	}
578*5796c8dcSSimon Schubert 
579*5796c8dcSSimon Schubert       /* Don't allow variables to be created for types. */
580*5796c8dcSSimon Schubert       if (var->root->exp->elts[0].opcode == OP_TYPE)
581*5796c8dcSSimon Schubert 	{
582*5796c8dcSSimon Schubert 	  do_cleanups (old_chain);
583*5796c8dcSSimon Schubert 	  fprintf_unfiltered (gdb_stderr, "Attempt to use a type name"
584*5796c8dcSSimon Schubert 			      " as an expression.\n");
585*5796c8dcSSimon Schubert 	  return NULL;
586*5796c8dcSSimon Schubert 	}
587*5796c8dcSSimon Schubert 
588*5796c8dcSSimon Schubert       var->format = variable_default_display (var);
589*5796c8dcSSimon Schubert       var->root->valid_block = innermost_block;
590*5796c8dcSSimon Schubert       var->name = xstrdup (expression);
591*5796c8dcSSimon Schubert       /* For a root var, the name and the expr are the same.  */
592*5796c8dcSSimon Schubert       var->path_expr = xstrdup (expression);
593*5796c8dcSSimon Schubert 
594*5796c8dcSSimon Schubert       /* When the frame is different from the current frame,
595*5796c8dcSSimon Schubert          we must select the appropriate frame before parsing
596*5796c8dcSSimon Schubert          the expression, otherwise the value will not be current.
597*5796c8dcSSimon Schubert          Since select_frame is so benign, just call it for all cases. */
598*5796c8dcSSimon Schubert       if (innermost_block)
599*5796c8dcSSimon Schubert 	{
600*5796c8dcSSimon Schubert 	  /* User could specify explicit FRAME-ADDR which was not found but
601*5796c8dcSSimon Schubert 	     EXPRESSION is frame specific and we would not be able to evaluate
602*5796c8dcSSimon Schubert 	     it correctly next time.  With VALID_BLOCK set we must also set
603*5796c8dcSSimon Schubert 	     FRAME and THREAD_ID.  */
604*5796c8dcSSimon Schubert 	  if (fi == NULL)
605*5796c8dcSSimon Schubert 	    error (_("Failed to find the specified frame"));
606*5796c8dcSSimon Schubert 
607*5796c8dcSSimon Schubert 	  var->root->frame = get_frame_id (fi);
608*5796c8dcSSimon Schubert 	  var->root->thread_id = pid_to_thread_id (inferior_ptid);
609*5796c8dcSSimon Schubert 	  old_fi = get_selected_frame (NULL);
610*5796c8dcSSimon Schubert 	  select_frame (fi);
611*5796c8dcSSimon Schubert 	}
612*5796c8dcSSimon Schubert 
613*5796c8dcSSimon Schubert       /* We definitely need to catch errors here.
614*5796c8dcSSimon Schubert          If evaluate_expression succeeds we got the value we wanted.
615*5796c8dcSSimon Schubert          But if it fails, we still go on with a call to evaluate_type()  */
616*5796c8dcSSimon Schubert       if (!gdb_evaluate_expression (var->root->exp, &value))
617*5796c8dcSSimon Schubert 	{
618*5796c8dcSSimon Schubert 	  /* Error getting the value.  Try to at least get the
619*5796c8dcSSimon Schubert 	     right type.  */
620*5796c8dcSSimon Schubert 	  struct value *type_only_value = evaluate_type (var->root->exp);
621*5796c8dcSSimon Schubert 	  var->type = value_type (type_only_value);
622*5796c8dcSSimon Schubert 	}
623*5796c8dcSSimon Schubert       else
624*5796c8dcSSimon Schubert 	var->type = value_type (value);
625*5796c8dcSSimon Schubert 
626*5796c8dcSSimon Schubert       install_new_value (var, value, 1 /* Initial assignment */);
627*5796c8dcSSimon Schubert 
628*5796c8dcSSimon Schubert       /* Set language info */
629*5796c8dcSSimon Schubert       lang = variable_language (var);
630*5796c8dcSSimon Schubert       var->root->lang = &languages[lang];
631*5796c8dcSSimon Schubert 
632*5796c8dcSSimon Schubert       /* Set ourselves as our root */
633*5796c8dcSSimon Schubert       var->root->rootvar = var;
634*5796c8dcSSimon Schubert 
635*5796c8dcSSimon Schubert       /* Reset the selected frame */
636*5796c8dcSSimon Schubert       if (old_fi != NULL)
637*5796c8dcSSimon Schubert 	select_frame (old_fi);
638*5796c8dcSSimon Schubert     }
639*5796c8dcSSimon Schubert 
640*5796c8dcSSimon Schubert   /* If the variable object name is null, that means this
641*5796c8dcSSimon Schubert      is a temporary variable, so don't install it. */
642*5796c8dcSSimon Schubert 
643*5796c8dcSSimon Schubert   if ((var != NULL) && (objname != NULL))
644*5796c8dcSSimon Schubert     {
645*5796c8dcSSimon Schubert       var->obj_name = xstrdup (objname);
646*5796c8dcSSimon Schubert 
647*5796c8dcSSimon Schubert       /* If a varobj name is duplicated, the install will fail so
648*5796c8dcSSimon Schubert          we must clenup */
649*5796c8dcSSimon Schubert       if (!install_variable (var))
650*5796c8dcSSimon Schubert 	{
651*5796c8dcSSimon Schubert 	  do_cleanups (old_chain);
652*5796c8dcSSimon Schubert 	  return NULL;
653*5796c8dcSSimon Schubert 	}
654*5796c8dcSSimon Schubert     }
655*5796c8dcSSimon Schubert 
656*5796c8dcSSimon Schubert   discard_cleanups (old_chain);
657*5796c8dcSSimon Schubert   return var;
658*5796c8dcSSimon Schubert }
659*5796c8dcSSimon Schubert 
660*5796c8dcSSimon Schubert /* Generates an unique name that can be used for a varobj */
661*5796c8dcSSimon Schubert 
662*5796c8dcSSimon Schubert char *
663*5796c8dcSSimon Schubert varobj_gen_name (void)
664*5796c8dcSSimon Schubert {
665*5796c8dcSSimon Schubert   static int id = 0;
666*5796c8dcSSimon Schubert   char *obj_name;
667*5796c8dcSSimon Schubert 
668*5796c8dcSSimon Schubert   /* generate a name for this object */
669*5796c8dcSSimon Schubert   id++;
670*5796c8dcSSimon Schubert   obj_name = xstrprintf ("var%d", id);
671*5796c8dcSSimon Schubert 
672*5796c8dcSSimon Schubert   return obj_name;
673*5796c8dcSSimon Schubert }
674*5796c8dcSSimon Schubert 
675*5796c8dcSSimon Schubert /* Given an OBJNAME, returns the pointer to the corresponding varobj.  Call
676*5796c8dcSSimon Schubert    error if OBJNAME cannot be found.  */
677*5796c8dcSSimon Schubert 
678*5796c8dcSSimon Schubert struct varobj *
679*5796c8dcSSimon Schubert varobj_get_handle (char *objname)
680*5796c8dcSSimon Schubert {
681*5796c8dcSSimon Schubert   struct vlist *cv;
682*5796c8dcSSimon Schubert   const char *chp;
683*5796c8dcSSimon Schubert   unsigned int index = 0;
684*5796c8dcSSimon Schubert   unsigned int i = 1;
685*5796c8dcSSimon Schubert 
686*5796c8dcSSimon Schubert   for (chp = objname; *chp; chp++)
687*5796c8dcSSimon Schubert     {
688*5796c8dcSSimon Schubert       index = (index + (i++ * (unsigned int) *chp)) % VAROBJ_TABLE_SIZE;
689*5796c8dcSSimon Schubert     }
690*5796c8dcSSimon Schubert 
691*5796c8dcSSimon Schubert   cv = *(varobj_table + index);
692*5796c8dcSSimon Schubert   while ((cv != NULL) && (strcmp (cv->var->obj_name, objname) != 0))
693*5796c8dcSSimon Schubert     cv = cv->next;
694*5796c8dcSSimon Schubert 
695*5796c8dcSSimon Schubert   if (cv == NULL)
696*5796c8dcSSimon Schubert     error (_("Variable object not found"));
697*5796c8dcSSimon Schubert 
698*5796c8dcSSimon Schubert   return cv->var;
699*5796c8dcSSimon Schubert }
700*5796c8dcSSimon Schubert 
701*5796c8dcSSimon Schubert /* Given the handle, return the name of the object */
702*5796c8dcSSimon Schubert 
703*5796c8dcSSimon Schubert char *
704*5796c8dcSSimon Schubert varobj_get_objname (struct varobj *var)
705*5796c8dcSSimon Schubert {
706*5796c8dcSSimon Schubert   return var->obj_name;
707*5796c8dcSSimon Schubert }
708*5796c8dcSSimon Schubert 
709*5796c8dcSSimon Schubert /* Given the handle, return the expression represented by the object */
710*5796c8dcSSimon Schubert 
711*5796c8dcSSimon Schubert char *
712*5796c8dcSSimon Schubert varobj_get_expression (struct varobj *var)
713*5796c8dcSSimon Schubert {
714*5796c8dcSSimon Schubert   return name_of_variable (var);
715*5796c8dcSSimon Schubert }
716*5796c8dcSSimon Schubert 
717*5796c8dcSSimon Schubert /* Deletes a varobj and all its children if only_children == 0,
718*5796c8dcSSimon Schubert    otherwise deletes only the children; returns a malloc'ed list of all the
719*5796c8dcSSimon Schubert    (malloc'ed) names of the variables that have been deleted (NULL terminated) */
720*5796c8dcSSimon Schubert 
721*5796c8dcSSimon Schubert int
722*5796c8dcSSimon Schubert varobj_delete (struct varobj *var, char ***dellist, int only_children)
723*5796c8dcSSimon Schubert {
724*5796c8dcSSimon Schubert   int delcount;
725*5796c8dcSSimon Schubert   int mycount;
726*5796c8dcSSimon Schubert   struct cpstack *result = NULL;
727*5796c8dcSSimon Schubert   char **cp;
728*5796c8dcSSimon Schubert 
729*5796c8dcSSimon Schubert   /* Initialize a stack for temporary results */
730*5796c8dcSSimon Schubert   cppush (&result, NULL);
731*5796c8dcSSimon Schubert 
732*5796c8dcSSimon Schubert   if (only_children)
733*5796c8dcSSimon Schubert     /* Delete only the variable children */
734*5796c8dcSSimon Schubert     delcount = delete_variable (&result, var, 1 /* only the children */ );
735*5796c8dcSSimon Schubert   else
736*5796c8dcSSimon Schubert     /* Delete the variable and all its children */
737*5796c8dcSSimon Schubert     delcount = delete_variable (&result, var, 0 /* parent+children */ );
738*5796c8dcSSimon Schubert 
739*5796c8dcSSimon Schubert   /* We may have been asked to return a list of what has been deleted */
740*5796c8dcSSimon Schubert   if (dellist != NULL)
741*5796c8dcSSimon Schubert     {
742*5796c8dcSSimon Schubert       *dellist = xmalloc ((delcount + 1) * sizeof (char *));
743*5796c8dcSSimon Schubert 
744*5796c8dcSSimon Schubert       cp = *dellist;
745*5796c8dcSSimon Schubert       mycount = delcount;
746*5796c8dcSSimon Schubert       *cp = cppop (&result);
747*5796c8dcSSimon Schubert       while ((*cp != NULL) && (mycount > 0))
748*5796c8dcSSimon Schubert 	{
749*5796c8dcSSimon Schubert 	  mycount--;
750*5796c8dcSSimon Schubert 	  cp++;
751*5796c8dcSSimon Schubert 	  *cp = cppop (&result);
752*5796c8dcSSimon Schubert 	}
753*5796c8dcSSimon Schubert 
754*5796c8dcSSimon Schubert       if (mycount || (*cp != NULL))
755*5796c8dcSSimon Schubert 	warning (_("varobj_delete: assertion failed - mycount(=%d) <> 0"),
756*5796c8dcSSimon Schubert 		 mycount);
757*5796c8dcSSimon Schubert     }
758*5796c8dcSSimon Schubert 
759*5796c8dcSSimon Schubert   return delcount;
760*5796c8dcSSimon Schubert }
761*5796c8dcSSimon Schubert 
762*5796c8dcSSimon Schubert /* Convenience function for varobj_set_visualizer.  Instantiate a
763*5796c8dcSSimon Schubert    pretty-printer for a given value.  */
764*5796c8dcSSimon Schubert static PyObject *
765*5796c8dcSSimon Schubert instantiate_pretty_printer (PyObject *constructor, struct value *value)
766*5796c8dcSSimon Schubert {
767*5796c8dcSSimon Schubert #if HAVE_PYTHON
768*5796c8dcSSimon Schubert   PyObject *val_obj = NULL;
769*5796c8dcSSimon Schubert   PyObject *printer;
770*5796c8dcSSimon Schubert 
771*5796c8dcSSimon Schubert   val_obj = value_to_value_object (value);
772*5796c8dcSSimon Schubert   if (! val_obj)
773*5796c8dcSSimon Schubert     return NULL;
774*5796c8dcSSimon Schubert 
775*5796c8dcSSimon Schubert   printer = PyObject_CallFunctionObjArgs (constructor, val_obj, NULL);
776*5796c8dcSSimon Schubert   Py_DECREF (val_obj);
777*5796c8dcSSimon Schubert   return printer;
778*5796c8dcSSimon Schubert #endif
779*5796c8dcSSimon Schubert   return NULL;
780*5796c8dcSSimon Schubert }
781*5796c8dcSSimon Schubert 
782*5796c8dcSSimon Schubert /* Set/Get variable object display format */
783*5796c8dcSSimon Schubert 
784*5796c8dcSSimon Schubert enum varobj_display_formats
785*5796c8dcSSimon Schubert varobj_set_display_format (struct varobj *var,
786*5796c8dcSSimon Schubert 			   enum varobj_display_formats format)
787*5796c8dcSSimon Schubert {
788*5796c8dcSSimon Schubert   switch (format)
789*5796c8dcSSimon Schubert     {
790*5796c8dcSSimon Schubert     case FORMAT_NATURAL:
791*5796c8dcSSimon Schubert     case FORMAT_BINARY:
792*5796c8dcSSimon Schubert     case FORMAT_DECIMAL:
793*5796c8dcSSimon Schubert     case FORMAT_HEXADECIMAL:
794*5796c8dcSSimon Schubert     case FORMAT_OCTAL:
795*5796c8dcSSimon Schubert       var->format = format;
796*5796c8dcSSimon Schubert       break;
797*5796c8dcSSimon Schubert 
798*5796c8dcSSimon Schubert     default:
799*5796c8dcSSimon Schubert       var->format = variable_default_display (var);
800*5796c8dcSSimon Schubert     }
801*5796c8dcSSimon Schubert 
802*5796c8dcSSimon Schubert   if (varobj_value_is_changeable_p (var)
803*5796c8dcSSimon Schubert       && var->value && !value_lazy (var->value))
804*5796c8dcSSimon Schubert     {
805*5796c8dcSSimon Schubert       xfree (var->print_value);
806*5796c8dcSSimon Schubert       var->print_value = value_get_print_value (var->value, var->format, var);
807*5796c8dcSSimon Schubert     }
808*5796c8dcSSimon Schubert 
809*5796c8dcSSimon Schubert   return var->format;
810*5796c8dcSSimon Schubert }
811*5796c8dcSSimon Schubert 
812*5796c8dcSSimon Schubert enum varobj_display_formats
813*5796c8dcSSimon Schubert varobj_get_display_format (struct varobj *var)
814*5796c8dcSSimon Schubert {
815*5796c8dcSSimon Schubert   return var->format;
816*5796c8dcSSimon Schubert }
817*5796c8dcSSimon Schubert 
818*5796c8dcSSimon Schubert char *
819*5796c8dcSSimon Schubert varobj_get_display_hint (struct varobj *var)
820*5796c8dcSSimon Schubert {
821*5796c8dcSSimon Schubert   char *result = NULL;
822*5796c8dcSSimon Schubert 
823*5796c8dcSSimon Schubert #if HAVE_PYTHON
824*5796c8dcSSimon Schubert   struct cleanup *back_to = varobj_ensure_python_env (var);
825*5796c8dcSSimon Schubert 
826*5796c8dcSSimon Schubert   if (var->pretty_printer)
827*5796c8dcSSimon Schubert     result = gdbpy_get_display_hint (var->pretty_printer);
828*5796c8dcSSimon Schubert 
829*5796c8dcSSimon Schubert   do_cleanups (back_to);
830*5796c8dcSSimon Schubert #endif
831*5796c8dcSSimon Schubert 
832*5796c8dcSSimon Schubert   return result;
833*5796c8dcSSimon Schubert }
834*5796c8dcSSimon Schubert 
835*5796c8dcSSimon Schubert /* Return true if the varobj has items after TO, false otherwise.  */
836*5796c8dcSSimon Schubert 
837*5796c8dcSSimon Schubert int
838*5796c8dcSSimon Schubert varobj_has_more (struct varobj *var, int to)
839*5796c8dcSSimon Schubert {
840*5796c8dcSSimon Schubert   if (VEC_length (varobj_p, var->children) > to)
841*5796c8dcSSimon Schubert     return 1;
842*5796c8dcSSimon Schubert   return ((to == -1 || VEC_length (varobj_p, var->children) == to)
843*5796c8dcSSimon Schubert 	  && var->saved_item != NULL);
844*5796c8dcSSimon Schubert }
845*5796c8dcSSimon Schubert 
846*5796c8dcSSimon Schubert /* If the variable object is bound to a specific thread, that
847*5796c8dcSSimon Schubert    is its evaluation can always be done in context of a frame
848*5796c8dcSSimon Schubert    inside that thread, returns GDB id of the thread -- which
849*5796c8dcSSimon Schubert    is always positive.  Otherwise, returns -1. */
850*5796c8dcSSimon Schubert int
851*5796c8dcSSimon Schubert varobj_get_thread_id (struct varobj *var)
852*5796c8dcSSimon Schubert {
853*5796c8dcSSimon Schubert   if (var->root->valid_block && var->root->thread_id > 0)
854*5796c8dcSSimon Schubert     return var->root->thread_id;
855*5796c8dcSSimon Schubert   else
856*5796c8dcSSimon Schubert     return -1;
857*5796c8dcSSimon Schubert }
858*5796c8dcSSimon Schubert 
859*5796c8dcSSimon Schubert void
860*5796c8dcSSimon Schubert varobj_set_frozen (struct varobj *var, int frozen)
861*5796c8dcSSimon Schubert {
862*5796c8dcSSimon Schubert   /* When a variable is unfrozen, we don't fetch its value.
863*5796c8dcSSimon Schubert      The 'not_fetched' flag remains set, so next -var-update
864*5796c8dcSSimon Schubert      won't complain.
865*5796c8dcSSimon Schubert 
866*5796c8dcSSimon Schubert      We don't fetch the value, because for structures the client
867*5796c8dcSSimon Schubert      should do -var-update anyway.  It would be bad to have different
868*5796c8dcSSimon Schubert      client-size logic for structure and other types.  */
869*5796c8dcSSimon Schubert   var->frozen = frozen;
870*5796c8dcSSimon Schubert }
871*5796c8dcSSimon Schubert 
872*5796c8dcSSimon Schubert int
873*5796c8dcSSimon Schubert varobj_get_frozen (struct varobj *var)
874*5796c8dcSSimon Schubert {
875*5796c8dcSSimon Schubert   return var->frozen;
876*5796c8dcSSimon Schubert }
877*5796c8dcSSimon Schubert 
878*5796c8dcSSimon Schubert /* A helper function that restricts a range to what is actually
879*5796c8dcSSimon Schubert    available in a VEC.  This follows the usual rules for the meaning
880*5796c8dcSSimon Schubert    of FROM and TO -- if either is negative, the entire range is
881*5796c8dcSSimon Schubert    used.  */
882*5796c8dcSSimon Schubert 
883*5796c8dcSSimon Schubert static void
884*5796c8dcSSimon Schubert restrict_range (VEC (varobj_p) *children, int *from, int *to)
885*5796c8dcSSimon Schubert {
886*5796c8dcSSimon Schubert   if (*from < 0 || *to < 0)
887*5796c8dcSSimon Schubert     {
888*5796c8dcSSimon Schubert       *from = 0;
889*5796c8dcSSimon Schubert       *to = VEC_length (varobj_p, children);
890*5796c8dcSSimon Schubert     }
891*5796c8dcSSimon Schubert   else
892*5796c8dcSSimon Schubert     {
893*5796c8dcSSimon Schubert       if (*from > VEC_length (varobj_p, children))
894*5796c8dcSSimon Schubert 	*from = VEC_length (varobj_p, children);
895*5796c8dcSSimon Schubert       if (*to > VEC_length (varobj_p, children))
896*5796c8dcSSimon Schubert 	*to = VEC_length (varobj_p, children);
897*5796c8dcSSimon Schubert       if (*from > *to)
898*5796c8dcSSimon Schubert 	*from = *to;
899*5796c8dcSSimon Schubert     }
900*5796c8dcSSimon Schubert }
901*5796c8dcSSimon Schubert 
902*5796c8dcSSimon Schubert /* A helper for update_dynamic_varobj_children that installs a new
903*5796c8dcSSimon Schubert    child when needed.  */
904*5796c8dcSSimon Schubert 
905*5796c8dcSSimon Schubert static void
906*5796c8dcSSimon Schubert install_dynamic_child (struct varobj *var,
907*5796c8dcSSimon Schubert 		       VEC (varobj_p) **changed,
908*5796c8dcSSimon Schubert 		       VEC (varobj_p) **new,
909*5796c8dcSSimon Schubert 		       VEC (varobj_p) **unchanged,
910*5796c8dcSSimon Schubert 		       int *cchanged,
911*5796c8dcSSimon Schubert 		       int index,
912*5796c8dcSSimon Schubert 		       const char *name,
913*5796c8dcSSimon Schubert 		       struct value *value)
914*5796c8dcSSimon Schubert {
915*5796c8dcSSimon Schubert   if (VEC_length (varobj_p, var->children) < index + 1)
916*5796c8dcSSimon Schubert     {
917*5796c8dcSSimon Schubert       /* There's no child yet.  */
918*5796c8dcSSimon Schubert       struct varobj *child = varobj_add_child (var, name, value);
919*5796c8dcSSimon Schubert       if (new)
920*5796c8dcSSimon Schubert 	{
921*5796c8dcSSimon Schubert 	  VEC_safe_push (varobj_p, *new, child);
922*5796c8dcSSimon Schubert 	  *cchanged = 1;
923*5796c8dcSSimon Schubert 	}
924*5796c8dcSSimon Schubert     }
925*5796c8dcSSimon Schubert   else
926*5796c8dcSSimon Schubert     {
927*5796c8dcSSimon Schubert       varobj_p existing = VEC_index (varobj_p, var->children, index);
928*5796c8dcSSimon Schubert       if (install_new_value (existing, value, 0))
929*5796c8dcSSimon Schubert 	{
930*5796c8dcSSimon Schubert 	  if (changed)
931*5796c8dcSSimon Schubert 	    VEC_safe_push (varobj_p, *changed, existing);
932*5796c8dcSSimon Schubert 	}
933*5796c8dcSSimon Schubert       else if (unchanged)
934*5796c8dcSSimon Schubert 	VEC_safe_push (varobj_p, *unchanged, existing);
935*5796c8dcSSimon Schubert     }
936*5796c8dcSSimon Schubert }
937*5796c8dcSSimon Schubert 
938*5796c8dcSSimon Schubert #if HAVE_PYTHON
939*5796c8dcSSimon Schubert 
940*5796c8dcSSimon Schubert static int
941*5796c8dcSSimon Schubert dynamic_varobj_has_child_method (struct varobj *var)
942*5796c8dcSSimon Schubert {
943*5796c8dcSSimon Schubert   struct cleanup *back_to;
944*5796c8dcSSimon Schubert   PyObject *printer = var->pretty_printer;
945*5796c8dcSSimon Schubert   int result;
946*5796c8dcSSimon Schubert 
947*5796c8dcSSimon Schubert   back_to = varobj_ensure_python_env (var);
948*5796c8dcSSimon Schubert   result = PyObject_HasAttr (printer, gdbpy_children_cst);
949*5796c8dcSSimon Schubert   do_cleanups (back_to);
950*5796c8dcSSimon Schubert   return result;
951*5796c8dcSSimon Schubert }
952*5796c8dcSSimon Schubert 
953*5796c8dcSSimon Schubert #endif
954*5796c8dcSSimon Schubert 
955*5796c8dcSSimon Schubert static int
956*5796c8dcSSimon Schubert update_dynamic_varobj_children (struct varobj *var,
957*5796c8dcSSimon Schubert 				VEC (varobj_p) **changed,
958*5796c8dcSSimon Schubert 				VEC (varobj_p) **new,
959*5796c8dcSSimon Schubert 				VEC (varobj_p) **unchanged,
960*5796c8dcSSimon Schubert 				int *cchanged,
961*5796c8dcSSimon Schubert 				int update_children,
962*5796c8dcSSimon Schubert 				int from,
963*5796c8dcSSimon Schubert 				int to)
964*5796c8dcSSimon Schubert {
965*5796c8dcSSimon Schubert #if HAVE_PYTHON
966*5796c8dcSSimon Schubert   struct cleanup *back_to;
967*5796c8dcSSimon Schubert   PyObject *children;
968*5796c8dcSSimon Schubert   int i;
969*5796c8dcSSimon Schubert   PyObject *printer = var->pretty_printer;
970*5796c8dcSSimon Schubert 
971*5796c8dcSSimon Schubert   back_to = varobj_ensure_python_env (var);
972*5796c8dcSSimon Schubert 
973*5796c8dcSSimon Schubert   *cchanged = 0;
974*5796c8dcSSimon Schubert   if (!PyObject_HasAttr (printer, gdbpy_children_cst))
975*5796c8dcSSimon Schubert     {
976*5796c8dcSSimon Schubert       do_cleanups (back_to);
977*5796c8dcSSimon Schubert       return 0;
978*5796c8dcSSimon Schubert     }
979*5796c8dcSSimon Schubert 
980*5796c8dcSSimon Schubert   if (update_children || !var->child_iter)
981*5796c8dcSSimon Schubert     {
982*5796c8dcSSimon Schubert       children = PyObject_CallMethodObjArgs (printer, gdbpy_children_cst,
983*5796c8dcSSimon Schubert 					     NULL);
984*5796c8dcSSimon Schubert 
985*5796c8dcSSimon Schubert       if (!children)
986*5796c8dcSSimon Schubert 	{
987*5796c8dcSSimon Schubert 	  gdbpy_print_stack ();
988*5796c8dcSSimon Schubert 	  error (_("Null value returned for children"));
989*5796c8dcSSimon Schubert 	}
990*5796c8dcSSimon Schubert 
991*5796c8dcSSimon Schubert       make_cleanup_py_decref (children);
992*5796c8dcSSimon Schubert 
993*5796c8dcSSimon Schubert       if (!PyIter_Check (children))
994*5796c8dcSSimon Schubert 	error (_("Returned value is not iterable"));
995*5796c8dcSSimon Schubert 
996*5796c8dcSSimon Schubert       Py_XDECREF (var->child_iter);
997*5796c8dcSSimon Schubert       var->child_iter = PyObject_GetIter (children);
998*5796c8dcSSimon Schubert       if (!var->child_iter)
999*5796c8dcSSimon Schubert 	{
1000*5796c8dcSSimon Schubert 	  gdbpy_print_stack ();
1001*5796c8dcSSimon Schubert 	  error (_("Could not get children iterator"));
1002*5796c8dcSSimon Schubert 	}
1003*5796c8dcSSimon Schubert 
1004*5796c8dcSSimon Schubert       Py_XDECREF (var->saved_item);
1005*5796c8dcSSimon Schubert       var->saved_item = NULL;
1006*5796c8dcSSimon Schubert 
1007*5796c8dcSSimon Schubert       i = 0;
1008*5796c8dcSSimon Schubert     }
1009*5796c8dcSSimon Schubert   else
1010*5796c8dcSSimon Schubert     i = VEC_length (varobj_p, var->children);
1011*5796c8dcSSimon Schubert 
1012*5796c8dcSSimon Schubert   /* We ask for one extra child, so that MI can report whether there
1013*5796c8dcSSimon Schubert      are more children.  */
1014*5796c8dcSSimon Schubert   for (; to < 0 || i < to + 1; ++i)
1015*5796c8dcSSimon Schubert     {
1016*5796c8dcSSimon Schubert       PyObject *item;
1017*5796c8dcSSimon Schubert 
1018*5796c8dcSSimon Schubert       /* See if there was a leftover from last time.  */
1019*5796c8dcSSimon Schubert       if (var->saved_item)
1020*5796c8dcSSimon Schubert 	{
1021*5796c8dcSSimon Schubert 	  item = var->saved_item;
1022*5796c8dcSSimon Schubert 	  var->saved_item = NULL;
1023*5796c8dcSSimon Schubert 	}
1024*5796c8dcSSimon Schubert       else
1025*5796c8dcSSimon Schubert 	item = PyIter_Next (var->child_iter);
1026*5796c8dcSSimon Schubert 
1027*5796c8dcSSimon Schubert       if (!item)
1028*5796c8dcSSimon Schubert 	break;
1029*5796c8dcSSimon Schubert 
1030*5796c8dcSSimon Schubert       /* We don't want to push the extra child on any report list.  */
1031*5796c8dcSSimon Schubert       if (to < 0 || i < to)
1032*5796c8dcSSimon Schubert 	{
1033*5796c8dcSSimon Schubert 	  PyObject *py_v;
1034*5796c8dcSSimon Schubert 	  char *name;
1035*5796c8dcSSimon Schubert 	  struct value *v;
1036*5796c8dcSSimon Schubert 	  struct cleanup *inner;
1037*5796c8dcSSimon Schubert 	  int can_mention = from < 0 || i >= from;
1038*5796c8dcSSimon Schubert 
1039*5796c8dcSSimon Schubert 	  inner = make_cleanup_py_decref (item);
1040*5796c8dcSSimon Schubert 
1041*5796c8dcSSimon Schubert 	  if (!PyArg_ParseTuple (item, "sO", &name, &py_v))
1042*5796c8dcSSimon Schubert 	    error (_("Invalid item from the child list"));
1043*5796c8dcSSimon Schubert 
1044*5796c8dcSSimon Schubert 	  v = convert_value_from_python (py_v);
1045*5796c8dcSSimon Schubert 	  install_dynamic_child (var, can_mention ? changed : NULL,
1046*5796c8dcSSimon Schubert 				 can_mention ? new : NULL,
1047*5796c8dcSSimon Schubert 				 can_mention ? unchanged : NULL,
1048*5796c8dcSSimon Schubert 				 can_mention ? cchanged : NULL, i, name, v);
1049*5796c8dcSSimon Schubert 	  do_cleanups (inner);
1050*5796c8dcSSimon Schubert 	}
1051*5796c8dcSSimon Schubert       else
1052*5796c8dcSSimon Schubert 	{
1053*5796c8dcSSimon Schubert 	  Py_XDECREF (var->saved_item);
1054*5796c8dcSSimon Schubert 	  var->saved_item = item;
1055*5796c8dcSSimon Schubert 
1056*5796c8dcSSimon Schubert 	  /* We want to truncate the child list just before this
1057*5796c8dcSSimon Schubert 	     element.  */
1058*5796c8dcSSimon Schubert 	  break;
1059*5796c8dcSSimon Schubert 	}
1060*5796c8dcSSimon Schubert     }
1061*5796c8dcSSimon Schubert 
1062*5796c8dcSSimon Schubert   if (i < VEC_length (varobj_p, var->children))
1063*5796c8dcSSimon Schubert     {
1064*5796c8dcSSimon Schubert       int j;
1065*5796c8dcSSimon Schubert       *cchanged = 1;
1066*5796c8dcSSimon Schubert       for (j = i; j < VEC_length (varobj_p, var->children); ++j)
1067*5796c8dcSSimon Schubert 	varobj_delete (VEC_index (varobj_p, var->children, j), NULL, 0);
1068*5796c8dcSSimon Schubert       VEC_truncate (varobj_p, var->children, i);
1069*5796c8dcSSimon Schubert     }
1070*5796c8dcSSimon Schubert 
1071*5796c8dcSSimon Schubert   /* If there are fewer children than requested, note that the list of
1072*5796c8dcSSimon Schubert      children changed.  */
1073*5796c8dcSSimon Schubert   if (to >= 0 && VEC_length (varobj_p, var->children) < to)
1074*5796c8dcSSimon Schubert     *cchanged = 1;
1075*5796c8dcSSimon Schubert 
1076*5796c8dcSSimon Schubert   var->num_children = VEC_length (varobj_p, var->children);
1077*5796c8dcSSimon Schubert 
1078*5796c8dcSSimon Schubert   do_cleanups (back_to);
1079*5796c8dcSSimon Schubert 
1080*5796c8dcSSimon Schubert   return 1;
1081*5796c8dcSSimon Schubert #else
1082*5796c8dcSSimon Schubert   gdb_assert (0 && "should never be called if Python is not enabled");
1083*5796c8dcSSimon Schubert #endif
1084*5796c8dcSSimon Schubert }
1085*5796c8dcSSimon Schubert 
1086*5796c8dcSSimon Schubert int
1087*5796c8dcSSimon Schubert varobj_get_num_children (struct varobj *var)
1088*5796c8dcSSimon Schubert {
1089*5796c8dcSSimon Schubert   if (var->num_children == -1)
1090*5796c8dcSSimon Schubert     {
1091*5796c8dcSSimon Schubert       if (var->pretty_printer)
1092*5796c8dcSSimon Schubert 	{
1093*5796c8dcSSimon Schubert 	  int dummy;
1094*5796c8dcSSimon Schubert 
1095*5796c8dcSSimon Schubert 	  /* If we have a dynamic varobj, don't report -1 children.
1096*5796c8dcSSimon Schubert 	     So, try to fetch some children first.  */
1097*5796c8dcSSimon Schubert 	  update_dynamic_varobj_children (var, NULL, NULL, NULL, &dummy,
1098*5796c8dcSSimon Schubert 					  0, 0, 0);
1099*5796c8dcSSimon Schubert 	}
1100*5796c8dcSSimon Schubert       else
1101*5796c8dcSSimon Schubert 	var->num_children = number_of_children (var);
1102*5796c8dcSSimon Schubert     }
1103*5796c8dcSSimon Schubert 
1104*5796c8dcSSimon Schubert   return var->num_children >= 0 ? var->num_children : 0;
1105*5796c8dcSSimon Schubert }
1106*5796c8dcSSimon Schubert 
1107*5796c8dcSSimon Schubert /* Creates a list of the immediate children of a variable object;
1108*5796c8dcSSimon Schubert    the return code is the number of such children or -1 on error */
1109*5796c8dcSSimon Schubert 
1110*5796c8dcSSimon Schubert VEC (varobj_p)*
1111*5796c8dcSSimon Schubert varobj_list_children (struct varobj *var, int *from, int *to)
1112*5796c8dcSSimon Schubert {
1113*5796c8dcSSimon Schubert   struct varobj *child;
1114*5796c8dcSSimon Schubert   char *name;
1115*5796c8dcSSimon Schubert   int i, children_changed;
1116*5796c8dcSSimon Schubert 
1117*5796c8dcSSimon Schubert   var->children_requested = 1;
1118*5796c8dcSSimon Schubert 
1119*5796c8dcSSimon Schubert   if (var->pretty_printer)
1120*5796c8dcSSimon Schubert     {
1121*5796c8dcSSimon Schubert       /* This, in theory, can result in the number of children changing without
1122*5796c8dcSSimon Schubert 	 frontend noticing.  But well, calling -var-list-children on the same
1123*5796c8dcSSimon Schubert 	 varobj twice is not something a sane frontend would do.  */
1124*5796c8dcSSimon Schubert       update_dynamic_varobj_children (var, NULL, NULL, NULL, &children_changed,
1125*5796c8dcSSimon Schubert 				      0, 0, *to);
1126*5796c8dcSSimon Schubert       restrict_range (var->children, from, to);
1127*5796c8dcSSimon Schubert       return var->children;
1128*5796c8dcSSimon Schubert     }
1129*5796c8dcSSimon Schubert 
1130*5796c8dcSSimon Schubert   if (var->num_children == -1)
1131*5796c8dcSSimon Schubert     var->num_children = number_of_children (var);
1132*5796c8dcSSimon Schubert 
1133*5796c8dcSSimon Schubert   /* If that failed, give up.  */
1134*5796c8dcSSimon Schubert   if (var->num_children == -1)
1135*5796c8dcSSimon Schubert     return var->children;
1136*5796c8dcSSimon Schubert 
1137*5796c8dcSSimon Schubert   /* If we're called when the list of children is not yet initialized,
1138*5796c8dcSSimon Schubert      allocate enough elements in it.  */
1139*5796c8dcSSimon Schubert   while (VEC_length (varobj_p, var->children) < var->num_children)
1140*5796c8dcSSimon Schubert     VEC_safe_push (varobj_p, var->children, NULL);
1141*5796c8dcSSimon Schubert 
1142*5796c8dcSSimon Schubert   for (i = 0; i < var->num_children; i++)
1143*5796c8dcSSimon Schubert     {
1144*5796c8dcSSimon Schubert       varobj_p existing = VEC_index (varobj_p, var->children, i);
1145*5796c8dcSSimon Schubert 
1146*5796c8dcSSimon Schubert       if (existing == NULL)
1147*5796c8dcSSimon Schubert 	{
1148*5796c8dcSSimon Schubert 	  /* Either it's the first call to varobj_list_children for
1149*5796c8dcSSimon Schubert 	     this variable object, and the child was never created,
1150*5796c8dcSSimon Schubert 	     or it was explicitly deleted by the client.  */
1151*5796c8dcSSimon Schubert 	  name = name_of_child (var, i);
1152*5796c8dcSSimon Schubert 	  existing = create_child (var, i, name);
1153*5796c8dcSSimon Schubert 	  VEC_replace (varobj_p, var->children, i, existing);
1154*5796c8dcSSimon Schubert 	}
1155*5796c8dcSSimon Schubert     }
1156*5796c8dcSSimon Schubert 
1157*5796c8dcSSimon Schubert   restrict_range (var->children, from, to);
1158*5796c8dcSSimon Schubert   return var->children;
1159*5796c8dcSSimon Schubert }
1160*5796c8dcSSimon Schubert 
1161*5796c8dcSSimon Schubert static struct varobj *
1162*5796c8dcSSimon Schubert varobj_add_child (struct varobj *var, const char *name, struct value *value)
1163*5796c8dcSSimon Schubert {
1164*5796c8dcSSimon Schubert   varobj_p v = create_child_with_value (var,
1165*5796c8dcSSimon Schubert 					VEC_length (varobj_p, var->children),
1166*5796c8dcSSimon Schubert 					name, value);
1167*5796c8dcSSimon Schubert   VEC_safe_push (varobj_p, var->children, v);
1168*5796c8dcSSimon Schubert   return v;
1169*5796c8dcSSimon Schubert }
1170*5796c8dcSSimon Schubert 
1171*5796c8dcSSimon Schubert /* Obtain the type of an object Variable as a string similar to the one gdb
1172*5796c8dcSSimon Schubert    prints on the console */
1173*5796c8dcSSimon Schubert 
1174*5796c8dcSSimon Schubert char *
1175*5796c8dcSSimon Schubert varobj_get_type (struct varobj *var)
1176*5796c8dcSSimon Schubert {
1177*5796c8dcSSimon Schubert   /* For the "fake" variables, do not return a type. (It's type is
1178*5796c8dcSSimon Schubert      NULL, too.)
1179*5796c8dcSSimon Schubert      Do not return a type for invalid variables as well.  */
1180*5796c8dcSSimon Schubert   if (CPLUS_FAKE_CHILD (var) || !var->root->is_valid)
1181*5796c8dcSSimon Schubert     return NULL;
1182*5796c8dcSSimon Schubert 
1183*5796c8dcSSimon Schubert   return type_to_string (var->type);
1184*5796c8dcSSimon Schubert }
1185*5796c8dcSSimon Schubert 
1186*5796c8dcSSimon Schubert /* Obtain the type of an object variable.  */
1187*5796c8dcSSimon Schubert 
1188*5796c8dcSSimon Schubert struct type *
1189*5796c8dcSSimon Schubert varobj_get_gdb_type (struct varobj *var)
1190*5796c8dcSSimon Schubert {
1191*5796c8dcSSimon Schubert   return var->type;
1192*5796c8dcSSimon Schubert }
1193*5796c8dcSSimon Schubert 
1194*5796c8dcSSimon Schubert /* Return a pointer to the full rooted expression of varobj VAR.
1195*5796c8dcSSimon Schubert    If it has not been computed yet, compute it.  */
1196*5796c8dcSSimon Schubert char *
1197*5796c8dcSSimon Schubert varobj_get_path_expr (struct varobj *var)
1198*5796c8dcSSimon Schubert {
1199*5796c8dcSSimon Schubert   if (var->path_expr != NULL)
1200*5796c8dcSSimon Schubert     return var->path_expr;
1201*5796c8dcSSimon Schubert   else
1202*5796c8dcSSimon Schubert     {
1203*5796c8dcSSimon Schubert       /* For root varobjs, we initialize path_expr
1204*5796c8dcSSimon Schubert 	 when creating varobj, so here it should be
1205*5796c8dcSSimon Schubert 	 child varobj.  */
1206*5796c8dcSSimon Schubert       gdb_assert (!is_root_p (var));
1207*5796c8dcSSimon Schubert       return (*var->root->lang->path_expr_of_child) (var);
1208*5796c8dcSSimon Schubert     }
1209*5796c8dcSSimon Schubert }
1210*5796c8dcSSimon Schubert 
1211*5796c8dcSSimon Schubert enum varobj_languages
1212*5796c8dcSSimon Schubert varobj_get_language (struct varobj *var)
1213*5796c8dcSSimon Schubert {
1214*5796c8dcSSimon Schubert   return variable_language (var);
1215*5796c8dcSSimon Schubert }
1216*5796c8dcSSimon Schubert 
1217*5796c8dcSSimon Schubert int
1218*5796c8dcSSimon Schubert varobj_get_attributes (struct varobj *var)
1219*5796c8dcSSimon Schubert {
1220*5796c8dcSSimon Schubert   int attributes = 0;
1221*5796c8dcSSimon Schubert 
1222*5796c8dcSSimon Schubert   if (varobj_editable_p (var))
1223*5796c8dcSSimon Schubert     /* FIXME: define masks for attributes */
1224*5796c8dcSSimon Schubert     attributes |= 0x00000001;	/* Editable */
1225*5796c8dcSSimon Schubert 
1226*5796c8dcSSimon Schubert   return attributes;
1227*5796c8dcSSimon Schubert }
1228*5796c8dcSSimon Schubert 
1229*5796c8dcSSimon Schubert int
1230*5796c8dcSSimon Schubert varobj_pretty_printed_p (struct varobj *var)
1231*5796c8dcSSimon Schubert {
1232*5796c8dcSSimon Schubert   return var->pretty_printer != NULL;
1233*5796c8dcSSimon Schubert }
1234*5796c8dcSSimon Schubert 
1235*5796c8dcSSimon Schubert char *
1236*5796c8dcSSimon Schubert varobj_get_formatted_value (struct varobj *var,
1237*5796c8dcSSimon Schubert 			    enum varobj_display_formats format)
1238*5796c8dcSSimon Schubert {
1239*5796c8dcSSimon Schubert   return my_value_of_variable (var, format);
1240*5796c8dcSSimon Schubert }
1241*5796c8dcSSimon Schubert 
1242*5796c8dcSSimon Schubert char *
1243*5796c8dcSSimon Schubert varobj_get_value (struct varobj *var)
1244*5796c8dcSSimon Schubert {
1245*5796c8dcSSimon Schubert   return my_value_of_variable (var, var->format);
1246*5796c8dcSSimon Schubert }
1247*5796c8dcSSimon Schubert 
1248*5796c8dcSSimon Schubert /* Set the value of an object variable (if it is editable) to the
1249*5796c8dcSSimon Schubert    value of the given expression */
1250*5796c8dcSSimon Schubert /* Note: Invokes functions that can call error() */
1251*5796c8dcSSimon Schubert 
1252*5796c8dcSSimon Schubert int
1253*5796c8dcSSimon Schubert varobj_set_value (struct varobj *var, char *expression)
1254*5796c8dcSSimon Schubert {
1255*5796c8dcSSimon Schubert   struct value *val;
1256*5796c8dcSSimon Schubert   int offset = 0;
1257*5796c8dcSSimon Schubert   int error = 0;
1258*5796c8dcSSimon Schubert 
1259*5796c8dcSSimon Schubert   /* The argument "expression" contains the variable's new value.
1260*5796c8dcSSimon Schubert      We need to first construct a legal expression for this -- ugh! */
1261*5796c8dcSSimon Schubert   /* Does this cover all the bases? */
1262*5796c8dcSSimon Schubert   struct expression *exp;
1263*5796c8dcSSimon Schubert   struct value *value;
1264*5796c8dcSSimon Schubert   int saved_input_radix = input_radix;
1265*5796c8dcSSimon Schubert   char *s = expression;
1266*5796c8dcSSimon Schubert   int i;
1267*5796c8dcSSimon Schubert 
1268*5796c8dcSSimon Schubert   gdb_assert (varobj_editable_p (var));
1269*5796c8dcSSimon Schubert 
1270*5796c8dcSSimon Schubert   input_radix = 10;		/* ALWAYS reset to decimal temporarily */
1271*5796c8dcSSimon Schubert   exp = parse_exp_1 (&s, 0, 0);
1272*5796c8dcSSimon Schubert   if (!gdb_evaluate_expression (exp, &value))
1273*5796c8dcSSimon Schubert     {
1274*5796c8dcSSimon Schubert       /* We cannot proceed without a valid expression. */
1275*5796c8dcSSimon Schubert       xfree (exp);
1276*5796c8dcSSimon Schubert       return 0;
1277*5796c8dcSSimon Schubert     }
1278*5796c8dcSSimon Schubert 
1279*5796c8dcSSimon Schubert   /* All types that are editable must also be changeable.  */
1280*5796c8dcSSimon Schubert   gdb_assert (varobj_value_is_changeable_p (var));
1281*5796c8dcSSimon Schubert 
1282*5796c8dcSSimon Schubert   /* The value of a changeable variable object must not be lazy.  */
1283*5796c8dcSSimon Schubert   gdb_assert (!value_lazy (var->value));
1284*5796c8dcSSimon Schubert 
1285*5796c8dcSSimon Schubert   /* Need to coerce the input.  We want to check if the
1286*5796c8dcSSimon Schubert      value of the variable object will be different
1287*5796c8dcSSimon Schubert      after assignment, and the first thing value_assign
1288*5796c8dcSSimon Schubert      does is coerce the input.
1289*5796c8dcSSimon Schubert      For example, if we are assigning an array to a pointer variable we
1290*5796c8dcSSimon Schubert      should compare the pointer with the the array's address, not with the
1291*5796c8dcSSimon Schubert      array's content.  */
1292*5796c8dcSSimon Schubert   value = coerce_array (value);
1293*5796c8dcSSimon Schubert 
1294*5796c8dcSSimon Schubert   /* The new value may be lazy.  gdb_value_assign, or
1295*5796c8dcSSimon Schubert      rather value_contents, will take care of this.
1296*5796c8dcSSimon Schubert      If fetching of the new value will fail, gdb_value_assign
1297*5796c8dcSSimon Schubert      with catch the exception.  */
1298*5796c8dcSSimon Schubert   if (!gdb_value_assign (var->value, value, &val))
1299*5796c8dcSSimon Schubert     return 0;
1300*5796c8dcSSimon Schubert 
1301*5796c8dcSSimon Schubert   /* If the value has changed, record it, so that next -var-update can
1302*5796c8dcSSimon Schubert      report this change.  If a variable had a value of '1', we've set it
1303*5796c8dcSSimon Schubert      to '333' and then set again to '1', when -var-update will report this
1304*5796c8dcSSimon Schubert      variable as changed -- because the first assignment has set the
1305*5796c8dcSSimon Schubert      'updated' flag.  There's no need to optimize that, because return value
1306*5796c8dcSSimon Schubert      of -var-update should be considered an approximation.  */
1307*5796c8dcSSimon Schubert   var->updated = install_new_value (var, val, 0 /* Compare values. */);
1308*5796c8dcSSimon Schubert   input_radix = saved_input_radix;
1309*5796c8dcSSimon Schubert   return 1;
1310*5796c8dcSSimon Schubert }
1311*5796c8dcSSimon Schubert 
1312*5796c8dcSSimon Schubert #if HAVE_PYTHON
1313*5796c8dcSSimon Schubert 
1314*5796c8dcSSimon Schubert /* A helper function to install a constructor function and visualizer
1315*5796c8dcSSimon Schubert    in a varobj.  */
1316*5796c8dcSSimon Schubert 
1317*5796c8dcSSimon Schubert static void
1318*5796c8dcSSimon Schubert install_visualizer (struct varobj *var, PyObject *constructor,
1319*5796c8dcSSimon Schubert 		    PyObject *visualizer)
1320*5796c8dcSSimon Schubert {
1321*5796c8dcSSimon Schubert   Py_XDECREF (var->constructor);
1322*5796c8dcSSimon Schubert   var->constructor = constructor;
1323*5796c8dcSSimon Schubert 
1324*5796c8dcSSimon Schubert   Py_XDECREF (var->pretty_printer);
1325*5796c8dcSSimon Schubert   var->pretty_printer = visualizer;
1326*5796c8dcSSimon Schubert 
1327*5796c8dcSSimon Schubert   Py_XDECREF (var->child_iter);
1328*5796c8dcSSimon Schubert   var->child_iter = NULL;
1329*5796c8dcSSimon Schubert }
1330*5796c8dcSSimon Schubert 
1331*5796c8dcSSimon Schubert /* Install the default visualizer for VAR.  */
1332*5796c8dcSSimon Schubert 
1333*5796c8dcSSimon Schubert static void
1334*5796c8dcSSimon Schubert install_default_visualizer (struct varobj *var)
1335*5796c8dcSSimon Schubert {
1336*5796c8dcSSimon Schubert   if (pretty_printing)
1337*5796c8dcSSimon Schubert     {
1338*5796c8dcSSimon Schubert       PyObject *pretty_printer = NULL;
1339*5796c8dcSSimon Schubert 
1340*5796c8dcSSimon Schubert       if (var->value)
1341*5796c8dcSSimon Schubert 	{
1342*5796c8dcSSimon Schubert 	  pretty_printer = gdbpy_get_varobj_pretty_printer (var->value);
1343*5796c8dcSSimon Schubert 	  if (! pretty_printer)
1344*5796c8dcSSimon Schubert 	    {
1345*5796c8dcSSimon Schubert 	      gdbpy_print_stack ();
1346*5796c8dcSSimon Schubert 	      error (_("Cannot instantiate printer for default visualizer"));
1347*5796c8dcSSimon Schubert 	    }
1348*5796c8dcSSimon Schubert 	}
1349*5796c8dcSSimon Schubert 
1350*5796c8dcSSimon Schubert       if (pretty_printer == Py_None)
1351*5796c8dcSSimon Schubert 	{
1352*5796c8dcSSimon Schubert 	  Py_DECREF (pretty_printer);
1353*5796c8dcSSimon Schubert 	  pretty_printer = NULL;
1354*5796c8dcSSimon Schubert 	}
1355*5796c8dcSSimon Schubert 
1356*5796c8dcSSimon Schubert       install_visualizer (var, NULL, pretty_printer);
1357*5796c8dcSSimon Schubert     }
1358*5796c8dcSSimon Schubert }
1359*5796c8dcSSimon Schubert 
1360*5796c8dcSSimon Schubert /* Instantiate and install a visualizer for VAR using CONSTRUCTOR to
1361*5796c8dcSSimon Schubert    make a new object.  */
1362*5796c8dcSSimon Schubert 
1363*5796c8dcSSimon Schubert static void
1364*5796c8dcSSimon Schubert construct_visualizer (struct varobj *var, PyObject *constructor)
1365*5796c8dcSSimon Schubert {
1366*5796c8dcSSimon Schubert   PyObject *pretty_printer;
1367*5796c8dcSSimon Schubert 
1368*5796c8dcSSimon Schubert   Py_INCREF (constructor);
1369*5796c8dcSSimon Schubert   if (constructor == Py_None)
1370*5796c8dcSSimon Schubert     pretty_printer = NULL;
1371*5796c8dcSSimon Schubert   else
1372*5796c8dcSSimon Schubert     {
1373*5796c8dcSSimon Schubert       pretty_printer = instantiate_pretty_printer (constructor, var->value);
1374*5796c8dcSSimon Schubert       if (! pretty_printer)
1375*5796c8dcSSimon Schubert 	{
1376*5796c8dcSSimon Schubert 	  gdbpy_print_stack ();
1377*5796c8dcSSimon Schubert 	  Py_DECREF (constructor);
1378*5796c8dcSSimon Schubert 	  constructor = Py_None;
1379*5796c8dcSSimon Schubert 	  Py_INCREF (constructor);
1380*5796c8dcSSimon Schubert 	}
1381*5796c8dcSSimon Schubert 
1382*5796c8dcSSimon Schubert       if (pretty_printer == Py_None)
1383*5796c8dcSSimon Schubert 	{
1384*5796c8dcSSimon Schubert 	  Py_DECREF (pretty_printer);
1385*5796c8dcSSimon Schubert 	  pretty_printer = NULL;
1386*5796c8dcSSimon Schubert 	}
1387*5796c8dcSSimon Schubert     }
1388*5796c8dcSSimon Schubert 
1389*5796c8dcSSimon Schubert   install_visualizer (var, constructor, pretty_printer);
1390*5796c8dcSSimon Schubert }
1391*5796c8dcSSimon Schubert 
1392*5796c8dcSSimon Schubert #endif /* HAVE_PYTHON */
1393*5796c8dcSSimon Schubert 
1394*5796c8dcSSimon Schubert /* A helper function for install_new_value.  This creates and installs
1395*5796c8dcSSimon Schubert    a visualizer for VAR, if appropriate.  */
1396*5796c8dcSSimon Schubert 
1397*5796c8dcSSimon Schubert static void
1398*5796c8dcSSimon Schubert install_new_value_visualizer (struct varobj *var)
1399*5796c8dcSSimon Schubert {
1400*5796c8dcSSimon Schubert #if HAVE_PYTHON
1401*5796c8dcSSimon Schubert   /* If the constructor is None, then we want the raw value.  If VAR
1402*5796c8dcSSimon Schubert      does not have a value, just skip this.  */
1403*5796c8dcSSimon Schubert   if (var->constructor != Py_None && var->value)
1404*5796c8dcSSimon Schubert     {
1405*5796c8dcSSimon Schubert       struct cleanup *cleanup;
1406*5796c8dcSSimon Schubert       PyObject *pretty_printer = NULL;
1407*5796c8dcSSimon Schubert 
1408*5796c8dcSSimon Schubert       cleanup = varobj_ensure_python_env (var);
1409*5796c8dcSSimon Schubert 
1410*5796c8dcSSimon Schubert       if (!var->constructor)
1411*5796c8dcSSimon Schubert 	install_default_visualizer (var);
1412*5796c8dcSSimon Schubert       else
1413*5796c8dcSSimon Schubert 	construct_visualizer (var, var->constructor);
1414*5796c8dcSSimon Schubert 
1415*5796c8dcSSimon Schubert       do_cleanups (cleanup);
1416*5796c8dcSSimon Schubert     }
1417*5796c8dcSSimon Schubert #else
1418*5796c8dcSSimon Schubert   /* Do nothing.  */
1419*5796c8dcSSimon Schubert #endif
1420*5796c8dcSSimon Schubert }
1421*5796c8dcSSimon Schubert 
1422*5796c8dcSSimon Schubert /* Assign a new value to a variable object.  If INITIAL is non-zero,
1423*5796c8dcSSimon Schubert    this is the first assignement after the variable object was just
1424*5796c8dcSSimon Schubert    created, or changed type.  In that case, just assign the value
1425*5796c8dcSSimon Schubert    and return 0.
1426*5796c8dcSSimon Schubert    Otherwise, assign the new value, and return 1 if the value is different
1427*5796c8dcSSimon Schubert    from the current one, 0 otherwise. The comparison is done on textual
1428*5796c8dcSSimon Schubert    representation of value. Therefore, some types need not be compared. E.g.
1429*5796c8dcSSimon Schubert    for structures the reported value is always "{...}", so no comparison is
1430*5796c8dcSSimon Schubert    necessary here. If the old value was NULL and new one is not, or vice versa,
1431*5796c8dcSSimon Schubert    we always return 1.
1432*5796c8dcSSimon Schubert 
1433*5796c8dcSSimon Schubert    The VALUE parameter should not be released -- the function will
1434*5796c8dcSSimon Schubert    take care of releasing it when needed.  */
1435*5796c8dcSSimon Schubert static int
1436*5796c8dcSSimon Schubert install_new_value (struct varobj *var, struct value *value, int initial)
1437*5796c8dcSSimon Schubert {
1438*5796c8dcSSimon Schubert   int changeable;
1439*5796c8dcSSimon Schubert   int need_to_fetch;
1440*5796c8dcSSimon Schubert   int changed = 0;
1441*5796c8dcSSimon Schubert   int intentionally_not_fetched = 0;
1442*5796c8dcSSimon Schubert   char *print_value = NULL;
1443*5796c8dcSSimon Schubert 
1444*5796c8dcSSimon Schubert   /* We need to know the varobj's type to decide if the value should
1445*5796c8dcSSimon Schubert      be fetched or not.  C++ fake children (public/protected/private) don't have
1446*5796c8dcSSimon Schubert      a type. */
1447*5796c8dcSSimon Schubert   gdb_assert (var->type || CPLUS_FAKE_CHILD (var));
1448*5796c8dcSSimon Schubert   changeable = varobj_value_is_changeable_p (var);
1449*5796c8dcSSimon Schubert 
1450*5796c8dcSSimon Schubert   /* If the type has custom visualizer, we consider it to be always
1451*5796c8dcSSimon Schubert      changeable. FIXME: need to make sure this behaviour will not
1452*5796c8dcSSimon Schubert      mess up read-sensitive values.  */
1453*5796c8dcSSimon Schubert   if (var->pretty_printer)
1454*5796c8dcSSimon Schubert     changeable = 1;
1455*5796c8dcSSimon Schubert 
1456*5796c8dcSSimon Schubert   need_to_fetch = changeable;
1457*5796c8dcSSimon Schubert 
1458*5796c8dcSSimon Schubert   /* We are not interested in the address of references, and given
1459*5796c8dcSSimon Schubert      that in C++ a reference is not rebindable, it cannot
1460*5796c8dcSSimon Schubert      meaningfully change.  So, get hold of the real value.  */
1461*5796c8dcSSimon Schubert   if (value)
1462*5796c8dcSSimon Schubert     value = coerce_ref (value);
1463*5796c8dcSSimon Schubert 
1464*5796c8dcSSimon Schubert   if (var->type && TYPE_CODE (var->type) == TYPE_CODE_UNION)
1465*5796c8dcSSimon Schubert     /* For unions, we need to fetch the value implicitly because
1466*5796c8dcSSimon Schubert        of implementation of union member fetch.  When gdb
1467*5796c8dcSSimon Schubert        creates a value for a field and the value of the enclosing
1468*5796c8dcSSimon Schubert        structure is not lazy,  it immediately copies the necessary
1469*5796c8dcSSimon Schubert        bytes from the enclosing values.  If the enclosing value is
1470*5796c8dcSSimon Schubert        lazy, the call to value_fetch_lazy on the field will read
1471*5796c8dcSSimon Schubert        the data from memory.  For unions, that means we'll read the
1472*5796c8dcSSimon Schubert        same memory more than once, which is not desirable.  So
1473*5796c8dcSSimon Schubert        fetch now.  */
1474*5796c8dcSSimon Schubert     need_to_fetch = 1;
1475*5796c8dcSSimon Schubert 
1476*5796c8dcSSimon Schubert   /* The new value might be lazy.  If the type is changeable,
1477*5796c8dcSSimon Schubert      that is we'll be comparing values of this type, fetch the
1478*5796c8dcSSimon Schubert      value now.  Otherwise, on the next update the old value
1479*5796c8dcSSimon Schubert      will be lazy, which means we've lost that old value.  */
1480*5796c8dcSSimon Schubert   if (need_to_fetch && value && value_lazy (value))
1481*5796c8dcSSimon Schubert     {
1482*5796c8dcSSimon Schubert       struct varobj *parent = var->parent;
1483*5796c8dcSSimon Schubert       int frozen = var->frozen;
1484*5796c8dcSSimon Schubert       for (; !frozen && parent; parent = parent->parent)
1485*5796c8dcSSimon Schubert 	frozen |= parent->frozen;
1486*5796c8dcSSimon Schubert 
1487*5796c8dcSSimon Schubert       if (frozen && initial)
1488*5796c8dcSSimon Schubert 	{
1489*5796c8dcSSimon Schubert 	  /* For variables that are frozen, or are children of frozen
1490*5796c8dcSSimon Schubert 	     variables, we don't do fetch on initial assignment.
1491*5796c8dcSSimon Schubert 	     For non-initial assignemnt we do the fetch, since it means we're
1492*5796c8dcSSimon Schubert 	     explicitly asked to compare the new value with the old one.  */
1493*5796c8dcSSimon Schubert 	  intentionally_not_fetched = 1;
1494*5796c8dcSSimon Schubert 	}
1495*5796c8dcSSimon Schubert       else if (!gdb_value_fetch_lazy (value))
1496*5796c8dcSSimon Schubert 	{
1497*5796c8dcSSimon Schubert 	  /* Set the value to NULL, so that for the next -var-update,
1498*5796c8dcSSimon Schubert 	     we don't try to compare the new value with this value,
1499*5796c8dcSSimon Schubert 	     that we couldn't even read.  */
1500*5796c8dcSSimon Schubert 	  value = NULL;
1501*5796c8dcSSimon Schubert 	}
1502*5796c8dcSSimon Schubert     }
1503*5796c8dcSSimon Schubert 
1504*5796c8dcSSimon Schubert 
1505*5796c8dcSSimon Schubert   /* Below, we'll be comparing string rendering of old and new
1506*5796c8dcSSimon Schubert      values.  Don't get string rendering if the value is
1507*5796c8dcSSimon Schubert      lazy -- if it is, the code above has decided that the value
1508*5796c8dcSSimon Schubert      should not be fetched.  */
1509*5796c8dcSSimon Schubert   if (value && !value_lazy (value) && !var->pretty_printer)
1510*5796c8dcSSimon Schubert     print_value = value_get_print_value (value, var->format, var);
1511*5796c8dcSSimon Schubert 
1512*5796c8dcSSimon Schubert   /* If the type is changeable, compare the old and the new values.
1513*5796c8dcSSimon Schubert      If this is the initial assignment, we don't have any old value
1514*5796c8dcSSimon Schubert      to compare with.  */
1515*5796c8dcSSimon Schubert   if (!initial && changeable)
1516*5796c8dcSSimon Schubert     {
1517*5796c8dcSSimon Schubert       /* If the value of the varobj was changed by -var-set-value, then the
1518*5796c8dcSSimon Schubert 	 value in the varobj and in the target is the same.  However, that value
1519*5796c8dcSSimon Schubert 	 is different from the value that the varobj had after the previous
1520*5796c8dcSSimon Schubert 	 -var-update. So need to the varobj as changed.  */
1521*5796c8dcSSimon Schubert       if (var->updated)
1522*5796c8dcSSimon Schubert 	{
1523*5796c8dcSSimon Schubert 	  changed = 1;
1524*5796c8dcSSimon Schubert 	}
1525*5796c8dcSSimon Schubert       else if (! var->pretty_printer)
1526*5796c8dcSSimon Schubert 	{
1527*5796c8dcSSimon Schubert 	  /* Try to compare the values.  That requires that both
1528*5796c8dcSSimon Schubert 	     values are non-lazy.  */
1529*5796c8dcSSimon Schubert 	  if (var->not_fetched && value_lazy (var->value))
1530*5796c8dcSSimon Schubert 	    {
1531*5796c8dcSSimon Schubert 	      /* This is a frozen varobj and the value was never read.
1532*5796c8dcSSimon Schubert 		 Presumably, UI shows some "never read" indicator.
1533*5796c8dcSSimon Schubert 		 Now that we've fetched the real value, we need to report
1534*5796c8dcSSimon Schubert 		 this varobj as changed so that UI can show the real
1535*5796c8dcSSimon Schubert 		 value.  */
1536*5796c8dcSSimon Schubert 	      changed = 1;
1537*5796c8dcSSimon Schubert 	    }
1538*5796c8dcSSimon Schubert           else  if (var->value == NULL && value == NULL)
1539*5796c8dcSSimon Schubert 	    /* Equal. */
1540*5796c8dcSSimon Schubert 	    ;
1541*5796c8dcSSimon Schubert 	  else if (var->value == NULL || value == NULL)
1542*5796c8dcSSimon Schubert 	    {
1543*5796c8dcSSimon Schubert 	      changed = 1;
1544*5796c8dcSSimon Schubert 	    }
1545*5796c8dcSSimon Schubert 	  else
1546*5796c8dcSSimon Schubert 	    {
1547*5796c8dcSSimon Schubert 	      gdb_assert (!value_lazy (var->value));
1548*5796c8dcSSimon Schubert 	      gdb_assert (!value_lazy (value));
1549*5796c8dcSSimon Schubert 
1550*5796c8dcSSimon Schubert 	      gdb_assert (var->print_value != NULL && print_value != NULL);
1551*5796c8dcSSimon Schubert 	      if (strcmp (var->print_value, print_value) != 0)
1552*5796c8dcSSimon Schubert 		changed = 1;
1553*5796c8dcSSimon Schubert 	    }
1554*5796c8dcSSimon Schubert 	}
1555*5796c8dcSSimon Schubert     }
1556*5796c8dcSSimon Schubert 
1557*5796c8dcSSimon Schubert   if (!initial && !changeable)
1558*5796c8dcSSimon Schubert     {
1559*5796c8dcSSimon Schubert       /* For values that are not changeable, we don't compare the values.
1560*5796c8dcSSimon Schubert 	 However, we want to notice if a value was not NULL and now is NULL,
1561*5796c8dcSSimon Schubert 	 or vise versa, so that we report when top-level varobjs come in scope
1562*5796c8dcSSimon Schubert 	 and leave the scope.  */
1563*5796c8dcSSimon Schubert       changed = (var->value != NULL) != (value != NULL);
1564*5796c8dcSSimon Schubert     }
1565*5796c8dcSSimon Schubert 
1566*5796c8dcSSimon Schubert   /* We must always keep the new value, since children depend on it.  */
1567*5796c8dcSSimon Schubert   if (var->value != NULL && var->value != value)
1568*5796c8dcSSimon Schubert     value_free (var->value);
1569*5796c8dcSSimon Schubert   var->value = value;
1570*5796c8dcSSimon Schubert   if (value != NULL)
1571*5796c8dcSSimon Schubert     value_incref (value);
1572*5796c8dcSSimon Schubert   if (value && value_lazy (value) && intentionally_not_fetched)
1573*5796c8dcSSimon Schubert     var->not_fetched = 1;
1574*5796c8dcSSimon Schubert   else
1575*5796c8dcSSimon Schubert     var->not_fetched = 0;
1576*5796c8dcSSimon Schubert   var->updated = 0;
1577*5796c8dcSSimon Schubert 
1578*5796c8dcSSimon Schubert   install_new_value_visualizer (var);
1579*5796c8dcSSimon Schubert 
1580*5796c8dcSSimon Schubert   /* If we installed a pretty-printer, re-compare the printed version
1581*5796c8dcSSimon Schubert      to see if the variable changed.  */
1582*5796c8dcSSimon Schubert   if (var->pretty_printer)
1583*5796c8dcSSimon Schubert     {
1584*5796c8dcSSimon Schubert       xfree (print_value);
1585*5796c8dcSSimon Schubert       print_value = value_get_print_value (var->value, var->format, var);
1586*5796c8dcSSimon Schubert       if (!var->print_value || strcmp (var->print_value, print_value) != 0)
1587*5796c8dcSSimon Schubert 	changed = 1;
1588*5796c8dcSSimon Schubert     }
1589*5796c8dcSSimon Schubert   if (var->print_value)
1590*5796c8dcSSimon Schubert     xfree (var->print_value);
1591*5796c8dcSSimon Schubert   var->print_value = print_value;
1592*5796c8dcSSimon Schubert 
1593*5796c8dcSSimon Schubert   gdb_assert (!var->value || value_type (var->value));
1594*5796c8dcSSimon Schubert 
1595*5796c8dcSSimon Schubert   return changed;
1596*5796c8dcSSimon Schubert }
1597*5796c8dcSSimon Schubert 
1598*5796c8dcSSimon Schubert /* Return the requested range for a varobj.  VAR is the varobj.  FROM
1599*5796c8dcSSimon Schubert    and TO are out parameters; *FROM and *TO will be set to the
1600*5796c8dcSSimon Schubert    selected sub-range of VAR.  If no range was selected using
1601*5796c8dcSSimon Schubert    -var-set-update-range, then both will be -1.  */
1602*5796c8dcSSimon Schubert void
1603*5796c8dcSSimon Schubert varobj_get_child_range (struct varobj *var, int *from, int *to)
1604*5796c8dcSSimon Schubert {
1605*5796c8dcSSimon Schubert   *from = var->from;
1606*5796c8dcSSimon Schubert   *to = var->to;
1607*5796c8dcSSimon Schubert }
1608*5796c8dcSSimon Schubert 
1609*5796c8dcSSimon Schubert /* Set the selected sub-range of children of VAR to start at index
1610*5796c8dcSSimon Schubert    FROM and end at index TO.  If either FROM or TO is less than zero,
1611*5796c8dcSSimon Schubert    this is interpreted as a request for all children.  */
1612*5796c8dcSSimon Schubert void
1613*5796c8dcSSimon Schubert varobj_set_child_range (struct varobj *var, int from, int to)
1614*5796c8dcSSimon Schubert {
1615*5796c8dcSSimon Schubert   var->from = from;
1616*5796c8dcSSimon Schubert   var->to = to;
1617*5796c8dcSSimon Schubert }
1618*5796c8dcSSimon Schubert 
1619*5796c8dcSSimon Schubert void
1620*5796c8dcSSimon Schubert varobj_set_visualizer (struct varobj *var, const char *visualizer)
1621*5796c8dcSSimon Schubert {
1622*5796c8dcSSimon Schubert #if HAVE_PYTHON
1623*5796c8dcSSimon Schubert   PyObject *mainmod, *globals, *pretty_printer, *constructor;
1624*5796c8dcSSimon Schubert   struct cleanup *back_to, *value;
1625*5796c8dcSSimon Schubert 
1626*5796c8dcSSimon Schubert   back_to = varobj_ensure_python_env (var);
1627*5796c8dcSSimon Schubert 
1628*5796c8dcSSimon Schubert   mainmod = PyImport_AddModule ("__main__");
1629*5796c8dcSSimon Schubert   globals = PyModule_GetDict (mainmod);
1630*5796c8dcSSimon Schubert   Py_INCREF (globals);
1631*5796c8dcSSimon Schubert   make_cleanup_py_decref (globals);
1632*5796c8dcSSimon Schubert 
1633*5796c8dcSSimon Schubert   constructor = PyRun_String (visualizer, Py_eval_input, globals, globals);
1634*5796c8dcSSimon Schubert 
1635*5796c8dcSSimon Schubert   if (! constructor)
1636*5796c8dcSSimon Schubert     {
1637*5796c8dcSSimon Schubert       gdbpy_print_stack ();
1638*5796c8dcSSimon Schubert       error (_("Could not evaluate visualizer expression: %s"), visualizer);
1639*5796c8dcSSimon Schubert     }
1640*5796c8dcSSimon Schubert 
1641*5796c8dcSSimon Schubert   construct_visualizer (var, constructor);
1642*5796c8dcSSimon Schubert   Py_XDECREF (constructor);
1643*5796c8dcSSimon Schubert 
1644*5796c8dcSSimon Schubert   /* If there are any children now, wipe them.  */
1645*5796c8dcSSimon Schubert   varobj_delete (var, NULL, 1 /* children only */);
1646*5796c8dcSSimon Schubert   var->num_children = -1;
1647*5796c8dcSSimon Schubert 
1648*5796c8dcSSimon Schubert   do_cleanups (back_to);
1649*5796c8dcSSimon Schubert #else
1650*5796c8dcSSimon Schubert   error (_("Python support required"));
1651*5796c8dcSSimon Schubert #endif
1652*5796c8dcSSimon Schubert }
1653*5796c8dcSSimon Schubert 
1654*5796c8dcSSimon Schubert /* Update the values for a variable and its children.  This is a
1655*5796c8dcSSimon Schubert    two-pronged attack.  First, re-parse the value for the root's
1656*5796c8dcSSimon Schubert    expression to see if it's changed.  Then go all the way
1657*5796c8dcSSimon Schubert    through its children, reconstructing them and noting if they've
1658*5796c8dcSSimon Schubert    changed.
1659*5796c8dcSSimon Schubert 
1660*5796c8dcSSimon Schubert    The EXPLICIT parameter specifies if this call is result
1661*5796c8dcSSimon Schubert    of MI request to update this specific variable, or
1662*5796c8dcSSimon Schubert    result of implicit -var-update *. For implicit request, we don't
1663*5796c8dcSSimon Schubert    update frozen variables.
1664*5796c8dcSSimon Schubert 
1665*5796c8dcSSimon Schubert    NOTE: This function may delete the caller's varobj. If it
1666*5796c8dcSSimon Schubert    returns TYPE_CHANGED, then it has done this and VARP will be modified
1667*5796c8dcSSimon Schubert    to point to the new varobj.  */
1668*5796c8dcSSimon Schubert 
1669*5796c8dcSSimon Schubert VEC(varobj_update_result) *varobj_update (struct varobj **varp, int explicit)
1670*5796c8dcSSimon Schubert {
1671*5796c8dcSSimon Schubert   int changed = 0;
1672*5796c8dcSSimon Schubert   int type_changed = 0;
1673*5796c8dcSSimon Schubert   int i;
1674*5796c8dcSSimon Schubert   int vleft;
1675*5796c8dcSSimon Schubert   struct varobj *v;
1676*5796c8dcSSimon Schubert   struct varobj **cv;
1677*5796c8dcSSimon Schubert   struct varobj **templist = NULL;
1678*5796c8dcSSimon Schubert   struct value *new;
1679*5796c8dcSSimon Schubert   VEC (varobj_update_result) *stack = NULL;
1680*5796c8dcSSimon Schubert   VEC (varobj_update_result) *result = NULL;
1681*5796c8dcSSimon Schubert   struct frame_info *fi;
1682*5796c8dcSSimon Schubert 
1683*5796c8dcSSimon Schubert   /* Frozen means frozen -- we don't check for any change in
1684*5796c8dcSSimon Schubert      this varobj, including its going out of scope, or
1685*5796c8dcSSimon Schubert      changing type.  One use case for frozen varobjs is
1686*5796c8dcSSimon Schubert      retaining previously evaluated expressions, and we don't
1687*5796c8dcSSimon Schubert      want them to be reevaluated at all.  */
1688*5796c8dcSSimon Schubert   if (!explicit && (*varp)->frozen)
1689*5796c8dcSSimon Schubert     return result;
1690*5796c8dcSSimon Schubert 
1691*5796c8dcSSimon Schubert   if (!(*varp)->root->is_valid)
1692*5796c8dcSSimon Schubert     {
1693*5796c8dcSSimon Schubert       varobj_update_result r = {*varp};
1694*5796c8dcSSimon Schubert       r.status = VAROBJ_INVALID;
1695*5796c8dcSSimon Schubert       VEC_safe_push (varobj_update_result, result, &r);
1696*5796c8dcSSimon Schubert       return result;
1697*5796c8dcSSimon Schubert     }
1698*5796c8dcSSimon Schubert 
1699*5796c8dcSSimon Schubert   if ((*varp)->root->rootvar == *varp)
1700*5796c8dcSSimon Schubert     {
1701*5796c8dcSSimon Schubert       varobj_update_result r = {*varp};
1702*5796c8dcSSimon Schubert       r.status = VAROBJ_IN_SCOPE;
1703*5796c8dcSSimon Schubert 
1704*5796c8dcSSimon Schubert       /* Update the root variable. value_of_root can return NULL
1705*5796c8dcSSimon Schubert 	 if the variable is no longer around, i.e. we stepped out of
1706*5796c8dcSSimon Schubert 	 the frame in which a local existed. We are letting the
1707*5796c8dcSSimon Schubert 	 value_of_root variable dispose of the varobj if the type
1708*5796c8dcSSimon Schubert 	 has changed.  */
1709*5796c8dcSSimon Schubert       new = value_of_root (varp, &type_changed);
1710*5796c8dcSSimon Schubert       r.varobj = *varp;
1711*5796c8dcSSimon Schubert 
1712*5796c8dcSSimon Schubert       r.type_changed = type_changed;
1713*5796c8dcSSimon Schubert       if (install_new_value ((*varp), new, type_changed))
1714*5796c8dcSSimon Schubert 	r.changed = 1;
1715*5796c8dcSSimon Schubert 
1716*5796c8dcSSimon Schubert       if (new == NULL)
1717*5796c8dcSSimon Schubert 	r.status = VAROBJ_NOT_IN_SCOPE;
1718*5796c8dcSSimon Schubert       r.value_installed = 1;
1719*5796c8dcSSimon Schubert 
1720*5796c8dcSSimon Schubert       if (r.status == VAROBJ_NOT_IN_SCOPE)
1721*5796c8dcSSimon Schubert 	{
1722*5796c8dcSSimon Schubert 	  if (r.type_changed || r.changed)
1723*5796c8dcSSimon Schubert 	    VEC_safe_push (varobj_update_result, result, &r);
1724*5796c8dcSSimon Schubert 	  return result;
1725*5796c8dcSSimon Schubert 	}
1726*5796c8dcSSimon Schubert 
1727*5796c8dcSSimon Schubert       VEC_safe_push (varobj_update_result, stack, &r);
1728*5796c8dcSSimon Schubert     }
1729*5796c8dcSSimon Schubert   else
1730*5796c8dcSSimon Schubert     {
1731*5796c8dcSSimon Schubert       varobj_update_result r = {*varp};
1732*5796c8dcSSimon Schubert       VEC_safe_push (varobj_update_result, stack, &r);
1733*5796c8dcSSimon Schubert     }
1734*5796c8dcSSimon Schubert 
1735*5796c8dcSSimon Schubert   /* Walk through the children, reconstructing them all.  */
1736*5796c8dcSSimon Schubert   while (!VEC_empty (varobj_update_result, stack))
1737*5796c8dcSSimon Schubert     {
1738*5796c8dcSSimon Schubert       varobj_update_result r = *(VEC_last (varobj_update_result, stack));
1739*5796c8dcSSimon Schubert       struct varobj *v = r.varobj;
1740*5796c8dcSSimon Schubert 
1741*5796c8dcSSimon Schubert       VEC_pop (varobj_update_result, stack);
1742*5796c8dcSSimon Schubert 
1743*5796c8dcSSimon Schubert       /* Update this variable, unless it's a root, which is already
1744*5796c8dcSSimon Schubert 	 updated.  */
1745*5796c8dcSSimon Schubert       if (!r.value_installed)
1746*5796c8dcSSimon Schubert 	{
1747*5796c8dcSSimon Schubert 	  new = value_of_child (v->parent, v->index);
1748*5796c8dcSSimon Schubert 	  if (install_new_value (v, new, 0 /* type not changed */))
1749*5796c8dcSSimon Schubert 	    {
1750*5796c8dcSSimon Schubert 	      r.changed = 1;
1751*5796c8dcSSimon Schubert 	      v->updated = 0;
1752*5796c8dcSSimon Schubert 	    }
1753*5796c8dcSSimon Schubert 	}
1754*5796c8dcSSimon Schubert 
1755*5796c8dcSSimon Schubert       /* We probably should not get children of a varobj that has a
1756*5796c8dcSSimon Schubert 	 pretty-printer, but for which -var-list-children was never
1757*5796c8dcSSimon Schubert 	 invoked.    */
1758*5796c8dcSSimon Schubert       if (v->pretty_printer)
1759*5796c8dcSSimon Schubert 	{
1760*5796c8dcSSimon Schubert 	  VEC (varobj_p) *changed = 0, *new = 0, *unchanged = 0;
1761*5796c8dcSSimon Schubert 	  int i, children_changed = 0;
1762*5796c8dcSSimon Schubert 
1763*5796c8dcSSimon Schubert 	  if (v->frozen)
1764*5796c8dcSSimon Schubert 	    continue;
1765*5796c8dcSSimon Schubert 
1766*5796c8dcSSimon Schubert 	  if (!v->children_requested)
1767*5796c8dcSSimon Schubert 	    {
1768*5796c8dcSSimon Schubert 	      int dummy;
1769*5796c8dcSSimon Schubert 
1770*5796c8dcSSimon Schubert 	      /* If we initially did not have potential children, but
1771*5796c8dcSSimon Schubert 		 now we do, consider the varobj as changed.
1772*5796c8dcSSimon Schubert 		 Otherwise, if children were never requested, consider
1773*5796c8dcSSimon Schubert 		 it as unchanged -- presumably, such varobj is not yet
1774*5796c8dcSSimon Schubert 		 expanded in the UI, so we need not bother getting
1775*5796c8dcSSimon Schubert 		 it.  */
1776*5796c8dcSSimon Schubert 	      if (!varobj_has_more (v, 0))
1777*5796c8dcSSimon Schubert 		{
1778*5796c8dcSSimon Schubert 		  update_dynamic_varobj_children (v, NULL, NULL, NULL,
1779*5796c8dcSSimon Schubert 						  &dummy, 0, 0, 0);
1780*5796c8dcSSimon Schubert 		  if (varobj_has_more (v, 0))
1781*5796c8dcSSimon Schubert 		    r.changed = 1;
1782*5796c8dcSSimon Schubert 		}
1783*5796c8dcSSimon Schubert 
1784*5796c8dcSSimon Schubert 	      if (r.changed)
1785*5796c8dcSSimon Schubert 		VEC_safe_push (varobj_update_result, result, &r);
1786*5796c8dcSSimon Schubert 
1787*5796c8dcSSimon Schubert 	      continue;
1788*5796c8dcSSimon Schubert 	    }
1789*5796c8dcSSimon Schubert 
1790*5796c8dcSSimon Schubert 	  /* If update_dynamic_varobj_children returns 0, then we have
1791*5796c8dcSSimon Schubert 	     a non-conforming pretty-printer, so we skip it.  */
1792*5796c8dcSSimon Schubert 	  if (update_dynamic_varobj_children (v, &changed, &new, &unchanged,
1793*5796c8dcSSimon Schubert 					      &children_changed, 1,
1794*5796c8dcSSimon Schubert 					      v->from, v->to))
1795*5796c8dcSSimon Schubert 	    {
1796*5796c8dcSSimon Schubert 	      if (children_changed || new)
1797*5796c8dcSSimon Schubert 		{
1798*5796c8dcSSimon Schubert 		  r.children_changed = 1;
1799*5796c8dcSSimon Schubert 		  r.new = new;
1800*5796c8dcSSimon Schubert 		}
1801*5796c8dcSSimon Schubert 	      /* Push in reverse order so that the first child is
1802*5796c8dcSSimon Schubert 		 popped from the work stack first, and so will be
1803*5796c8dcSSimon Schubert 		 added to result first.  This does not affect
1804*5796c8dcSSimon Schubert 		 correctness, just "nicer".  */
1805*5796c8dcSSimon Schubert 	      for (i = VEC_length (varobj_p, changed) - 1; i >= 0; --i)
1806*5796c8dcSSimon Schubert 		{
1807*5796c8dcSSimon Schubert 		  varobj_p tmp = VEC_index (varobj_p, changed, i);
1808*5796c8dcSSimon Schubert 		  varobj_update_result r = {tmp};
1809*5796c8dcSSimon Schubert 		  r.changed = 1;
1810*5796c8dcSSimon Schubert 		  r.value_installed = 1;
1811*5796c8dcSSimon Schubert 		  VEC_safe_push (varobj_update_result, stack, &r);
1812*5796c8dcSSimon Schubert 		}
1813*5796c8dcSSimon Schubert 	      for (i = VEC_length (varobj_p, unchanged) - 1; i >= 0; --i)
1814*5796c8dcSSimon Schubert 	      	{
1815*5796c8dcSSimon Schubert 		  varobj_p tmp = VEC_index (varobj_p, unchanged, i);
1816*5796c8dcSSimon Schubert 	      	  if (!tmp->frozen)
1817*5796c8dcSSimon Schubert 	      	    {
1818*5796c8dcSSimon Schubert 	      	      varobj_update_result r = {tmp};
1819*5796c8dcSSimon Schubert 	      	      r.value_installed = 1;
1820*5796c8dcSSimon Schubert 	      	      VEC_safe_push (varobj_update_result, stack, &r);
1821*5796c8dcSSimon Schubert 	      	    }
1822*5796c8dcSSimon Schubert 	      	}
1823*5796c8dcSSimon Schubert 	      if (r.changed || r.children_changed)
1824*5796c8dcSSimon Schubert 		VEC_safe_push (varobj_update_result, result, &r);
1825*5796c8dcSSimon Schubert 
1826*5796c8dcSSimon Schubert 	      /* Free CHANGED and UNCHANGED, but not NEW, because NEW
1827*5796c8dcSSimon Schubert 		 has been put into the result vector.  */
1828*5796c8dcSSimon Schubert 	      VEC_free (varobj_p, changed);
1829*5796c8dcSSimon Schubert 	      VEC_free (varobj_p, unchanged);
1830*5796c8dcSSimon Schubert 
1831*5796c8dcSSimon Schubert 	      continue;
1832*5796c8dcSSimon Schubert 	    }
1833*5796c8dcSSimon Schubert 	}
1834*5796c8dcSSimon Schubert 
1835*5796c8dcSSimon Schubert       /* Push any children.  Use reverse order so that the first
1836*5796c8dcSSimon Schubert 	 child is popped from the work stack first, and so
1837*5796c8dcSSimon Schubert 	 will be added to result first.  This does not
1838*5796c8dcSSimon Schubert 	 affect correctness, just "nicer".  */
1839*5796c8dcSSimon Schubert       for (i = VEC_length (varobj_p, v->children)-1; i >= 0; --i)
1840*5796c8dcSSimon Schubert 	{
1841*5796c8dcSSimon Schubert 	  varobj_p c = VEC_index (varobj_p, v->children, i);
1842*5796c8dcSSimon Schubert 	  /* Child may be NULL if explicitly deleted by -var-delete.  */
1843*5796c8dcSSimon Schubert 	  if (c != NULL && !c->frozen)
1844*5796c8dcSSimon Schubert 	    {
1845*5796c8dcSSimon Schubert 	      varobj_update_result r = {c};
1846*5796c8dcSSimon Schubert 	      VEC_safe_push (varobj_update_result, stack, &r);
1847*5796c8dcSSimon Schubert 	    }
1848*5796c8dcSSimon Schubert 	}
1849*5796c8dcSSimon Schubert 
1850*5796c8dcSSimon Schubert       if (r.changed || r.type_changed)
1851*5796c8dcSSimon Schubert 	VEC_safe_push (varobj_update_result, result, &r);
1852*5796c8dcSSimon Schubert     }
1853*5796c8dcSSimon Schubert 
1854*5796c8dcSSimon Schubert   VEC_free (varobj_update_result, stack);
1855*5796c8dcSSimon Schubert 
1856*5796c8dcSSimon Schubert   return result;
1857*5796c8dcSSimon Schubert }
1858*5796c8dcSSimon Schubert 
1859*5796c8dcSSimon Schubert 
1860*5796c8dcSSimon Schubert /* Helper functions */
1861*5796c8dcSSimon Schubert 
1862*5796c8dcSSimon Schubert /*
1863*5796c8dcSSimon Schubert  * Variable object construction/destruction
1864*5796c8dcSSimon Schubert  */
1865*5796c8dcSSimon Schubert 
1866*5796c8dcSSimon Schubert static int
1867*5796c8dcSSimon Schubert delete_variable (struct cpstack **resultp, struct varobj *var,
1868*5796c8dcSSimon Schubert 		 int only_children_p)
1869*5796c8dcSSimon Schubert {
1870*5796c8dcSSimon Schubert   int delcount = 0;
1871*5796c8dcSSimon Schubert 
1872*5796c8dcSSimon Schubert   delete_variable_1 (resultp, &delcount, var,
1873*5796c8dcSSimon Schubert 		     only_children_p, 1 /* remove_from_parent_p */ );
1874*5796c8dcSSimon Schubert 
1875*5796c8dcSSimon Schubert   return delcount;
1876*5796c8dcSSimon Schubert }
1877*5796c8dcSSimon Schubert 
1878*5796c8dcSSimon Schubert /* Delete the variable object VAR and its children */
1879*5796c8dcSSimon Schubert /* IMPORTANT NOTE: If we delete a variable which is a child
1880*5796c8dcSSimon Schubert    and the parent is not removed we dump core.  It must be always
1881*5796c8dcSSimon Schubert    initially called with remove_from_parent_p set */
1882*5796c8dcSSimon Schubert static void
1883*5796c8dcSSimon Schubert delete_variable_1 (struct cpstack **resultp, int *delcountp,
1884*5796c8dcSSimon Schubert 		   struct varobj *var, int only_children_p,
1885*5796c8dcSSimon Schubert 		   int remove_from_parent_p)
1886*5796c8dcSSimon Schubert {
1887*5796c8dcSSimon Schubert   int i;
1888*5796c8dcSSimon Schubert 
1889*5796c8dcSSimon Schubert   /* Delete any children of this variable, too. */
1890*5796c8dcSSimon Schubert   for (i = 0; i < VEC_length (varobj_p, var->children); ++i)
1891*5796c8dcSSimon Schubert     {
1892*5796c8dcSSimon Schubert       varobj_p child = VEC_index (varobj_p, var->children, i);
1893*5796c8dcSSimon Schubert       if (!child)
1894*5796c8dcSSimon Schubert 	continue;
1895*5796c8dcSSimon Schubert       if (!remove_from_parent_p)
1896*5796c8dcSSimon Schubert 	child->parent = NULL;
1897*5796c8dcSSimon Schubert       delete_variable_1 (resultp, delcountp, child, 0, only_children_p);
1898*5796c8dcSSimon Schubert     }
1899*5796c8dcSSimon Schubert   VEC_free (varobj_p, var->children);
1900*5796c8dcSSimon Schubert 
1901*5796c8dcSSimon Schubert   /* if we were called to delete only the children we are done here */
1902*5796c8dcSSimon Schubert   if (only_children_p)
1903*5796c8dcSSimon Schubert     return;
1904*5796c8dcSSimon Schubert 
1905*5796c8dcSSimon Schubert   /* Otherwise, add it to the list of deleted ones and proceed to do so */
1906*5796c8dcSSimon Schubert   /* If the name is null, this is a temporary variable, that has not
1907*5796c8dcSSimon Schubert      yet been installed, don't report it, it belongs to the caller... */
1908*5796c8dcSSimon Schubert   if (var->obj_name != NULL)
1909*5796c8dcSSimon Schubert     {
1910*5796c8dcSSimon Schubert       cppush (resultp, xstrdup (var->obj_name));
1911*5796c8dcSSimon Schubert       *delcountp = *delcountp + 1;
1912*5796c8dcSSimon Schubert     }
1913*5796c8dcSSimon Schubert 
1914*5796c8dcSSimon Schubert   /* If this variable has a parent, remove it from its parent's list */
1915*5796c8dcSSimon Schubert   /* OPTIMIZATION: if the parent of this variable is also being deleted,
1916*5796c8dcSSimon Schubert      (as indicated by remove_from_parent_p) we don't bother doing an
1917*5796c8dcSSimon Schubert      expensive list search to find the element to remove when we are
1918*5796c8dcSSimon Schubert      discarding the list afterwards */
1919*5796c8dcSSimon Schubert   if ((remove_from_parent_p) && (var->parent != NULL))
1920*5796c8dcSSimon Schubert     {
1921*5796c8dcSSimon Schubert       VEC_replace (varobj_p, var->parent->children, var->index, NULL);
1922*5796c8dcSSimon Schubert     }
1923*5796c8dcSSimon Schubert 
1924*5796c8dcSSimon Schubert   if (var->obj_name != NULL)
1925*5796c8dcSSimon Schubert     uninstall_variable (var);
1926*5796c8dcSSimon Schubert 
1927*5796c8dcSSimon Schubert   /* Free memory associated with this variable */
1928*5796c8dcSSimon Schubert   free_variable (var);
1929*5796c8dcSSimon Schubert }
1930*5796c8dcSSimon Schubert 
1931*5796c8dcSSimon Schubert /* Install the given variable VAR with the object name VAR->OBJ_NAME. */
1932*5796c8dcSSimon Schubert static int
1933*5796c8dcSSimon Schubert install_variable (struct varobj *var)
1934*5796c8dcSSimon Schubert {
1935*5796c8dcSSimon Schubert   struct vlist *cv;
1936*5796c8dcSSimon Schubert   struct vlist *newvl;
1937*5796c8dcSSimon Schubert   const char *chp;
1938*5796c8dcSSimon Schubert   unsigned int index = 0;
1939*5796c8dcSSimon Schubert   unsigned int i = 1;
1940*5796c8dcSSimon Schubert 
1941*5796c8dcSSimon Schubert   for (chp = var->obj_name; *chp; chp++)
1942*5796c8dcSSimon Schubert     {
1943*5796c8dcSSimon Schubert       index = (index + (i++ * (unsigned int) *chp)) % VAROBJ_TABLE_SIZE;
1944*5796c8dcSSimon Schubert     }
1945*5796c8dcSSimon Schubert 
1946*5796c8dcSSimon Schubert   cv = *(varobj_table + index);
1947*5796c8dcSSimon Schubert   while ((cv != NULL) && (strcmp (cv->var->obj_name, var->obj_name) != 0))
1948*5796c8dcSSimon Schubert     cv = cv->next;
1949*5796c8dcSSimon Schubert 
1950*5796c8dcSSimon Schubert   if (cv != NULL)
1951*5796c8dcSSimon Schubert     error (_("Duplicate variable object name"));
1952*5796c8dcSSimon Schubert 
1953*5796c8dcSSimon Schubert   /* Add varobj to hash table */
1954*5796c8dcSSimon Schubert   newvl = xmalloc (sizeof (struct vlist));
1955*5796c8dcSSimon Schubert   newvl->next = *(varobj_table + index);
1956*5796c8dcSSimon Schubert   newvl->var = var;
1957*5796c8dcSSimon Schubert   *(varobj_table + index) = newvl;
1958*5796c8dcSSimon Schubert 
1959*5796c8dcSSimon Schubert   /* If root, add varobj to root list */
1960*5796c8dcSSimon Schubert   if (is_root_p (var))
1961*5796c8dcSSimon Schubert     {
1962*5796c8dcSSimon Schubert       /* Add to list of root variables */
1963*5796c8dcSSimon Schubert       if (rootlist == NULL)
1964*5796c8dcSSimon Schubert 	var->root->next = NULL;
1965*5796c8dcSSimon Schubert       else
1966*5796c8dcSSimon Schubert 	var->root->next = rootlist;
1967*5796c8dcSSimon Schubert       rootlist = var->root;
1968*5796c8dcSSimon Schubert     }
1969*5796c8dcSSimon Schubert 
1970*5796c8dcSSimon Schubert   return 1;			/* OK */
1971*5796c8dcSSimon Schubert }
1972*5796c8dcSSimon Schubert 
1973*5796c8dcSSimon Schubert /* Unistall the object VAR. */
1974*5796c8dcSSimon Schubert static void
1975*5796c8dcSSimon Schubert uninstall_variable (struct varobj *var)
1976*5796c8dcSSimon Schubert {
1977*5796c8dcSSimon Schubert   struct vlist *cv;
1978*5796c8dcSSimon Schubert   struct vlist *prev;
1979*5796c8dcSSimon Schubert   struct varobj_root *cr;
1980*5796c8dcSSimon Schubert   struct varobj_root *prer;
1981*5796c8dcSSimon Schubert   const char *chp;
1982*5796c8dcSSimon Schubert   unsigned int index = 0;
1983*5796c8dcSSimon Schubert   unsigned int i = 1;
1984*5796c8dcSSimon Schubert 
1985*5796c8dcSSimon Schubert   /* Remove varobj from hash table */
1986*5796c8dcSSimon Schubert   for (chp = var->obj_name; *chp; chp++)
1987*5796c8dcSSimon Schubert     {
1988*5796c8dcSSimon Schubert       index = (index + (i++ * (unsigned int) *chp)) % VAROBJ_TABLE_SIZE;
1989*5796c8dcSSimon Schubert     }
1990*5796c8dcSSimon Schubert 
1991*5796c8dcSSimon Schubert   cv = *(varobj_table + index);
1992*5796c8dcSSimon Schubert   prev = NULL;
1993*5796c8dcSSimon Schubert   while ((cv != NULL) && (strcmp (cv->var->obj_name, var->obj_name) != 0))
1994*5796c8dcSSimon Schubert     {
1995*5796c8dcSSimon Schubert       prev = cv;
1996*5796c8dcSSimon Schubert       cv = cv->next;
1997*5796c8dcSSimon Schubert     }
1998*5796c8dcSSimon Schubert 
1999*5796c8dcSSimon Schubert   if (varobjdebug)
2000*5796c8dcSSimon Schubert     fprintf_unfiltered (gdb_stdlog, "Deleting %s\n", var->obj_name);
2001*5796c8dcSSimon Schubert 
2002*5796c8dcSSimon Schubert   if (cv == NULL)
2003*5796c8dcSSimon Schubert     {
2004*5796c8dcSSimon Schubert       warning
2005*5796c8dcSSimon Schubert 	("Assertion failed: Could not find variable object \"%s\" to delete",
2006*5796c8dcSSimon Schubert 	 var->obj_name);
2007*5796c8dcSSimon Schubert       return;
2008*5796c8dcSSimon Schubert     }
2009*5796c8dcSSimon Schubert 
2010*5796c8dcSSimon Schubert   if (prev == NULL)
2011*5796c8dcSSimon Schubert     *(varobj_table + index) = cv->next;
2012*5796c8dcSSimon Schubert   else
2013*5796c8dcSSimon Schubert     prev->next = cv->next;
2014*5796c8dcSSimon Schubert 
2015*5796c8dcSSimon Schubert   xfree (cv);
2016*5796c8dcSSimon Schubert 
2017*5796c8dcSSimon Schubert   /* If root, remove varobj from root list */
2018*5796c8dcSSimon Schubert   if (is_root_p (var))
2019*5796c8dcSSimon Schubert     {
2020*5796c8dcSSimon Schubert       /* Remove from list of root variables */
2021*5796c8dcSSimon Schubert       if (rootlist == var->root)
2022*5796c8dcSSimon Schubert 	rootlist = var->root->next;
2023*5796c8dcSSimon Schubert       else
2024*5796c8dcSSimon Schubert 	{
2025*5796c8dcSSimon Schubert 	  prer = NULL;
2026*5796c8dcSSimon Schubert 	  cr = rootlist;
2027*5796c8dcSSimon Schubert 	  while ((cr != NULL) && (cr->rootvar != var))
2028*5796c8dcSSimon Schubert 	    {
2029*5796c8dcSSimon Schubert 	      prer = cr;
2030*5796c8dcSSimon Schubert 	      cr = cr->next;
2031*5796c8dcSSimon Schubert 	    }
2032*5796c8dcSSimon Schubert 	  if (cr == NULL)
2033*5796c8dcSSimon Schubert 	    {
2034*5796c8dcSSimon Schubert 	      warning
2035*5796c8dcSSimon Schubert 		("Assertion failed: Could not find varobj \"%s\" in root list",
2036*5796c8dcSSimon Schubert 		 var->obj_name);
2037*5796c8dcSSimon Schubert 	      return;
2038*5796c8dcSSimon Schubert 	    }
2039*5796c8dcSSimon Schubert 	  if (prer == NULL)
2040*5796c8dcSSimon Schubert 	    rootlist = NULL;
2041*5796c8dcSSimon Schubert 	  else
2042*5796c8dcSSimon Schubert 	    prer->next = cr->next;
2043*5796c8dcSSimon Schubert 	}
2044*5796c8dcSSimon Schubert     }
2045*5796c8dcSSimon Schubert 
2046*5796c8dcSSimon Schubert }
2047*5796c8dcSSimon Schubert 
2048*5796c8dcSSimon Schubert /* Create and install a child of the parent of the given name */
2049*5796c8dcSSimon Schubert static struct varobj *
2050*5796c8dcSSimon Schubert create_child (struct varobj *parent, int index, char *name)
2051*5796c8dcSSimon Schubert {
2052*5796c8dcSSimon Schubert   return create_child_with_value (parent, index, name,
2053*5796c8dcSSimon Schubert 				  value_of_child (parent, index));
2054*5796c8dcSSimon Schubert }
2055*5796c8dcSSimon Schubert 
2056*5796c8dcSSimon Schubert static struct varobj *
2057*5796c8dcSSimon Schubert create_child_with_value (struct varobj *parent, int index, const char *name,
2058*5796c8dcSSimon Schubert 			 struct value *value)
2059*5796c8dcSSimon Schubert {
2060*5796c8dcSSimon Schubert   struct varobj *child;
2061*5796c8dcSSimon Schubert   char *childs_name;
2062*5796c8dcSSimon Schubert 
2063*5796c8dcSSimon Schubert   child = new_variable ();
2064*5796c8dcSSimon Schubert 
2065*5796c8dcSSimon Schubert   /* name is allocated by name_of_child */
2066*5796c8dcSSimon Schubert   /* FIXME: xstrdup should not be here.  */
2067*5796c8dcSSimon Schubert   child->name = xstrdup (name);
2068*5796c8dcSSimon Schubert   child->index = index;
2069*5796c8dcSSimon Schubert   child->parent = parent;
2070*5796c8dcSSimon Schubert   child->root = parent->root;
2071*5796c8dcSSimon Schubert   childs_name = xstrprintf ("%s.%s", parent->obj_name, name);
2072*5796c8dcSSimon Schubert   child->obj_name = childs_name;
2073*5796c8dcSSimon Schubert   install_variable (child);
2074*5796c8dcSSimon Schubert 
2075*5796c8dcSSimon Schubert   /* Compute the type of the child.  Must do this before
2076*5796c8dcSSimon Schubert      calling install_new_value.  */
2077*5796c8dcSSimon Schubert   if (value != NULL)
2078*5796c8dcSSimon Schubert     /* If the child had no evaluation errors, var->value
2079*5796c8dcSSimon Schubert        will be non-NULL and contain a valid type. */
2080*5796c8dcSSimon Schubert     child->type = value_type (value);
2081*5796c8dcSSimon Schubert   else
2082*5796c8dcSSimon Schubert     /* Otherwise, we must compute the type. */
2083*5796c8dcSSimon Schubert     child->type = (*child->root->lang->type_of_child) (child->parent,
2084*5796c8dcSSimon Schubert 						       child->index);
2085*5796c8dcSSimon Schubert   install_new_value (child, value, 1);
2086*5796c8dcSSimon Schubert 
2087*5796c8dcSSimon Schubert   return child;
2088*5796c8dcSSimon Schubert }
2089*5796c8dcSSimon Schubert 
2090*5796c8dcSSimon Schubert 
2091*5796c8dcSSimon Schubert /*
2092*5796c8dcSSimon Schubert  * Miscellaneous utility functions.
2093*5796c8dcSSimon Schubert  */
2094*5796c8dcSSimon Schubert 
2095*5796c8dcSSimon Schubert /* Allocate memory and initialize a new variable */
2096*5796c8dcSSimon Schubert static struct varobj *
2097*5796c8dcSSimon Schubert new_variable (void)
2098*5796c8dcSSimon Schubert {
2099*5796c8dcSSimon Schubert   struct varobj *var;
2100*5796c8dcSSimon Schubert 
2101*5796c8dcSSimon Schubert   var = (struct varobj *) xmalloc (sizeof (struct varobj));
2102*5796c8dcSSimon Schubert   var->name = NULL;
2103*5796c8dcSSimon Schubert   var->path_expr = NULL;
2104*5796c8dcSSimon Schubert   var->obj_name = NULL;
2105*5796c8dcSSimon Schubert   var->index = -1;
2106*5796c8dcSSimon Schubert   var->type = NULL;
2107*5796c8dcSSimon Schubert   var->value = NULL;
2108*5796c8dcSSimon Schubert   var->num_children = -1;
2109*5796c8dcSSimon Schubert   var->parent = NULL;
2110*5796c8dcSSimon Schubert   var->children = NULL;
2111*5796c8dcSSimon Schubert   var->format = 0;
2112*5796c8dcSSimon Schubert   var->root = NULL;
2113*5796c8dcSSimon Schubert   var->updated = 0;
2114*5796c8dcSSimon Schubert   var->print_value = NULL;
2115*5796c8dcSSimon Schubert   var->frozen = 0;
2116*5796c8dcSSimon Schubert   var->not_fetched = 0;
2117*5796c8dcSSimon Schubert   var->children_requested = 0;
2118*5796c8dcSSimon Schubert   var->from = -1;
2119*5796c8dcSSimon Schubert   var->to = -1;
2120*5796c8dcSSimon Schubert   var->constructor = 0;
2121*5796c8dcSSimon Schubert   var->pretty_printer = 0;
2122*5796c8dcSSimon Schubert   var->child_iter = 0;
2123*5796c8dcSSimon Schubert   var->saved_item = 0;
2124*5796c8dcSSimon Schubert 
2125*5796c8dcSSimon Schubert   return var;
2126*5796c8dcSSimon Schubert }
2127*5796c8dcSSimon Schubert 
2128*5796c8dcSSimon Schubert /* Allocate memory and initialize a new root variable */
2129*5796c8dcSSimon Schubert static struct varobj *
2130*5796c8dcSSimon Schubert new_root_variable (void)
2131*5796c8dcSSimon Schubert {
2132*5796c8dcSSimon Schubert   struct varobj *var = new_variable ();
2133*5796c8dcSSimon Schubert   var->root = (struct varobj_root *) xmalloc (sizeof (struct varobj_root));;
2134*5796c8dcSSimon Schubert   var->root->lang = NULL;
2135*5796c8dcSSimon Schubert   var->root->exp = NULL;
2136*5796c8dcSSimon Schubert   var->root->valid_block = NULL;
2137*5796c8dcSSimon Schubert   var->root->frame = null_frame_id;
2138*5796c8dcSSimon Schubert   var->root->floating = 0;
2139*5796c8dcSSimon Schubert   var->root->rootvar = NULL;
2140*5796c8dcSSimon Schubert   var->root->is_valid = 1;
2141*5796c8dcSSimon Schubert 
2142*5796c8dcSSimon Schubert   return var;
2143*5796c8dcSSimon Schubert }
2144*5796c8dcSSimon Schubert 
2145*5796c8dcSSimon Schubert /* Free any allocated memory associated with VAR. */
2146*5796c8dcSSimon Schubert static void
2147*5796c8dcSSimon Schubert free_variable (struct varobj *var)
2148*5796c8dcSSimon Schubert {
2149*5796c8dcSSimon Schubert #if HAVE_PYTHON
2150*5796c8dcSSimon Schubert   if (var->pretty_printer)
2151*5796c8dcSSimon Schubert     {
2152*5796c8dcSSimon Schubert       struct cleanup *cleanup = varobj_ensure_python_env (var);
2153*5796c8dcSSimon Schubert       Py_XDECREF (var->constructor);
2154*5796c8dcSSimon Schubert       Py_XDECREF (var->pretty_printer);
2155*5796c8dcSSimon Schubert       Py_XDECREF (var->child_iter);
2156*5796c8dcSSimon Schubert       Py_XDECREF (var->saved_item);
2157*5796c8dcSSimon Schubert       do_cleanups (cleanup);
2158*5796c8dcSSimon Schubert     }
2159*5796c8dcSSimon Schubert #endif
2160*5796c8dcSSimon Schubert 
2161*5796c8dcSSimon Schubert   value_free (var->value);
2162*5796c8dcSSimon Schubert 
2163*5796c8dcSSimon Schubert   /* Free the expression if this is a root variable. */
2164*5796c8dcSSimon Schubert   if (is_root_p (var))
2165*5796c8dcSSimon Schubert     {
2166*5796c8dcSSimon Schubert       xfree (var->root->exp);
2167*5796c8dcSSimon Schubert       xfree (var->root);
2168*5796c8dcSSimon Schubert     }
2169*5796c8dcSSimon Schubert 
2170*5796c8dcSSimon Schubert   xfree (var->name);
2171*5796c8dcSSimon Schubert   xfree (var->obj_name);
2172*5796c8dcSSimon Schubert   xfree (var->print_value);
2173*5796c8dcSSimon Schubert   xfree (var->path_expr);
2174*5796c8dcSSimon Schubert   xfree (var);
2175*5796c8dcSSimon Schubert }
2176*5796c8dcSSimon Schubert 
2177*5796c8dcSSimon Schubert static void
2178*5796c8dcSSimon Schubert do_free_variable_cleanup (void *var)
2179*5796c8dcSSimon Schubert {
2180*5796c8dcSSimon Schubert   free_variable (var);
2181*5796c8dcSSimon Schubert }
2182*5796c8dcSSimon Schubert 
2183*5796c8dcSSimon Schubert static struct cleanup *
2184*5796c8dcSSimon Schubert make_cleanup_free_variable (struct varobj *var)
2185*5796c8dcSSimon Schubert {
2186*5796c8dcSSimon Schubert   return make_cleanup (do_free_variable_cleanup, var);
2187*5796c8dcSSimon Schubert }
2188*5796c8dcSSimon Schubert 
2189*5796c8dcSSimon Schubert /* This returns the type of the variable. It also skips past typedefs
2190*5796c8dcSSimon Schubert    to return the real type of the variable.
2191*5796c8dcSSimon Schubert 
2192*5796c8dcSSimon Schubert    NOTE: TYPE_TARGET_TYPE should NOT be used anywhere in this file
2193*5796c8dcSSimon Schubert    except within get_target_type and get_type. */
2194*5796c8dcSSimon Schubert static struct type *
2195*5796c8dcSSimon Schubert get_type (struct varobj *var)
2196*5796c8dcSSimon Schubert {
2197*5796c8dcSSimon Schubert   struct type *type;
2198*5796c8dcSSimon Schubert   type = var->type;
2199*5796c8dcSSimon Schubert 
2200*5796c8dcSSimon Schubert   if (type != NULL)
2201*5796c8dcSSimon Schubert     type = check_typedef (type);
2202*5796c8dcSSimon Schubert 
2203*5796c8dcSSimon Schubert   return type;
2204*5796c8dcSSimon Schubert }
2205*5796c8dcSSimon Schubert 
2206*5796c8dcSSimon Schubert /* Return the type of the value that's stored in VAR,
2207*5796c8dcSSimon Schubert    or that would have being stored there if the
2208*5796c8dcSSimon Schubert    value were accessible.
2209*5796c8dcSSimon Schubert 
2210*5796c8dcSSimon Schubert    This differs from VAR->type in that VAR->type is always
2211*5796c8dcSSimon Schubert    the true type of the expession in the source language.
2212*5796c8dcSSimon Schubert    The return value of this function is the type we're
2213*5796c8dcSSimon Schubert    actually storing in varobj, and using for displaying
2214*5796c8dcSSimon Schubert    the values and for comparing previous and new values.
2215*5796c8dcSSimon Schubert 
2216*5796c8dcSSimon Schubert    For example, top-level references are always stripped.  */
2217*5796c8dcSSimon Schubert static struct type *
2218*5796c8dcSSimon Schubert get_value_type (struct varobj *var)
2219*5796c8dcSSimon Schubert {
2220*5796c8dcSSimon Schubert   struct type *type;
2221*5796c8dcSSimon Schubert 
2222*5796c8dcSSimon Schubert   if (var->value)
2223*5796c8dcSSimon Schubert     type = value_type (var->value);
2224*5796c8dcSSimon Schubert   else
2225*5796c8dcSSimon Schubert     type = var->type;
2226*5796c8dcSSimon Schubert 
2227*5796c8dcSSimon Schubert   type = check_typedef (type);
2228*5796c8dcSSimon Schubert 
2229*5796c8dcSSimon Schubert   if (TYPE_CODE (type) == TYPE_CODE_REF)
2230*5796c8dcSSimon Schubert     type = get_target_type (type);
2231*5796c8dcSSimon Schubert 
2232*5796c8dcSSimon Schubert   type = check_typedef (type);
2233*5796c8dcSSimon Schubert 
2234*5796c8dcSSimon Schubert   return type;
2235*5796c8dcSSimon Schubert }
2236*5796c8dcSSimon Schubert 
2237*5796c8dcSSimon Schubert /* This returns the target type (or NULL) of TYPE, also skipping
2238*5796c8dcSSimon Schubert    past typedefs, just like get_type ().
2239*5796c8dcSSimon Schubert 
2240*5796c8dcSSimon Schubert    NOTE: TYPE_TARGET_TYPE should NOT be used anywhere in this file
2241*5796c8dcSSimon Schubert    except within get_target_type and get_type. */
2242*5796c8dcSSimon Schubert static struct type *
2243*5796c8dcSSimon Schubert get_target_type (struct type *type)
2244*5796c8dcSSimon Schubert {
2245*5796c8dcSSimon Schubert   if (type != NULL)
2246*5796c8dcSSimon Schubert     {
2247*5796c8dcSSimon Schubert       type = TYPE_TARGET_TYPE (type);
2248*5796c8dcSSimon Schubert       if (type != NULL)
2249*5796c8dcSSimon Schubert 	type = check_typedef (type);
2250*5796c8dcSSimon Schubert     }
2251*5796c8dcSSimon Schubert 
2252*5796c8dcSSimon Schubert   return type;
2253*5796c8dcSSimon Schubert }
2254*5796c8dcSSimon Schubert 
2255*5796c8dcSSimon Schubert /* What is the default display for this variable? We assume that
2256*5796c8dcSSimon Schubert    everything is "natural". Any exceptions? */
2257*5796c8dcSSimon Schubert static enum varobj_display_formats
2258*5796c8dcSSimon Schubert variable_default_display (struct varobj *var)
2259*5796c8dcSSimon Schubert {
2260*5796c8dcSSimon Schubert   return FORMAT_NATURAL;
2261*5796c8dcSSimon Schubert }
2262*5796c8dcSSimon Schubert 
2263*5796c8dcSSimon Schubert /* FIXME: The following should be generic for any pointer */
2264*5796c8dcSSimon Schubert static void
2265*5796c8dcSSimon Schubert cppush (struct cpstack **pstack, char *name)
2266*5796c8dcSSimon Schubert {
2267*5796c8dcSSimon Schubert   struct cpstack *s;
2268*5796c8dcSSimon Schubert 
2269*5796c8dcSSimon Schubert   s = (struct cpstack *) xmalloc (sizeof (struct cpstack));
2270*5796c8dcSSimon Schubert   s->name = name;
2271*5796c8dcSSimon Schubert   s->next = *pstack;
2272*5796c8dcSSimon Schubert   *pstack = s;
2273*5796c8dcSSimon Schubert }
2274*5796c8dcSSimon Schubert 
2275*5796c8dcSSimon Schubert /* FIXME: The following should be generic for any pointer */
2276*5796c8dcSSimon Schubert static char *
2277*5796c8dcSSimon Schubert cppop (struct cpstack **pstack)
2278*5796c8dcSSimon Schubert {
2279*5796c8dcSSimon Schubert   struct cpstack *s;
2280*5796c8dcSSimon Schubert   char *v;
2281*5796c8dcSSimon Schubert 
2282*5796c8dcSSimon Schubert   if ((*pstack)->name == NULL && (*pstack)->next == NULL)
2283*5796c8dcSSimon Schubert     return NULL;
2284*5796c8dcSSimon Schubert 
2285*5796c8dcSSimon Schubert   s = *pstack;
2286*5796c8dcSSimon Schubert   v = s->name;
2287*5796c8dcSSimon Schubert   *pstack = (*pstack)->next;
2288*5796c8dcSSimon Schubert   xfree (s);
2289*5796c8dcSSimon Schubert 
2290*5796c8dcSSimon Schubert   return v;
2291*5796c8dcSSimon Schubert }
2292*5796c8dcSSimon Schubert 
2293*5796c8dcSSimon Schubert /*
2294*5796c8dcSSimon Schubert  * Language-dependencies
2295*5796c8dcSSimon Schubert  */
2296*5796c8dcSSimon Schubert 
2297*5796c8dcSSimon Schubert /* Common entry points */
2298*5796c8dcSSimon Schubert 
2299*5796c8dcSSimon Schubert /* Get the language of variable VAR. */
2300*5796c8dcSSimon Schubert static enum varobj_languages
2301*5796c8dcSSimon Schubert variable_language (struct varobj *var)
2302*5796c8dcSSimon Schubert {
2303*5796c8dcSSimon Schubert   enum varobj_languages lang;
2304*5796c8dcSSimon Schubert 
2305*5796c8dcSSimon Schubert   switch (var->root->exp->language_defn->la_language)
2306*5796c8dcSSimon Schubert     {
2307*5796c8dcSSimon Schubert     default:
2308*5796c8dcSSimon Schubert     case language_c:
2309*5796c8dcSSimon Schubert       lang = vlang_c;
2310*5796c8dcSSimon Schubert       break;
2311*5796c8dcSSimon Schubert     case language_cplus:
2312*5796c8dcSSimon Schubert       lang = vlang_cplus;
2313*5796c8dcSSimon Schubert       break;
2314*5796c8dcSSimon Schubert     case language_java:
2315*5796c8dcSSimon Schubert       lang = vlang_java;
2316*5796c8dcSSimon Schubert       break;
2317*5796c8dcSSimon Schubert     }
2318*5796c8dcSSimon Schubert 
2319*5796c8dcSSimon Schubert   return lang;
2320*5796c8dcSSimon Schubert }
2321*5796c8dcSSimon Schubert 
2322*5796c8dcSSimon Schubert /* Return the number of children for a given variable.
2323*5796c8dcSSimon Schubert    The result of this function is defined by the language
2324*5796c8dcSSimon Schubert    implementation. The number of children returned by this function
2325*5796c8dcSSimon Schubert    is the number of children that the user will see in the variable
2326*5796c8dcSSimon Schubert    display. */
2327*5796c8dcSSimon Schubert static int
2328*5796c8dcSSimon Schubert number_of_children (struct varobj *var)
2329*5796c8dcSSimon Schubert {
2330*5796c8dcSSimon Schubert   return (*var->root->lang->number_of_children) (var);;
2331*5796c8dcSSimon Schubert }
2332*5796c8dcSSimon Schubert 
2333*5796c8dcSSimon Schubert /* What is the expression for the root varobj VAR? Returns a malloc'd string. */
2334*5796c8dcSSimon Schubert static char *
2335*5796c8dcSSimon Schubert name_of_variable (struct varobj *var)
2336*5796c8dcSSimon Schubert {
2337*5796c8dcSSimon Schubert   return (*var->root->lang->name_of_variable) (var);
2338*5796c8dcSSimon Schubert }
2339*5796c8dcSSimon Schubert 
2340*5796c8dcSSimon Schubert /* What is the name of the INDEX'th child of VAR? Returns a malloc'd string. */
2341*5796c8dcSSimon Schubert static char *
2342*5796c8dcSSimon Schubert name_of_child (struct varobj *var, int index)
2343*5796c8dcSSimon Schubert {
2344*5796c8dcSSimon Schubert   return (*var->root->lang->name_of_child) (var, index);
2345*5796c8dcSSimon Schubert }
2346*5796c8dcSSimon Schubert 
2347*5796c8dcSSimon Schubert /* What is the ``struct value *'' of the root variable VAR?
2348*5796c8dcSSimon Schubert    For floating variable object, evaluation can get us a value
2349*5796c8dcSSimon Schubert    of different type from what is stored in varobj already.  In
2350*5796c8dcSSimon Schubert    that case:
2351*5796c8dcSSimon Schubert    - *type_changed will be set to 1
2352*5796c8dcSSimon Schubert    - old varobj will be freed, and new one will be
2353*5796c8dcSSimon Schubert    created, with the same name.
2354*5796c8dcSSimon Schubert    - *var_handle will be set to the new varobj
2355*5796c8dcSSimon Schubert    Otherwise, *type_changed will be set to 0.  */
2356*5796c8dcSSimon Schubert static struct value *
2357*5796c8dcSSimon Schubert value_of_root (struct varobj **var_handle, int *type_changed)
2358*5796c8dcSSimon Schubert {
2359*5796c8dcSSimon Schubert   struct varobj *var;
2360*5796c8dcSSimon Schubert 
2361*5796c8dcSSimon Schubert   if (var_handle == NULL)
2362*5796c8dcSSimon Schubert     return NULL;
2363*5796c8dcSSimon Schubert 
2364*5796c8dcSSimon Schubert   var = *var_handle;
2365*5796c8dcSSimon Schubert 
2366*5796c8dcSSimon Schubert   /* This should really be an exception, since this should
2367*5796c8dcSSimon Schubert      only get called with a root variable. */
2368*5796c8dcSSimon Schubert 
2369*5796c8dcSSimon Schubert   if (!is_root_p (var))
2370*5796c8dcSSimon Schubert     return NULL;
2371*5796c8dcSSimon Schubert 
2372*5796c8dcSSimon Schubert   if (var->root->floating)
2373*5796c8dcSSimon Schubert     {
2374*5796c8dcSSimon Schubert       struct varobj *tmp_var;
2375*5796c8dcSSimon Schubert       char *old_type, *new_type;
2376*5796c8dcSSimon Schubert 
2377*5796c8dcSSimon Schubert       tmp_var = varobj_create (NULL, var->name, (CORE_ADDR) 0,
2378*5796c8dcSSimon Schubert 			       USE_SELECTED_FRAME);
2379*5796c8dcSSimon Schubert       if (tmp_var == NULL)
2380*5796c8dcSSimon Schubert 	{
2381*5796c8dcSSimon Schubert 	  return NULL;
2382*5796c8dcSSimon Schubert 	}
2383*5796c8dcSSimon Schubert       old_type = varobj_get_type (var);
2384*5796c8dcSSimon Schubert       new_type = varobj_get_type (tmp_var);
2385*5796c8dcSSimon Schubert       if (strcmp (old_type, new_type) == 0)
2386*5796c8dcSSimon Schubert 	{
2387*5796c8dcSSimon Schubert 	  /* The expression presently stored inside var->root->exp
2388*5796c8dcSSimon Schubert 	     remembers the locations of local variables relatively to
2389*5796c8dcSSimon Schubert 	     the frame where the expression was created (in DWARF location
2390*5796c8dcSSimon Schubert 	     button, for example).  Naturally, those locations are not
2391*5796c8dcSSimon Schubert 	     correct in other frames, so update the expression.  */
2392*5796c8dcSSimon Schubert 
2393*5796c8dcSSimon Schubert          struct expression *tmp_exp = var->root->exp;
2394*5796c8dcSSimon Schubert          var->root->exp = tmp_var->root->exp;
2395*5796c8dcSSimon Schubert          tmp_var->root->exp = tmp_exp;
2396*5796c8dcSSimon Schubert 
2397*5796c8dcSSimon Schubert 	  varobj_delete (tmp_var, NULL, 0);
2398*5796c8dcSSimon Schubert 	  *type_changed = 0;
2399*5796c8dcSSimon Schubert 	}
2400*5796c8dcSSimon Schubert       else
2401*5796c8dcSSimon Schubert 	{
2402*5796c8dcSSimon Schubert 	  tmp_var->obj_name = xstrdup (var->obj_name);
2403*5796c8dcSSimon Schubert 	  tmp_var->from = var->from;
2404*5796c8dcSSimon Schubert 	  tmp_var->to = var->to;
2405*5796c8dcSSimon Schubert 	  varobj_delete (var, NULL, 0);
2406*5796c8dcSSimon Schubert 
2407*5796c8dcSSimon Schubert 	  install_variable (tmp_var);
2408*5796c8dcSSimon Schubert 	  *var_handle = tmp_var;
2409*5796c8dcSSimon Schubert 	  var = *var_handle;
2410*5796c8dcSSimon Schubert 	  *type_changed = 1;
2411*5796c8dcSSimon Schubert 	}
2412*5796c8dcSSimon Schubert       xfree (old_type);
2413*5796c8dcSSimon Schubert       xfree (new_type);
2414*5796c8dcSSimon Schubert     }
2415*5796c8dcSSimon Schubert   else
2416*5796c8dcSSimon Schubert     {
2417*5796c8dcSSimon Schubert       *type_changed = 0;
2418*5796c8dcSSimon Schubert     }
2419*5796c8dcSSimon Schubert 
2420*5796c8dcSSimon Schubert   return (*var->root->lang->value_of_root) (var_handle);
2421*5796c8dcSSimon Schubert }
2422*5796c8dcSSimon Schubert 
2423*5796c8dcSSimon Schubert /* What is the ``struct value *'' for the INDEX'th child of PARENT? */
2424*5796c8dcSSimon Schubert static struct value *
2425*5796c8dcSSimon Schubert value_of_child (struct varobj *parent, int index)
2426*5796c8dcSSimon Schubert {
2427*5796c8dcSSimon Schubert   struct value *value;
2428*5796c8dcSSimon Schubert 
2429*5796c8dcSSimon Schubert   value = (*parent->root->lang->value_of_child) (parent, index);
2430*5796c8dcSSimon Schubert 
2431*5796c8dcSSimon Schubert   return value;
2432*5796c8dcSSimon Schubert }
2433*5796c8dcSSimon Schubert 
2434*5796c8dcSSimon Schubert /* GDB already has a command called "value_of_variable". Sigh. */
2435*5796c8dcSSimon Schubert static char *
2436*5796c8dcSSimon Schubert my_value_of_variable (struct varobj *var, enum varobj_display_formats format)
2437*5796c8dcSSimon Schubert {
2438*5796c8dcSSimon Schubert   if (var->root->is_valid)
2439*5796c8dcSSimon Schubert     {
2440*5796c8dcSSimon Schubert       if (var->pretty_printer)
2441*5796c8dcSSimon Schubert 	return value_get_print_value (var->value, var->format, var);
2442*5796c8dcSSimon Schubert       return (*var->root->lang->value_of_variable) (var, format);
2443*5796c8dcSSimon Schubert     }
2444*5796c8dcSSimon Schubert   else
2445*5796c8dcSSimon Schubert     return NULL;
2446*5796c8dcSSimon Schubert }
2447*5796c8dcSSimon Schubert 
2448*5796c8dcSSimon Schubert static char *
2449*5796c8dcSSimon Schubert value_get_print_value (struct value *value, enum varobj_display_formats format,
2450*5796c8dcSSimon Schubert 		       struct varobj *var)
2451*5796c8dcSSimon Schubert {
2452*5796c8dcSSimon Schubert   struct ui_file *stb;
2453*5796c8dcSSimon Schubert   struct cleanup *old_chain;
2454*5796c8dcSSimon Schubert   gdb_byte *thevalue = NULL;
2455*5796c8dcSSimon Schubert   struct value_print_options opts;
2456*5796c8dcSSimon Schubert   int len = 0;
2457*5796c8dcSSimon Schubert 
2458*5796c8dcSSimon Schubert   if (value == NULL)
2459*5796c8dcSSimon Schubert     return NULL;
2460*5796c8dcSSimon Schubert 
2461*5796c8dcSSimon Schubert #if HAVE_PYTHON
2462*5796c8dcSSimon Schubert   {
2463*5796c8dcSSimon Schubert     struct cleanup *back_to = varobj_ensure_python_env (var);
2464*5796c8dcSSimon Schubert     PyObject *value_formatter = var->pretty_printer;
2465*5796c8dcSSimon Schubert 
2466*5796c8dcSSimon Schubert     if (value_formatter)
2467*5796c8dcSSimon Schubert       {
2468*5796c8dcSSimon Schubert 	/* First check to see if we have any children at all.  If so,
2469*5796c8dcSSimon Schubert 	   we simply return {...}.  */
2470*5796c8dcSSimon Schubert 	if (dynamic_varobj_has_child_method (var))
2471*5796c8dcSSimon Schubert 	  return xstrdup ("{...}");
2472*5796c8dcSSimon Schubert 
2473*5796c8dcSSimon Schubert 	if (PyObject_HasAttr (value_formatter, gdbpy_to_string_cst))
2474*5796c8dcSSimon Schubert 	  {
2475*5796c8dcSSimon Schubert 	    char *hint;
2476*5796c8dcSSimon Schubert 	    struct value *replacement;
2477*5796c8dcSSimon Schubert 	    int string_print = 0;
2478*5796c8dcSSimon Schubert 	    PyObject *output = NULL;
2479*5796c8dcSSimon Schubert 
2480*5796c8dcSSimon Schubert 	    hint = gdbpy_get_display_hint (value_formatter);
2481*5796c8dcSSimon Schubert 	    if (hint)
2482*5796c8dcSSimon Schubert 	      {
2483*5796c8dcSSimon Schubert 		if (!strcmp (hint, "string"))
2484*5796c8dcSSimon Schubert 		  string_print = 1;
2485*5796c8dcSSimon Schubert 		xfree (hint);
2486*5796c8dcSSimon Schubert 	      }
2487*5796c8dcSSimon Schubert 
2488*5796c8dcSSimon Schubert 	    output = apply_varobj_pretty_printer (value_formatter,
2489*5796c8dcSSimon Schubert 						  &replacement);
2490*5796c8dcSSimon Schubert 	    if (output)
2491*5796c8dcSSimon Schubert 	      {
2492*5796c8dcSSimon Schubert 		PyObject *py_str
2493*5796c8dcSSimon Schubert 		  = python_string_to_target_python_string (output);
2494*5796c8dcSSimon Schubert 		if (py_str)
2495*5796c8dcSSimon Schubert 		  {
2496*5796c8dcSSimon Schubert 		    char *s = PyString_AsString (py_str);
2497*5796c8dcSSimon Schubert 		    len = PyString_Size (py_str);
2498*5796c8dcSSimon Schubert 		    thevalue = xmemdup (s, len + 1, len + 1);
2499*5796c8dcSSimon Schubert 		    Py_DECREF (py_str);
2500*5796c8dcSSimon Schubert 		  }
2501*5796c8dcSSimon Schubert 		Py_DECREF (output);
2502*5796c8dcSSimon Schubert 	      }
2503*5796c8dcSSimon Schubert 	    if (thevalue && !string_print)
2504*5796c8dcSSimon Schubert 	      {
2505*5796c8dcSSimon Schubert 		do_cleanups (back_to);
2506*5796c8dcSSimon Schubert 		return thevalue;
2507*5796c8dcSSimon Schubert 	      }
2508*5796c8dcSSimon Schubert 	    if (replacement)
2509*5796c8dcSSimon Schubert 	      value = replacement;
2510*5796c8dcSSimon Schubert 	  }
2511*5796c8dcSSimon Schubert       }
2512*5796c8dcSSimon Schubert     do_cleanups (back_to);
2513*5796c8dcSSimon Schubert   }
2514*5796c8dcSSimon Schubert #endif
2515*5796c8dcSSimon Schubert 
2516*5796c8dcSSimon Schubert   stb = mem_fileopen ();
2517*5796c8dcSSimon Schubert   old_chain = make_cleanup_ui_file_delete (stb);
2518*5796c8dcSSimon Schubert 
2519*5796c8dcSSimon Schubert   get_formatted_print_options (&opts, format_code[(int) format]);
2520*5796c8dcSSimon Schubert   opts.deref_ref = 0;
2521*5796c8dcSSimon Schubert   opts.raw = 1;
2522*5796c8dcSSimon Schubert   if (thevalue)
2523*5796c8dcSSimon Schubert     {
2524*5796c8dcSSimon Schubert       struct gdbarch *gdbarch = get_type_arch (value_type (value));
2525*5796c8dcSSimon Schubert       make_cleanup (xfree, thevalue);
2526*5796c8dcSSimon Schubert       LA_PRINT_STRING (stb, builtin_type (gdbarch)->builtin_char,
2527*5796c8dcSSimon Schubert 		       thevalue, len, 0, &opts);
2528*5796c8dcSSimon Schubert     }
2529*5796c8dcSSimon Schubert   else
2530*5796c8dcSSimon Schubert     common_val_print (value, stb, 0, &opts, current_language);
2531*5796c8dcSSimon Schubert   thevalue = ui_file_xstrdup (stb, NULL);
2532*5796c8dcSSimon Schubert 
2533*5796c8dcSSimon Schubert   do_cleanups (old_chain);
2534*5796c8dcSSimon Schubert   return thevalue;
2535*5796c8dcSSimon Schubert }
2536*5796c8dcSSimon Schubert 
2537*5796c8dcSSimon Schubert int
2538*5796c8dcSSimon Schubert varobj_editable_p (struct varobj *var)
2539*5796c8dcSSimon Schubert {
2540*5796c8dcSSimon Schubert   struct type *type;
2541*5796c8dcSSimon Schubert   struct value *value;
2542*5796c8dcSSimon Schubert 
2543*5796c8dcSSimon Schubert   if (!(var->root->is_valid && var->value && VALUE_LVAL (var->value)))
2544*5796c8dcSSimon Schubert     return 0;
2545*5796c8dcSSimon Schubert 
2546*5796c8dcSSimon Schubert   type = get_value_type (var);
2547*5796c8dcSSimon Schubert 
2548*5796c8dcSSimon Schubert   switch (TYPE_CODE (type))
2549*5796c8dcSSimon Schubert     {
2550*5796c8dcSSimon Schubert     case TYPE_CODE_STRUCT:
2551*5796c8dcSSimon Schubert     case TYPE_CODE_UNION:
2552*5796c8dcSSimon Schubert     case TYPE_CODE_ARRAY:
2553*5796c8dcSSimon Schubert     case TYPE_CODE_FUNC:
2554*5796c8dcSSimon Schubert     case TYPE_CODE_METHOD:
2555*5796c8dcSSimon Schubert       return 0;
2556*5796c8dcSSimon Schubert       break;
2557*5796c8dcSSimon Schubert 
2558*5796c8dcSSimon Schubert     default:
2559*5796c8dcSSimon Schubert       return 1;
2560*5796c8dcSSimon Schubert       break;
2561*5796c8dcSSimon Schubert     }
2562*5796c8dcSSimon Schubert }
2563*5796c8dcSSimon Schubert 
2564*5796c8dcSSimon Schubert /* Return non-zero if changes in value of VAR
2565*5796c8dcSSimon Schubert    must be detected and reported by -var-update.
2566*5796c8dcSSimon Schubert    Return zero is -var-update should never report
2567*5796c8dcSSimon Schubert    changes of such values.  This makes sense for structures
2568*5796c8dcSSimon Schubert    (since the changes in children values will be reported separately),
2569*5796c8dcSSimon Schubert    or for artifical objects (like 'public' pseudo-field in C++).
2570*5796c8dcSSimon Schubert 
2571*5796c8dcSSimon Schubert    Return value of 0 means that gdb need not call value_fetch_lazy
2572*5796c8dcSSimon Schubert    for the value of this variable object.  */
2573*5796c8dcSSimon Schubert static int
2574*5796c8dcSSimon Schubert varobj_value_is_changeable_p (struct varobj *var)
2575*5796c8dcSSimon Schubert {
2576*5796c8dcSSimon Schubert   int r;
2577*5796c8dcSSimon Schubert   struct type *type;
2578*5796c8dcSSimon Schubert 
2579*5796c8dcSSimon Schubert   if (CPLUS_FAKE_CHILD (var))
2580*5796c8dcSSimon Schubert     return 0;
2581*5796c8dcSSimon Schubert 
2582*5796c8dcSSimon Schubert   type = get_value_type (var);
2583*5796c8dcSSimon Schubert 
2584*5796c8dcSSimon Schubert   switch (TYPE_CODE (type))
2585*5796c8dcSSimon Schubert     {
2586*5796c8dcSSimon Schubert     case TYPE_CODE_STRUCT:
2587*5796c8dcSSimon Schubert     case TYPE_CODE_UNION:
2588*5796c8dcSSimon Schubert     case TYPE_CODE_ARRAY:
2589*5796c8dcSSimon Schubert       r = 0;
2590*5796c8dcSSimon Schubert       break;
2591*5796c8dcSSimon Schubert 
2592*5796c8dcSSimon Schubert     default:
2593*5796c8dcSSimon Schubert       r = 1;
2594*5796c8dcSSimon Schubert     }
2595*5796c8dcSSimon Schubert 
2596*5796c8dcSSimon Schubert   return r;
2597*5796c8dcSSimon Schubert }
2598*5796c8dcSSimon Schubert 
2599*5796c8dcSSimon Schubert /* Return 1 if that varobj is floating, that is is always evaluated in the
2600*5796c8dcSSimon Schubert    selected frame, and not bound to thread/frame.  Such variable objects
2601*5796c8dcSSimon Schubert    are created using '@' as frame specifier to -var-create.  */
2602*5796c8dcSSimon Schubert int
2603*5796c8dcSSimon Schubert varobj_floating_p (struct varobj *var)
2604*5796c8dcSSimon Schubert {
2605*5796c8dcSSimon Schubert   return var->root->floating;
2606*5796c8dcSSimon Schubert }
2607*5796c8dcSSimon Schubert 
2608*5796c8dcSSimon Schubert /* Given the value and the type of a variable object,
2609*5796c8dcSSimon Schubert    adjust the value and type to those necessary
2610*5796c8dcSSimon Schubert    for getting children of the variable object.
2611*5796c8dcSSimon Schubert    This includes dereferencing top-level references
2612*5796c8dcSSimon Schubert    to all types and dereferencing pointers to
2613*5796c8dcSSimon Schubert    structures.
2614*5796c8dcSSimon Schubert 
2615*5796c8dcSSimon Schubert    Both TYPE and *TYPE should be non-null. VALUE
2616*5796c8dcSSimon Schubert    can be null if we want to only translate type.
2617*5796c8dcSSimon Schubert    *VALUE can be null as well -- if the parent
2618*5796c8dcSSimon Schubert    value is not known.
2619*5796c8dcSSimon Schubert 
2620*5796c8dcSSimon Schubert    If WAS_PTR is not NULL, set *WAS_PTR to 0 or 1
2621*5796c8dcSSimon Schubert    depending on whether pointer was dereferenced
2622*5796c8dcSSimon Schubert    in this function.  */
2623*5796c8dcSSimon Schubert static void
2624*5796c8dcSSimon Schubert adjust_value_for_child_access (struct value **value,
2625*5796c8dcSSimon Schubert 				  struct type **type,
2626*5796c8dcSSimon Schubert 				  int *was_ptr)
2627*5796c8dcSSimon Schubert {
2628*5796c8dcSSimon Schubert   gdb_assert (type && *type);
2629*5796c8dcSSimon Schubert 
2630*5796c8dcSSimon Schubert   if (was_ptr)
2631*5796c8dcSSimon Schubert     *was_ptr = 0;
2632*5796c8dcSSimon Schubert 
2633*5796c8dcSSimon Schubert   *type = check_typedef (*type);
2634*5796c8dcSSimon Schubert 
2635*5796c8dcSSimon Schubert   /* The type of value stored in varobj, that is passed
2636*5796c8dcSSimon Schubert      to us, is already supposed to be
2637*5796c8dcSSimon Schubert      reference-stripped.  */
2638*5796c8dcSSimon Schubert 
2639*5796c8dcSSimon Schubert   gdb_assert (TYPE_CODE (*type) != TYPE_CODE_REF);
2640*5796c8dcSSimon Schubert 
2641*5796c8dcSSimon Schubert   /* Pointers to structures are treated just like
2642*5796c8dcSSimon Schubert      structures when accessing children.  Don't
2643*5796c8dcSSimon Schubert      dererences pointers to other types.  */
2644*5796c8dcSSimon Schubert   if (TYPE_CODE (*type) == TYPE_CODE_PTR)
2645*5796c8dcSSimon Schubert     {
2646*5796c8dcSSimon Schubert       struct type *target_type = get_target_type (*type);
2647*5796c8dcSSimon Schubert       if (TYPE_CODE (target_type) == TYPE_CODE_STRUCT
2648*5796c8dcSSimon Schubert 	  || TYPE_CODE (target_type) == TYPE_CODE_UNION)
2649*5796c8dcSSimon Schubert 	{
2650*5796c8dcSSimon Schubert 	  if (value && *value)
2651*5796c8dcSSimon Schubert 	    {
2652*5796c8dcSSimon Schubert 	      int success = gdb_value_ind (*value, value);
2653*5796c8dcSSimon Schubert 	      if (!success)
2654*5796c8dcSSimon Schubert 		*value = NULL;
2655*5796c8dcSSimon Schubert 	    }
2656*5796c8dcSSimon Schubert 	  *type = target_type;
2657*5796c8dcSSimon Schubert 	  if (was_ptr)
2658*5796c8dcSSimon Schubert 	    *was_ptr = 1;
2659*5796c8dcSSimon Schubert 	}
2660*5796c8dcSSimon Schubert     }
2661*5796c8dcSSimon Schubert 
2662*5796c8dcSSimon Schubert   /* The 'get_target_type' function calls check_typedef on
2663*5796c8dcSSimon Schubert      result, so we can immediately check type code.  No
2664*5796c8dcSSimon Schubert      need to call check_typedef here.  */
2665*5796c8dcSSimon Schubert }
2666*5796c8dcSSimon Schubert 
2667*5796c8dcSSimon Schubert /* C */
2668*5796c8dcSSimon Schubert static int
2669*5796c8dcSSimon Schubert c_number_of_children (struct varobj *var)
2670*5796c8dcSSimon Schubert {
2671*5796c8dcSSimon Schubert   struct type *type = get_value_type (var);
2672*5796c8dcSSimon Schubert   int children = 0;
2673*5796c8dcSSimon Schubert   struct type *target;
2674*5796c8dcSSimon Schubert 
2675*5796c8dcSSimon Schubert   adjust_value_for_child_access (NULL, &type, NULL);
2676*5796c8dcSSimon Schubert   target = get_target_type (type);
2677*5796c8dcSSimon Schubert 
2678*5796c8dcSSimon Schubert   switch (TYPE_CODE (type))
2679*5796c8dcSSimon Schubert     {
2680*5796c8dcSSimon Schubert     case TYPE_CODE_ARRAY:
2681*5796c8dcSSimon Schubert       if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (target) > 0
2682*5796c8dcSSimon Schubert 	  && !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
2683*5796c8dcSSimon Schubert 	children = TYPE_LENGTH (type) / TYPE_LENGTH (target);
2684*5796c8dcSSimon Schubert       else
2685*5796c8dcSSimon Schubert 	/* If we don't know how many elements there are, don't display
2686*5796c8dcSSimon Schubert 	   any.  */
2687*5796c8dcSSimon Schubert 	children = 0;
2688*5796c8dcSSimon Schubert       break;
2689*5796c8dcSSimon Schubert 
2690*5796c8dcSSimon Schubert     case TYPE_CODE_STRUCT:
2691*5796c8dcSSimon Schubert     case TYPE_CODE_UNION:
2692*5796c8dcSSimon Schubert       children = TYPE_NFIELDS (type);
2693*5796c8dcSSimon Schubert       break;
2694*5796c8dcSSimon Schubert 
2695*5796c8dcSSimon Schubert     case TYPE_CODE_PTR:
2696*5796c8dcSSimon Schubert       /* The type here is a pointer to non-struct. Typically, pointers
2697*5796c8dcSSimon Schubert 	 have one child, except for function ptrs, which have no children,
2698*5796c8dcSSimon Schubert 	 and except for void*, as we don't know what to show.
2699*5796c8dcSSimon Schubert 
2700*5796c8dcSSimon Schubert          We can show char* so we allow it to be dereferenced.  If you decide
2701*5796c8dcSSimon Schubert          to test for it, please mind that a little magic is necessary to
2702*5796c8dcSSimon Schubert          properly identify it: char* has TYPE_CODE == TYPE_CODE_INT and
2703*5796c8dcSSimon Schubert          TYPE_NAME == "char" */
2704*5796c8dcSSimon Schubert       if (TYPE_CODE (target) == TYPE_CODE_FUNC
2705*5796c8dcSSimon Schubert 	  || TYPE_CODE (target) == TYPE_CODE_VOID)
2706*5796c8dcSSimon Schubert 	children = 0;
2707*5796c8dcSSimon Schubert       else
2708*5796c8dcSSimon Schubert 	children = 1;
2709*5796c8dcSSimon Schubert       break;
2710*5796c8dcSSimon Schubert 
2711*5796c8dcSSimon Schubert     default:
2712*5796c8dcSSimon Schubert       /* Other types have no children */
2713*5796c8dcSSimon Schubert       break;
2714*5796c8dcSSimon Schubert     }
2715*5796c8dcSSimon Schubert 
2716*5796c8dcSSimon Schubert   return children;
2717*5796c8dcSSimon Schubert }
2718*5796c8dcSSimon Schubert 
2719*5796c8dcSSimon Schubert static char *
2720*5796c8dcSSimon Schubert c_name_of_variable (struct varobj *parent)
2721*5796c8dcSSimon Schubert {
2722*5796c8dcSSimon Schubert   return xstrdup (parent->name);
2723*5796c8dcSSimon Schubert }
2724*5796c8dcSSimon Schubert 
2725*5796c8dcSSimon Schubert /* Return the value of element TYPE_INDEX of a structure
2726*5796c8dcSSimon Schubert    value VALUE.  VALUE's type should be a structure,
2727*5796c8dcSSimon Schubert    or union, or a typedef to struct/union.
2728*5796c8dcSSimon Schubert 
2729*5796c8dcSSimon Schubert    Returns NULL if getting the value fails.  Never throws.  */
2730*5796c8dcSSimon Schubert static struct value *
2731*5796c8dcSSimon Schubert value_struct_element_index (struct value *value, int type_index)
2732*5796c8dcSSimon Schubert {
2733*5796c8dcSSimon Schubert   struct value *result = NULL;
2734*5796c8dcSSimon Schubert   volatile struct gdb_exception e;
2735*5796c8dcSSimon Schubert 
2736*5796c8dcSSimon Schubert   struct type *type = value_type (value);
2737*5796c8dcSSimon Schubert   type = check_typedef (type);
2738*5796c8dcSSimon Schubert 
2739*5796c8dcSSimon Schubert   gdb_assert (TYPE_CODE (type) == TYPE_CODE_STRUCT
2740*5796c8dcSSimon Schubert 	      || TYPE_CODE (type) == TYPE_CODE_UNION);
2741*5796c8dcSSimon Schubert 
2742*5796c8dcSSimon Schubert   TRY_CATCH (e, RETURN_MASK_ERROR)
2743*5796c8dcSSimon Schubert     {
2744*5796c8dcSSimon Schubert       if (field_is_static (&TYPE_FIELD (type, type_index)))
2745*5796c8dcSSimon Schubert 	result = value_static_field (type, type_index);
2746*5796c8dcSSimon Schubert       else
2747*5796c8dcSSimon Schubert 	result = value_primitive_field (value, 0, type_index, type);
2748*5796c8dcSSimon Schubert     }
2749*5796c8dcSSimon Schubert   if (e.reason < 0)
2750*5796c8dcSSimon Schubert     {
2751*5796c8dcSSimon Schubert       return NULL;
2752*5796c8dcSSimon Schubert     }
2753*5796c8dcSSimon Schubert   else
2754*5796c8dcSSimon Schubert     {
2755*5796c8dcSSimon Schubert       return result;
2756*5796c8dcSSimon Schubert     }
2757*5796c8dcSSimon Schubert }
2758*5796c8dcSSimon Schubert 
2759*5796c8dcSSimon Schubert /* Obtain the information about child INDEX of the variable
2760*5796c8dcSSimon Schubert    object PARENT.
2761*5796c8dcSSimon Schubert    If CNAME is not null, sets *CNAME to the name of the child relative
2762*5796c8dcSSimon Schubert    to the parent.
2763*5796c8dcSSimon Schubert    If CVALUE is not null, sets *CVALUE to the value of the child.
2764*5796c8dcSSimon Schubert    If CTYPE is not null, sets *CTYPE to the type of the child.
2765*5796c8dcSSimon Schubert 
2766*5796c8dcSSimon Schubert    If any of CNAME, CVALUE, or CTYPE is not null, but the corresponding
2767*5796c8dcSSimon Schubert    information cannot be determined, set *CNAME, *CVALUE, or *CTYPE
2768*5796c8dcSSimon Schubert    to NULL.  */
2769*5796c8dcSSimon Schubert static void
2770*5796c8dcSSimon Schubert c_describe_child (struct varobj *parent, int index,
2771*5796c8dcSSimon Schubert 		  char **cname, struct value **cvalue, struct type **ctype,
2772*5796c8dcSSimon Schubert 		  char **cfull_expression)
2773*5796c8dcSSimon Schubert {
2774*5796c8dcSSimon Schubert   struct value *value = parent->value;
2775*5796c8dcSSimon Schubert   struct type *type = get_value_type (parent);
2776*5796c8dcSSimon Schubert   char *parent_expression = NULL;
2777*5796c8dcSSimon Schubert   int was_ptr;
2778*5796c8dcSSimon Schubert 
2779*5796c8dcSSimon Schubert   if (cname)
2780*5796c8dcSSimon Schubert     *cname = NULL;
2781*5796c8dcSSimon Schubert   if (cvalue)
2782*5796c8dcSSimon Schubert     *cvalue = NULL;
2783*5796c8dcSSimon Schubert   if (ctype)
2784*5796c8dcSSimon Schubert     *ctype = NULL;
2785*5796c8dcSSimon Schubert   if (cfull_expression)
2786*5796c8dcSSimon Schubert     {
2787*5796c8dcSSimon Schubert       *cfull_expression = NULL;
2788*5796c8dcSSimon Schubert       parent_expression = varobj_get_path_expr (parent);
2789*5796c8dcSSimon Schubert     }
2790*5796c8dcSSimon Schubert   adjust_value_for_child_access (&value, &type, &was_ptr);
2791*5796c8dcSSimon Schubert 
2792*5796c8dcSSimon Schubert   switch (TYPE_CODE (type))
2793*5796c8dcSSimon Schubert     {
2794*5796c8dcSSimon Schubert     case TYPE_CODE_ARRAY:
2795*5796c8dcSSimon Schubert       if (cname)
2796*5796c8dcSSimon Schubert 	*cname = xstrprintf ("%d", index
2797*5796c8dcSSimon Schubert 			     + TYPE_LOW_BOUND (TYPE_INDEX_TYPE (type)));
2798*5796c8dcSSimon Schubert 
2799*5796c8dcSSimon Schubert       if (cvalue && value)
2800*5796c8dcSSimon Schubert 	{
2801*5796c8dcSSimon Schubert 	  int real_index = index + TYPE_LOW_BOUND (TYPE_INDEX_TYPE (type));
2802*5796c8dcSSimon Schubert 	  gdb_value_subscript (value, real_index, cvalue);
2803*5796c8dcSSimon Schubert 	}
2804*5796c8dcSSimon Schubert 
2805*5796c8dcSSimon Schubert       if (ctype)
2806*5796c8dcSSimon Schubert 	*ctype = get_target_type (type);
2807*5796c8dcSSimon Schubert 
2808*5796c8dcSSimon Schubert       if (cfull_expression)
2809*5796c8dcSSimon Schubert 	*cfull_expression = xstrprintf ("(%s)[%d]", parent_expression,
2810*5796c8dcSSimon Schubert 					index
2811*5796c8dcSSimon Schubert 					+ TYPE_LOW_BOUND (TYPE_INDEX_TYPE (type)));
2812*5796c8dcSSimon Schubert 
2813*5796c8dcSSimon Schubert 
2814*5796c8dcSSimon Schubert       break;
2815*5796c8dcSSimon Schubert 
2816*5796c8dcSSimon Schubert     case TYPE_CODE_STRUCT:
2817*5796c8dcSSimon Schubert     case TYPE_CODE_UNION:
2818*5796c8dcSSimon Schubert       if (cname)
2819*5796c8dcSSimon Schubert 	*cname = xstrdup (TYPE_FIELD_NAME (type, index));
2820*5796c8dcSSimon Schubert 
2821*5796c8dcSSimon Schubert       if (cvalue && value)
2822*5796c8dcSSimon Schubert 	{
2823*5796c8dcSSimon Schubert 	  /* For C, varobj index is the same as type index.  */
2824*5796c8dcSSimon Schubert 	  *cvalue = value_struct_element_index (value, index);
2825*5796c8dcSSimon Schubert 	}
2826*5796c8dcSSimon Schubert 
2827*5796c8dcSSimon Schubert       if (ctype)
2828*5796c8dcSSimon Schubert 	*ctype = TYPE_FIELD_TYPE (type, index);
2829*5796c8dcSSimon Schubert 
2830*5796c8dcSSimon Schubert       if (cfull_expression)
2831*5796c8dcSSimon Schubert 	{
2832*5796c8dcSSimon Schubert 	  char *join = was_ptr ? "->" : ".";
2833*5796c8dcSSimon Schubert 	  *cfull_expression = xstrprintf ("(%s)%s%s", parent_expression, join,
2834*5796c8dcSSimon Schubert 					  TYPE_FIELD_NAME (type, index));
2835*5796c8dcSSimon Schubert 	}
2836*5796c8dcSSimon Schubert 
2837*5796c8dcSSimon Schubert       break;
2838*5796c8dcSSimon Schubert 
2839*5796c8dcSSimon Schubert     case TYPE_CODE_PTR:
2840*5796c8dcSSimon Schubert       if (cname)
2841*5796c8dcSSimon Schubert 	*cname = xstrprintf ("*%s", parent->name);
2842*5796c8dcSSimon Schubert 
2843*5796c8dcSSimon Schubert       if (cvalue && value)
2844*5796c8dcSSimon Schubert 	{
2845*5796c8dcSSimon Schubert 	  int success = gdb_value_ind (value, cvalue);
2846*5796c8dcSSimon Schubert 	  if (!success)
2847*5796c8dcSSimon Schubert 	    *cvalue = NULL;
2848*5796c8dcSSimon Schubert 	}
2849*5796c8dcSSimon Schubert 
2850*5796c8dcSSimon Schubert       /* Don't use get_target_type because it calls
2851*5796c8dcSSimon Schubert 	 check_typedef and here, we want to show the true
2852*5796c8dcSSimon Schubert 	 declared type of the variable.  */
2853*5796c8dcSSimon Schubert       if (ctype)
2854*5796c8dcSSimon Schubert 	*ctype = TYPE_TARGET_TYPE (type);
2855*5796c8dcSSimon Schubert 
2856*5796c8dcSSimon Schubert       if (cfull_expression)
2857*5796c8dcSSimon Schubert 	*cfull_expression = xstrprintf ("*(%s)", parent_expression);
2858*5796c8dcSSimon Schubert 
2859*5796c8dcSSimon Schubert       break;
2860*5796c8dcSSimon Schubert 
2861*5796c8dcSSimon Schubert     default:
2862*5796c8dcSSimon Schubert       /* This should not happen */
2863*5796c8dcSSimon Schubert       if (cname)
2864*5796c8dcSSimon Schubert 	*cname = xstrdup ("???");
2865*5796c8dcSSimon Schubert       if (cfull_expression)
2866*5796c8dcSSimon Schubert 	*cfull_expression = xstrdup ("???");
2867*5796c8dcSSimon Schubert       /* Don't set value and type, we don't know then. */
2868*5796c8dcSSimon Schubert     }
2869*5796c8dcSSimon Schubert }
2870*5796c8dcSSimon Schubert 
2871*5796c8dcSSimon Schubert static char *
2872*5796c8dcSSimon Schubert c_name_of_child (struct varobj *parent, int index)
2873*5796c8dcSSimon Schubert {
2874*5796c8dcSSimon Schubert   char *name;
2875*5796c8dcSSimon Schubert   c_describe_child (parent, index, &name, NULL, NULL, NULL);
2876*5796c8dcSSimon Schubert   return name;
2877*5796c8dcSSimon Schubert }
2878*5796c8dcSSimon Schubert 
2879*5796c8dcSSimon Schubert static char *
2880*5796c8dcSSimon Schubert c_path_expr_of_child (struct varobj *child)
2881*5796c8dcSSimon Schubert {
2882*5796c8dcSSimon Schubert   c_describe_child (child->parent, child->index, NULL, NULL, NULL,
2883*5796c8dcSSimon Schubert 		    &child->path_expr);
2884*5796c8dcSSimon Schubert   return child->path_expr;
2885*5796c8dcSSimon Schubert }
2886*5796c8dcSSimon Schubert 
2887*5796c8dcSSimon Schubert /* If frame associated with VAR can be found, switch
2888*5796c8dcSSimon Schubert    to it and return 1.  Otherwise, return 0.  */
2889*5796c8dcSSimon Schubert static int
2890*5796c8dcSSimon Schubert check_scope (struct varobj *var)
2891*5796c8dcSSimon Schubert {
2892*5796c8dcSSimon Schubert   struct frame_info *fi;
2893*5796c8dcSSimon Schubert   int scope;
2894*5796c8dcSSimon Schubert 
2895*5796c8dcSSimon Schubert   fi = frame_find_by_id (var->root->frame);
2896*5796c8dcSSimon Schubert   scope = fi != NULL;
2897*5796c8dcSSimon Schubert 
2898*5796c8dcSSimon Schubert   if (fi)
2899*5796c8dcSSimon Schubert     {
2900*5796c8dcSSimon Schubert       CORE_ADDR pc = get_frame_pc (fi);
2901*5796c8dcSSimon Schubert       if (pc <  BLOCK_START (var->root->valid_block) ||
2902*5796c8dcSSimon Schubert 	  pc >= BLOCK_END (var->root->valid_block))
2903*5796c8dcSSimon Schubert 	scope = 0;
2904*5796c8dcSSimon Schubert       else
2905*5796c8dcSSimon Schubert 	select_frame (fi);
2906*5796c8dcSSimon Schubert     }
2907*5796c8dcSSimon Schubert   return scope;
2908*5796c8dcSSimon Schubert }
2909*5796c8dcSSimon Schubert 
2910*5796c8dcSSimon Schubert static struct value *
2911*5796c8dcSSimon Schubert c_value_of_root (struct varobj **var_handle)
2912*5796c8dcSSimon Schubert {
2913*5796c8dcSSimon Schubert   struct value *new_val = NULL;
2914*5796c8dcSSimon Schubert   struct varobj *var = *var_handle;
2915*5796c8dcSSimon Schubert   struct frame_info *fi;
2916*5796c8dcSSimon Schubert   int within_scope = 0;
2917*5796c8dcSSimon Schubert   struct cleanup *back_to;
2918*5796c8dcSSimon Schubert 
2919*5796c8dcSSimon Schubert   /*  Only root variables can be updated... */
2920*5796c8dcSSimon Schubert   if (!is_root_p (var))
2921*5796c8dcSSimon Schubert     /* Not a root var */
2922*5796c8dcSSimon Schubert     return NULL;
2923*5796c8dcSSimon Schubert 
2924*5796c8dcSSimon Schubert   back_to = make_cleanup_restore_current_thread ();
2925*5796c8dcSSimon Schubert 
2926*5796c8dcSSimon Schubert   /* Determine whether the variable is still around. */
2927*5796c8dcSSimon Schubert   if (var->root->valid_block == NULL || var->root->floating)
2928*5796c8dcSSimon Schubert     within_scope = 1;
2929*5796c8dcSSimon Schubert   else if (var->root->thread_id == 0)
2930*5796c8dcSSimon Schubert     {
2931*5796c8dcSSimon Schubert       /* The program was single-threaded when the variable object was
2932*5796c8dcSSimon Schubert 	 created.  Technically, it's possible that the program became
2933*5796c8dcSSimon Schubert 	 multi-threaded since then, but we don't support such
2934*5796c8dcSSimon Schubert 	 scenario yet.  */
2935*5796c8dcSSimon Schubert       within_scope = check_scope (var);
2936*5796c8dcSSimon Schubert     }
2937*5796c8dcSSimon Schubert   else
2938*5796c8dcSSimon Schubert     {
2939*5796c8dcSSimon Schubert       ptid_t ptid = thread_id_to_pid (var->root->thread_id);
2940*5796c8dcSSimon Schubert       if (in_thread_list (ptid))
2941*5796c8dcSSimon Schubert 	{
2942*5796c8dcSSimon Schubert 	  switch_to_thread (ptid);
2943*5796c8dcSSimon Schubert 	  within_scope = check_scope (var);
2944*5796c8dcSSimon Schubert 	}
2945*5796c8dcSSimon Schubert     }
2946*5796c8dcSSimon Schubert 
2947*5796c8dcSSimon Schubert   if (within_scope)
2948*5796c8dcSSimon Schubert     {
2949*5796c8dcSSimon Schubert       /* We need to catch errors here, because if evaluate
2950*5796c8dcSSimon Schubert          expression fails we want to just return NULL.  */
2951*5796c8dcSSimon Schubert       gdb_evaluate_expression (var->root->exp, &new_val);
2952*5796c8dcSSimon Schubert       return new_val;
2953*5796c8dcSSimon Schubert     }
2954*5796c8dcSSimon Schubert 
2955*5796c8dcSSimon Schubert   do_cleanups (back_to);
2956*5796c8dcSSimon Schubert 
2957*5796c8dcSSimon Schubert   return NULL;
2958*5796c8dcSSimon Schubert }
2959*5796c8dcSSimon Schubert 
2960*5796c8dcSSimon Schubert static struct value *
2961*5796c8dcSSimon Schubert c_value_of_child (struct varobj *parent, int index)
2962*5796c8dcSSimon Schubert {
2963*5796c8dcSSimon Schubert   struct value *value = NULL;
2964*5796c8dcSSimon Schubert   c_describe_child (parent, index, NULL, &value, NULL, NULL);
2965*5796c8dcSSimon Schubert 
2966*5796c8dcSSimon Schubert   return value;
2967*5796c8dcSSimon Schubert }
2968*5796c8dcSSimon Schubert 
2969*5796c8dcSSimon Schubert static struct type *
2970*5796c8dcSSimon Schubert c_type_of_child (struct varobj *parent, int index)
2971*5796c8dcSSimon Schubert {
2972*5796c8dcSSimon Schubert   struct type *type = NULL;
2973*5796c8dcSSimon Schubert   c_describe_child (parent, index, NULL, NULL, &type, NULL);
2974*5796c8dcSSimon Schubert   return type;
2975*5796c8dcSSimon Schubert }
2976*5796c8dcSSimon Schubert 
2977*5796c8dcSSimon Schubert static char *
2978*5796c8dcSSimon Schubert c_value_of_variable (struct varobj *var, enum varobj_display_formats format)
2979*5796c8dcSSimon Schubert {
2980*5796c8dcSSimon Schubert   /* BOGUS: if val_print sees a struct/class, or a reference to one,
2981*5796c8dcSSimon Schubert      it will print out its children instead of "{...}".  So we need to
2982*5796c8dcSSimon Schubert      catch that case explicitly.  */
2983*5796c8dcSSimon Schubert   struct type *type = get_type (var);
2984*5796c8dcSSimon Schubert 
2985*5796c8dcSSimon Schubert   /* If we have a custom formatter, return whatever string it has
2986*5796c8dcSSimon Schubert      produced.  */
2987*5796c8dcSSimon Schubert   if (var->pretty_printer && var->print_value)
2988*5796c8dcSSimon Schubert     return xstrdup (var->print_value);
2989*5796c8dcSSimon Schubert 
2990*5796c8dcSSimon Schubert   /* Strip top-level references. */
2991*5796c8dcSSimon Schubert   while (TYPE_CODE (type) == TYPE_CODE_REF)
2992*5796c8dcSSimon Schubert     type = check_typedef (TYPE_TARGET_TYPE (type));
2993*5796c8dcSSimon Schubert 
2994*5796c8dcSSimon Schubert   switch (TYPE_CODE (type))
2995*5796c8dcSSimon Schubert     {
2996*5796c8dcSSimon Schubert     case TYPE_CODE_STRUCT:
2997*5796c8dcSSimon Schubert     case TYPE_CODE_UNION:
2998*5796c8dcSSimon Schubert       return xstrdup ("{...}");
2999*5796c8dcSSimon Schubert       /* break; */
3000*5796c8dcSSimon Schubert 
3001*5796c8dcSSimon Schubert     case TYPE_CODE_ARRAY:
3002*5796c8dcSSimon Schubert       {
3003*5796c8dcSSimon Schubert 	char *number;
3004*5796c8dcSSimon Schubert 	number = xstrprintf ("[%d]", var->num_children);
3005*5796c8dcSSimon Schubert 	return (number);
3006*5796c8dcSSimon Schubert       }
3007*5796c8dcSSimon Schubert       /* break; */
3008*5796c8dcSSimon Schubert 
3009*5796c8dcSSimon Schubert     default:
3010*5796c8dcSSimon Schubert       {
3011*5796c8dcSSimon Schubert 	if (var->value == NULL)
3012*5796c8dcSSimon Schubert 	  {
3013*5796c8dcSSimon Schubert 	    /* This can happen if we attempt to get the value of a struct
3014*5796c8dcSSimon Schubert 	       member when the parent is an invalid pointer. This is an
3015*5796c8dcSSimon Schubert 	       error condition, so we should tell the caller. */
3016*5796c8dcSSimon Schubert 	    return NULL;
3017*5796c8dcSSimon Schubert 	  }
3018*5796c8dcSSimon Schubert 	else
3019*5796c8dcSSimon Schubert 	  {
3020*5796c8dcSSimon Schubert 	    if (var->not_fetched && value_lazy (var->value))
3021*5796c8dcSSimon Schubert 	      /* Frozen variable and no value yet.  We don't
3022*5796c8dcSSimon Schubert 		 implicitly fetch the value.  MI response will
3023*5796c8dcSSimon Schubert 		 use empty string for the value, which is OK.  */
3024*5796c8dcSSimon Schubert 	      return NULL;
3025*5796c8dcSSimon Schubert 
3026*5796c8dcSSimon Schubert 	    gdb_assert (varobj_value_is_changeable_p (var));
3027*5796c8dcSSimon Schubert 	    gdb_assert (!value_lazy (var->value));
3028*5796c8dcSSimon Schubert 
3029*5796c8dcSSimon Schubert 	    /* If the specified format is the current one,
3030*5796c8dcSSimon Schubert 	       we can reuse print_value */
3031*5796c8dcSSimon Schubert 	    if (format == var->format)
3032*5796c8dcSSimon Schubert 	      return xstrdup (var->print_value);
3033*5796c8dcSSimon Schubert 	    else
3034*5796c8dcSSimon Schubert 	      return value_get_print_value (var->value, format, var);
3035*5796c8dcSSimon Schubert 	  }
3036*5796c8dcSSimon Schubert       }
3037*5796c8dcSSimon Schubert     }
3038*5796c8dcSSimon Schubert }
3039*5796c8dcSSimon Schubert 
3040*5796c8dcSSimon Schubert 
3041*5796c8dcSSimon Schubert /* C++ */
3042*5796c8dcSSimon Schubert 
3043*5796c8dcSSimon Schubert static int
3044*5796c8dcSSimon Schubert cplus_number_of_children (struct varobj *var)
3045*5796c8dcSSimon Schubert {
3046*5796c8dcSSimon Schubert   struct type *type;
3047*5796c8dcSSimon Schubert   int children, dont_know;
3048*5796c8dcSSimon Schubert 
3049*5796c8dcSSimon Schubert   dont_know = 1;
3050*5796c8dcSSimon Schubert   children = 0;
3051*5796c8dcSSimon Schubert 
3052*5796c8dcSSimon Schubert   if (!CPLUS_FAKE_CHILD (var))
3053*5796c8dcSSimon Schubert     {
3054*5796c8dcSSimon Schubert       type = get_value_type (var);
3055*5796c8dcSSimon Schubert       adjust_value_for_child_access (NULL, &type, NULL);
3056*5796c8dcSSimon Schubert 
3057*5796c8dcSSimon Schubert       if (((TYPE_CODE (type)) == TYPE_CODE_STRUCT) ||
3058*5796c8dcSSimon Schubert 	  ((TYPE_CODE (type)) == TYPE_CODE_UNION))
3059*5796c8dcSSimon Schubert 	{
3060*5796c8dcSSimon Schubert 	  int kids[3];
3061*5796c8dcSSimon Schubert 
3062*5796c8dcSSimon Schubert 	  cplus_class_num_children (type, kids);
3063*5796c8dcSSimon Schubert 	  if (kids[v_public] != 0)
3064*5796c8dcSSimon Schubert 	    children++;
3065*5796c8dcSSimon Schubert 	  if (kids[v_private] != 0)
3066*5796c8dcSSimon Schubert 	    children++;
3067*5796c8dcSSimon Schubert 	  if (kids[v_protected] != 0)
3068*5796c8dcSSimon Schubert 	    children++;
3069*5796c8dcSSimon Schubert 
3070*5796c8dcSSimon Schubert 	  /* Add any baseclasses */
3071*5796c8dcSSimon Schubert 	  children += TYPE_N_BASECLASSES (type);
3072*5796c8dcSSimon Schubert 	  dont_know = 0;
3073*5796c8dcSSimon Schubert 
3074*5796c8dcSSimon Schubert 	  /* FIXME: save children in var */
3075*5796c8dcSSimon Schubert 	}
3076*5796c8dcSSimon Schubert     }
3077*5796c8dcSSimon Schubert   else
3078*5796c8dcSSimon Schubert     {
3079*5796c8dcSSimon Schubert       int kids[3];
3080*5796c8dcSSimon Schubert 
3081*5796c8dcSSimon Schubert       type = get_value_type (var->parent);
3082*5796c8dcSSimon Schubert       adjust_value_for_child_access (NULL, &type, NULL);
3083*5796c8dcSSimon Schubert 
3084*5796c8dcSSimon Schubert       cplus_class_num_children (type, kids);
3085*5796c8dcSSimon Schubert       if (strcmp (var->name, "public") == 0)
3086*5796c8dcSSimon Schubert 	children = kids[v_public];
3087*5796c8dcSSimon Schubert       else if (strcmp (var->name, "private") == 0)
3088*5796c8dcSSimon Schubert 	children = kids[v_private];
3089*5796c8dcSSimon Schubert       else
3090*5796c8dcSSimon Schubert 	children = kids[v_protected];
3091*5796c8dcSSimon Schubert       dont_know = 0;
3092*5796c8dcSSimon Schubert     }
3093*5796c8dcSSimon Schubert 
3094*5796c8dcSSimon Schubert   if (dont_know)
3095*5796c8dcSSimon Schubert     children = c_number_of_children (var);
3096*5796c8dcSSimon Schubert 
3097*5796c8dcSSimon Schubert   return children;
3098*5796c8dcSSimon Schubert }
3099*5796c8dcSSimon Schubert 
3100*5796c8dcSSimon Schubert /* Compute # of public, private, and protected variables in this class.
3101*5796c8dcSSimon Schubert    That means we need to descend into all baseclasses and find out
3102*5796c8dcSSimon Schubert    how many are there, too. */
3103*5796c8dcSSimon Schubert static void
3104*5796c8dcSSimon Schubert cplus_class_num_children (struct type *type, int children[3])
3105*5796c8dcSSimon Schubert {
3106*5796c8dcSSimon Schubert   int i;
3107*5796c8dcSSimon Schubert 
3108*5796c8dcSSimon Schubert   children[v_public] = 0;
3109*5796c8dcSSimon Schubert   children[v_private] = 0;
3110*5796c8dcSSimon Schubert   children[v_protected] = 0;
3111*5796c8dcSSimon Schubert 
3112*5796c8dcSSimon Schubert   for (i = TYPE_N_BASECLASSES (type); i < TYPE_NFIELDS (type); i++)
3113*5796c8dcSSimon Schubert     {
3114*5796c8dcSSimon Schubert       /* If we have a virtual table pointer, omit it. */
3115*5796c8dcSSimon Schubert       if (TYPE_VPTR_BASETYPE (type) == type && TYPE_VPTR_FIELDNO (type) == i)
3116*5796c8dcSSimon Schubert 	continue;
3117*5796c8dcSSimon Schubert 
3118*5796c8dcSSimon Schubert       if (TYPE_FIELD_PROTECTED (type, i))
3119*5796c8dcSSimon Schubert 	children[v_protected]++;
3120*5796c8dcSSimon Schubert       else if (TYPE_FIELD_PRIVATE (type, i))
3121*5796c8dcSSimon Schubert 	children[v_private]++;
3122*5796c8dcSSimon Schubert       else
3123*5796c8dcSSimon Schubert 	children[v_public]++;
3124*5796c8dcSSimon Schubert     }
3125*5796c8dcSSimon Schubert }
3126*5796c8dcSSimon Schubert 
3127*5796c8dcSSimon Schubert static char *
3128*5796c8dcSSimon Schubert cplus_name_of_variable (struct varobj *parent)
3129*5796c8dcSSimon Schubert {
3130*5796c8dcSSimon Schubert   return c_name_of_variable (parent);
3131*5796c8dcSSimon Schubert }
3132*5796c8dcSSimon Schubert 
3133*5796c8dcSSimon Schubert enum accessibility { private_field, protected_field, public_field };
3134*5796c8dcSSimon Schubert 
3135*5796c8dcSSimon Schubert /* Check if field INDEX of TYPE has the specified accessibility.
3136*5796c8dcSSimon Schubert    Return 0 if so and 1 otherwise.  */
3137*5796c8dcSSimon Schubert static int
3138*5796c8dcSSimon Schubert match_accessibility (struct type *type, int index, enum accessibility acc)
3139*5796c8dcSSimon Schubert {
3140*5796c8dcSSimon Schubert   if (acc == private_field && TYPE_FIELD_PRIVATE (type, index))
3141*5796c8dcSSimon Schubert     return 1;
3142*5796c8dcSSimon Schubert   else if (acc == protected_field && TYPE_FIELD_PROTECTED (type, index))
3143*5796c8dcSSimon Schubert     return 1;
3144*5796c8dcSSimon Schubert   else if (acc == public_field && !TYPE_FIELD_PRIVATE (type, index)
3145*5796c8dcSSimon Schubert 	   && !TYPE_FIELD_PROTECTED (type, index))
3146*5796c8dcSSimon Schubert     return 1;
3147*5796c8dcSSimon Schubert   else
3148*5796c8dcSSimon Schubert     return 0;
3149*5796c8dcSSimon Schubert }
3150*5796c8dcSSimon Schubert 
3151*5796c8dcSSimon Schubert static void
3152*5796c8dcSSimon Schubert cplus_describe_child (struct varobj *parent, int index,
3153*5796c8dcSSimon Schubert 		      char **cname, struct value **cvalue, struct type **ctype,
3154*5796c8dcSSimon Schubert 		      char **cfull_expression)
3155*5796c8dcSSimon Schubert {
3156*5796c8dcSSimon Schubert   char *name = NULL;
3157*5796c8dcSSimon Schubert   struct value *value;
3158*5796c8dcSSimon Schubert   struct type *type;
3159*5796c8dcSSimon Schubert   int was_ptr;
3160*5796c8dcSSimon Schubert   char *parent_expression = NULL;
3161*5796c8dcSSimon Schubert 
3162*5796c8dcSSimon Schubert   if (cname)
3163*5796c8dcSSimon Schubert     *cname = NULL;
3164*5796c8dcSSimon Schubert   if (cvalue)
3165*5796c8dcSSimon Schubert     *cvalue = NULL;
3166*5796c8dcSSimon Schubert   if (ctype)
3167*5796c8dcSSimon Schubert     *ctype = NULL;
3168*5796c8dcSSimon Schubert   if (cfull_expression)
3169*5796c8dcSSimon Schubert     *cfull_expression = NULL;
3170*5796c8dcSSimon Schubert 
3171*5796c8dcSSimon Schubert   if (CPLUS_FAKE_CHILD (parent))
3172*5796c8dcSSimon Schubert     {
3173*5796c8dcSSimon Schubert       value = parent->parent->value;
3174*5796c8dcSSimon Schubert       type = get_value_type (parent->parent);
3175*5796c8dcSSimon Schubert       if (cfull_expression)
3176*5796c8dcSSimon Schubert 	parent_expression = varobj_get_path_expr (parent->parent);
3177*5796c8dcSSimon Schubert     }
3178*5796c8dcSSimon Schubert   else
3179*5796c8dcSSimon Schubert     {
3180*5796c8dcSSimon Schubert       value = parent->value;
3181*5796c8dcSSimon Schubert       type = get_value_type (parent);
3182*5796c8dcSSimon Schubert       if (cfull_expression)
3183*5796c8dcSSimon Schubert 	parent_expression = varobj_get_path_expr (parent);
3184*5796c8dcSSimon Schubert     }
3185*5796c8dcSSimon Schubert 
3186*5796c8dcSSimon Schubert   adjust_value_for_child_access (&value, &type, &was_ptr);
3187*5796c8dcSSimon Schubert 
3188*5796c8dcSSimon Schubert   if (TYPE_CODE (type) == TYPE_CODE_STRUCT
3189*5796c8dcSSimon Schubert       || TYPE_CODE (type) == TYPE_CODE_UNION)
3190*5796c8dcSSimon Schubert     {
3191*5796c8dcSSimon Schubert       char *join = was_ptr ? "->" : ".";
3192*5796c8dcSSimon Schubert       if (CPLUS_FAKE_CHILD (parent))
3193*5796c8dcSSimon Schubert 	{
3194*5796c8dcSSimon Schubert 	  /* The fields of the class type are ordered as they
3195*5796c8dcSSimon Schubert 	     appear in the class.  We are given an index for a
3196*5796c8dcSSimon Schubert 	     particular access control type ("public","protected",
3197*5796c8dcSSimon Schubert 	     or "private").  We must skip over fields that don't
3198*5796c8dcSSimon Schubert 	     have the access control we are looking for to properly
3199*5796c8dcSSimon Schubert 	     find the indexed field. */
3200*5796c8dcSSimon Schubert 	  int type_index = TYPE_N_BASECLASSES (type);
3201*5796c8dcSSimon Schubert 	  enum accessibility acc = public_field;
3202*5796c8dcSSimon Schubert 	  if (strcmp (parent->name, "private") == 0)
3203*5796c8dcSSimon Schubert 	    acc = private_field;
3204*5796c8dcSSimon Schubert 	  else if (strcmp (parent->name, "protected") == 0)
3205*5796c8dcSSimon Schubert 	    acc = protected_field;
3206*5796c8dcSSimon Schubert 
3207*5796c8dcSSimon Schubert 	  while (index >= 0)
3208*5796c8dcSSimon Schubert 	    {
3209*5796c8dcSSimon Schubert 	      if (TYPE_VPTR_BASETYPE (type) == type
3210*5796c8dcSSimon Schubert 		  && type_index == TYPE_VPTR_FIELDNO (type))
3211*5796c8dcSSimon Schubert 		; /* ignore vptr */
3212*5796c8dcSSimon Schubert 	      else if (match_accessibility (type, type_index, acc))
3213*5796c8dcSSimon Schubert 		    --index;
3214*5796c8dcSSimon Schubert 		  ++type_index;
3215*5796c8dcSSimon Schubert 	    }
3216*5796c8dcSSimon Schubert 	  --type_index;
3217*5796c8dcSSimon Schubert 
3218*5796c8dcSSimon Schubert 	  if (cname)
3219*5796c8dcSSimon Schubert 	    *cname = xstrdup (TYPE_FIELD_NAME (type, type_index));
3220*5796c8dcSSimon Schubert 
3221*5796c8dcSSimon Schubert 	  if (cvalue && value)
3222*5796c8dcSSimon Schubert 	    *cvalue = value_struct_element_index (value, type_index);
3223*5796c8dcSSimon Schubert 
3224*5796c8dcSSimon Schubert 	  if (ctype)
3225*5796c8dcSSimon Schubert 	    *ctype = TYPE_FIELD_TYPE (type, type_index);
3226*5796c8dcSSimon Schubert 
3227*5796c8dcSSimon Schubert 	  if (cfull_expression)
3228*5796c8dcSSimon Schubert 	    *cfull_expression = xstrprintf ("((%s)%s%s)", parent_expression,
3229*5796c8dcSSimon Schubert 					    join,
3230*5796c8dcSSimon Schubert 					    TYPE_FIELD_NAME (type, type_index));
3231*5796c8dcSSimon Schubert 	}
3232*5796c8dcSSimon Schubert       else if (index < TYPE_N_BASECLASSES (type))
3233*5796c8dcSSimon Schubert 	{
3234*5796c8dcSSimon Schubert 	  /* This is a baseclass.  */
3235*5796c8dcSSimon Schubert 	  if (cname)
3236*5796c8dcSSimon Schubert 	    *cname = xstrdup (TYPE_FIELD_NAME (type, index));
3237*5796c8dcSSimon Schubert 
3238*5796c8dcSSimon Schubert 	  if (cvalue && value)
3239*5796c8dcSSimon Schubert 	    *cvalue = value_cast (TYPE_FIELD_TYPE (type, index), value);
3240*5796c8dcSSimon Schubert 
3241*5796c8dcSSimon Schubert 	  if (ctype)
3242*5796c8dcSSimon Schubert 	    {
3243*5796c8dcSSimon Schubert 	      *ctype = TYPE_FIELD_TYPE (type, index);
3244*5796c8dcSSimon Schubert 	    }
3245*5796c8dcSSimon Schubert 
3246*5796c8dcSSimon Schubert 	  if (cfull_expression)
3247*5796c8dcSSimon Schubert 	    {
3248*5796c8dcSSimon Schubert 	      char *ptr = was_ptr ? "*" : "";
3249*5796c8dcSSimon Schubert 	      /* Cast the parent to the base' type. Note that in gdb,
3250*5796c8dcSSimon Schubert 		 expression like
3251*5796c8dcSSimon Schubert 		         (Base1)d
3252*5796c8dcSSimon Schubert 		 will create an lvalue, for all appearences, so we don't
3253*5796c8dcSSimon Schubert 		 need to use more fancy:
3254*5796c8dcSSimon Schubert 		         *(Base1*)(&d)
3255*5796c8dcSSimon Schubert 		 construct.  */
3256*5796c8dcSSimon Schubert 	      *cfull_expression = xstrprintf ("(%s(%s%s) %s)",
3257*5796c8dcSSimon Schubert 					      ptr,
3258*5796c8dcSSimon Schubert 					      TYPE_FIELD_NAME (type, index),
3259*5796c8dcSSimon Schubert 					      ptr,
3260*5796c8dcSSimon Schubert 					      parent_expression);
3261*5796c8dcSSimon Schubert 	    }
3262*5796c8dcSSimon Schubert 	}
3263*5796c8dcSSimon Schubert       else
3264*5796c8dcSSimon Schubert 	{
3265*5796c8dcSSimon Schubert 	  char *access = NULL;
3266*5796c8dcSSimon Schubert 	  int children[3];
3267*5796c8dcSSimon Schubert 	  cplus_class_num_children (type, children);
3268*5796c8dcSSimon Schubert 
3269*5796c8dcSSimon Schubert 	  /* Everything beyond the baseclasses can
3270*5796c8dcSSimon Schubert 	     only be "public", "private", or "protected"
3271*5796c8dcSSimon Schubert 
3272*5796c8dcSSimon Schubert 	     The special "fake" children are always output by varobj in
3273*5796c8dcSSimon Schubert 	     this order. So if INDEX == 2, it MUST be "protected". */
3274*5796c8dcSSimon Schubert 	  index -= TYPE_N_BASECLASSES (type);
3275*5796c8dcSSimon Schubert 	  switch (index)
3276*5796c8dcSSimon Schubert 	    {
3277*5796c8dcSSimon Schubert 	    case 0:
3278*5796c8dcSSimon Schubert 	      if (children[v_public] > 0)
3279*5796c8dcSSimon Schubert 	 	access = "public";
3280*5796c8dcSSimon Schubert 	      else if (children[v_private] > 0)
3281*5796c8dcSSimon Schubert 	 	access = "private";
3282*5796c8dcSSimon Schubert 	      else
3283*5796c8dcSSimon Schubert 	 	access = "protected";
3284*5796c8dcSSimon Schubert 	      break;
3285*5796c8dcSSimon Schubert 	    case 1:
3286*5796c8dcSSimon Schubert 	      if (children[v_public] > 0)
3287*5796c8dcSSimon Schubert 		{
3288*5796c8dcSSimon Schubert 		  if (children[v_private] > 0)
3289*5796c8dcSSimon Schubert 		    access = "private";
3290*5796c8dcSSimon Schubert 		  else
3291*5796c8dcSSimon Schubert 		    access = "protected";
3292*5796c8dcSSimon Schubert 		}
3293*5796c8dcSSimon Schubert 	      else if (children[v_private] > 0)
3294*5796c8dcSSimon Schubert 	 	access = "protected";
3295*5796c8dcSSimon Schubert 	      break;
3296*5796c8dcSSimon Schubert 	    case 2:
3297*5796c8dcSSimon Schubert 	      /* Must be protected */
3298*5796c8dcSSimon Schubert 	      access = "protected";
3299*5796c8dcSSimon Schubert 	      break;
3300*5796c8dcSSimon Schubert 	    default:
3301*5796c8dcSSimon Schubert 	      /* error! */
3302*5796c8dcSSimon Schubert 	      break;
3303*5796c8dcSSimon Schubert 	    }
3304*5796c8dcSSimon Schubert 
3305*5796c8dcSSimon Schubert 	  gdb_assert (access);
3306*5796c8dcSSimon Schubert 	  if (cname)
3307*5796c8dcSSimon Schubert 	    *cname = xstrdup (access);
3308*5796c8dcSSimon Schubert 
3309*5796c8dcSSimon Schubert 	  /* Value and type and full expression are null here.  */
3310*5796c8dcSSimon Schubert 	}
3311*5796c8dcSSimon Schubert     }
3312*5796c8dcSSimon Schubert   else
3313*5796c8dcSSimon Schubert     {
3314*5796c8dcSSimon Schubert       c_describe_child (parent, index, cname, cvalue, ctype, cfull_expression);
3315*5796c8dcSSimon Schubert     }
3316*5796c8dcSSimon Schubert }
3317*5796c8dcSSimon Schubert 
3318*5796c8dcSSimon Schubert static char *
3319*5796c8dcSSimon Schubert cplus_name_of_child (struct varobj *parent, int index)
3320*5796c8dcSSimon Schubert {
3321*5796c8dcSSimon Schubert   char *name = NULL;
3322*5796c8dcSSimon Schubert   cplus_describe_child (parent, index, &name, NULL, NULL, NULL);
3323*5796c8dcSSimon Schubert   return name;
3324*5796c8dcSSimon Schubert }
3325*5796c8dcSSimon Schubert 
3326*5796c8dcSSimon Schubert static char *
3327*5796c8dcSSimon Schubert cplus_path_expr_of_child (struct varobj *child)
3328*5796c8dcSSimon Schubert {
3329*5796c8dcSSimon Schubert   cplus_describe_child (child->parent, child->index, NULL, NULL, NULL,
3330*5796c8dcSSimon Schubert 			&child->path_expr);
3331*5796c8dcSSimon Schubert   return child->path_expr;
3332*5796c8dcSSimon Schubert }
3333*5796c8dcSSimon Schubert 
3334*5796c8dcSSimon Schubert static struct value *
3335*5796c8dcSSimon Schubert cplus_value_of_root (struct varobj **var_handle)
3336*5796c8dcSSimon Schubert {
3337*5796c8dcSSimon Schubert   return c_value_of_root (var_handle);
3338*5796c8dcSSimon Schubert }
3339*5796c8dcSSimon Schubert 
3340*5796c8dcSSimon Schubert static struct value *
3341*5796c8dcSSimon Schubert cplus_value_of_child (struct varobj *parent, int index)
3342*5796c8dcSSimon Schubert {
3343*5796c8dcSSimon Schubert   struct value *value = NULL;
3344*5796c8dcSSimon Schubert   cplus_describe_child (parent, index, NULL, &value, NULL, NULL);
3345*5796c8dcSSimon Schubert   return value;
3346*5796c8dcSSimon Schubert }
3347*5796c8dcSSimon Schubert 
3348*5796c8dcSSimon Schubert static struct type *
3349*5796c8dcSSimon Schubert cplus_type_of_child (struct varobj *parent, int index)
3350*5796c8dcSSimon Schubert {
3351*5796c8dcSSimon Schubert   struct type *type = NULL;
3352*5796c8dcSSimon Schubert   cplus_describe_child (parent, index, NULL, NULL, &type, NULL);
3353*5796c8dcSSimon Schubert   return type;
3354*5796c8dcSSimon Schubert }
3355*5796c8dcSSimon Schubert 
3356*5796c8dcSSimon Schubert static char *
3357*5796c8dcSSimon Schubert cplus_value_of_variable (struct varobj *var, enum varobj_display_formats format)
3358*5796c8dcSSimon Schubert {
3359*5796c8dcSSimon Schubert 
3360*5796c8dcSSimon Schubert   /* If we have one of our special types, don't print out
3361*5796c8dcSSimon Schubert      any value. */
3362*5796c8dcSSimon Schubert   if (CPLUS_FAKE_CHILD (var))
3363*5796c8dcSSimon Schubert     return xstrdup ("");
3364*5796c8dcSSimon Schubert 
3365*5796c8dcSSimon Schubert   return c_value_of_variable (var, format);
3366*5796c8dcSSimon Schubert }
3367*5796c8dcSSimon Schubert 
3368*5796c8dcSSimon Schubert /* Java */
3369*5796c8dcSSimon Schubert 
3370*5796c8dcSSimon Schubert static int
3371*5796c8dcSSimon Schubert java_number_of_children (struct varobj *var)
3372*5796c8dcSSimon Schubert {
3373*5796c8dcSSimon Schubert   return cplus_number_of_children (var);
3374*5796c8dcSSimon Schubert }
3375*5796c8dcSSimon Schubert 
3376*5796c8dcSSimon Schubert static char *
3377*5796c8dcSSimon Schubert java_name_of_variable (struct varobj *parent)
3378*5796c8dcSSimon Schubert {
3379*5796c8dcSSimon Schubert   char *p, *name;
3380*5796c8dcSSimon Schubert 
3381*5796c8dcSSimon Schubert   name = cplus_name_of_variable (parent);
3382*5796c8dcSSimon Schubert   /* If  the name has "-" in it, it is because we
3383*5796c8dcSSimon Schubert      needed to escape periods in the name... */
3384*5796c8dcSSimon Schubert   p = name;
3385*5796c8dcSSimon Schubert 
3386*5796c8dcSSimon Schubert   while (*p != '\000')
3387*5796c8dcSSimon Schubert     {
3388*5796c8dcSSimon Schubert       if (*p == '-')
3389*5796c8dcSSimon Schubert 	*p = '.';
3390*5796c8dcSSimon Schubert       p++;
3391*5796c8dcSSimon Schubert     }
3392*5796c8dcSSimon Schubert 
3393*5796c8dcSSimon Schubert   return name;
3394*5796c8dcSSimon Schubert }
3395*5796c8dcSSimon Schubert 
3396*5796c8dcSSimon Schubert static char *
3397*5796c8dcSSimon Schubert java_name_of_child (struct varobj *parent, int index)
3398*5796c8dcSSimon Schubert {
3399*5796c8dcSSimon Schubert   char *name, *p;
3400*5796c8dcSSimon Schubert 
3401*5796c8dcSSimon Schubert   name = cplus_name_of_child (parent, index);
3402*5796c8dcSSimon Schubert   /* Escape any periods in the name... */
3403*5796c8dcSSimon Schubert   p = name;
3404*5796c8dcSSimon Schubert 
3405*5796c8dcSSimon Schubert   while (*p != '\000')
3406*5796c8dcSSimon Schubert     {
3407*5796c8dcSSimon Schubert       if (*p == '.')
3408*5796c8dcSSimon Schubert 	*p = '-';
3409*5796c8dcSSimon Schubert       p++;
3410*5796c8dcSSimon Schubert     }
3411*5796c8dcSSimon Schubert 
3412*5796c8dcSSimon Schubert   return name;
3413*5796c8dcSSimon Schubert }
3414*5796c8dcSSimon Schubert 
3415*5796c8dcSSimon Schubert static char *
3416*5796c8dcSSimon Schubert java_path_expr_of_child (struct varobj *child)
3417*5796c8dcSSimon Schubert {
3418*5796c8dcSSimon Schubert   return NULL;
3419*5796c8dcSSimon Schubert }
3420*5796c8dcSSimon Schubert 
3421*5796c8dcSSimon Schubert static struct value *
3422*5796c8dcSSimon Schubert java_value_of_root (struct varobj **var_handle)
3423*5796c8dcSSimon Schubert {
3424*5796c8dcSSimon Schubert   return cplus_value_of_root (var_handle);
3425*5796c8dcSSimon Schubert }
3426*5796c8dcSSimon Schubert 
3427*5796c8dcSSimon Schubert static struct value *
3428*5796c8dcSSimon Schubert java_value_of_child (struct varobj *parent, int index)
3429*5796c8dcSSimon Schubert {
3430*5796c8dcSSimon Schubert   return cplus_value_of_child (parent, index);
3431*5796c8dcSSimon Schubert }
3432*5796c8dcSSimon Schubert 
3433*5796c8dcSSimon Schubert static struct type *
3434*5796c8dcSSimon Schubert java_type_of_child (struct varobj *parent, int index)
3435*5796c8dcSSimon Schubert {
3436*5796c8dcSSimon Schubert   return cplus_type_of_child (parent, index);
3437*5796c8dcSSimon Schubert }
3438*5796c8dcSSimon Schubert 
3439*5796c8dcSSimon Schubert static char *
3440*5796c8dcSSimon Schubert java_value_of_variable (struct varobj *var, enum varobj_display_formats format)
3441*5796c8dcSSimon Schubert {
3442*5796c8dcSSimon Schubert   return cplus_value_of_variable (var, format);
3443*5796c8dcSSimon Schubert }
3444*5796c8dcSSimon Schubert 
3445*5796c8dcSSimon Schubert /* Iterate all the existing _root_ VAROBJs and call the FUNC callback for them
3446*5796c8dcSSimon Schubert    with an arbitrary caller supplied DATA pointer.  */
3447*5796c8dcSSimon Schubert 
3448*5796c8dcSSimon Schubert void
3449*5796c8dcSSimon Schubert all_root_varobjs (void (*func) (struct varobj *var, void *data), void *data)
3450*5796c8dcSSimon Schubert {
3451*5796c8dcSSimon Schubert   struct varobj_root *var_root, *var_root_next;
3452*5796c8dcSSimon Schubert 
3453*5796c8dcSSimon Schubert   /* Iterate "safely" - handle if the callee deletes its passed VAROBJ.  */
3454*5796c8dcSSimon Schubert 
3455*5796c8dcSSimon Schubert   for (var_root = rootlist; var_root != NULL; var_root = var_root_next)
3456*5796c8dcSSimon Schubert     {
3457*5796c8dcSSimon Schubert       var_root_next = var_root->next;
3458*5796c8dcSSimon Schubert 
3459*5796c8dcSSimon Schubert       (*func) (var_root->rootvar, data);
3460*5796c8dcSSimon Schubert     }
3461*5796c8dcSSimon Schubert }
3462*5796c8dcSSimon Schubert 
3463*5796c8dcSSimon Schubert extern void _initialize_varobj (void);
3464*5796c8dcSSimon Schubert void
3465*5796c8dcSSimon Schubert _initialize_varobj (void)
3466*5796c8dcSSimon Schubert {
3467*5796c8dcSSimon Schubert   int sizeof_table = sizeof (struct vlist *) * VAROBJ_TABLE_SIZE;
3468*5796c8dcSSimon Schubert 
3469*5796c8dcSSimon Schubert   varobj_table = xmalloc (sizeof_table);
3470*5796c8dcSSimon Schubert   memset (varobj_table, 0, sizeof_table);
3471*5796c8dcSSimon Schubert 
3472*5796c8dcSSimon Schubert   add_setshow_zinteger_cmd ("debugvarobj", class_maintenance,
3473*5796c8dcSSimon Schubert 			    &varobjdebug, _("\
3474*5796c8dcSSimon Schubert Set varobj debugging."), _("\
3475*5796c8dcSSimon Schubert Show varobj debugging."), _("\
3476*5796c8dcSSimon Schubert When non-zero, varobj debugging is enabled."),
3477*5796c8dcSSimon Schubert 			    NULL,
3478*5796c8dcSSimon Schubert 			    show_varobjdebug,
3479*5796c8dcSSimon Schubert 			    &setlist, &showlist);
3480*5796c8dcSSimon Schubert }
3481*5796c8dcSSimon Schubert 
3482*5796c8dcSSimon Schubert /* Invalidate varobj VAR if it is tied to locals and re-create it if it is
3483*5796c8dcSSimon Schubert    defined on globals.  It is a helper for varobj_invalidate.  */
3484*5796c8dcSSimon Schubert 
3485*5796c8dcSSimon Schubert static void
3486*5796c8dcSSimon Schubert varobj_invalidate_iter (struct varobj *var, void *unused)
3487*5796c8dcSSimon Schubert {
3488*5796c8dcSSimon Schubert   /* Floating varobjs are reparsed on each stop, so we don't care if the
3489*5796c8dcSSimon Schubert      presently parsed expression refers to something that's gone.  */
3490*5796c8dcSSimon Schubert   if (var->root->floating)
3491*5796c8dcSSimon Schubert     return;
3492*5796c8dcSSimon Schubert 
3493*5796c8dcSSimon Schubert   /* global var must be re-evaluated.  */
3494*5796c8dcSSimon Schubert   if (var->root->valid_block == NULL)
3495*5796c8dcSSimon Schubert     {
3496*5796c8dcSSimon Schubert       struct varobj *tmp_var;
3497*5796c8dcSSimon Schubert 
3498*5796c8dcSSimon Schubert       /* Try to create a varobj with same expression.  If we succeed
3499*5796c8dcSSimon Schubert 	 replace the old varobj, otherwise invalidate it.  */
3500*5796c8dcSSimon Schubert       tmp_var = varobj_create (NULL, var->name, (CORE_ADDR) 0,
3501*5796c8dcSSimon Schubert 			       USE_CURRENT_FRAME);
3502*5796c8dcSSimon Schubert       if (tmp_var != NULL)
3503*5796c8dcSSimon Schubert 	{
3504*5796c8dcSSimon Schubert 	  tmp_var->obj_name = xstrdup (var->obj_name);
3505*5796c8dcSSimon Schubert 	  varobj_delete (var, NULL, 0);
3506*5796c8dcSSimon Schubert 	  install_variable (tmp_var);
3507*5796c8dcSSimon Schubert 	}
3508*5796c8dcSSimon Schubert       else
3509*5796c8dcSSimon Schubert 	var->root->is_valid = 0;
3510*5796c8dcSSimon Schubert     }
3511*5796c8dcSSimon Schubert   else /* locals must be invalidated.  */
3512*5796c8dcSSimon Schubert     var->root->is_valid = 0;
3513*5796c8dcSSimon Schubert }
3514*5796c8dcSSimon Schubert 
3515*5796c8dcSSimon Schubert /* Invalidate the varobjs that are tied to locals and re-create the ones that
3516*5796c8dcSSimon Schubert    are defined on globals.
3517*5796c8dcSSimon Schubert    Invalidated varobjs will be always printed in_scope="invalid".  */
3518*5796c8dcSSimon Schubert 
3519*5796c8dcSSimon Schubert void
3520*5796c8dcSSimon Schubert varobj_invalidate (void)
3521*5796c8dcSSimon Schubert {
3522*5796c8dcSSimon Schubert   all_root_varobjs (varobj_invalidate_iter, NULL);
3523*5796c8dcSSimon Schubert }
3524