1 /* Support for printing Java types for GDB, the GNU debugger.
2 Copyright (C) 1997, 1998, 1999, 2000, 2007, 2008, 2009, 2010
3 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
27 #include "gdb_string.h"
28 #include "typeprint.h"
31 #include "gdb_assert.h"
35 static void java_type_print_base (struct type * type,
36 struct ui_file *stream, int show,
40 java_type_print_derivation_info (struct ui_file *stream, struct type *type)
47 n_bases = TYPE_N_BASECLASSES (type);
49 for (i = 0, prev = 0; i < n_bases; i++)
53 kind = BASETYPE_VIA_VIRTUAL (type, i) ? 'I' : 'E';
55 fputs_filtered (kind == prev ? ", "
56 : kind == 'I' ? " implements "
60 name = type_name_no_tag (TYPE_BASECLASS (type, i));
62 fprintf_filtered (stream, "%s", name ? name : "(null)");
66 fputs_filtered (" ", stream);
69 /* Print the name of the type (or the ultimate pointer target,
70 function value or array element), or the description of a
73 SHOW positive means print details about the type (e.g. enum values),
74 and print structure elements passing SHOW - 1 for show.
75 SHOW negative means just print the type name or struct tag if there is one.
76 If there is no name, print something sensible but concise like
78 SHOW zero means just print the type name or struct tag if there is one.
79 If there is no name, print something sensible but not as concise like
80 "struct {int x; int y;}".
82 LEVEL is the number of spaces to indent by.
83 We increase it for some recursive calls. */
86 java_type_print_base (struct type *type, struct ui_file *stream, int show,
99 fputs_filtered ("<type unknown>", stream);
103 /* When SHOW is zero or less, and there is a valid type name, then always
104 just print the type name directly from the type. */
107 && TYPE_NAME (type) != NULL)
109 fputs_filtered (TYPE_NAME (type), stream);
113 CHECK_TYPEDEF (type);
115 switch (TYPE_CODE (type))
118 java_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
121 case TYPE_CODE_STRUCT:
122 if (TYPE_TAG_NAME (type) != NULL && TYPE_TAG_NAME (type)[0] == '[')
124 char *name = java_demangle_type_signature (TYPE_TAG_NAME (type));
125 fputs_filtered (name, stream);
131 fprintf_filtered (stream, "class ");
133 if (TYPE_TAG_NAME (type) != NULL)
135 fputs_filtered (TYPE_TAG_NAME (type), stream);
137 fputs_filtered (" ", stream);
144 /* If we just printed a tag name, no need to print anything else. */
145 if (TYPE_TAG_NAME (type) == NULL)
146 fprintf_filtered (stream, "{...}");
148 else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
150 java_type_print_derivation_info (stream, type);
152 fprintf_filtered (stream, "{\n");
153 if ((TYPE_NFIELDS (type) == 0) && (TYPE_NFN_FIELDS (type) == 0))
155 if (TYPE_STUB (type))
156 fprintfi_filtered (level + 4, stream, "<incomplete type>\n");
158 fprintfi_filtered (level + 4, stream, "<no data fields>\n");
161 /* If there is a base class for this type,
162 do not print the field that it occupies. */
164 len = TYPE_NFIELDS (type);
165 for (i = TYPE_N_BASECLASSES (type); i < len; i++)
168 /* Don't print out virtual function table. */
169 if (strncmp (TYPE_FIELD_NAME (type, i), "_vptr", 5) == 0
170 && is_cplus_marker ((TYPE_FIELD_NAME (type, i))[5]))
173 /* Don't print the dummy field "class". */
174 if (strncmp (TYPE_FIELD_NAME (type, i), "class", 5) == 0)
177 print_spaces_filtered (level + 4, stream);
179 if (HAVE_CPLUS_STRUCT (type))
181 if (TYPE_FIELD_PROTECTED (type, i))
182 fprintf_filtered (stream, "protected ");
183 else if (TYPE_FIELD_PRIVATE (type, i))
184 fprintf_filtered (stream, "private ");
186 fprintf_filtered (stream, "public ");
189 if (field_is_static (&TYPE_FIELD (type, i)))
190 fprintf_filtered (stream, "static ");
192 java_print_type (TYPE_FIELD_TYPE (type, i),
193 TYPE_FIELD_NAME (type, i),
194 stream, show - 1, level + 4);
196 fprintf_filtered (stream, ";\n");
199 /* If there are both fields and methods, put a space between. */
200 len = TYPE_NFN_FIELDS (type);
202 fprintf_filtered (stream, "\n");
204 /* Print out the methods */
206 for (i = 0; i < len; i++)
215 f = TYPE_FN_FIELDLIST1 (type, i);
216 n_overloads = TYPE_FN_FIELDLIST_LENGTH (type, i);
217 method_name = TYPE_FN_FIELDLIST_NAME (type, i);
218 name = type_name_no_tag (type);
219 is_constructor = name && strcmp (method_name, name) == 0;
221 for (j = 0; j < n_overloads; j++)
223 char *real_physname, *physname, *p;
224 int is_full_physname_constructor;
226 real_physname = TYPE_FN_FIELD_PHYSNAME (f, j);
228 /* The physname will contain the return type
229 after the final closing parenthesis. Strip it off. */
230 p = strrchr (real_physname, ')');
231 gdb_assert (p != NULL);
232 ++p; /* Keep the trailing ')'. */
233 physname = alloca (p - real_physname + 1);
234 memcpy (physname, real_physname, p - real_physname);
235 physname[p - real_physname] = '\0';
237 is_full_physname_constructor
238 = (is_constructor_name (physname)
239 || is_destructor_name (physname));
243 print_spaces_filtered (level + 4, stream);
245 if (TYPE_FN_FIELD_PROTECTED (f, j))
246 fprintf_filtered (stream, "protected ");
247 else if (TYPE_FN_FIELD_PRIVATE (f, j))
248 fprintf_filtered (stream, "private ");
249 else if (TYPE_FN_FIELD_PUBLIC (f, j))
250 fprintf_filtered (stream, "public ");
252 if (TYPE_FN_FIELD_ABSTRACT (f, j))
253 fprintf_filtered (stream, "abstract ");
254 if (TYPE_FN_FIELD_STATIC (f, j))
255 fprintf_filtered (stream, "static ");
256 if (TYPE_FN_FIELD_FINAL (f, j))
257 fprintf_filtered (stream, "final ");
258 if (TYPE_FN_FIELD_SYNCHRONIZED (f, j))
259 fprintf_filtered (stream, "synchronized ");
260 if (TYPE_FN_FIELD_NATIVE (f, j))
261 fprintf_filtered (stream, "native ");
263 if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) == 0)
265 /* Keep GDB from crashing here. */
266 fprintf_filtered (stream, "<undefined type> %s;\n",
267 TYPE_FN_FIELD_PHYSNAME (f, j));
270 else if (!is_constructor && !is_full_physname_constructor)
272 type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)),
274 fputs_filtered (" ", stream);
277 if (TYPE_FN_FIELD_STUB (f, j))
278 /* Build something we can demangle. */
279 mangled_name = gdb_mangle_name (type, i, j);
281 mangled_name = physname;
284 cplus_demangle (mangled_name,
285 DMGL_ANSI | DMGL_PARAMS | DMGL_JAVA);
287 if (demangled_name == NULL)
288 demangled_name = xstrdup (mangled_name);
291 char *demangled_no_class;
294 ptr = demangled_no_class = demangled_name;
302 if (c == 0 || c == '(')
305 demangled_no_class = ptr;
308 fputs_filtered (demangled_no_class, stream);
309 xfree (demangled_name);
312 if (TYPE_FN_FIELD_STUB (f, j))
313 xfree (mangled_name);
315 fprintf_filtered (stream, ";\n");
319 fprintfi_filtered (level, stream, "}");
324 c_type_print_base (type, stream, show, level);
328 /* LEVEL is the depth to indent lines by. */
330 extern void c_type_print_varspec_suffix (struct type *, struct ui_file *,
334 java_print_type (struct type *type, char *varstring, struct ui_file *stream,
339 java_type_print_base (type, stream, show, level);
341 if (varstring != NULL && *varstring != '\0')
343 fputs_filtered (" ", stream);
344 fputs_filtered (varstring, stream);
347 /* For demangled function names, we have the arglist as part of the name,
348 so don't print an additional pair of ()'s */
350 demangled_args = varstring != NULL && strchr (varstring, '(') != NULL;
351 c_type_print_varspec_suffix (type, stream, show, 0, demangled_args);