1*b725ae77Skettenis /* Support for printing Java values for GDB, the GNU debugger.
2*b725ae77Skettenis
3*b725ae77Skettenis Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free
4*b725ae77Skettenis Software Foundation, Inc.
5*b725ae77Skettenis
6*b725ae77Skettenis This file is part of GDB.
7*b725ae77Skettenis
8*b725ae77Skettenis This program is free software; you can redistribute it and/or modify
9*b725ae77Skettenis it under the terms of the GNU General Public License as published by
10*b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or
11*b725ae77Skettenis (at your option) any later version.
12*b725ae77Skettenis
13*b725ae77Skettenis This program is distributed in the hope that it will be useful,
14*b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
15*b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16*b725ae77Skettenis GNU General Public License for more details.
17*b725ae77Skettenis
18*b725ae77Skettenis You should have received a copy of the GNU General Public License
19*b725ae77Skettenis along with this program; if not, write to the Free Software
20*b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
21*b725ae77Skettenis Boston, MA 02111-1307, USA. */
22*b725ae77Skettenis
23*b725ae77Skettenis #include "defs.h"
24*b725ae77Skettenis #include "symtab.h"
25*b725ae77Skettenis #include "gdbtypes.h"
26*b725ae77Skettenis #include "gdbcore.h"
27*b725ae77Skettenis #include "expression.h"
28*b725ae77Skettenis #include "value.h"
29*b725ae77Skettenis #include "demangle.h"
30*b725ae77Skettenis #include "valprint.h"
31*b725ae77Skettenis #include "language.h"
32*b725ae77Skettenis #include "jv-lang.h"
33*b725ae77Skettenis #include "c-lang.h"
34*b725ae77Skettenis #include "annotate.h"
35*b725ae77Skettenis #include "gdb_string.h"
36*b725ae77Skettenis
37*b725ae77Skettenis /* Local functions */
38*b725ae77Skettenis
39*b725ae77Skettenis static void java_print_value_fields (struct type * type, char *valaddr,
40*b725ae77Skettenis CORE_ADDR address,
41*b725ae77Skettenis struct ui_file *stream, int format,
42*b725ae77Skettenis int recurse,
43*b725ae77Skettenis enum val_prettyprint pretty);
44*b725ae77Skettenis
45*b725ae77Skettenis
46*b725ae77Skettenis int
java_value_print(struct value * val,struct ui_file * stream,int format,enum val_prettyprint pretty)47*b725ae77Skettenis java_value_print (struct value *val, struct ui_file *stream, int format,
48*b725ae77Skettenis enum val_prettyprint pretty)
49*b725ae77Skettenis {
50*b725ae77Skettenis struct type *type;
51*b725ae77Skettenis CORE_ADDR address;
52*b725ae77Skettenis int i;
53*b725ae77Skettenis char *name;
54*b725ae77Skettenis
55*b725ae77Skettenis type = VALUE_TYPE (val);
56*b725ae77Skettenis address = VALUE_ADDRESS (val) + VALUE_OFFSET (val);
57*b725ae77Skettenis
58*b725ae77Skettenis if (is_object_type (type))
59*b725ae77Skettenis {
60*b725ae77Skettenis CORE_ADDR obj_addr;
61*b725ae77Skettenis
62*b725ae77Skettenis /* Get the run-time type, and cast the object into that */
63*b725ae77Skettenis
64*b725ae77Skettenis obj_addr = unpack_pointer (type, VALUE_CONTENTS (val));
65*b725ae77Skettenis
66*b725ae77Skettenis if (obj_addr != 0)
67*b725ae77Skettenis {
68*b725ae77Skettenis type = type_from_class (java_class_from_object (val));
69*b725ae77Skettenis type = lookup_pointer_type (type);
70*b725ae77Skettenis
71*b725ae77Skettenis val = value_at (type, address, NULL);
72*b725ae77Skettenis }
73*b725ae77Skettenis }
74*b725ae77Skettenis
75*b725ae77Skettenis if (TYPE_CODE (type) == TYPE_CODE_PTR && !value_logical_not (val))
76*b725ae77Skettenis type_print (TYPE_TARGET_TYPE (type), "", stream, -1);
77*b725ae77Skettenis
78*b725ae77Skettenis name = TYPE_TAG_NAME (type);
79*b725ae77Skettenis if (TYPE_CODE (type) == TYPE_CODE_STRUCT && name != NULL
80*b725ae77Skettenis && (i = strlen (name), name[i - 1] == ']'))
81*b725ae77Skettenis {
82*b725ae77Skettenis char buf4[4];
83*b725ae77Skettenis long length;
84*b725ae77Skettenis unsigned int things_printed = 0;
85*b725ae77Skettenis int reps;
86*b725ae77Skettenis struct type *el_type = java_primitive_type_from_name (name, i - 2);
87*b725ae77Skettenis
88*b725ae77Skettenis i = 0;
89*b725ae77Skettenis read_memory (address + JAVA_OBJECT_SIZE, buf4, 4);
90*b725ae77Skettenis
91*b725ae77Skettenis length = (long) extract_signed_integer (buf4, 4);
92*b725ae77Skettenis fprintf_filtered (stream, "{length: %ld", length);
93*b725ae77Skettenis
94*b725ae77Skettenis if (el_type == NULL)
95*b725ae77Skettenis {
96*b725ae77Skettenis CORE_ADDR element;
97*b725ae77Skettenis CORE_ADDR next_element = -1; /* dummy initial value */
98*b725ae77Skettenis
99*b725ae77Skettenis address += JAVA_OBJECT_SIZE + 4; /* Skip object header and length. */
100*b725ae77Skettenis
101*b725ae77Skettenis while (i < length && things_printed < print_max)
102*b725ae77Skettenis {
103*b725ae77Skettenis char *buf;
104*b725ae77Skettenis
105*b725ae77Skettenis buf = alloca (TARGET_PTR_BIT / HOST_CHAR_BIT);
106*b725ae77Skettenis fputs_filtered (", ", stream);
107*b725ae77Skettenis wrap_here (n_spaces (2));
108*b725ae77Skettenis
109*b725ae77Skettenis if (i > 0)
110*b725ae77Skettenis element = next_element;
111*b725ae77Skettenis else
112*b725ae77Skettenis {
113*b725ae77Skettenis read_memory (address, buf, sizeof (buf));
114*b725ae77Skettenis address += TARGET_PTR_BIT / HOST_CHAR_BIT;
115*b725ae77Skettenis /* FIXME: cagney/2003-05-24: Bogus or what. It
116*b725ae77Skettenis pulls a host sized pointer out of the target and
117*b725ae77Skettenis then extracts that as an address (while assuming
118*b725ae77Skettenis that the address is unsigned)! */
119*b725ae77Skettenis element = extract_unsigned_integer (buf, sizeof (buf));
120*b725ae77Skettenis }
121*b725ae77Skettenis
122*b725ae77Skettenis for (reps = 1; i + reps < length; reps++)
123*b725ae77Skettenis {
124*b725ae77Skettenis read_memory (address, buf, sizeof (buf));
125*b725ae77Skettenis address += TARGET_PTR_BIT / HOST_CHAR_BIT;
126*b725ae77Skettenis /* FIXME: cagney/2003-05-24: Bogus or what. It
127*b725ae77Skettenis pulls a host sized pointer out of the target and
128*b725ae77Skettenis then extracts that as an address (while assuming
129*b725ae77Skettenis that the address is unsigned)! */
130*b725ae77Skettenis next_element = extract_unsigned_integer (buf, sizeof (buf));
131*b725ae77Skettenis if (next_element != element)
132*b725ae77Skettenis break;
133*b725ae77Skettenis }
134*b725ae77Skettenis
135*b725ae77Skettenis if (reps == 1)
136*b725ae77Skettenis fprintf_filtered (stream, "%d: ", i);
137*b725ae77Skettenis else
138*b725ae77Skettenis fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
139*b725ae77Skettenis
140*b725ae77Skettenis if (element == 0)
141*b725ae77Skettenis fprintf_filtered (stream, "null");
142*b725ae77Skettenis else
143*b725ae77Skettenis fprintf_filtered (stream, "@%s", paddr_nz (element));
144*b725ae77Skettenis
145*b725ae77Skettenis things_printed++;
146*b725ae77Skettenis i += reps;
147*b725ae77Skettenis }
148*b725ae77Skettenis }
149*b725ae77Skettenis else
150*b725ae77Skettenis {
151*b725ae77Skettenis struct value *v = allocate_value (el_type);
152*b725ae77Skettenis struct value *next_v = allocate_value (el_type);
153*b725ae77Skettenis
154*b725ae77Skettenis VALUE_ADDRESS (v) = address + JAVA_OBJECT_SIZE + 4;
155*b725ae77Skettenis VALUE_ADDRESS (next_v) = VALUE_ADDRESS (v);
156*b725ae77Skettenis
157*b725ae77Skettenis while (i < length && things_printed < print_max)
158*b725ae77Skettenis {
159*b725ae77Skettenis fputs_filtered (", ", stream);
160*b725ae77Skettenis wrap_here (n_spaces (2));
161*b725ae77Skettenis
162*b725ae77Skettenis if (i > 0)
163*b725ae77Skettenis {
164*b725ae77Skettenis struct value *tmp;
165*b725ae77Skettenis
166*b725ae77Skettenis tmp = next_v;
167*b725ae77Skettenis next_v = v;
168*b725ae77Skettenis v = tmp;
169*b725ae77Skettenis }
170*b725ae77Skettenis else
171*b725ae77Skettenis {
172*b725ae77Skettenis VALUE_LAZY (v) = 1;
173*b725ae77Skettenis VALUE_OFFSET (v) = 0;
174*b725ae77Skettenis }
175*b725ae77Skettenis
176*b725ae77Skettenis VALUE_OFFSET (next_v) = VALUE_OFFSET (v);
177*b725ae77Skettenis
178*b725ae77Skettenis for (reps = 1; i + reps < length; reps++)
179*b725ae77Skettenis {
180*b725ae77Skettenis VALUE_LAZY (next_v) = 1;
181*b725ae77Skettenis VALUE_OFFSET (next_v) += TYPE_LENGTH (el_type);
182*b725ae77Skettenis if (memcmp (VALUE_CONTENTS (v), VALUE_CONTENTS (next_v),
183*b725ae77Skettenis TYPE_LENGTH (el_type)) != 0)
184*b725ae77Skettenis break;
185*b725ae77Skettenis }
186*b725ae77Skettenis
187*b725ae77Skettenis if (reps == 1)
188*b725ae77Skettenis fprintf_filtered (stream, "%d: ", i);
189*b725ae77Skettenis else
190*b725ae77Skettenis fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
191*b725ae77Skettenis
192*b725ae77Skettenis val_print (VALUE_TYPE (v), VALUE_CONTENTS (v), 0, 0,
193*b725ae77Skettenis stream, format, 2, 1, pretty);
194*b725ae77Skettenis
195*b725ae77Skettenis things_printed++;
196*b725ae77Skettenis i += reps;
197*b725ae77Skettenis }
198*b725ae77Skettenis }
199*b725ae77Skettenis
200*b725ae77Skettenis if (i < length)
201*b725ae77Skettenis fprintf_filtered (stream, "...");
202*b725ae77Skettenis
203*b725ae77Skettenis fprintf_filtered (stream, "}");
204*b725ae77Skettenis
205*b725ae77Skettenis return 0;
206*b725ae77Skettenis }
207*b725ae77Skettenis
208*b725ae77Skettenis /* If it's type String, print it */
209*b725ae77Skettenis
210*b725ae77Skettenis if (TYPE_CODE (type) == TYPE_CODE_PTR
211*b725ae77Skettenis && TYPE_TARGET_TYPE (type)
212*b725ae77Skettenis && TYPE_TAG_NAME (TYPE_TARGET_TYPE (type))
213*b725ae77Skettenis && strcmp (TYPE_TAG_NAME (TYPE_TARGET_TYPE (type)),
214*b725ae77Skettenis "java.lang.String") == 0
215*b725ae77Skettenis && (format == 0 || format == 's')
216*b725ae77Skettenis && address != 0
217*b725ae77Skettenis && value_as_address (val) != 0)
218*b725ae77Skettenis {
219*b725ae77Skettenis struct value *data_val;
220*b725ae77Skettenis CORE_ADDR data;
221*b725ae77Skettenis struct value *boffset_val;
222*b725ae77Skettenis unsigned long boffset;
223*b725ae77Skettenis struct value *count_val;
224*b725ae77Skettenis unsigned long count;
225*b725ae77Skettenis struct value *mark;
226*b725ae77Skettenis
227*b725ae77Skettenis mark = value_mark (); /* Remember start of new values */
228*b725ae77Skettenis
229*b725ae77Skettenis data_val = value_struct_elt (&val, NULL, "data", NULL, NULL);
230*b725ae77Skettenis data = value_as_address (data_val);
231*b725ae77Skettenis
232*b725ae77Skettenis boffset_val = value_struct_elt (&val, NULL, "boffset", NULL, NULL);
233*b725ae77Skettenis boffset = value_as_address (boffset_val);
234*b725ae77Skettenis
235*b725ae77Skettenis count_val = value_struct_elt (&val, NULL, "count", NULL, NULL);
236*b725ae77Skettenis count = value_as_address (count_val);
237*b725ae77Skettenis
238*b725ae77Skettenis value_free_to_mark (mark); /* Release unnecessary values */
239*b725ae77Skettenis
240*b725ae77Skettenis val_print_string (data + boffset, count, 2, stream);
241*b725ae77Skettenis
242*b725ae77Skettenis return 0;
243*b725ae77Skettenis }
244*b725ae77Skettenis
245*b725ae77Skettenis return (val_print (type, VALUE_CONTENTS (val), 0, address,
246*b725ae77Skettenis stream, format, 1, 0, pretty));
247*b725ae77Skettenis }
248*b725ae77Skettenis
249*b725ae77Skettenis /* TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the
250*b725ae77Skettenis same meanings as in cp_print_value and c_val_print.
251*b725ae77Skettenis
252*b725ae77Skettenis DONT_PRINT is an array of baseclass types that we
253*b725ae77Skettenis should not print, or zero if called from top level. */
254*b725ae77Skettenis
255*b725ae77Skettenis static void
java_print_value_fields(struct type * type,char * valaddr,CORE_ADDR address,struct ui_file * stream,int format,int recurse,enum val_prettyprint pretty)256*b725ae77Skettenis java_print_value_fields (struct type *type, char *valaddr, CORE_ADDR address,
257*b725ae77Skettenis struct ui_file *stream, int format, int recurse,
258*b725ae77Skettenis enum val_prettyprint pretty)
259*b725ae77Skettenis {
260*b725ae77Skettenis int i, len, n_baseclasses;
261*b725ae77Skettenis
262*b725ae77Skettenis CHECK_TYPEDEF (type);
263*b725ae77Skettenis
264*b725ae77Skettenis fprintf_filtered (stream, "{");
265*b725ae77Skettenis len = TYPE_NFIELDS (type);
266*b725ae77Skettenis n_baseclasses = TYPE_N_BASECLASSES (type);
267*b725ae77Skettenis
268*b725ae77Skettenis if (n_baseclasses > 0)
269*b725ae77Skettenis {
270*b725ae77Skettenis int i, n_baseclasses = TYPE_N_BASECLASSES (type);
271*b725ae77Skettenis
272*b725ae77Skettenis for (i = 0; i < n_baseclasses; i++)
273*b725ae77Skettenis {
274*b725ae77Skettenis int boffset;
275*b725ae77Skettenis struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
276*b725ae77Skettenis char *basename = TYPE_NAME (baseclass);
277*b725ae77Skettenis char *base_valaddr;
278*b725ae77Skettenis
279*b725ae77Skettenis if (BASETYPE_VIA_VIRTUAL (type, i))
280*b725ae77Skettenis continue;
281*b725ae77Skettenis
282*b725ae77Skettenis if (basename != NULL && strcmp (basename, "java.lang.Object") == 0)
283*b725ae77Skettenis continue;
284*b725ae77Skettenis
285*b725ae77Skettenis boffset = 0;
286*b725ae77Skettenis
287*b725ae77Skettenis if (pretty)
288*b725ae77Skettenis {
289*b725ae77Skettenis fprintf_filtered (stream, "\n");
290*b725ae77Skettenis print_spaces_filtered (2 * (recurse + 1), stream);
291*b725ae77Skettenis }
292*b725ae77Skettenis fputs_filtered ("<", stream);
293*b725ae77Skettenis /* Not sure what the best notation is in the case where there is no
294*b725ae77Skettenis baseclass name. */
295*b725ae77Skettenis fputs_filtered (basename ? basename : "", stream);
296*b725ae77Skettenis fputs_filtered ("> = ", stream);
297*b725ae77Skettenis
298*b725ae77Skettenis base_valaddr = valaddr;
299*b725ae77Skettenis
300*b725ae77Skettenis java_print_value_fields (baseclass, base_valaddr, address + boffset,
301*b725ae77Skettenis stream, format, recurse + 1, pretty);
302*b725ae77Skettenis fputs_filtered (", ", stream);
303*b725ae77Skettenis }
304*b725ae77Skettenis
305*b725ae77Skettenis }
306*b725ae77Skettenis
307*b725ae77Skettenis if (!len && n_baseclasses == 1)
308*b725ae77Skettenis fprintf_filtered (stream, "<No data fields>");
309*b725ae77Skettenis else
310*b725ae77Skettenis {
311*b725ae77Skettenis int fields_seen = 0;
312*b725ae77Skettenis
313*b725ae77Skettenis for (i = n_baseclasses; i < len; i++)
314*b725ae77Skettenis {
315*b725ae77Skettenis /* If requested, skip printing of static fields. */
316*b725ae77Skettenis if (TYPE_FIELD_STATIC (type, i))
317*b725ae77Skettenis {
318*b725ae77Skettenis char *name = TYPE_FIELD_NAME (type, i);
319*b725ae77Skettenis if (!static_field_print)
320*b725ae77Skettenis continue;
321*b725ae77Skettenis if (name != NULL && strcmp (name, "class") == 0)
322*b725ae77Skettenis continue;
323*b725ae77Skettenis }
324*b725ae77Skettenis if (fields_seen)
325*b725ae77Skettenis fprintf_filtered (stream, ", ");
326*b725ae77Skettenis else if (n_baseclasses > 0)
327*b725ae77Skettenis {
328*b725ae77Skettenis if (pretty)
329*b725ae77Skettenis {
330*b725ae77Skettenis fprintf_filtered (stream, "\n");
331*b725ae77Skettenis print_spaces_filtered (2 + 2 * recurse, stream);
332*b725ae77Skettenis fputs_filtered ("members of ", stream);
333*b725ae77Skettenis fputs_filtered (type_name_no_tag (type), stream);
334*b725ae77Skettenis fputs_filtered (": ", stream);
335*b725ae77Skettenis }
336*b725ae77Skettenis }
337*b725ae77Skettenis fields_seen = 1;
338*b725ae77Skettenis
339*b725ae77Skettenis if (pretty)
340*b725ae77Skettenis {
341*b725ae77Skettenis fprintf_filtered (stream, "\n");
342*b725ae77Skettenis print_spaces_filtered (2 + 2 * recurse, stream);
343*b725ae77Skettenis }
344*b725ae77Skettenis else
345*b725ae77Skettenis {
346*b725ae77Skettenis wrap_here (n_spaces (2 + 2 * recurse));
347*b725ae77Skettenis }
348*b725ae77Skettenis if (inspect_it)
349*b725ae77Skettenis {
350*b725ae77Skettenis if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
351*b725ae77Skettenis fputs_filtered ("\"( ptr \"", stream);
352*b725ae77Skettenis else
353*b725ae77Skettenis fputs_filtered ("\"( nodef \"", stream);
354*b725ae77Skettenis if (TYPE_FIELD_STATIC (type, i))
355*b725ae77Skettenis fputs_filtered ("static ", stream);
356*b725ae77Skettenis fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
357*b725ae77Skettenis language_cplus,
358*b725ae77Skettenis DMGL_PARAMS | DMGL_ANSI);
359*b725ae77Skettenis fputs_filtered ("\" \"", stream);
360*b725ae77Skettenis fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
361*b725ae77Skettenis language_cplus,
362*b725ae77Skettenis DMGL_PARAMS | DMGL_ANSI);
363*b725ae77Skettenis fputs_filtered ("\") \"", stream);
364*b725ae77Skettenis }
365*b725ae77Skettenis else
366*b725ae77Skettenis {
367*b725ae77Skettenis annotate_field_begin (TYPE_FIELD_TYPE (type, i));
368*b725ae77Skettenis
369*b725ae77Skettenis if (TYPE_FIELD_STATIC (type, i))
370*b725ae77Skettenis fputs_filtered ("static ", stream);
371*b725ae77Skettenis fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
372*b725ae77Skettenis language_cplus,
373*b725ae77Skettenis DMGL_PARAMS | DMGL_ANSI);
374*b725ae77Skettenis annotate_field_name_end ();
375*b725ae77Skettenis fputs_filtered (": ", stream);
376*b725ae77Skettenis annotate_field_value ();
377*b725ae77Skettenis }
378*b725ae77Skettenis
379*b725ae77Skettenis if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
380*b725ae77Skettenis {
381*b725ae77Skettenis struct value *v;
382*b725ae77Skettenis
383*b725ae77Skettenis /* Bitfields require special handling, especially due to byte
384*b725ae77Skettenis order problems. */
385*b725ae77Skettenis if (TYPE_FIELD_IGNORE (type, i))
386*b725ae77Skettenis {
387*b725ae77Skettenis fputs_filtered ("<optimized out or zero length>", stream);
388*b725ae77Skettenis }
389*b725ae77Skettenis else
390*b725ae77Skettenis {
391*b725ae77Skettenis v = value_from_longest (TYPE_FIELD_TYPE (type, i),
392*b725ae77Skettenis unpack_field_as_long (type, valaddr, i));
393*b725ae77Skettenis
394*b725ae77Skettenis val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v), 0,
395*b725ae77Skettenis 0, stream, format, 0, recurse + 1, pretty);
396*b725ae77Skettenis }
397*b725ae77Skettenis }
398*b725ae77Skettenis else
399*b725ae77Skettenis {
400*b725ae77Skettenis if (TYPE_FIELD_IGNORE (type, i))
401*b725ae77Skettenis {
402*b725ae77Skettenis fputs_filtered ("<optimized out or zero length>", stream);
403*b725ae77Skettenis }
404*b725ae77Skettenis else if (TYPE_FIELD_STATIC (type, i))
405*b725ae77Skettenis {
406*b725ae77Skettenis struct value *v = value_static_field (type, i);
407*b725ae77Skettenis if (v == NULL)
408*b725ae77Skettenis fputs_filtered ("<optimized out>", stream);
409*b725ae77Skettenis else
410*b725ae77Skettenis {
411*b725ae77Skettenis struct type *t = check_typedef (VALUE_TYPE (v));
412*b725ae77Skettenis if (TYPE_CODE (t) == TYPE_CODE_STRUCT)
413*b725ae77Skettenis v = value_addr (v);
414*b725ae77Skettenis val_print (VALUE_TYPE (v),
415*b725ae77Skettenis VALUE_CONTENTS (v), 0, VALUE_ADDRESS (v),
416*b725ae77Skettenis stream, format, 0, recurse + 1, pretty);
417*b725ae77Skettenis }
418*b725ae77Skettenis }
419*b725ae77Skettenis else if (TYPE_FIELD_TYPE (type, i) == NULL)
420*b725ae77Skettenis fputs_filtered ("<unknown type>", stream);
421*b725ae77Skettenis else
422*b725ae77Skettenis {
423*b725ae77Skettenis val_print (TYPE_FIELD_TYPE (type, i),
424*b725ae77Skettenis valaddr + TYPE_FIELD_BITPOS (type, i) / 8, 0,
425*b725ae77Skettenis address + TYPE_FIELD_BITPOS (type, i) / 8,
426*b725ae77Skettenis stream, format, 0, recurse + 1, pretty);
427*b725ae77Skettenis }
428*b725ae77Skettenis }
429*b725ae77Skettenis annotate_field_end ();
430*b725ae77Skettenis }
431*b725ae77Skettenis
432*b725ae77Skettenis if (pretty)
433*b725ae77Skettenis {
434*b725ae77Skettenis fprintf_filtered (stream, "\n");
435*b725ae77Skettenis print_spaces_filtered (2 * recurse, stream);
436*b725ae77Skettenis }
437*b725ae77Skettenis }
438*b725ae77Skettenis fprintf_filtered (stream, "}");
439*b725ae77Skettenis }
440*b725ae77Skettenis
441*b725ae77Skettenis /* Print data of type TYPE located at VALADDR (within GDB), which came from
442*b725ae77Skettenis the inferior at address ADDRESS, onto stdio stream STREAM according to
443*b725ae77Skettenis FORMAT (a letter or 0 for natural format). The data at VALADDR is in
444*b725ae77Skettenis target byte order.
445*b725ae77Skettenis
446*b725ae77Skettenis If the data are a string pointer, returns the number of string characters
447*b725ae77Skettenis printed.
448*b725ae77Skettenis
449*b725ae77Skettenis If DEREF_REF is nonzero, then dereference references, otherwise just print
450*b725ae77Skettenis them like pointers.
451*b725ae77Skettenis
452*b725ae77Skettenis The PRETTY parameter controls prettyprinting. */
453*b725ae77Skettenis
454*b725ae77Skettenis int
java_val_print(struct type * type,char * valaddr,int embedded_offset,CORE_ADDR address,struct ui_file * stream,int format,int deref_ref,int recurse,enum val_prettyprint pretty)455*b725ae77Skettenis java_val_print (struct type *type, char *valaddr, int embedded_offset,
456*b725ae77Skettenis CORE_ADDR address, struct ui_file *stream, int format,
457*b725ae77Skettenis int deref_ref, int recurse, enum val_prettyprint pretty)
458*b725ae77Skettenis {
459*b725ae77Skettenis unsigned int i = 0; /* Number of characters printed */
460*b725ae77Skettenis struct type *target_type;
461*b725ae77Skettenis CORE_ADDR addr;
462*b725ae77Skettenis
463*b725ae77Skettenis CHECK_TYPEDEF (type);
464*b725ae77Skettenis switch (TYPE_CODE (type))
465*b725ae77Skettenis {
466*b725ae77Skettenis case TYPE_CODE_PTR:
467*b725ae77Skettenis if (format && format != 's')
468*b725ae77Skettenis {
469*b725ae77Skettenis print_scalar_formatted (valaddr, type, format, 0, stream);
470*b725ae77Skettenis break;
471*b725ae77Skettenis }
472*b725ae77Skettenis #if 0
473*b725ae77Skettenis if (vtblprint && cp_is_vtbl_ptr_type (type))
474*b725ae77Skettenis {
475*b725ae77Skettenis /* Print the unmangled name if desired. */
476*b725ae77Skettenis /* Print vtable entry - we only get here if we ARE using
477*b725ae77Skettenis -fvtable_thunks. (Otherwise, look under TYPE_CODE_STRUCT.) */
478*b725ae77Skettenis /* Extract an address, assume that it is unsigned. */
479*b725ae77Skettenis print_address_demangle (extract_unsigned_integer (valaddr, TYPE_LENGTH (type)),
480*b725ae77Skettenis stream, demangle);
481*b725ae77Skettenis break;
482*b725ae77Skettenis }
483*b725ae77Skettenis #endif
484*b725ae77Skettenis addr = unpack_pointer (type, valaddr);
485*b725ae77Skettenis if (addr == 0)
486*b725ae77Skettenis {
487*b725ae77Skettenis fputs_filtered ("null", stream);
488*b725ae77Skettenis return i;
489*b725ae77Skettenis }
490*b725ae77Skettenis target_type = check_typedef (TYPE_TARGET_TYPE (type));
491*b725ae77Skettenis
492*b725ae77Skettenis if (TYPE_CODE (target_type) == TYPE_CODE_FUNC)
493*b725ae77Skettenis {
494*b725ae77Skettenis /* Try to print what function it points to. */
495*b725ae77Skettenis print_address_demangle (addr, stream, demangle);
496*b725ae77Skettenis /* Return value is irrelevant except for string pointers. */
497*b725ae77Skettenis return (0);
498*b725ae77Skettenis }
499*b725ae77Skettenis
500*b725ae77Skettenis if (addressprint && format != 's')
501*b725ae77Skettenis {
502*b725ae77Skettenis fputs_filtered ("@", stream);
503*b725ae77Skettenis print_longest (stream, 'x', 0, (ULONGEST) addr);
504*b725ae77Skettenis }
505*b725ae77Skettenis
506*b725ae77Skettenis return i;
507*b725ae77Skettenis
508*b725ae77Skettenis case TYPE_CODE_CHAR:
509*b725ae77Skettenis case TYPE_CODE_INT:
510*b725ae77Skettenis /* Can't just call c_val_print because that prints bytes as C
511*b725ae77Skettenis chars. */
512*b725ae77Skettenis format = format ? format : output_format;
513*b725ae77Skettenis if (format)
514*b725ae77Skettenis print_scalar_formatted (valaddr, type, format, 0, stream);
515*b725ae77Skettenis else if (TYPE_CODE (type) == TYPE_CODE_CHAR
516*b725ae77Skettenis || (TYPE_CODE (type) == TYPE_CODE_INT
517*b725ae77Skettenis && TYPE_LENGTH (type) == 2
518*b725ae77Skettenis && strcmp (TYPE_NAME (type), "char") == 0))
519*b725ae77Skettenis LA_PRINT_CHAR ((int) unpack_long (type, valaddr), stream);
520*b725ae77Skettenis else
521*b725ae77Skettenis val_print_type_code_int (type, valaddr, stream);
522*b725ae77Skettenis break;
523*b725ae77Skettenis
524*b725ae77Skettenis case TYPE_CODE_STRUCT:
525*b725ae77Skettenis java_print_value_fields (type, valaddr, address, stream, format,
526*b725ae77Skettenis recurse, pretty);
527*b725ae77Skettenis break;
528*b725ae77Skettenis
529*b725ae77Skettenis default:
530*b725ae77Skettenis return c_val_print (type, valaddr, embedded_offset, address, stream,
531*b725ae77Skettenis format, deref_ref, recurse, pretty);
532*b725ae77Skettenis }
533*b725ae77Skettenis
534*b725ae77Skettenis return 0;
535*b725ae77Skettenis }
536