1 /* Support for printing Java types for GDB, the GNU debugger.
2 Copyright 1997, 1998, 1999 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
27 #include "gdb_string.h"
28 #include "typeprint.h"
32 java_type_print_derivation_info (stream
, type
)
41 n_bases
= TYPE_N_BASECLASSES (type
);
43 for (i
= 0, prev
= 0; i
< n_bases
; i
++)
47 kind
= BASETYPE_VIA_VIRTUAL(type
, i
) ? 'I' : 'E';
49 fputs_filtered (kind
== prev
? ", "
50 : kind
== 'I' ? " implements "
54 name
= type_name_no_tag (TYPE_BASECLASS (type
, i
));
56 fprintf_filtered (stream
, "%s", name
? name
: "(null)");
60 fputs_filtered (" ", stream
);
63 /* Print the name of the type (or the ultimate pointer target,
64 function value or array element), or the description of a
67 SHOW positive means print details about the type (e.g. enum values),
68 and print structure elements passing SHOW - 1 for show.
69 SHOW negative means just print the type name or struct tag if there is one.
70 If there is no name, print something sensible but concise like
72 SHOW zero means just print the type name or struct tag if there is one.
73 If there is no name, print something sensible but not as concise like
74 "struct {int x; int y;}".
76 LEVEL is the number of spaces to indent by.
77 We increase it for some recursive calls. */
80 java_type_print_base (type
, stream
, show
, level
)
96 fputs_filtered ("<type unknown>", stream
);
100 /* When SHOW is zero or less, and there is a valid type name, then always
101 just print the type name directly from the type. */
104 && TYPE_NAME (type
) != NULL
)
106 fputs_filtered (TYPE_NAME (type
), stream
);
110 CHECK_TYPEDEF (type
);
112 switch (TYPE_CODE (type
))
115 java_type_print_base (TYPE_TARGET_TYPE (type
), stream
, show
, level
);
118 case TYPE_CODE_STRUCT
:
119 if (TYPE_TAG_NAME (type
) != NULL
&& TYPE_TAG_NAME (type
)[0] == '[')
121 char *name
= java_demangle_type_signature (TYPE_TAG_NAME (type
));
122 fputs_filtered (name
, stream
);
128 fprintf_filtered (stream
, "class ");
130 if (TYPE_TAG_NAME (type
) != NULL
)
132 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
134 fputs_filtered (" ", stream
);
141 /* If we just printed a tag name, no need to print anything else. */
142 if (TYPE_TAG_NAME (type
) == NULL
)
143 fprintf_filtered (stream
, "{...}");
145 else if (show
> 0 || TYPE_TAG_NAME (type
) == NULL
)
147 java_type_print_derivation_info (stream
, type
);
149 fprintf_filtered (stream
, "{\n");
150 if ((TYPE_NFIELDS (type
) == 0) && (TYPE_NFN_FIELDS (type
) == 0))
152 if (TYPE_FLAGS (type
) & TYPE_FLAG_STUB
)
153 fprintfi_filtered (level
+ 4, stream
, "<incomplete type>\n");
155 fprintfi_filtered (level
+ 4, stream
, "<no data fields>\n");
158 /* If there is a base class for this type,
159 do not print the field that it occupies. */
161 len
= TYPE_NFIELDS (type
);
162 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
165 /* Don't print out virtual function table. */
166 if (STREQN (TYPE_FIELD_NAME (type
, i
), "_vptr", 5)
167 && is_cplus_marker ((TYPE_FIELD_NAME (type
, i
))[5]))
170 /* Don't print the dummy field "class". */
171 if (STREQN (TYPE_FIELD_NAME (type
, i
), "class", 5))
174 print_spaces_filtered (level
+ 4, stream
);
176 if (HAVE_CPLUS_STRUCT (type
))
178 if (TYPE_FIELD_PROTECTED (type
, i
))
179 fprintf_filtered (stream
, "protected ");
180 else if (TYPE_FIELD_PRIVATE (type
, i
))
181 fprintf_filtered (stream
, "private ");
183 fprintf_filtered (stream
, "public ");
186 if (TYPE_FIELD_STATIC (type
, i
))
187 fprintf_filtered (stream
, "static ");
189 java_print_type (TYPE_FIELD_TYPE (type
, i
),
190 TYPE_FIELD_NAME (type
, i
),
191 stream
, show
- 1, level
+ 4);
193 fprintf_filtered (stream
, ";\n");
196 /* If there are both fields and methods, put a space between. */
197 len
= TYPE_NFN_FIELDS (type
);
199 fprintf_filtered (stream
, "\n");
201 /* Print out the methods */
203 for (i
= 0; i
< len
; i
++)
212 f
= TYPE_FN_FIELDLIST1 (type
, i
);
213 n_overloads
= TYPE_FN_FIELDLIST_LENGTH (type
, i
);
214 method_name
= TYPE_FN_FIELDLIST_NAME (type
, i
);
215 name
= type_name_no_tag (type
);
216 is_constructor
= name
&& STREQ (method_name
, name
);
218 for (j
= 0; j
< n_overloads
; j
++)
221 int is_full_physname_constructor
;
223 physname
= TYPE_FN_FIELD_PHYSNAME (f
, j
);
225 is_full_physname_constructor
=
226 ((physname
[0] == '_' && physname
[1] == '_'
227 && strchr ("0123456789Qt", physname
[2]))
228 || STREQN (physname
, "__ct__", 6)
229 || DESTRUCTOR_PREFIX_P (physname
)
230 || STREQN (physname
, "__dt__", 6));
234 print_spaces_filtered (level
+ 4, stream
);
236 if (TYPE_FN_FIELD_PROTECTED (f
, j
))
237 fprintf_filtered (stream
, "protected ");
238 else if (TYPE_FN_FIELD_PRIVATE (f
, j
))
239 fprintf_filtered (stream
, "private ");
240 else if (TYPE_FN_FIELD_PUBLIC (f
, j
))
241 fprintf_filtered (stream
, "public ");
243 if (TYPE_FN_FIELD_ABSTRACT (f
, j
))
244 fprintf_filtered (stream
, "abstract ");
245 if (TYPE_FN_FIELD_STATIC (f
, j
))
246 fprintf_filtered (stream
, "static ");
247 if (TYPE_FN_FIELD_FINAL (f
, j
))
248 fprintf_filtered (stream
, "final ");
249 if (TYPE_FN_FIELD_SYNCHRONIZED (f
, j
))
250 fprintf_filtered (stream
, "synchronized ");
251 if (TYPE_FN_FIELD_NATIVE (f
, j
))
252 fprintf_filtered (stream
, "native ");
254 if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f
, j
)) == 0)
256 /* Keep GDB from crashing here. */
257 fprintf_filtered (stream
, "<undefined type> %s;\n",
258 TYPE_FN_FIELD_PHYSNAME (f
, j
));
261 else if (!is_constructor
&& !is_full_physname_constructor
)
263 type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f
, j
)),
265 fputs_filtered (" ", stream
);
268 if (TYPE_FN_FIELD_STUB (f
, j
))
269 /* Build something we can demangle. */
270 mangled_name
= gdb_mangle_name (type
, i
, j
);
272 mangled_name
= TYPE_FN_FIELD_PHYSNAME (f
, j
);
275 cplus_demangle (mangled_name
,
276 DMGL_ANSI
| DMGL_PARAMS
| DMGL_JAVA
);
278 if (demangled_name
== NULL
)
279 demangled_name
= strdup (mangled_name
);
282 char *demangled_no_class
;
285 ptr
= demangled_no_class
= demangled_name
;
293 if (c
== 0 || c
== '(')
296 demangled_no_class
= ptr
;
299 fputs_filtered (demangled_no_class
, stream
);
300 free (demangled_name
);
303 if (TYPE_FN_FIELD_STUB (f
, j
))
306 fprintf_filtered (stream
, ";\n");
310 fprintfi_filtered (level
, stream
, "}");
315 c_type_print_base (type
, stream
, show
, level
);
319 /* LEVEL is the depth to indent lines by. */
322 c_type_print_varspec_suffix
PARAMS ((struct type
*, GDB_FILE
*, int, int, int));
325 java_print_type (type
, varstring
, stream
, show
, level
)
334 java_type_print_base (type
, stream
, show
, level
);
336 if (varstring
!= NULL
&& *varstring
!= '\0')
338 fputs_filtered (" ", stream
);
339 fputs_filtered (varstring
, stream
);
342 /* For demangled function names, we have the arglist as part of the name,
343 so don't print an additional pair of ()'s */
345 demangled_args
= strchr(varstring
, '(') != NULL
;
346 c_type_print_varspec_suffix (type
, stream
, show
, 0, demangled_args
);