1 /* Support for printing Java types for GDB, the GNU debugger.
2 Copyright 1997, 1998, 1999 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
PARAMS ((struct type
* type
, GDB_FILE
* stream
, int show
, int level
));
37 java_type_print_derivation_info (stream
, type
)
46 n_bases
= TYPE_N_BASECLASSES (type
);
48 for (i
= 0, prev
= 0; i
< n_bases
; i
++)
52 kind
= BASETYPE_VIA_VIRTUAL (type
, i
) ? 'I' : 'E';
54 fputs_filtered (kind
== prev
? ", "
55 : kind
== 'I' ? " implements "
59 name
= type_name_no_tag (TYPE_BASECLASS (type
, i
));
61 fprintf_filtered (stream
, "%s", name
? name
: "(null)");
65 fputs_filtered (" ", stream
);
68 /* Print the name of the type (or the ultimate pointer target,
69 function value or array element), or the description of a
72 SHOW positive means print details about the type (e.g. enum values),
73 and print structure elements passing SHOW - 1 for show.
74 SHOW negative means just print the type name or struct tag if there is one.
75 If there is no name, print something sensible but concise like
77 SHOW zero means just print the type name or struct tag if there is one.
78 If there is no name, print something sensible but not as concise like
79 "struct {int x; int y;}".
81 LEVEL is the number of spaces to indent by.
82 We increase it for some recursive calls. */
85 java_type_print_base (type
, stream
, show
, level
)
101 fputs_filtered ("<type unknown>", stream
);
105 /* When SHOW is zero or less, and there is a valid type name, then always
106 just print the type name directly from the type. */
109 && TYPE_NAME (type
) != NULL
)
111 fputs_filtered (TYPE_NAME (type
), stream
);
115 CHECK_TYPEDEF (type
);
117 switch (TYPE_CODE (type
))
120 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
));
127 fputs_filtered (name
, stream
);
133 fprintf_filtered (stream
, "class ");
135 if (TYPE_TAG_NAME (type
) != NULL
)
137 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
139 fputs_filtered (" ", stream
);
146 /* If we just printed a tag name, no need to print anything else. */
147 if (TYPE_TAG_NAME (type
) == NULL
)
148 fprintf_filtered (stream
, "{...}");
150 else if (show
> 0 || TYPE_TAG_NAME (type
) == NULL
)
152 java_type_print_derivation_info (stream
, type
);
154 fprintf_filtered (stream
, "{\n");
155 if ((TYPE_NFIELDS (type
) == 0) && (TYPE_NFN_FIELDS (type
) == 0))
157 if (TYPE_FLAGS (type
) & TYPE_FLAG_STUB
)
158 fprintfi_filtered (level
+ 4, stream
, "<incomplete type>\n");
160 fprintfi_filtered (level
+ 4, stream
, "<no data fields>\n");
163 /* If there is a base class for this type,
164 do not print the field that it occupies. */
166 len
= TYPE_NFIELDS (type
);
167 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
170 /* Don't print out virtual function table. */
171 if (STREQN (TYPE_FIELD_NAME (type
, i
), "_vptr", 5)
172 && is_cplus_marker ((TYPE_FIELD_NAME (type
, i
))[5]))
175 /* Don't print the dummy field "class". */
176 if (STREQN (TYPE_FIELD_NAME (type
, i
), "class", 5))
179 print_spaces_filtered (level
+ 4, stream
);
181 if (HAVE_CPLUS_STRUCT (type
))
183 if (TYPE_FIELD_PROTECTED (type
, i
))
184 fprintf_filtered (stream
, "protected ");
185 else if (TYPE_FIELD_PRIVATE (type
, i
))
186 fprintf_filtered (stream
, "private ");
188 fprintf_filtered (stream
, "public ");
191 if (TYPE_FIELD_STATIC (type
, i
))
192 fprintf_filtered (stream
, "static ");
194 java_print_type (TYPE_FIELD_TYPE (type
, i
),
195 TYPE_FIELD_NAME (type
, i
),
196 stream
, show
- 1, level
+ 4);
198 fprintf_filtered (stream
, ";\n");
201 /* If there are both fields and methods, put a space between. */
202 len
= TYPE_NFN_FIELDS (type
);
204 fprintf_filtered (stream
, "\n");
206 /* Print out the methods */
208 for (i
= 0; i
< len
; i
++)
217 f
= TYPE_FN_FIELDLIST1 (type
, i
);
218 n_overloads
= TYPE_FN_FIELDLIST_LENGTH (type
, i
);
219 method_name
= TYPE_FN_FIELDLIST_NAME (type
, i
);
220 name
= type_name_no_tag (type
);
221 is_constructor
= name
&& STREQ (method_name
, name
);
223 for (j
= 0; j
< n_overloads
; j
++)
226 int is_full_physname_constructor
;
228 physname
= TYPE_FN_FIELD_PHYSNAME (f
, j
);
230 is_full_physname_constructor
=
231 ((physname
[0] == '_' && physname
[1] == '_'
232 && strchr ("0123456789Qt", physname
[2]))
233 || STREQN (physname
, "__ct__", 6)
234 || DESTRUCTOR_PREFIX_P (physname
)
235 || STREQN (physname
, "__dt__", 6));
239 print_spaces_filtered (level
+ 4, stream
);
241 if (TYPE_FN_FIELD_PROTECTED (f
, j
))
242 fprintf_filtered (stream
, "protected ");
243 else if (TYPE_FN_FIELD_PRIVATE (f
, j
))
244 fprintf_filtered (stream
, "private ");
245 else if (TYPE_FN_FIELD_PUBLIC (f
, j
))
246 fprintf_filtered (stream
, "public ");
248 if (TYPE_FN_FIELD_ABSTRACT (f
, j
))
249 fprintf_filtered (stream
, "abstract ");
250 if (TYPE_FN_FIELD_STATIC (f
, j
))
251 fprintf_filtered (stream
, "static ");
252 if (TYPE_FN_FIELD_FINAL (f
, j
))
253 fprintf_filtered (stream
, "final ");
254 if (TYPE_FN_FIELD_SYNCHRONIZED (f
, j
))
255 fprintf_filtered (stream
, "synchronized ");
256 if (TYPE_FN_FIELD_NATIVE (f
, j
))
257 fprintf_filtered (stream
, "native ");
259 if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f
, j
)) == 0)
261 /* Keep GDB from crashing here. */
262 fprintf_filtered (stream
, "<undefined type> %s;\n",
263 TYPE_FN_FIELD_PHYSNAME (f
, j
));
266 else if (!is_constructor
&& !is_full_physname_constructor
)
268 type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f
, j
)),
270 fputs_filtered (" ", stream
);
273 if (TYPE_FN_FIELD_STUB (f
, j
))
274 /* Build something we can demangle. */
275 mangled_name
= gdb_mangle_name (type
, i
, j
);
277 mangled_name
= TYPE_FN_FIELD_PHYSNAME (f
, j
);
280 cplus_demangle (mangled_name
,
281 DMGL_ANSI
| DMGL_PARAMS
| DMGL_JAVA
);
283 if (demangled_name
== NULL
)
284 demangled_name
= strdup (mangled_name
);
287 char *demangled_no_class
;
290 ptr
= demangled_no_class
= demangled_name
;
298 if (c
== 0 || c
== '(')
301 demangled_no_class
= ptr
;
304 fputs_filtered (demangled_no_class
, stream
);
305 free (demangled_name
);
308 if (TYPE_FN_FIELD_STUB (f
, j
))
311 fprintf_filtered (stream
, ";\n");
315 fprintfi_filtered (level
, stream
, "}");
320 c_type_print_base (type
, stream
, show
, level
);
324 /* LEVEL is the depth to indent lines by. */
327 c_type_print_varspec_suffix
PARAMS ((struct type
*, GDB_FILE
*, int, int, int));
330 java_print_type (type
, varstring
, stream
, show
, level
)
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
= strchr (varstring
, '(') != NULL
;
351 c_type_print_varspec_suffix (type
, stream
, show
, 0, demangled_args
);