1 /* Support for printing Java types for GDB, the GNU debugger.
2 Copyright 1997-2000 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,
19 Boston, MA 02111-1307, USA. */
28 #include "gdb_string.h"
29 #include "typeprint.h"
34 static void java_type_print_base (struct type
* type
,
35 struct ui_file
*stream
, int show
,
39 java_type_print_derivation_info (stream
, type
)
40 struct ui_file
*stream
;
48 n_bases
= TYPE_N_BASECLASSES (type
);
50 for (i
= 0, prev
= 0; i
< n_bases
; i
++)
54 kind
= BASETYPE_VIA_VIRTUAL (type
, i
) ? 'I' : 'E';
56 fputs_filtered (kind
== prev
? ", "
57 : kind
== 'I' ? " implements "
61 name
= type_name_no_tag (TYPE_BASECLASS (type
, i
));
63 fprintf_filtered (stream
, "%s", name
? name
: "(null)");
67 fputs_filtered (" ", stream
);
70 /* Print the name of the type (or the ultimate pointer target,
71 function value or array element), or the description of a
74 SHOW positive means print details about the type (e.g. enum values),
75 and print structure elements passing SHOW - 1 for show.
76 SHOW negative means just print the type name or struct tag if there is one.
77 If there is no name, print something sensible but concise like
79 SHOW zero means just print the type name or struct tag if there is one.
80 If there is no name, print something sensible but not as concise like
81 "struct {int x; int y;}".
83 LEVEL is the number of spaces to indent by.
84 We increase it for some recursive calls. */
87 java_type_print_base (type
, stream
, show
, level
)
89 struct ui_file
*stream
;
103 fputs_filtered ("<type unknown>", stream
);
107 /* When SHOW is zero or less, and there is a valid type name, then always
108 just print the type name directly from the type. */
111 && TYPE_NAME (type
) != NULL
)
113 fputs_filtered (TYPE_NAME (type
), stream
);
117 CHECK_TYPEDEF (type
);
119 switch (TYPE_CODE (type
))
122 java_type_print_base (TYPE_TARGET_TYPE (type
), stream
, show
, level
);
125 case TYPE_CODE_STRUCT
:
126 if (TYPE_TAG_NAME (type
) != NULL
&& TYPE_TAG_NAME (type
)[0] == '[')
128 char *name
= java_demangle_type_signature (TYPE_TAG_NAME (type
));
129 fputs_filtered (name
, stream
);
135 fprintf_filtered (stream
, "class ");
137 if (TYPE_TAG_NAME (type
) != NULL
)
139 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
141 fputs_filtered (" ", stream
);
148 /* If we just printed a tag name, no need to print anything else. */
149 if (TYPE_TAG_NAME (type
) == NULL
)
150 fprintf_filtered (stream
, "{...}");
152 else if (show
> 0 || TYPE_TAG_NAME (type
) == NULL
)
154 java_type_print_derivation_info (stream
, type
);
156 fprintf_filtered (stream
, "{\n");
157 if ((TYPE_NFIELDS (type
) == 0) && (TYPE_NFN_FIELDS (type
) == 0))
159 if (TYPE_FLAGS (type
) & TYPE_FLAG_STUB
)
160 fprintfi_filtered (level
+ 4, stream
, "<incomplete type>\n");
162 fprintfi_filtered (level
+ 4, stream
, "<no data fields>\n");
165 /* If there is a base class for this type,
166 do not print the field that it occupies. */
168 len
= TYPE_NFIELDS (type
);
169 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
172 /* Don't print out virtual function table. */
173 if (STREQN (TYPE_FIELD_NAME (type
, i
), "_vptr", 5)
174 && is_cplus_marker ((TYPE_FIELD_NAME (type
, i
))[5]))
177 /* Don't print the dummy field "class". */
178 if (STREQN (TYPE_FIELD_NAME (type
, i
), "class", 5))
181 print_spaces_filtered (level
+ 4, stream
);
183 if (HAVE_CPLUS_STRUCT (type
))
185 if (TYPE_FIELD_PROTECTED (type
, i
))
186 fprintf_filtered (stream
, "protected ");
187 else if (TYPE_FIELD_PRIVATE (type
, i
))
188 fprintf_filtered (stream
, "private ");
190 fprintf_filtered (stream
, "public ");
193 if (TYPE_FIELD_STATIC (type
, i
))
194 fprintf_filtered (stream
, "static ");
196 java_print_type (TYPE_FIELD_TYPE (type
, i
),
197 TYPE_FIELD_NAME (type
, i
),
198 stream
, show
- 1, level
+ 4);
200 fprintf_filtered (stream
, ";\n");
203 /* If there are both fields and methods, put a space between. */
204 len
= TYPE_NFN_FIELDS (type
);
206 fprintf_filtered (stream
, "\n");
208 /* Print out the methods */
210 for (i
= 0; i
< len
; i
++)
219 f
= TYPE_FN_FIELDLIST1 (type
, i
);
220 n_overloads
= TYPE_FN_FIELDLIST_LENGTH (type
, i
);
221 method_name
= TYPE_FN_FIELDLIST_NAME (type
, i
);
222 name
= type_name_no_tag (type
);
223 is_constructor
= name
&& STREQ (method_name
, name
);
225 for (j
= 0; j
< n_overloads
; j
++)
228 int is_full_physname_constructor
;
230 physname
= TYPE_FN_FIELD_PHYSNAME (f
, j
);
232 is_full_physname_constructor
=
233 ((physname
[0] == '_' && physname
[1] == '_'
234 && strchr ("0123456789Qt", physname
[2]))
235 || STREQN (physname
, "__ct__", 6)
236 || DESTRUCTOR_PREFIX_P (physname
)
237 || STREQN (physname
, "__dt__", 6));
241 print_spaces_filtered (level
+ 4, stream
);
243 if (TYPE_FN_FIELD_PROTECTED (f
, j
))
244 fprintf_filtered (stream
, "protected ");
245 else if (TYPE_FN_FIELD_PRIVATE (f
, j
))
246 fprintf_filtered (stream
, "private ");
247 else if (TYPE_FN_FIELD_PUBLIC (f
, j
))
248 fprintf_filtered (stream
, "public ");
250 if (TYPE_FN_FIELD_ABSTRACT (f
, j
))
251 fprintf_filtered (stream
, "abstract ");
252 if (TYPE_FN_FIELD_STATIC (f
, j
))
253 fprintf_filtered (stream
, "static ");
254 if (TYPE_FN_FIELD_FINAL (f
, j
))
255 fprintf_filtered (stream
, "final ");
256 if (TYPE_FN_FIELD_SYNCHRONIZED (f
, j
))
257 fprintf_filtered (stream
, "synchronized ");
258 if (TYPE_FN_FIELD_NATIVE (f
, j
))
259 fprintf_filtered (stream
, "native ");
261 if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f
, j
)) == 0)
263 /* Keep GDB from crashing here. */
264 fprintf_filtered (stream
, "<undefined type> %s;\n",
265 TYPE_FN_FIELD_PHYSNAME (f
, j
));
268 else if (!is_constructor
&& !is_full_physname_constructor
)
270 type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f
, j
)),
272 fputs_filtered (" ", stream
);
275 if (TYPE_FN_FIELD_STUB (f
, j
))
276 /* Build something we can demangle. */
277 mangled_name
= gdb_mangle_name (type
, i
, j
);
279 mangled_name
= TYPE_FN_FIELD_PHYSNAME (f
, j
);
282 cplus_demangle (mangled_name
,
283 DMGL_ANSI
| DMGL_PARAMS
| DMGL_JAVA
);
285 if (demangled_name
== NULL
)
286 demangled_name
= xstrdup (mangled_name
);
289 char *demangled_no_class
;
292 ptr
= demangled_no_class
= demangled_name
;
300 if (c
== 0 || c
== '(')
303 demangled_no_class
= ptr
;
306 fputs_filtered (demangled_no_class
, stream
);
307 free (demangled_name
);
310 if (TYPE_FN_FIELD_STUB (f
, j
))
313 fprintf_filtered (stream
, ";\n");
317 fprintfi_filtered (level
, stream
, "}");
322 c_type_print_base (type
, stream
, show
, level
);
326 /* LEVEL is the depth to indent lines by. */
328 extern void c_type_print_varspec_suffix (struct type
*, struct ui_file
*,
332 java_print_type (type
, varstring
, stream
, show
, level
)
335 struct ui_file
*stream
;
341 java_type_print_base (type
, stream
, show
, level
);
343 if (varstring
!= NULL
&& *varstring
!= '\0')
345 fputs_filtered (" ", stream
);
346 fputs_filtered (varstring
, stream
);
349 /* For demangled function names, we have the arglist as part of the name,
350 so don't print an additional pair of ()'s */
352 demangled_args
= strchr (varstring
, '(') != NULL
;
353 c_type_print_varspec_suffix (type
, stream
, show
, 0, demangled_args
);