X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fjv-typeprint.c;h=00abd9acda3e93598619edb6dfb7a4756cb9c070;hb=e56534680d0df0e2ca313086b1758480c9374615;hp=1b60830a854ad41524a8432bc93d48a7b008fbe6;hpb=d0352a18a504a4e7b761f6b3264cf11347d8d056;p=deliverable%2Fbinutils-gdb.git
diff --git a/gdb/jv-typeprint.c b/gdb/jv-typeprint.c
index 1b60830a85..00abd9acda 100644
--- a/gdb/jv-typeprint.c
+++ b/gdb/jv-typeprint.c
@@ -1,11 +1,11 @@
/* Support for printing Java types for GDB, the GNU debugger.
- Copyright 1997-2000 Free Software Foundation, Inc.
+ Copyright (C) 1997-2016 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
@@ -14,9 +14,7 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ along with this program. If not, see . */
#include "defs.h"
@@ -24,23 +22,24 @@
#include "gdbtypes.h"
#include "value.h"
#include "demangle.h"
+#include "gdb-demangle.h"
#include "jv-lang.h"
-#include "gdb_string.h"
#include "typeprint.h"
#include "c-lang.h"
+#include "cp-abi.h"
+#include "cp-support.h"
/* Local functions */
static void java_type_print_base (struct type * type,
struct ui_file *stream, int show,
- int level);
+ int level,
+ const struct type_print_options *flags);
static void
-java_type_print_derivation_info (stream, type)
- struct ui_file *stream;
- struct type *type;
+java_type_print_derivation_info (struct ui_file *stream, struct type *type)
{
- char *name;
+ const char *name;
int i;
int n_bases;
int prev;
@@ -84,18 +83,15 @@ java_type_print_derivation_info (stream, type)
We increase it for some recursive calls. */
static void
-java_type_print_base (type, stream, show, level)
- struct type *type;
- struct ui_file *stream;
- int show;
- int level;
+java_type_print_base (struct type *type, struct ui_file *stream, int show,
+ int level, const struct type_print_options *flags)
{
- register int i;
- register int len;
+ int i;
+ int len;
char *mangled_name;
char *demangled_name;
- QUIT;
+ QUIT;
wrap_here (" ");
if (type == NULL)
@@ -114,20 +110,22 @@ java_type_print_base (type, stream, show, level)
return;
}
- CHECK_TYPEDEF (type);
+ type = check_typedef (type);
switch (TYPE_CODE (type))
{
case TYPE_CODE_PTR:
- java_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
+ java_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level,
+ flags);
break;
case TYPE_CODE_STRUCT:
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);
- free (name);
+ xfree (name);
break;
}
@@ -156,7 +154,7 @@ java_type_print_base (type, stream, show, level)
fprintf_filtered (stream, "{\n");
if ((TYPE_NFIELDS (type) == 0) && (TYPE_NFN_FIELDS (type) == 0))
{
- if (TYPE_FLAGS (type) & TYPE_FLAG_STUB)
+ if (TYPE_STUB (type))
fprintfi_filtered (level + 4, stream, "\n");
else
fprintfi_filtered (level + 4, stream, "\n");
@@ -170,12 +168,12 @@ java_type_print_base (type, stream, show, level)
{
QUIT;
/* Don't print out virtual function table. */
- if (STREQN (TYPE_FIELD_NAME (type, i), "_vptr", 5)
+ if (startswith (TYPE_FIELD_NAME (type, i), "_vptr")
&& is_cplus_marker ((TYPE_FIELD_NAME (type, i))[5]))
continue;
- /* Don't print the dummy field "class". */
- if (STREQN (TYPE_FIELD_NAME (type, i), "class", 5))
+ /* Don't print the dummy field "class". */
+ if (startswith (TYPE_FIELD_NAME (type, i), "class"))
continue;
print_spaces_filtered (level + 4, stream);
@@ -190,29 +188,29 @@ java_type_print_base (type, stream, show, level)
fprintf_filtered (stream, "public ");
}
- if (TYPE_FIELD_STATIC (type, i))
+ if (field_is_static (&TYPE_FIELD (type, i)))
fprintf_filtered (stream, "static ");
java_print_type (TYPE_FIELD_TYPE (type, i),
TYPE_FIELD_NAME (type, i),
- stream, show - 1, level + 4);
+ stream, show - 1, level + 4, flags);
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++)
{
struct fn_field *f;
int j;
- char *method_name;
- char *name;
+ const char *method_name;
+ const char *name;
int is_constructor;
int n_overloads;
@@ -220,21 +218,30 @@ java_type_print_base (type, stream, show, level)
n_overloads = TYPE_FN_FIELDLIST_LENGTH (type, i);
method_name = TYPE_FN_FIELDLIST_NAME (type, i);
name = type_name_no_tag (type);
- is_constructor = name && STREQ (method_name, name);
+ is_constructor = name && strcmp (method_name, name) == 0;
for (j = 0; j < n_overloads; j++)
{
+ const char *real_physname;
+ const char *p;
char *physname;
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 = (char *) alloca (p - real_physname + 1);
+ memcpy (physname, real_physname, p - real_physname);
+ physname[p - real_physname] = '\0';
- is_full_physname_constructor =
- ((physname[0] == '_' && physname[1] == '_'
- && strchr ("0123456789Qt", physname[2]))
- || STREQN (physname, "__ct__", 6)
- || DESTRUCTOR_PREFIX_P (physname)
- || STREQN (physname, "__dt__", 6));
+ is_full_physname_constructor
+ = (TYPE_FN_FIELD_CONSTRUCTOR (f, j)
+ || is_constructor_name (physname)
+ || is_destructor_name (physname));
QUIT;
@@ -276,11 +283,11 @@ java_type_print_base (type, stream, show, level)
/* 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,
- DMGL_ANSI | DMGL_PARAMS | DMGL_JAVA);
+ gdb_demangle (mangled_name,
+ DMGL_ANSI | DMGL_PARAMS | DMGL_JAVA);
if (demangled_name == NULL)
demangled_name = xstrdup (mangled_name);
@@ -304,11 +311,11 @@ java_type_print_base (type, stream, show, level)
}
fputs_filtered (demangled_no_class, stream);
- free (demangled_name);
+ xfree (demangled_name);
}
if (TYPE_FN_FIELD_STUB (f, j))
- free (mangled_name);
+ xfree (mangled_name);
fprintf_filtered (stream, ";\n");
}
@@ -319,26 +326,20 @@ java_type_print_base (type, stream, show, level)
break;
default:
- c_type_print_base (type, stream, show, level);
+ c_type_print_base (type, stream, show, level, flags);
}
}
/* LEVEL is the depth to indent lines by. */
-extern void c_type_print_varspec_suffix (struct type *, struct ui_file *,
- int, int, int);
-
void
-java_print_type (type, varstring, stream, show, level)
- 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,
+ const struct type_print_options *flags)
{
int demangled_args;
- java_type_print_base (type, stream, show, level);
+ java_type_print_base (type, stream, show, level, flags);
if (varstring != NULL && *varstring != '\0')
{
@@ -347,8 +348,8 @@ java_print_type (type, varstring, stream, show, level)
}
/* 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 = strchr (varstring, '(') != NULL;
- c_type_print_varspec_suffix (type, stream, show, 0, demangled_args);
+ demangled_args = varstring != NULL && strchr (varstring, '(') != NULL;
+ c_type_print_varspec_suffix (type, stream, show, 0, demangled_args, flags);
}