xref: /openbsd-src/gnu/usr.bin/binutils/gdb/jv-valprint.c (revision b725ae7711052a2233e31a66fefb8a752c388d7a)
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