static void print_record_type (struct type *type0, struct ui_file *stream, int show, int level, const struct type_print_options *flags) { struct type *parent_type; struct type *type; type = ada_find_parallel_type (type0, "___XVE"); if (type == NULL) type = type0; parent_type = ada_parent_type (type); if (ada_type_name (parent_type) != NULL) { const char *parent_name = decoded_type_name (parent_type); /* If we fail to decode the parent type name, then use the parent type name as is. Not pretty, but should never happen except when the debugging info is incomplete or incorrect. This prevents a crash trying to print a NULL pointer. */ if (parent_name == NULL) parent_name = ada_type_name (parent_type); fprintf_filtered (stream, "new %s with record", parent_name); } else if (parent_type == NULL && ada_is_tagged_type (type, 0)) fprintf_filtered (stream, "tagged record"); else fprintf_filtered (stream, "record"); if (show < 0) fprintf_filtered (stream, " ... end record"); else { int flds; flds = 0; if (parent_type != NULL && ada_type_name (parent_type) == NULL) flds += print_record_field_types (parent_type, parent_type, stream, show, level, flags); flds += print_record_field_types (type, type, stream, show, level, flags); if (flds > 0) fprintf_filtered (stream, "\n%*send record", level, ""); else if (flds < 0) fprintf_filtered (stream, _(" <incomplete type> end record")); else fprintf_filtered (stream, " null; end record"); } }
static void print_variant_clauses (struct type *type, int field_num, struct type *outer_type, struct ui_file *stream, int show, int level) { int i; struct type *var_type, *par_type; struct type *discr_type; var_type = TYPE_FIELD_TYPE (type, field_num); discr_type = ada_variant_discrim_type (var_type, outer_type); if (TYPE_CODE (var_type) == TYPE_CODE_PTR) { var_type = TYPE_TARGET_TYPE (var_type); if (var_type == NULL || TYPE_CODE (var_type) != TYPE_CODE_UNION) return; } par_type = ada_find_parallel_type (var_type, "___XVU"); if (par_type != NULL) var_type = par_type; for (i = 0; i < TYPE_NFIELDS (var_type); i += 1) { fprintf_filtered (stream, "\n%*swhen ", level + 4, ""); print_choices (var_type, i, stream, discr_type); fprintf_filtered (stream, " =>"); if (print_record_field_types (TYPE_FIELD_TYPE (var_type, i), outer_type, stream, show, level + 4) <= 0) fprintf_filtered (stream, " null;"); } }
static void print_record_type (struct type *type0, struct ui_file *stream, int show, int level) { struct type *parent_type; struct type *type; type = ada_find_parallel_type (type0, "___XVE"); if (type == NULL) type = type0; parent_type = ada_parent_type (type); if (ada_type_name (parent_type) != NULL) fprintf_filtered (stream, "new %s with record", decoded_type_name (parent_type)); else if (parent_type == NULL && ada_is_tagged_type (type, 0)) fprintf_filtered (stream, "tagged record"); else fprintf_filtered (stream, "record"); if (show < 0) fprintf_filtered (stream, " ... end record"); else { int flds; flds = 0; if (parent_type != NULL && ada_type_name (parent_type) == NULL) flds += print_record_field_types (parent_type, parent_type, stream, show, level); flds += print_record_field_types (type, type, stream, show, level); if (flds > 0) fprintf_filtered (stream, "\n%*send record", level, ""); else if (flds < 0) fprintf_filtered (stream, _(" <incomplete type> end record")); else fprintf_filtered (stream, " null; end record"); } }
static int print_selected_record_field_types (struct type *type, struct type *outer_type, int fld0, int fld1, struct ui_file *stream, int show, int level, const struct type_print_options *flags) { int i, flds; flds = 0; if (fld0 > fld1 && TYPE_STUB (type)) return -1; for (i = fld0; i <= fld1; i += 1) { QUIT; if (ada_is_parent_field (type, i) || ada_is_ignored_field (type, i)) ; else if (ada_is_wrapper_field (type, i)) flds += print_record_field_types (TYPE_FIELD_TYPE (type, i), type, stream, show, level, flags); else if (ada_is_variant_part (type, i)) { print_variant_part (type, i, outer_type, stream, show, level, flags); flds = 1; } else { flds += 1; fprintf_filtered (stream, "\n%*s", level + 4, ""); ada_print_type (TYPE_FIELD_TYPE (type, i), TYPE_FIELD_NAME (type, i), stream, show - 1, level + 4, flags); fprintf_filtered (stream, ";"); } } return flds; }
static int print_record_field_types (struct type *type, struct type *outer_type, struct ui_file *stream, int show, int level) { int len, i, flds; flds = 0; len = TYPE_NFIELDS (type); if (len == 0 && (TYPE_FLAGS (type) & TYPE_FLAG_STUB) != 0) return -1; for (i = 0; i < len; i += 1) { QUIT; if (ada_is_parent_field (type, i) || ada_is_ignored_field (type, i)) ; else if (ada_is_wrapper_field (type, i)) flds += print_record_field_types (TYPE_FIELD_TYPE (type, i), type, stream, show, level); else if (ada_is_variant_part (type, i)) { print_variant_part (type, i, outer_type, stream, show, level); flds = 1; } else { flds += 1; fprintf_filtered (stream, "\n%*s", level + 4, ""); ada_print_type (TYPE_FIELD_TYPE (type, i), TYPE_FIELD_NAME (type, i), stream, show - 1, level + 4); fprintf_filtered (stream, ";"); } } return flds; }