X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fjv-typeprint.c;h=df46debece361c71261da2eec00c4cc5330f76cb;hb=9f1b45b0da430a7a7abf9e54acbe6f2ef9d3a763;hp=884bc1270462b8a750603edb68d46a65bcb3d17b;hpb=30727aa6d12fb866494020c0b62ab265a2bdcdfe;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/jv-typeprint.c b/gdb/jv-typeprint.c index 884bc12704..df46debece 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, 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1997-2014 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,21 +22,26 @@ #include "gdbtypes.h" #include "value.h" #include "demangle.h" +#include "gdb-demangle.h" #include "jv-lang.h" -#include "gdb_string.h" +#include #include "typeprint.h" #include "c-lang.h" +#include "cp-abi.h" +#include "cp-support.h" +#include "gdb_assert.h" /* Local functions */ -static void java_type_print_base PARAMS ((struct type * type, GDB_FILE * stream, int show, int level)); +static void java_type_print_base (struct type * type, + struct ui_file *stream, int show, + int level, + const struct type_print_options *flags); static void -java_type_print_derivation_info (stream, type) - GDB_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; @@ -82,18 +85,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; - GDB_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) @@ -117,15 +117,17 @@ java_type_print_base (type, stream, show, level) 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; } @@ -154,7 +156,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"); @@ -168,12 +170,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 (strncmp (TYPE_FIELD_NAME (type, i), "_vptr", 5) == 0 && 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 (strncmp (TYPE_FIELD_NAME (type, i), "class", 5) == 0) continue; print_spaces_filtered (level + 4, stream); @@ -188,29 +190,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; @@ -218,21 +220,29 @@ 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++) { - char *physname; + const char *real_physname; + char *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 = - ((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; @@ -274,14 +284,14 @@ 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 = strdup (mangled_name); + demangled_name = xstrdup (mangled_name); { char *demangled_no_class; @@ -302,11 +312,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"); } @@ -317,26 +327,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 PARAMS ((struct type *, GDB_FILE *, int, int, int)); - void -java_print_type (type, varstring, stream, show, level) - struct type *type; - char *varstring; - GDB_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') { @@ -345,8 +349,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); }