Fix a system performance issue created by ata_sort_queue(). This function
[dragonfly.git] / contrib / gdb-6 / gdb / jv-typeprint.c
blobcc0f2bb7ed428cbb31ad9b42a403fb06976ff833
1 /* Support for printing Java types for GDB, the GNU debugger.
2 Copyright (C) 1997, 1998, 1999, 2000, 2007 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 3 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, see <http://www.gnu.org/licenses/>. */
20 #include "defs.h"
21 #include "symtab.h"
22 #include "gdbtypes.h"
23 #include "value.h"
24 #include "demangle.h"
25 #include "jv-lang.h"
26 #include "gdb_string.h"
27 #include "typeprint.h"
28 #include "c-lang.h"
29 #include "cp-abi.h"
31 /* Local functions */
33 static void java_type_print_base (struct type * type,
34 struct ui_file *stream, int show,
35 int level);
37 static void
38 java_type_print_derivation_info (struct ui_file *stream, struct type *type)
40 char *name;
41 int i;
42 int n_bases;
43 int prev;
45 n_bases = TYPE_N_BASECLASSES (type);
47 for (i = 0, prev = 0; i < n_bases; i++)
49 int kind;
51 kind = BASETYPE_VIA_VIRTUAL (type, i) ? 'I' : 'E';
53 fputs_filtered (kind == prev ? ", "
54 : kind == 'I' ? " implements "
55 : " extends ",
56 stream);
57 prev = kind;
58 name = type_name_no_tag (TYPE_BASECLASS (type, i));
60 fprintf_filtered (stream, "%s", name ? name : "(null)");
63 if (i > 0)
64 fputs_filtered (" ", stream);
67 /* Print the name of the type (or the ultimate pointer target,
68 function value or array element), or the description of a
69 structure or union.
71 SHOW positive means print details about the type (e.g. enum values),
72 and print structure elements passing SHOW - 1 for show.
73 SHOW negative means just print the type name or struct tag if there is one.
74 If there is no name, print something sensible but concise like
75 "struct {...}".
76 SHOW zero means just print the type name or struct tag if there is one.
77 If there is no name, print something sensible but not as concise like
78 "struct {int x; int y;}".
80 LEVEL is the number of spaces to indent by.
81 We increase it for some recursive calls. */
83 static void
84 java_type_print_base (struct type *type, struct ui_file *stream, int show,
85 int level)
87 int i;
88 int len;
89 char *mangled_name;
90 char *demangled_name;
91 QUIT;
93 wrap_here (" ");
95 if (type == NULL)
97 fputs_filtered ("<type unknown>", stream);
98 return;
101 /* When SHOW is zero or less, and there is a valid type name, then always
102 just print the type name directly from the type. */
104 if (show <= 0
105 && TYPE_NAME (type) != NULL)
107 fputs_filtered (TYPE_NAME (type), stream);
108 return;
111 CHECK_TYPEDEF (type);
113 switch (TYPE_CODE (type))
115 case TYPE_CODE_PTR:
116 java_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
117 break;
119 case TYPE_CODE_STRUCT:
120 if (TYPE_TAG_NAME (type) != NULL && TYPE_TAG_NAME (type)[0] == '[')
121 { /* array type */
122 char *name = java_demangle_type_signature (TYPE_TAG_NAME (type));
123 fputs_filtered (name, stream);
124 xfree (name);
125 break;
128 if (show >= 0)
129 fprintf_filtered (stream, "class ");
131 if (TYPE_TAG_NAME (type) != NULL)
133 fputs_filtered (TYPE_TAG_NAME (type), stream);
134 if (show > 0)
135 fputs_filtered (" ", stream);
138 wrap_here (" ");
140 if (show < 0)
142 /* If we just printed a tag name, no need to print anything else. */
143 if (TYPE_TAG_NAME (type) == NULL)
144 fprintf_filtered (stream, "{...}");
146 else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
148 java_type_print_derivation_info (stream, type);
150 fprintf_filtered (stream, "{\n");
151 if ((TYPE_NFIELDS (type) == 0) && (TYPE_NFN_FIELDS (type) == 0))
153 if (TYPE_STUB (type))
154 fprintfi_filtered (level + 4, stream, "<incomplete type>\n");
155 else
156 fprintfi_filtered (level + 4, stream, "<no data fields>\n");
159 /* If there is a base class for this type,
160 do not print the field that it occupies. */
162 len = TYPE_NFIELDS (type);
163 for (i = TYPE_N_BASECLASSES (type); i < len; i++)
165 QUIT;
166 /* Don't print out virtual function table. */
167 if (strncmp (TYPE_FIELD_NAME (type, i), "_vptr", 5) == 0
168 && is_cplus_marker ((TYPE_FIELD_NAME (type, i))[5]))
169 continue;
171 /* Don't print the dummy field "class". */
172 if (strncmp (TYPE_FIELD_NAME (type, i), "class", 5) == 0)
173 continue;
175 print_spaces_filtered (level + 4, stream);
177 if (HAVE_CPLUS_STRUCT (type))
179 if (TYPE_FIELD_PROTECTED (type, i))
180 fprintf_filtered (stream, "protected ");
181 else if (TYPE_FIELD_PRIVATE (type, i))
182 fprintf_filtered (stream, "private ");
183 else
184 fprintf_filtered (stream, "public ");
187 if (TYPE_FIELD_STATIC (type, i))
188 fprintf_filtered (stream, "static ");
190 java_print_type (TYPE_FIELD_TYPE (type, i),
191 TYPE_FIELD_NAME (type, i),
192 stream, show - 1, level + 4);
194 fprintf_filtered (stream, ";\n");
197 /* If there are both fields and methods, put a space between. */
198 len = TYPE_NFN_FIELDS (type);
199 if (len)
200 fprintf_filtered (stream, "\n");
202 /* Print out the methods */
204 for (i = 0; i < len; i++)
206 struct fn_field *f;
207 int j;
208 char *method_name;
209 char *name;
210 int is_constructor;
211 int n_overloads;
213 f = TYPE_FN_FIELDLIST1 (type, i);
214 n_overloads = TYPE_FN_FIELDLIST_LENGTH (type, i);
215 method_name = TYPE_FN_FIELDLIST_NAME (type, i);
216 name = type_name_no_tag (type);
217 is_constructor = name && strcmp (method_name, name) == 0;
219 for (j = 0; j < n_overloads; j++)
221 char *physname;
222 int is_full_physname_constructor;
224 physname = TYPE_FN_FIELD_PHYSNAME (f, j);
226 is_full_physname_constructor
227 = (is_constructor_name (physname)
228 || is_destructor_name (physname));
230 QUIT;
232 print_spaces_filtered (level + 4, stream);
234 if (TYPE_FN_FIELD_PROTECTED (f, j))
235 fprintf_filtered (stream, "protected ");
236 else if (TYPE_FN_FIELD_PRIVATE (f, j))
237 fprintf_filtered (stream, "private ");
238 else if (TYPE_FN_FIELD_PUBLIC (f, j))
239 fprintf_filtered (stream, "public ");
241 if (TYPE_FN_FIELD_ABSTRACT (f, j))
242 fprintf_filtered (stream, "abstract ");
243 if (TYPE_FN_FIELD_STATIC (f, j))
244 fprintf_filtered (stream, "static ");
245 if (TYPE_FN_FIELD_FINAL (f, j))
246 fprintf_filtered (stream, "final ");
247 if (TYPE_FN_FIELD_SYNCHRONIZED (f, j))
248 fprintf_filtered (stream, "synchronized ");
249 if (TYPE_FN_FIELD_NATIVE (f, j))
250 fprintf_filtered (stream, "native ");
252 if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) == 0)
254 /* Keep GDB from crashing here. */
255 fprintf_filtered (stream, "<undefined type> %s;\n",
256 TYPE_FN_FIELD_PHYSNAME (f, j));
257 break;
259 else if (!is_constructor && !is_full_physname_constructor)
261 type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)),
262 "", stream, -1);
263 fputs_filtered (" ", stream);
266 if (TYPE_FN_FIELD_STUB (f, j))
267 /* Build something we can demangle. */
268 mangled_name = gdb_mangle_name (type, i, j);
269 else
270 mangled_name = TYPE_FN_FIELD_PHYSNAME (f, j);
272 demangled_name =
273 cplus_demangle (mangled_name,
274 DMGL_ANSI | DMGL_PARAMS | DMGL_JAVA);
276 if (demangled_name == NULL)
277 demangled_name = xstrdup (mangled_name);
280 char *demangled_no_class;
281 char *ptr;
283 ptr = demangled_no_class = demangled_name;
285 while (1)
287 char c;
289 c = *ptr++;
291 if (c == 0 || c == '(')
292 break;
293 if (c == '.')
294 demangled_no_class = ptr;
297 fputs_filtered (demangled_no_class, stream);
298 xfree (demangled_name);
301 if (TYPE_FN_FIELD_STUB (f, j))
302 xfree (mangled_name);
304 fprintf_filtered (stream, ";\n");
308 fprintfi_filtered (level, stream, "}");
310 break;
312 default:
313 c_type_print_base (type, stream, show, level);
317 /* LEVEL is the depth to indent lines by. */
319 extern void c_type_print_varspec_suffix (struct type *, struct ui_file *,
320 int, int, int);
322 void
323 java_print_type (struct type *type, char *varstring, struct ui_file *stream,
324 int show, int level)
326 int demangled_args;
328 java_type_print_base (type, stream, show, level);
330 if (varstring != NULL && *varstring != '\0')
332 fputs_filtered (" ", stream);
333 fputs_filtered (varstring, stream);
336 /* For demangled function names, we have the arglist as part of the name,
337 so don't print an additional pair of ()'s */
339 demangled_args = varstring != NULL && strchr (varstring, '(') != NULL;
340 c_type_print_varspec_suffix (type, stream, show, 0, demangled_args);