X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fjv-typeprint.c;h=884bc1270462b8a750603edb68d46a65bcb3d17b;hb=1174497c8ae1bf9293addcb216c48dbdbf487e4f;hp=b3a20cc0ed555ad8cd9674182e6f9e4600b5e572;hpb=d2e131a198a957499a8d318f8962f4fe75a2b325;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/jv-typeprint.c b/gdb/jv-typeprint.c index b3a20cc0ed..884bc12704 100644 --- a/gdb/jv-typeprint.c +++ b/gdb/jv-typeprint.c @@ -1,21 +1,22 @@ /* Support for printing Java types for GDB, the GNU debugger. - Copyright 1997 Free Software Foundation, Inc. + Copyright 1997, 1998, 1999 Free Software Foundation, Inc. -This file is part of GDB. + 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 -(at your option) any later version. + 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 + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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. */ + 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. */ #include "defs.h" @@ -25,6 +26,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "demangle.h" #include "jv-lang.h" #include "gdb_string.h" +#include "typeprint.h" +#include "c-lang.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_derivation_info (stream, type) @@ -32,25 +39,30 @@ java_type_print_derivation_info (stream, type) struct type *type; { char *name; - int i = 0; - int n_bases = TYPE_N_BASECLASSES (type); - int prev = 0; + int i; + int n_bases; + int prev; + + n_bases = TYPE_N_BASECLASSES (type); - for (i = 0; i < n_bases; i++) + for (i = 0, prev = 0; i < n_bases; i++) { - int kind = BASETYPE_VIA_VIRTUAL(type, i) ? 'I' : 'E'; + int kind; + + kind = BASETYPE_VIA_VIRTUAL (type, i) ? 'I' : 'E'; + fputs_filtered (kind == prev ? ", " : kind == 'I' ? " implements " : " extends ", stream); prev = kind; name = type_name_no_tag (TYPE_BASECLASS (type, i)); + fprintf_filtered (stream, "%s", name ? name : "(null)"); } + if (i > 0) - { - fputs_filtered (" ", stream); - } + fputs_filtered (" ", stream); } /* Print the name of the type (or the ultimate pointer target, @@ -69,7 +81,7 @@ java_type_print_derivation_info (stream, type) LEVEL is the number of spaces to indent by. We increase it for some recursive calls. */ -void +static void java_type_print_base (type, stream, show, level) struct type *type; GDB_FILE *stream; @@ -83,6 +95,7 @@ java_type_print_base (type, stream, show, level) QUIT; wrap_here (" "); + if (type == NULL) { fputs_filtered ("", stream); @@ -103,15 +116,31 @@ 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); + break; + case TYPE_CODE_STRUCT: - fprintf_filtered (stream, "class "); + 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); + break; + } + + if (show >= 0) + fprintf_filtered (stream, "class "); + if (TYPE_TAG_NAME (type) != NULL) { fputs_filtered (TYPE_TAG_NAME (type), stream); if (show > 0) fputs_filtered (" ", stream); } + wrap_here (" "); + if (show < 0) { /* If we just printed a tag name, no need to print anything else. */ @@ -121,7 +150,7 @@ java_type_print_base (type, stream, show, level) else if (show > 0 || TYPE_TAG_NAME (type) == NULL) { java_type_print_derivation_info (stream, type); - + fprintf_filtered (stream, "{\n"); if ((TYPE_NFIELDS (type) == 0) && (TYPE_NFN_FIELDS (type) == 0)) { @@ -143,10 +172,12 @@ java_type_print_base (type, stream, show, level) && is_cplus_marker ((TYPE_FIELD_NAME (type, i))[5])) continue; - /* If this is a C++ class we can print the various C++ section - labels. */ + /* Don't print the dummy field "class". */ + if (STREQN (TYPE_FIELD_NAME (type, i), "class", 5)) + continue; print_spaces_filtered (level + 4, stream); + if (HAVE_CPLUS_STRUCT (type)) { if (TYPE_FIELD_PROTECTED (type, i)) @@ -158,33 +189,45 @@ java_type_print_base (type, stream, show, level) } if (TYPE_FIELD_STATIC (type, i)) - { - fprintf_filtered (stream, "static "); - } + fprintf_filtered (stream, "static "); + java_print_type (TYPE_FIELD_TYPE (type, i), - TYPE_FIELD_NAME (type, i), - stream, show - 1, level + 4); + TYPE_FIELD_NAME (type, i), + stream, show - 1, level + 4); + fprintf_filtered (stream, ";\n"); } /* If there are both fields and methods, put a space between. */ len = TYPE_NFN_FIELDS (type); if (len) - fprintf_filtered (stream, "\n"); + fprintf_filtered (stream, "\n"); /* Print out the methods */ for (i = 0; i < len; i++) { - struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i); - int j, len2 = TYPE_FN_FIELDLIST_LENGTH (type, i); - char *method_name = TYPE_FN_FIELDLIST_NAME (type, i); - char *name = type_name_no_tag (type); - int is_constructor = name && STREQ(method_name, name); - for (j = 0; j < len2; j++) + struct fn_field *f; + int j; + char *method_name; + char *name; + int is_constructor; + int n_overloads; + + f = TYPE_FN_FIELDLIST1 (type, i); + 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); + + for (j = 0; j < n_overloads; j++) { - char *physname = TYPE_FN_FIELD_PHYSNAME (f, j); - int is_full_physname_constructor = + char *physname; + int is_full_physname_constructor; + + physname = TYPE_FN_FIELD_PHYSNAME (f, j); + + is_full_physname_constructor = ((physname[0] == '_' && physname[1] == '_' && strchr ("0123456789Qt", physname[2])) || STREQN (physname, "__ct__", 6) @@ -192,23 +235,32 @@ java_type_print_base (type, stream, show, level) || STREQN (physname, "__dt__", 6)); QUIT; + print_spaces_filtered (level + 4, stream); + if (TYPE_FN_FIELD_PROTECTED (f, j)) fprintf_filtered (stream, "protected "); else if (TYPE_FN_FIELD_PRIVATE (f, j)) fprintf_filtered (stream, "private "); - else + else if (TYPE_FN_FIELD_PUBLIC (f, j)) fprintf_filtered (stream, "public "); - if (TYPE_FN_FIELD_VIRTUAL_P (f, j)) - fprintf_filtered (stream, "virtual "); - else if (TYPE_FN_FIELD_STATIC_P (f, j)) + if (TYPE_FN_FIELD_ABSTRACT (f, j)) + fprintf_filtered (stream, "abstract "); + if (TYPE_FN_FIELD_STATIC (f, j)) fprintf_filtered (stream, "static "); + if (TYPE_FN_FIELD_FINAL (f, j)) + fprintf_filtered (stream, "final "); + if (TYPE_FN_FIELD_SYNCHRONIZED (f, j)) + fprintf_filtered (stream, "synchronized "); + if (TYPE_FN_FIELD_NATIVE (f, j)) + fprintf_filtered (stream, "native "); + if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) == 0) { /* Keep GDB from crashing here. */ fprintf_filtered (stream, " %s;\n", - TYPE_FN_FIELD_PHYSNAME (f, j)); + TYPE_FN_FIELD_PHYSNAME (f, j)); break; } else if (!is_constructor && !is_full_physname_constructor) @@ -217,6 +269,7 @@ java_type_print_base (type, stream, show, level) "", stream, -1); fputs_filtered (" ", stream); } + if (TYPE_FN_FIELD_STUB (f, j)) /* Build something we can demangle. */ mangled_name = gdb_mangle_name (type, i, j); @@ -226,24 +279,31 @@ java_type_print_base (type, stream, show, level) demangled_name = cplus_demangle (mangled_name, DMGL_ANSI | DMGL_PARAMS | DMGL_JAVA); + if (demangled_name == NULL) - fprintf_filtered (stream, "", - mangled_name); - else - { - char *demangled_no_class = demangled_name; - char *ptr = demangled_name; - for ( ; ; ) - { - char c = *ptr++; - if (c == 0 || c == '(') - break; - if (c == '.') - demangled_no_class = ptr; - } - fputs_filtered (demangled_no_class, stream); - free (demangled_name); - } + demangled_name = strdup (mangled_name); + + { + char *demangled_no_class; + char *ptr; + + ptr = demangled_no_class = demangled_name; + + while (1) + { + char c; + + c = *ptr++; + + if (c == 0 || c == '(') + break; + if (c == '.') + demangled_no_class = ptr; + } + + fputs_filtered (demangled_no_class, stream); + free (demangled_name); + } if (TYPE_FN_FIELD_STUB (f, j)) free (mangled_name); @@ -256,13 +316,16 @@ java_type_print_base (type, stream, show, level) } break; - default: - c_type_print_base (type, stream, show, level); + default: + c_type_print_base (type, stream, show, level); } } /* 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; @@ -271,6 +334,8 @@ java_print_type (type, varstring, stream, show, level) int show; int level; { + int demangled_args; + java_type_print_base (type, stream, show, level); if (varstring != NULL && *varstring != '\0') @@ -278,11 +343,10 @@ java_print_type (type, varstring, stream, show, level) fputs_filtered (" ", stream); fputs_filtered (varstring, stream); } -#if 0 + /* For demangled function names, we have the arglist as part of the name, so don't print an additional pair of ()'s */ - demangled_args = strchr(varstring, '(') != NULL; + demangled_args = strchr (varstring, '(') != NULL; c_type_print_varspec_suffix (type, stream, show, 0, demangled_args); -#endif }