gdb/jv-typeprint.c - gdb
Functions defined
Source code
- #include "defs.h"
- #include "symtab.h"
- #include "gdbtypes.h"
- #include "value.h"
- #include "demangle.h"
- #include "gdb-demangle.h"
- #include "jv-lang.h"
- #include "typeprint.h"
- #include "c-lang.h"
- #include "cp-abi.h"
- #include "cp-support.h"
- 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 (struct ui_file *stream, struct type *type)
- {
- const char *name;
- int i;
- int n_bases;
- int prev;
- n_bases = TYPE_N_BASECLASSES (type);
- for (i = 0, prev = 0; i < n_bases; i++)
- {
- 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);
- }
- static void
- java_type_print_base (struct type *type, struct ui_file *stream, int show,
- int level, const struct type_print_options *flags)
- {
- int i;
- int len;
- char *mangled_name;
- char *demangled_name;
- QUIT;
- wrap_here (" ");
- if (type == NULL)
- {
- fputs_filtered ("<type unknown>", stream);
- return;
- }
-
- if (show <= 0
- && TYPE_NAME (type) != NULL)
- {
- fputs_filtered (TYPE_NAME (type), stream);
- return;
- }
- CHECK_TYPEDEF (type);
- switch (TYPE_CODE (type))
- {
- case TYPE_CODE_PTR:
- 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] == '[')
- {
- char *name = java_demangle_type_signature (TYPE_TAG_NAME (type));
- fputs_filtered (name, stream);
- xfree (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 (TYPE_TAG_NAME (type) == NULL)
- fprintf_filtered (stream, "{...}");
- }
- 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))
- {
- if (TYPE_STUB (type))
- fprintfi_filtered (level + 4, stream, "<incomplete type>\n");
- else
- fprintfi_filtered (level + 4, stream, "<no data fields>\n");
- }
-
- len = TYPE_NFIELDS (type);
- for (i = TYPE_N_BASECLASSES (type); i < len; i++)
- {
- QUIT;
-
- if (strncmp (TYPE_FIELD_NAME (type, i), "_vptr", 5) == 0
- && is_cplus_marker ((TYPE_FIELD_NAME (type, i))[5]))
- continue;
-
- if (strncmp (TYPE_FIELD_NAME (type, i), "class", 5) == 0)
- continue;
- print_spaces_filtered (level + 4, stream);
- if (HAVE_CPLUS_STRUCT (type))
- {
- if (TYPE_FIELD_PROTECTED (type, i))
- fprintf_filtered (stream, "protected ");
- else if (TYPE_FIELD_PRIVATE (type, i))
- fprintf_filtered (stream, "private ");
- else
- fprintf_filtered (stream, "public ");
- }
- 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, flags);
- fprintf_filtered (stream, ";\n");
- }
-
- len = TYPE_NFN_FIELDS (type);
- if (len)
- fprintf_filtered (stream, "\n");
-
- for (i = 0; i < len; i++)
- {
- struct fn_field *f;
- int j;
- const char *method_name;
- const 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 && strcmp (method_name, name) == 0;
- for (j = 0; j < n_overloads; j++)
- {
- const char *real_physname;
- char *physname, *p;
- int is_full_physname_constructor;
- real_physname = TYPE_FN_FIELD_PHYSNAME (f, j);
-
- p = strrchr (real_physname, ')');
- gdb_assert (p != NULL);
- ++p;
- physname = alloca (p - real_physname + 1);
- memcpy (physname, real_physname, p - real_physname);
- physname[p - real_physname] = '\0';
- is_full_physname_constructor
- = (TYPE_FN_FIELD_CONSTRUCTOR (f, j)
- || is_constructor_name (physname)
- || is_destructor_name (physname));
- 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 if (TYPE_FN_FIELD_PUBLIC (f, j))
- fprintf_filtered (stream, "public ");
- 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)
- {
-
- fprintf_filtered (stream, "<undefined type> %s;\n",
- TYPE_FN_FIELD_PHYSNAME (f, j));
- break;
- }
- else if (!is_constructor && !is_full_physname_constructor)
- {
- type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)),
- "", stream, -1);
- fputs_filtered (" ", stream);
- }
- if (TYPE_FN_FIELD_STUB (f, j))
-
- mangled_name = gdb_mangle_name (type, i, j);
- else
- mangled_name = physname;
- demangled_name =
- gdb_demangle (mangled_name,
- DMGL_ANSI | DMGL_PARAMS | DMGL_JAVA);
- if (demangled_name == NULL)
- demangled_name = xstrdup (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);
- xfree (demangled_name);
- }
- if (TYPE_FN_FIELD_STUB (f, j))
- xfree (mangled_name);
- fprintf_filtered (stream, ";\n");
- }
- }
- fprintfi_filtered (level, stream, "}");
- }
- break;
- default:
- c_type_print_base (type, stream, show, level, flags);
- }
- }
- void
- 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, flags);
- if (varstring != NULL && *varstring != '\0')
- {
- fputs_filtered (" ", stream);
- fputs_filtered (varstring, stream);
- }
-
- demangled_args = varstring != NULL && strchr (varstring, '(') != NULL;
- c_type_print_varspec_suffix (type, stream, show, 0, demangled_args, flags);
- }