コード例 #1
0
ファイル: ada-typeprint.c プロジェクト: asdlei00/gdb
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");
    }
}
コード例 #2
0
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;");
    }
}
コード例 #3
0
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");
    }
}
コード例 #4
0
ファイル: ada-typeprint.c プロジェクト: asdlei00/gdb
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;
}
コード例 #5
0
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;
}