/* Support for printing Java types for GDB, the GNU debugger.
- Copyright (C) 1997, 1998, 1999, 2000, 2007, 2008, 2009
+ Copyright (C) 1997, 1998, 1999, 2000, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
This file is part of GDB.
#include "typeprint.h"
#include "c-lang.h"
#include "cp-abi.h"
+#include "gdb_assert.h"
/* Local functions */
int len;
char *mangled_name;
char *demangled_name;
- QUIT;
+ QUIT;
wrap_here (" ");
if (type == NULL)
if (TYPE_TAG_NAME (type) != NULL && TYPE_TAG_NAME (type)[0] == '[')
{ /* array type */
char *name = java_demangle_type_signature (TYPE_TAG_NAME (type));
+
fputs_filtered (name, stream);
xfree (name);
break;
&& is_cplus_marker ((TYPE_FIELD_NAME (type, i))[5]))
continue;
- /* Don't print the dummy field "class". */
+ /* Don't print the dummy field "class". */
if (strncmp (TYPE_FIELD_NAME (type, i), "class", 5) == 0)
continue;
fprintf_filtered (stream, ";\n");
}
- /* If there are both fields and methods, put a space between. */
+ /* If there are both fields and methods, put a space between. */
len = TYPE_NFN_FIELDS (type);
if (len)
fprintf_filtered (stream, "\n");
- /* Print out the methods */
+ /* Print out the methods. */
for (i = 0; i < len; i++)
{
for (j = 0; j < n_overloads; j++)
{
- char *physname;
+ char *real_physname, *physname, *p;
int is_full_physname_constructor;
- physname = TYPE_FN_FIELD_PHYSNAME (f, j);
+ real_physname = TYPE_FN_FIELD_PHYSNAME (f, j);
+
+ /* The physname will contain the return type
+ after the final closing parenthesis. Strip it off. */
+ p = strrchr (real_physname, ')');
+ gdb_assert (p != NULL);
+ ++p; /* Keep the trailing ')'. */
+ physname = alloca (p - real_physname + 1);
+ memcpy (physname, real_physname, p - real_physname);
+ physname[p - real_physname] = '\0';
is_full_physname_constructor
= (is_constructor_name (physname)
/* Build something we can demangle. */
mangled_name = gdb_mangle_name (type, i, j);
else
- mangled_name = TYPE_FN_FIELD_PHYSNAME (f, j);
+ mangled_name = physname;
demangled_name =
cplus_demangle (mangled_name,
int, int, int);
void
-java_print_type (struct type *type, char *varstring, struct ui_file *stream,
- int show, int level)
+java_print_type (struct type *type, const char *varstring,
+ struct ui_file *stream, int show, int level)
{
int demangled_args;
}
/* For demangled function names, we have the arglist as part of the name,
- so don't print an additional pair of ()'s */
+ so don't print an additional pair of ()'s. */
demangled_args = varstring != NULL && strchr (varstring, '(') != NULL;
c_type_print_varspec_suffix (type, stream, show, 0, demangled_args);