fix typo in previous entry
[deliverable/binutils-gdb.git] / gdb / jv-typeprint.c
CommitLineData
c906108c 1/* Support for printing Java types for GDB, the GNU debugger.
4c38e0a4 2 Copyright (C) 1997, 1998, 1999, 2000, 2007, 2008, 2009, 2010
9b254dd1 3 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
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
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
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.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
19
20
21#include "defs.h"
22#include "symtab.h"
23#include "gdbtypes.h"
24#include "value.h"
25#include "demangle.h"
26#include "jv-lang.h"
27#include "gdb_string.h"
28#include "typeprint.h"
7a292a7a 29#include "c-lang.h"
015a42b4 30#include "cp-abi.h"
86ffb506 31#include "gdb_assert.h"
c906108c 32
392a587b
JM
33/* Local functions */
34
d9fcf2fb
JM
35static void java_type_print_base (struct type * type,
36 struct ui_file *stream, int show,
37 int level);
392a587b 38
c906108c 39static void
fba45db2 40java_type_print_derivation_info (struct ui_file *stream, struct type *type)
c906108c
SS
41{
42 char *name;
43 int i;
44 int n_bases;
45 int prev;
46
47 n_bases = TYPE_N_BASECLASSES (type);
48
49 for (i = 0, prev = 0; i < n_bases; i++)
50 {
51 int kind;
52
c5aa993b 53 kind = BASETYPE_VIA_VIRTUAL (type, i) ? 'I' : 'E';
c906108c
SS
54
55 fputs_filtered (kind == prev ? ", "
56 : kind == 'I' ? " implements "
57 : " extends ",
58 stream);
59 prev = kind;
60 name = type_name_no_tag (TYPE_BASECLASS (type, i));
61
62 fprintf_filtered (stream, "%s", name ? name : "(null)");
63 }
64
65 if (i > 0)
66 fputs_filtered (" ", stream);
67}
68
69/* Print the name of the type (or the ultimate pointer target,
70 function value or array element), or the description of a
71 structure or union.
72
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
77 "struct {...}".
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;}".
81
82 LEVEL is the number of spaces to indent by.
83 We increase it for some recursive calls. */
84
392a587b 85static void
fba45db2
KB
86java_type_print_base (struct type *type, struct ui_file *stream, int show,
87 int level)
c906108c 88{
52f0bd74
AC
89 int i;
90 int len;
c906108c
SS
91 char *mangled_name;
92 char *demangled_name;
93 QUIT;
94
95 wrap_here (" ");
96
97 if (type == NULL)
98 {
99 fputs_filtered ("<type unknown>", stream);
100 return;
101 }
102
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. */
105
106 if (show <= 0
107 && TYPE_NAME (type) != NULL)
108 {
109 fputs_filtered (TYPE_NAME (type), stream);
110 return;
111 }
112
113 CHECK_TYPEDEF (type);
114
115 switch (TYPE_CODE (type))
116 {
117 case TYPE_CODE_PTR:
118 java_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
119 break;
120
121 case TYPE_CODE_STRUCT:
122 if (TYPE_TAG_NAME (type) != NULL && TYPE_TAG_NAME (type)[0] == '[')
123 { /* array type */
124 char *name = java_demangle_type_signature (TYPE_TAG_NAME (type));
125 fputs_filtered (name, stream);
b8c9b27d 126 xfree (name);
c906108c
SS
127 break;
128 }
129
130 if (show >= 0)
131 fprintf_filtered (stream, "class ");
132
133 if (TYPE_TAG_NAME (type) != NULL)
134 {
135 fputs_filtered (TYPE_TAG_NAME (type), stream);
136 if (show > 0)
137 fputs_filtered (" ", stream);
138 }
139
140 wrap_here (" ");
141
142 if (show < 0)
143 {
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, "{...}");
147 }
148 else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
149 {
150 java_type_print_derivation_info (stream, type);
c5aa993b 151
c906108c
SS
152 fprintf_filtered (stream, "{\n");
153 if ((TYPE_NFIELDS (type) == 0) && (TYPE_NFN_FIELDS (type) == 0))
7a292a7a 154 {
74a9bb82 155 if (TYPE_STUB (type))
7a292a7a
SS
156 fprintfi_filtered (level + 4, stream, "<incomplete type>\n");
157 else
158 fprintfi_filtered (level + 4, stream, "<no data fields>\n");
159 }
c906108c
SS
160
161 /* If there is a base class for this type,
162 do not print the field that it occupies. */
163
164 len = TYPE_NFIELDS (type);
165 for (i = TYPE_N_BASECLASSES (type); i < len; i++)
166 {
167 QUIT;
168 /* Don't print out virtual function table. */
5cb316ef 169 if (strncmp (TYPE_FIELD_NAME (type, i), "_vptr", 5) == 0
c906108c
SS
170 && is_cplus_marker ((TYPE_FIELD_NAME (type, i))[5]))
171 continue;
172
173 /* Don't print the dummy field "class". */
5cb316ef 174 if (strncmp (TYPE_FIELD_NAME (type, i), "class", 5) == 0)
c906108c
SS
175 continue;
176
177 print_spaces_filtered (level + 4, stream);
178
179 if (HAVE_CPLUS_STRUCT (type))
7a292a7a
SS
180 {
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 ");
185 else
186 fprintf_filtered (stream, "public ");
187 }
c906108c 188
d6a843b5 189 if (field_is_static (&TYPE_FIELD (type, i)))
c906108c
SS
190 fprintf_filtered (stream, "static ");
191
192 java_print_type (TYPE_FIELD_TYPE (type, i),
193 TYPE_FIELD_NAME (type, i),
194 stream, show - 1, level + 4);
195
196 fprintf_filtered (stream, ";\n");
197 }
198
199 /* If there are both fields and methods, put a space between. */
200 len = TYPE_NFN_FIELDS (type);
201 if (len)
c5aa993b 202 fprintf_filtered (stream, "\n");
c906108c
SS
203
204 /* Print out the methods */
205
206 for (i = 0; i < len; i++)
207 {
208 struct fn_field *f;
209 int j;
210 char *method_name;
211 char *name;
212 int is_constructor;
213 int n_overloads;
214
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);
762f08a3 219 is_constructor = name && strcmp (method_name, name) == 0;
c906108c
SS
220
221 for (j = 0; j < n_overloads; j++)
222 {
86ffb506 223 char *real_physname, *physname, *p;
c906108c
SS
224 int is_full_physname_constructor;
225
86ffb506
KS
226 real_physname = TYPE_FN_FIELD_PHYSNAME (f, j);
227
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';
c906108c 236
015a42b4
JB
237 is_full_physname_constructor
238 = (is_constructor_name (physname)
239 || is_destructor_name (physname));
c906108c
SS
240
241 QUIT;
242
243 print_spaces_filtered (level + 4, stream);
244
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 ");
251
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 ");
262
263 if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) == 0)
264 {
265 /* Keep GDB from crashing here. */
266 fprintf_filtered (stream, "<undefined type> %s;\n",
c5aa993b 267 TYPE_FN_FIELD_PHYSNAME (f, j));
c906108c
SS
268 break;
269 }
270 else if (!is_constructor && !is_full_physname_constructor)
271 {
272 type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)),
273 "", stream, -1);
274 fputs_filtered (" ", stream);
275 }
276
277 if (TYPE_FN_FIELD_STUB (f, j))
278 /* Build something we can demangle. */
279 mangled_name = gdb_mangle_name (type, i, j);
280 else
86ffb506 281 mangled_name = physname;
c906108c
SS
282
283 demangled_name =
284 cplus_demangle (mangled_name,
285 DMGL_ANSI | DMGL_PARAMS | DMGL_JAVA);
286
287 if (demangled_name == NULL)
c2d11a7d 288 demangled_name = xstrdup (mangled_name);
c906108c
SS
289
290 {
291 char *demangled_no_class;
292 char *ptr;
293
294 ptr = demangled_no_class = demangled_name;
295
296 while (1)
297 {
298 char c;
299
300 c = *ptr++;
301
302 if (c == 0 || c == '(')
303 break;
304 if (c == '.')
305 demangled_no_class = ptr;
306 }
307
308 fputs_filtered (demangled_no_class, stream);
b8c9b27d 309 xfree (demangled_name);
c906108c
SS
310 }
311
312 if (TYPE_FN_FIELD_STUB (f, j))
b8c9b27d 313 xfree (mangled_name);
c906108c
SS
314
315 fprintf_filtered (stream, ";\n");
316 }
317 }
318
319 fprintfi_filtered (level, stream, "}");
320 }
321 break;
322
c5aa993b
JM
323 default:
324 c_type_print_base (type, stream, show, level);
c906108c
SS
325 }
326}
327
328/* LEVEL is the depth to indent lines by. */
329
d9fcf2fb
JM
330extern void c_type_print_varspec_suffix (struct type *, struct ui_file *,
331 int, int, int);
7a292a7a 332
c906108c 333void
fba45db2
KB
334java_print_type (struct type *type, char *varstring, struct ui_file *stream,
335 int show, int level)
c906108c
SS
336{
337 int demangled_args;
338
339 java_type_print_base (type, stream, show, level);
340
341 if (varstring != NULL && *varstring != '\0')
342 {
343 fputs_filtered (" ", stream);
344 fputs_filtered (varstring, stream);
345 }
346
347 /* For demangled function names, we have the arglist as part of the name,
348 so don't print an additional pair of ()'s */
349
dc5000e7 350 demangled_args = varstring != NULL && strchr (varstring, '(') != NULL;
c906108c
SS
351 c_type_print_varspec_suffix (type, stream, show, 0, demangled_args);
352}
This page took 0.788244 seconds and 4 git commands to generate.