1 /* Support for printing Java types for GDB, the GNU debugger.
2 Copyright (C) 1997-2000, 2007-2012 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/>. */
25 #include "gdb-demangle.h"
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
,
38 const struct type_print_options
*flags
);
41 java_type_print_derivation_info (struct ui_file
*stream
, struct type
*type
)
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 (struct type
*type
, struct ui_file
*stream
, int show
,
88 int level
, const struct type_print_options
*flags
)
100 fputs_filtered ("<type unknown>", stream
);
104 /* When SHOW is zero or less, and there is a valid type name, then always
105 just print the type name directly from the type. */
108 && TYPE_NAME (type
) != NULL
)
110 fputs_filtered (TYPE_NAME (type
), stream
);
114 CHECK_TYPEDEF (type
);
116 switch (TYPE_CODE (type
))
119 java_type_print_base (TYPE_TARGET_TYPE (type
), stream
, show
, level
,
123 case TYPE_CODE_STRUCT
:
124 if (TYPE_TAG_NAME (type
) != NULL
&& TYPE_TAG_NAME (type
)[0] == '[')
126 char *name
= java_demangle_type_signature (TYPE_TAG_NAME (type
));
128 fputs_filtered (name
, stream
);
134 fprintf_filtered (stream
, "class ");
136 if (TYPE_TAG_NAME (type
) != NULL
)
138 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
140 fputs_filtered (" ", stream
);
147 /* If we just printed a tag name, no need to print anything else. */
148 if (TYPE_TAG_NAME (type
) == NULL
)
149 fprintf_filtered (stream
, "{...}");
151 else if (show
> 0 || TYPE_TAG_NAME (type
) == NULL
)
153 java_type_print_derivation_info (stream
, type
);
155 fprintf_filtered (stream
, "{\n");
156 if ((TYPE_NFIELDS (type
) == 0) && (TYPE_NFN_FIELDS (type
) == 0))
158 if (TYPE_STUB (type
))
159 fprintfi_filtered (level
+ 4, stream
, "<incomplete type>\n");
161 fprintfi_filtered (level
+ 4, stream
, "<no data fields>\n");
164 /* If there is a base class for this type,
165 do not print the field that it occupies. */
167 len
= TYPE_NFIELDS (type
);
168 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
171 /* Don't print out virtual function table. */
172 if (strncmp (TYPE_FIELD_NAME (type
, i
), "_vptr", 5) == 0
173 && is_cplus_marker ((TYPE_FIELD_NAME (type
, i
))[5]))
176 /* Don't print the dummy field "class". */
177 if (strncmp (TYPE_FIELD_NAME (type
, i
), "class", 5) == 0)
180 print_spaces_filtered (level
+ 4, stream
);
182 if (HAVE_CPLUS_STRUCT (type
))
184 if (TYPE_FIELD_PROTECTED (type
, i
))
185 fprintf_filtered (stream
, "protected ");
186 else if (TYPE_FIELD_PRIVATE (type
, i
))
187 fprintf_filtered (stream
, "private ");
189 fprintf_filtered (stream
, "public ");
192 if (field_is_static (&TYPE_FIELD (type
, i
)))
193 fprintf_filtered (stream
, "static ");
195 java_print_type (TYPE_FIELD_TYPE (type
, i
),
196 TYPE_FIELD_NAME (type
, i
),
197 stream
, show
- 1, level
+ 4, flags
);
199 fprintf_filtered (stream
, ";\n");
202 /* If there are both fields and methods, put a space between. */
203 len
= TYPE_NFN_FIELDS (type
);
205 fprintf_filtered (stream
, "\n");
207 /* Print out the methods. */
209 for (i
= 0; i
< len
; i
++)
213 const char *method_name
;
218 f
= TYPE_FN_FIELDLIST1 (type
, i
);
219 n_overloads
= TYPE_FN_FIELDLIST_LENGTH (type
, i
);
220 method_name
= TYPE_FN_FIELDLIST_NAME (type
, i
);
221 name
= type_name_no_tag (type
);
222 is_constructor
= name
&& strcmp (method_name
, name
) == 0;
224 for (j
= 0; j
< n_overloads
; j
++)
226 const char *real_physname
;
228 int is_full_physname_constructor
;
230 real_physname
= TYPE_FN_FIELD_PHYSNAME (f
, j
);
232 /* The physname will contain the return type
233 after the final closing parenthesis. Strip it off. */
234 p
= strrchr (real_physname
, ')');
235 gdb_assert (p
!= NULL
);
236 ++p
; /* Keep the trailing ')'. */
237 physname
= alloca (p
- real_physname
+ 1);
238 memcpy (physname
, real_physname
, p
- real_physname
);
239 physname
[p
- real_physname
] = '\0';
241 is_full_physname_constructor
242 = (is_constructor_name (physname
)
243 || is_destructor_name (physname
));
247 print_spaces_filtered (level
+ 4, stream
);
249 if (TYPE_FN_FIELD_PROTECTED (f
, j
))
250 fprintf_filtered (stream
, "protected ");
251 else if (TYPE_FN_FIELD_PRIVATE (f
, j
))
252 fprintf_filtered (stream
, "private ");
253 else if (TYPE_FN_FIELD_PUBLIC (f
, j
))
254 fprintf_filtered (stream
, "public ");
256 if (TYPE_FN_FIELD_ABSTRACT (f
, j
))
257 fprintf_filtered (stream
, "abstract ");
258 if (TYPE_FN_FIELD_STATIC (f
, j
))
259 fprintf_filtered (stream
, "static ");
260 if (TYPE_FN_FIELD_FINAL (f
, j
))
261 fprintf_filtered (stream
, "final ");
262 if (TYPE_FN_FIELD_SYNCHRONIZED (f
, j
))
263 fprintf_filtered (stream
, "synchronized ");
264 if (TYPE_FN_FIELD_NATIVE (f
, j
))
265 fprintf_filtered (stream
, "native ");
267 if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f
, j
)) == 0)
269 /* Keep GDB from crashing here. */
270 fprintf_filtered (stream
, "<undefined type> %s;\n",
271 TYPE_FN_FIELD_PHYSNAME (f
, j
));
274 else if (!is_constructor
&& !is_full_physname_constructor
)
276 type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f
, j
)),
278 fputs_filtered (" ", stream
);
281 if (TYPE_FN_FIELD_STUB (f
, j
))
282 /* Build something we can demangle. */
283 mangled_name
= gdb_mangle_name (type
, i
, j
);
285 mangled_name
= physname
;
288 cplus_demangle (mangled_name
,
289 DMGL_ANSI
| DMGL_PARAMS
| DMGL_JAVA
);
291 if (demangled_name
== NULL
)
292 demangled_name
= xstrdup (mangled_name
);
295 char *demangled_no_class
;
298 ptr
= demangled_no_class
= demangled_name
;
306 if (c
== 0 || c
== '(')
309 demangled_no_class
= ptr
;
312 fputs_filtered (demangled_no_class
, stream
);
313 xfree (demangled_name
);
316 if (TYPE_FN_FIELD_STUB (f
, j
))
317 xfree (mangled_name
);
319 fprintf_filtered (stream
, ";\n");
323 fprintfi_filtered (level
, stream
, "}");
328 c_type_print_base (type
, stream
, show
, level
, flags
);
332 /* LEVEL is the depth to indent lines by. */
335 java_print_type (struct type
*type
, const char *varstring
,
336 struct ui_file
*stream
, int show
, int level
,
337 const struct type_print_options
*flags
)
341 java_type_print_base (type
, stream
, show
, level
, flags
);
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
= varstring
!= NULL
&& strchr (varstring
, '(') != NULL
;
353 c_type_print_varspec_suffix (type
, stream
, show
, 0, demangled_args
, flags
);