mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-27 14:39:09 +08:00
gdb: move pascal_language into p-lang.h
Move the pascal_language class declaration into the p-lang.h header file. This allows for the function implementations to be spread over the different p-*.c files without the need for global trampoline functions. As a consequence of this change many of the Pascal value and type printing helper functions have become member functions within the pascal_language class. There should be no user visible changes after this commit. gdb/ChangeLog: * p-exp.y (exp): Update call to pascal_is_string_type. (pascal_parse): Rename to... (pascal_language::parser): ...this. * p-lang.c (is_pascal_string_type): Rename to... (pascal_is_string_type): ...this. (pascal_one_char): Rename to... (pascal_language::print_one_char): ...this. (pascal_printchar): Rename to... (pascal_language::printchar): ...this. Update call to print_one_char member function. (pascal_op_print_tab): Rename to... (pascal_language::op_print_tab): ...this. (class pascal_language): Moved to p-lang.h. (pascal_language::language_arch_info): Function implementation moved out of class declaration. (pascal_language::printstr): Likewise. * p-lang.h (pascal_parse): Delete declaration. (pascal_is_string_type): Declare. (pascal_print_type): Delete declaration. (pascal_print_typedef): Delete declaration. (pascal_value_print_inner): Delete declaration. (pascal_value_print): Delete declaration. (pascal_type_print_method_args): Delete declaration. (is_pascal_string_type): Delete declaration. (pascal_printchar): Delete declaration. (pascal_builtin_types): Delete declaration. (pascal_type_print_base): Delete declaration. (pascal_type_print_varspec_prefix): Delete declaration. (class pascal_language): Moved here from p-lang.c. * p-typeprint.c (pascal_type_print_varspec_suffix): Delete declaration. (pascal_type_print_derivation_info): Delete declaration. (pascal_print_type): Rename to... (pascal_language::print_type): ...this. Update calls to member functions. (pascal_print_typedef): Rename to... (pascal_language::print_typedef): ...this. Update calls to member functions. (pascal_type_print_derivation_info): Rename to... (pascal_language::type_print_derivation_info): ...this. (pascal_type_print_method_args): Rename to... (pascal_language::type_print_method_args): ...this. (pascal_type_print_varspec_prefix): Rename to... (pascal_language::type_print_varspec_prefix): ...this. Update calls to member functions. (pascal_print_func_args): Rename to... (pascal_language::print_func_args): ...this. Update calls to member functions. (pascal_type_print_func_varspec_suffix): Rename to... (pascal_language::type_print_func_varspec_suffix): ...this. Update calls to member functions. (pascal_type_print_varspec_suffix): Rename to... (pascal_language::type_print_varspec_suffix): ...this. Update calls to member functions. (pascal_type_print_base): Rename to... (pascal_language::type_print_base): ...this. Update calls to member functions. * p-valprint.c (pascal_value_print_inner): Rename to... (pascal_language::value_print_inner): ...this. Update calls to member functions. (pascal_value_print): Rename to... (pascal_language::value_print): ...this. Update calls to member functions.
This commit is contained in:
@ -1,3 +1,69 @@
|
|||||||
|
2020-12-23 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||||
|
|
||||||
|
* p-exp.y (exp): Update call to pascal_is_string_type.
|
||||||
|
(pascal_parse): Rename to...
|
||||||
|
(pascal_language::parser): ...this.
|
||||||
|
* p-lang.c (is_pascal_string_type): Rename to...
|
||||||
|
(pascal_is_string_type): ...this.
|
||||||
|
(pascal_one_char): Rename to...
|
||||||
|
(pascal_language::print_one_char): ...this.
|
||||||
|
(pascal_printchar): Rename to...
|
||||||
|
(pascal_language::printchar): ...this. Update call to
|
||||||
|
print_one_char member function.
|
||||||
|
(pascal_op_print_tab): Rename to...
|
||||||
|
(pascal_language::op_print_tab): ...this.
|
||||||
|
(class pascal_language): Moved to p-lang.h.
|
||||||
|
(pascal_language::language_arch_info): Function implementation
|
||||||
|
moved out of class declaration.
|
||||||
|
(pascal_language::printstr): Likewise.
|
||||||
|
* p-lang.h (pascal_parse): Delete declaration.
|
||||||
|
(pascal_is_string_type): Declare.
|
||||||
|
(pascal_print_type): Delete declaration.
|
||||||
|
(pascal_print_typedef): Delete declaration.
|
||||||
|
(pascal_value_print_inner): Delete declaration.
|
||||||
|
(pascal_value_print): Delete declaration.
|
||||||
|
(pascal_type_print_method_args): Delete declaration.
|
||||||
|
(is_pascal_string_type): Delete declaration.
|
||||||
|
(pascal_printchar): Delete declaration.
|
||||||
|
(pascal_builtin_types): Delete declaration.
|
||||||
|
(pascal_type_print_base): Delete declaration.
|
||||||
|
(pascal_type_print_varspec_prefix): Delete declaration.
|
||||||
|
(class pascal_language): Moved here from p-lang.c.
|
||||||
|
* p-typeprint.c (pascal_type_print_varspec_suffix): Delete
|
||||||
|
declaration.
|
||||||
|
(pascal_type_print_derivation_info): Delete declaration.
|
||||||
|
(pascal_print_type): Rename to...
|
||||||
|
(pascal_language::print_type): ...this. Update calls to member
|
||||||
|
functions.
|
||||||
|
(pascal_print_typedef): Rename to...
|
||||||
|
(pascal_language::print_typedef): ...this. Update calls to member
|
||||||
|
functions.
|
||||||
|
(pascal_type_print_derivation_info): Rename to...
|
||||||
|
(pascal_language::type_print_derivation_info): ...this.
|
||||||
|
(pascal_type_print_method_args): Rename to...
|
||||||
|
(pascal_language::type_print_method_args): ...this.
|
||||||
|
(pascal_type_print_varspec_prefix): Rename to...
|
||||||
|
(pascal_language::type_print_varspec_prefix): ...this. Update
|
||||||
|
calls to member functions.
|
||||||
|
(pascal_print_func_args): Rename to...
|
||||||
|
(pascal_language::print_func_args): ...this. Update calls to
|
||||||
|
member functions.
|
||||||
|
(pascal_type_print_func_varspec_suffix): Rename to...
|
||||||
|
(pascal_language::type_print_func_varspec_suffix): ...this.
|
||||||
|
Update calls to member functions.
|
||||||
|
(pascal_type_print_varspec_suffix): Rename to...
|
||||||
|
(pascal_language::type_print_varspec_suffix): ...this. Update
|
||||||
|
calls to member functions.
|
||||||
|
(pascal_type_print_base): Rename to...
|
||||||
|
(pascal_language::type_print_base): ...this. Update calls to
|
||||||
|
member functions.
|
||||||
|
* p-valprint.c (pascal_value_print_inner): Rename to...
|
||||||
|
(pascal_language::value_print_inner): ...this. Update calls to
|
||||||
|
member functions.
|
||||||
|
(pascal_value_print): Rename to...
|
||||||
|
(pascal_language::value_print): ...this. Update calls to member
|
||||||
|
functions.
|
||||||
|
|
||||||
2020-12-23 Andrew Burgess <andrew.burgess@embecosm.com>
|
2020-12-23 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||||
|
|
||||||
* go-exp.y (go_parse): Rename to...
|
* go-exp.y (go_parse): Rename to...
|
||||||
|
@ -301,9 +301,8 @@ exp : field_exp COMPLETE
|
|||||||
exp : exp '['
|
exp : exp '['
|
||||||
/* We need to save the current_type value. */
|
/* We need to save the current_type value. */
|
||||||
{ const char *arrayname;
|
{ const char *arrayname;
|
||||||
int arrayfieldindex;
|
int arrayfieldindex
|
||||||
arrayfieldindex = is_pascal_string_type (
|
= pascal_is_string_type (current_type, NULL, NULL,
|
||||||
current_type, NULL, NULL,
|
|
||||||
NULL, NULL, &arrayname);
|
NULL, NULL, &arrayname);
|
||||||
if (arrayfieldindex)
|
if (arrayfieldindex)
|
||||||
{
|
{
|
||||||
@ -1727,8 +1726,10 @@ yylex (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
int
|
int
|
||||||
pascal_parse (struct parser_state *par_state)
|
pascal_language::parser (struct parser_state *par_state) const
|
||||||
{
|
{
|
||||||
/* Setting up the parser state. */
|
/* Setting up the parser state. */
|
||||||
scoped_restore pstate_restore = make_scoped_restore (&pstate);
|
scoped_restore pstate_restore = make_scoped_restore (&pstate);
|
||||||
|
172
gdb/p-lang.c
172
gdb/p-lang.c
@ -84,20 +84,11 @@ pascal_main_name (void)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determines if type TYPE is a pascal string type.
|
/* See p-lang.h. */
|
||||||
Returns a positive value if the type is a known pascal string type.
|
|
||||||
This function is used by p-valprint.c code to allow better string display.
|
|
||||||
If it is a pascal string type, then it also sets info needed
|
|
||||||
to get the length and the data of the string
|
|
||||||
length_pos, length_size and string_pos are given in bytes.
|
|
||||||
char_size gives the element size in bytes.
|
|
||||||
FIXME: if the position or the size of these fields
|
|
||||||
are not multiple of TARGET_CHAR_BIT then the results are wrong
|
|
||||||
but this does not happen for Free Pascal nor for GPC. */
|
|
||||||
int
|
int
|
||||||
is_pascal_string_type (struct type *type,int *length_pos,
|
pascal_is_string_type (struct type *type,int *length_pos, int *length_size,
|
||||||
int *length_size, int *string_pos,
|
int *string_pos, struct type **char_type,
|
||||||
struct type **char_type,
|
|
||||||
const char **arrayname)
|
const char **arrayname)
|
||||||
{
|
{
|
||||||
if (type != NULL && type->code () == TYPE_CODE_STRUCT)
|
if (type != NULL && type->code () == TYPE_CODE_STRUCT)
|
||||||
@ -152,14 +143,11 @@ is_pascal_string_type (struct type *type,int *length_pos,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pascal_one_char (int, struct ui_file *, int *);
|
/* See p-lang.h. */
|
||||||
|
|
||||||
/* Print the character C on STREAM as part of the contents of a literal
|
void
|
||||||
string.
|
pascal_language::print_one_char (int c, struct ui_file *stream,
|
||||||
In_quotes is reset to 0 if a char is written with #4 notation. */
|
int *in_quotes) const
|
||||||
|
|
||||||
static void
|
|
||||||
pascal_one_char (int c, struct ui_file *stream, int *in_quotes)
|
|
||||||
{
|
{
|
||||||
if (c == '\'' || ((unsigned int) c <= 0xff && (PRINT_LITERAL_FORM (c))))
|
if (c == '\'' || ((unsigned int) c <= 0xff && (PRINT_LITERAL_FORM (c))))
|
||||||
{
|
{
|
||||||
@ -182,12 +170,15 @@ pascal_one_char (int c, struct ui_file *stream, int *in_quotes)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
void
|
void
|
||||||
pascal_printchar (int c, struct type *type, struct ui_file *stream)
|
pascal_language::printchar (int c, struct type *type,
|
||||||
|
struct ui_file *stream) const
|
||||||
{
|
{
|
||||||
int in_quotes = 0;
|
int in_quotes = 0;
|
||||||
|
|
||||||
pascal_one_char (c, stream, &in_quotes);
|
print_one_char (c, stream, &in_quotes);
|
||||||
if (in_quotes)
|
if (in_quotes)
|
||||||
fputs_filtered ("'", stream);
|
fputs_filtered ("'", stream);
|
||||||
}
|
}
|
||||||
@ -197,7 +188,7 @@ pascal_printchar (int c, struct type *type, struct ui_file *stream)
|
|||||||
/* Table mapping opcodes into strings for printing operators
|
/* Table mapping opcodes into strings for printing operators
|
||||||
and precedences of the operators. */
|
and precedences of the operators. */
|
||||||
|
|
||||||
const struct op_print pascal_op_print_tab[] =
|
const struct op_print pascal_language::op_print_tab[] =
|
||||||
{
|
{
|
||||||
{",", BINOP_COMMA, PREC_COMMA, 0},
|
{",", BINOP_COMMA, PREC_COMMA, 0},
|
||||||
{":=", BINOP_ASSIGN, PREC_ASSIGN, 1},
|
{":=", BINOP_ASSIGN, PREC_ASSIGN, 1},
|
||||||
@ -228,38 +219,11 @@ const struct op_print pascal_op_print_tab[] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Class representing the Pascal language. */
|
/* See language.h. */
|
||||||
|
|
||||||
class pascal_language : public language_defn
|
void pascal_language::language_arch_info
|
||||||
|
(struct gdbarch *gdbarch, struct language_arch_info *lai) const
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
pascal_language ()
|
|
||||||
: language_defn (language_pascal)
|
|
||||||
{ /* Nothing. */ }
|
|
||||||
|
|
||||||
/* See language.h. */
|
|
||||||
|
|
||||||
const char *name () const override
|
|
||||||
{ return "pascal"; }
|
|
||||||
|
|
||||||
/* See language.h. */
|
|
||||||
|
|
||||||
const char *natural_name () const override
|
|
||||||
{ return "Pascal"; }
|
|
||||||
|
|
||||||
/* See language.h. */
|
|
||||||
|
|
||||||
const std::vector<const char *> &filename_extensions () const override
|
|
||||||
{
|
|
||||||
static const std::vector<const char *> extensions
|
|
||||||
= { ".pas", ".p", ".pp" };
|
|
||||||
return extensions;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See language.h. */
|
|
||||||
void language_arch_info (struct gdbarch *gdbarch,
|
|
||||||
struct language_arch_info *lai) const override
|
|
||||||
{
|
|
||||||
const struct builtin_type *builtin = builtin_type (gdbarch);
|
const struct builtin_type *builtin = builtin_type (gdbarch);
|
||||||
|
|
||||||
/* Helper function to allow shorter lines below. */
|
/* Helper function to allow shorter lines below. */
|
||||||
@ -288,68 +252,16 @@ public:
|
|||||||
|
|
||||||
lai->set_string_char_type (builtin->builtin_char);
|
lai->set_string_char_type (builtin->builtin_char);
|
||||||
lai->set_bool_type (builtin->builtin_bool, "boolean");
|
lai->set_bool_type (builtin->builtin_bool, "boolean");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See language.h. */
|
/* See language.h. */
|
||||||
|
|
||||||
void print_type (struct type *type, const char *varstring,
|
void
|
||||||
struct ui_file *stream, int show, int level,
|
pascal_language::printstr (struct ui_file *stream, struct type *elttype,
|
||||||
const struct type_print_options *flags) const override
|
|
||||||
{
|
|
||||||
pascal_print_type (type, varstring, stream, show, level, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See language.h. */
|
|
||||||
|
|
||||||
void value_print (struct value *val, struct ui_file *stream,
|
|
||||||
const struct value_print_options *options) const override
|
|
||||||
{
|
|
||||||
return pascal_value_print (val, stream, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See language.h. */
|
|
||||||
|
|
||||||
void value_print_inner
|
|
||||||
(struct value *val, struct ui_file *stream, int recurse,
|
|
||||||
const struct value_print_options *options) const override
|
|
||||||
{
|
|
||||||
return pascal_value_print_inner (val, stream, recurse, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See language.h. */
|
|
||||||
|
|
||||||
int parser (struct parser_state *ps) const override
|
|
||||||
{
|
|
||||||
return pascal_parse (ps);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See language.h. */
|
|
||||||
|
|
||||||
void emitchar (int ch, struct type *chtype,
|
|
||||||
struct ui_file *stream, int quoter) const override
|
|
||||||
{
|
|
||||||
int in_quotes = 0;
|
|
||||||
|
|
||||||
pascal_one_char (ch, stream, &in_quotes);
|
|
||||||
if (in_quotes)
|
|
||||||
fputs_filtered ("'", stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See language.h. */
|
|
||||||
|
|
||||||
void printchar (int ch, struct type *chtype,
|
|
||||||
struct ui_file *stream) const override
|
|
||||||
{
|
|
||||||
pascal_printchar (ch, chtype, stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See language.h. */
|
|
||||||
|
|
||||||
void printstr (struct ui_file *stream, struct type *elttype,
|
|
||||||
const gdb_byte *string, unsigned int length,
|
const gdb_byte *string, unsigned int length,
|
||||||
const char *encoding, int force_ellipses,
|
const char *encoding, int force_ellipses,
|
||||||
const struct value_print_options *options) const override
|
const struct value_print_options *options) const
|
||||||
{
|
{
|
||||||
enum bfd_endian byte_order = type_byte_order (elttype);
|
enum bfd_endian byte_order = type_byte_order (elttype);
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int things_printed = 0;
|
unsigned int things_printed = 0;
|
||||||
@ -412,7 +324,7 @@ public:
|
|||||||
fputs_filtered ("', ", stream);
|
fputs_filtered ("', ", stream);
|
||||||
in_quotes = 0;
|
in_quotes = 0;
|
||||||
}
|
}
|
||||||
pascal_printchar (current_char, elttype, stream);
|
printchar (current_char, elttype, stream);
|
||||||
fprintf_filtered (stream, " %p[<repeats %u times>%p]",
|
fprintf_filtered (stream, " %p[<repeats %u times>%p]",
|
||||||
metadata_style.style ().ptr (),
|
metadata_style.style ().ptr (),
|
||||||
reps, nullptr);
|
reps, nullptr);
|
||||||
@ -427,7 +339,7 @@ public:
|
|||||||
fputs_filtered ("'", stream);
|
fputs_filtered ("'", stream);
|
||||||
in_quotes = 1;
|
in_quotes = 1;
|
||||||
}
|
}
|
||||||
pascal_one_char (current_char, stream, &in_quotes);
|
print_one_char (current_char, stream, &in_quotes);
|
||||||
++things_printed;
|
++things_printed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -438,39 +350,7 @@ public:
|
|||||||
|
|
||||||
if (force_ellipses || i < length)
|
if (force_ellipses || i < length)
|
||||||
fputs_filtered ("...", stream);
|
fputs_filtered ("...", stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See language.h. */
|
|
||||||
|
|
||||||
void print_typedef (struct type *type, struct symbol *new_symbol,
|
|
||||||
struct ui_file *stream) const override
|
|
||||||
{
|
|
||||||
pascal_print_typedef (type, new_symbol, stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See language.h. */
|
|
||||||
|
|
||||||
bool is_string_type_p (struct type *type) const override
|
|
||||||
{
|
|
||||||
return is_pascal_string_type (type, nullptr, nullptr, nullptr,
|
|
||||||
nullptr, nullptr) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See language.h. */
|
|
||||||
|
|
||||||
const char *name_of_this () const override
|
|
||||||
{ return "this"; }
|
|
||||||
|
|
||||||
/* See language.h. */
|
|
||||||
|
|
||||||
bool range_checking_on_by_default () const override
|
|
||||||
{ return true; }
|
|
||||||
|
|
||||||
/* See language.h. */
|
|
||||||
|
|
||||||
const struct op_print *opcode_print_table () const override
|
|
||||||
{ return pascal_op_print_tab; }
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Single instance of the Pascal language class. */
|
/* Single instance of the Pascal language class. */
|
||||||
|
|
||||||
|
261
gdb/p-lang.h
261
gdb/p-lang.h
@ -25,51 +25,240 @@
|
|||||||
struct value;
|
struct value;
|
||||||
struct parser_state;
|
struct parser_state;
|
||||||
|
|
||||||
|
/* Determines if type TYPE is a pascal string type. Returns a positive
|
||||||
|
value if the type is a known pascal string type. This function is used
|
||||||
|
by p-valprint.c code to allow better string display. If it is a pascal
|
||||||
|
string type, then it also sets info needed to get the length and the
|
||||||
|
data of the string length_pos, length_size and string_pos are given in
|
||||||
|
bytes. char_size gives the element size in bytes. FIXME: if the
|
||||||
|
position or the size of these fields are not multiple of TARGET_CHAR_BIT
|
||||||
|
then the results are wrong but this does not happen for Free Pascal nor
|
||||||
|
for GPC. */
|
||||||
|
|
||||||
|
extern int pascal_is_string_type (struct type *type,int *length_pos,
|
||||||
|
int *length_size, int *string_pos,
|
||||||
|
struct type **char_type,
|
||||||
|
const char **arrayname);
|
||||||
|
|
||||||
/* Defined in p-lang.c */
|
/* Defined in p-lang.c */
|
||||||
|
|
||||||
extern const char *pascal_main_name (void);
|
extern const char *pascal_main_name (void);
|
||||||
|
|
||||||
extern int pascal_parse (struct parser_state *); /* Defined in p-exp.y */
|
|
||||||
|
|
||||||
/* Defined in p-typeprint.c */
|
|
||||||
extern void pascal_print_type (struct type *, const char *, struct ui_file *,
|
|
||||||
int, int, const struct type_print_options *);
|
|
||||||
|
|
||||||
extern void pascal_print_typedef (struct type *, struct symbol *,
|
|
||||||
struct ui_file *);
|
|
||||||
|
|
||||||
/* Implement la_value_print_inner for Pascal. */
|
|
||||||
|
|
||||||
extern void pascal_value_print_inner (struct value *, struct ui_file *, int,
|
|
||||||
const struct value_print_options *);
|
|
||||||
|
|
||||||
extern void pascal_value_print (struct value *, struct ui_file *,
|
|
||||||
const struct value_print_options *);
|
|
||||||
|
|
||||||
extern void pascal_type_print_method_args (const char *, const char *,
|
|
||||||
struct ui_file *);
|
|
||||||
|
|
||||||
/* These are in p-lang.c: */
|
/* These are in p-lang.c: */
|
||||||
|
|
||||||
extern int
|
extern int is_pascal_string_type (struct type *, int *, int *, int *,
|
||||||
is_pascal_string_type (struct type *, int *, int *, int *,
|
|
||||||
struct type **, const char **);
|
struct type **, const char **);
|
||||||
|
|
||||||
extern void pascal_printchar (int, struct type *, struct ui_file *);
|
|
||||||
|
|
||||||
extern struct type **const pascal_builtin_types[];
|
|
||||||
|
|
||||||
/* These are in p-typeprint.c: */
|
|
||||||
|
|
||||||
extern void
|
|
||||||
pascal_type_print_base (struct type *, struct ui_file *, int, int,
|
|
||||||
const struct type_print_options *);
|
|
||||||
|
|
||||||
extern void
|
|
||||||
pascal_type_print_varspec_prefix (struct type *, struct ui_file *, int, int,
|
|
||||||
const struct type_print_options *);
|
|
||||||
|
|
||||||
extern int pascal_object_is_vtbl_ptr_type (struct type *);
|
extern int pascal_object_is_vtbl_ptr_type (struct type *);
|
||||||
|
|
||||||
extern int pascal_object_is_vtbl_member (struct type *);
|
extern int pascal_object_is_vtbl_member (struct type *);
|
||||||
|
|
||||||
|
/* Class representing the Pascal language. */
|
||||||
|
|
||||||
|
class pascal_language : public language_defn
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
pascal_language ()
|
||||||
|
: language_defn (language_pascal)
|
||||||
|
{ /* Nothing. */ }
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
|
const char *name () const override
|
||||||
|
{ return "pascal"; }
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
|
const char *natural_name () const override
|
||||||
|
{ return "Pascal"; }
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
|
const std::vector<const char *> &filename_extensions () const override
|
||||||
|
{
|
||||||
|
static const std::vector<const char *> extensions
|
||||||
|
= { ".pas", ".p", ".pp" };
|
||||||
|
return extensions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
|
void language_arch_info (struct gdbarch *gdbarch,
|
||||||
|
struct language_arch_info *lai) const override;
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
|
void print_type (struct type *type, const char *varstring,
|
||||||
|
struct ui_file *stream, int show, int level,
|
||||||
|
const struct type_print_options *flags) const override;
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
|
void value_print (struct value *val, struct ui_file *stream,
|
||||||
|
const struct value_print_options *options) const override;
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
|
void value_print_inner
|
||||||
|
(struct value *val, struct ui_file *stream, int recurse,
|
||||||
|
const struct value_print_options *options) const override;
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
|
int parser (struct parser_state *ps) const override;
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
|
void emitchar (int ch, struct type *chtype,
|
||||||
|
struct ui_file *stream, int quoter) const override
|
||||||
|
{
|
||||||
|
int in_quotes = 0;
|
||||||
|
|
||||||
|
print_one_char (ch, stream, &in_quotes);
|
||||||
|
if (in_quotes)
|
||||||
|
fputs_filtered ("'", stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
|
void printchar (int ch, struct type *chtype,
|
||||||
|
struct ui_file *stream) const override;
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
|
void printstr (struct ui_file *stream, struct type *elttype,
|
||||||
|
const gdb_byte *string, unsigned int length,
|
||||||
|
const char *encoding, int force_ellipses,
|
||||||
|
const struct value_print_options *options) const override;
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
|
void print_typedef (struct type *type, struct symbol *new_symbol,
|
||||||
|
struct ui_file *stream) const override;
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
|
bool is_string_type_p (struct type *type) const override
|
||||||
|
{
|
||||||
|
return pascal_is_string_type(type, nullptr, nullptr, nullptr,
|
||||||
|
nullptr, nullptr) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
|
const char *name_of_this () const override
|
||||||
|
{ return "this"; }
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
|
bool range_checking_on_by_default () const override
|
||||||
|
{ return true; }
|
||||||
|
|
||||||
|
/* See language.h. */
|
||||||
|
|
||||||
|
const struct op_print *opcode_print_table () const override
|
||||||
|
{ return op_print_tab; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
/* Table of opcode data for use by OPCODE_PRINT_TABLE member function. */
|
||||||
|
|
||||||
|
static const struct op_print op_print_tab[];
|
||||||
|
|
||||||
|
/* Print the character C on STREAM as part of the contents of a literal
|
||||||
|
string. IN_QUOTES is reset to 0 if a char is written with #4 notation. */
|
||||||
|
|
||||||
|
void print_one_char (int c, struct ui_file *stream, int *in_quotes) const;
|
||||||
|
|
||||||
|
/* Print the name of the type (or the ultimate pointer target,
|
||||||
|
function value or array element), or the description of a
|
||||||
|
structure or union.
|
||||||
|
|
||||||
|
SHOW positive means print details about the type (e.g. enum values),
|
||||||
|
and print structure elements passing SHOW - 1 for show. SHOW negative
|
||||||
|
means just print the type name or struct tag if there is one. If
|
||||||
|
there is no name, print something sensible but concise like "struct
|
||||||
|
{...}".
|
||||||
|
SHOW zero means just print the type name or struct tag if there is one.
|
||||||
|
If there is no name, print something sensible but not as concise like
|
||||||
|
"struct {int x; int y;}".
|
||||||
|
|
||||||
|
LEVEL is the number of spaces to indent by.
|
||||||
|
We increase it for some recursive calls. */
|
||||||
|
|
||||||
|
void type_print_base (struct type *type, struct ui_file *stream, int show,
|
||||||
|
int level,
|
||||||
|
const struct type_print_options *flags) const;
|
||||||
|
|
||||||
|
|
||||||
|
/* Print any array sizes, function arguments or close parentheses
|
||||||
|
needed after the variable name (to describe its type).
|
||||||
|
Args work like pascal_type_print_varspec_prefix. */
|
||||||
|
|
||||||
|
void type_print_varspec_suffix (struct type *type, struct ui_file *stream,
|
||||||
|
int show, int passed_a_ptr,
|
||||||
|
int demangled_args,
|
||||||
|
const struct type_print_options *flags) const;
|
||||||
|
|
||||||
|
/* Helper for pascal_language::type_print_varspec_suffix to print the
|
||||||
|
suffix of a function or method. */
|
||||||
|
|
||||||
|
void type_print_func_varspec_suffix
|
||||||
|
(struct type *type, struct ui_file *stream, int show,
|
||||||
|
int passed_a_ptr, int demangled_args,
|
||||||
|
const struct type_print_options *flags) const;
|
||||||
|
|
||||||
|
/* Print any asterisks or open-parentheses needed before the
|
||||||
|
variable name (to describe its type).
|
||||||
|
|
||||||
|
On outermost call, pass 0 for PASSED_A_PTR.
|
||||||
|
On outermost call, SHOW > 0 means should ignore
|
||||||
|
any typename for TYPE and show its details.
|
||||||
|
SHOW is always zero on recursive calls. */
|
||||||
|
|
||||||
|
void type_print_varspec_prefix
|
||||||
|
(struct type *type, struct ui_file *stream, int show,
|
||||||
|
int passed_a_ptr, const struct type_print_options *flags) const;
|
||||||
|
|
||||||
|
/* Print the function args from TYPE (a TYPE_CODE_FUNC) to STREAM taking
|
||||||
|
FLAGS into account where appropriate. */
|
||||||
|
|
||||||
|
void print_func_args (struct type *type, struct ui_file *stream,
|
||||||
|
const struct type_print_options *flags) const;
|
||||||
|
|
||||||
|
/* Print the Pascal method arguments for PHYSNAME and METHODNAME to the
|
||||||
|
file STREAM. */
|
||||||
|
|
||||||
|
void type_print_method_args (const char *physname, const char *methodname,
|
||||||
|
struct ui_file *stream) const;
|
||||||
|
|
||||||
|
/* If TYPE is a derived type, then print out derivation information.
|
||||||
|
Print only the actual base classes of this type, not the base classes
|
||||||
|
of the base classes. I.e. for the derivation hierarchy:
|
||||||
|
|
||||||
|
class A { int a; };
|
||||||
|
class B : public A {int b; };
|
||||||
|
class C : public B {int c; };
|
||||||
|
|
||||||
|
Print the type of class C as:
|
||||||
|
|
||||||
|
class C : public B {
|
||||||
|
int c;
|
||||||
|
}
|
||||||
|
|
||||||
|
Not as the following (like gdb used to), which is not legal C++ syntax
|
||||||
|
for derived types and may be confused with the multiple inheritance
|
||||||
|
form:
|
||||||
|
|
||||||
|
class C : public B : public A {
|
||||||
|
int c;
|
||||||
|
}
|
||||||
|
|
||||||
|
In general, gdb should try to print the types as closely as possible
|
||||||
|
to the form that they appear in the source code. */
|
||||||
|
|
||||||
|
void type_print_derivation_info (struct ui_file *stream,
|
||||||
|
struct type *type) const;
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* P_LANG_H */
|
#endif /* P_LANG_H */
|
||||||
|
@ -34,21 +34,12 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include "cli/cli-style.h"
|
#include "cli/cli-style.h"
|
||||||
|
|
||||||
static void pascal_type_print_varspec_suffix (struct type *, struct ui_file *,
|
/* See language.h. */
|
||||||
int, int, int,
|
|
||||||
const struct type_print_options *);
|
|
||||||
|
|
||||||
static void pascal_type_print_derivation_info (struct ui_file *,
|
|
||||||
struct type *);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* LEVEL is the depth to indent lines by. */
|
|
||||||
|
|
||||||
void
|
void
|
||||||
pascal_print_type (struct type *type, const char *varstring,
|
pascal_language::print_type (struct type *type, const char *varstring,
|
||||||
struct ui_file *stream, int show, int level,
|
struct ui_file *stream, int show, int level,
|
||||||
const struct type_print_options *flags)
|
const struct type_print_options *flags) const
|
||||||
{
|
{
|
||||||
enum type_code code;
|
enum type_code code;
|
||||||
int demangled_args;
|
int demangled_args;
|
||||||
@ -61,7 +52,7 @@ pascal_print_type (struct type *type, const char *varstring,
|
|||||||
if ((code == TYPE_CODE_FUNC
|
if ((code == TYPE_CODE_FUNC
|
||||||
|| code == TYPE_CODE_METHOD))
|
|| code == TYPE_CODE_METHOD))
|
||||||
{
|
{
|
||||||
pascal_type_print_varspec_prefix (type, stream, show, 0, flags);
|
type_print_varspec_prefix (type, stream, show, 0, flags);
|
||||||
}
|
}
|
||||||
/* first the name */
|
/* first the name */
|
||||||
fputs_filtered (varstring, stream);
|
fputs_filtered (varstring, stream);
|
||||||
@ -76,26 +67,24 @@ pascal_print_type (struct type *type, const char *varstring,
|
|||||||
if (!(code == TYPE_CODE_FUNC
|
if (!(code == TYPE_CODE_FUNC
|
||||||
|| code == TYPE_CODE_METHOD))
|
|| code == TYPE_CODE_METHOD))
|
||||||
{
|
{
|
||||||
pascal_type_print_varspec_prefix (type, stream, show, 0, flags);
|
type_print_varspec_prefix (type, stream, show, 0, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
pascal_type_print_base (type, stream, show, level, flags);
|
type_print_base (type, stream, show, level, flags);
|
||||||
/* For demangled function names, we have the arglist as part of the name,
|
/* 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 = varstring ? strchr (varstring, '(') != NULL : 0;
|
demangled_args = varstring ? strchr (varstring, '(') != NULL : 0;
|
||||||
pascal_type_print_varspec_suffix (type, stream, show, 0, demangled_args,
|
type_print_varspec_suffix (type, stream, show, 0, demangled_args,
|
||||||
flags);
|
flags);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print a typedef using Pascal syntax. TYPE is the underlying type.
|
/* See language.h. */
|
||||||
NEW_SYMBOL is the symbol naming the type. STREAM is the stream on
|
|
||||||
which to print. */
|
|
||||||
|
|
||||||
void
|
void
|
||||||
pascal_print_typedef (struct type *type, struct symbol *new_symbol,
|
pascal_language::print_typedef (struct type *type, struct symbol *new_symbol,
|
||||||
struct ui_file *stream)
|
struct ui_file *stream) const
|
||||||
{
|
{
|
||||||
type = check_typedef (type);
|
type = check_typedef (type);
|
||||||
fprintf_filtered (stream, "type ");
|
fprintf_filtered (stream, "type ");
|
||||||
@ -104,32 +93,11 @@ pascal_print_typedef (struct type *type, struct symbol *new_symbol,
|
|||||||
fprintf_filtered (stream, ";");
|
fprintf_filtered (stream, ";");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If TYPE is a derived type, then print out derivation information.
|
/* See p-lang.h. */
|
||||||
Print only the actual base classes of this type, not the base classes
|
|
||||||
of the base classes. I.e. for the derivation hierarchy:
|
|
||||||
|
|
||||||
class A { int a; };
|
void
|
||||||
class B : public A {int b; };
|
pascal_language::type_print_derivation_info (struct ui_file *stream,
|
||||||
class C : public B {int c; };
|
struct type *type) const
|
||||||
|
|
||||||
Print the type of class C as:
|
|
||||||
|
|
||||||
class C : public B {
|
|
||||||
int c;
|
|
||||||
}
|
|
||||||
|
|
||||||
Not as the following (like gdb used to), which is not legal C++ syntax for
|
|
||||||
derived types and may be confused with the multiple inheritance form:
|
|
||||||
|
|
||||||
class C : public B : public A {
|
|
||||||
int c;
|
|
||||||
}
|
|
||||||
|
|
||||||
In general, gdb should try to print the types as closely as possible to
|
|
||||||
the form that they appear in the source code. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
pascal_type_print_derivation_info (struct ui_file *stream, struct type *type)
|
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
int i;
|
int i;
|
||||||
@ -149,11 +117,12 @@ pascal_type_print_derivation_info (struct ui_file *stream, struct type *type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print the Pascal method arguments ARGS to the file STREAM. */
|
/* See p-lang.h. */
|
||||||
|
|
||||||
void
|
void
|
||||||
pascal_type_print_method_args (const char *physname, const char *methodname,
|
pascal_language::type_print_method_args (const char *physname,
|
||||||
struct ui_file *stream)
|
const char *methodname,
|
||||||
|
struct ui_file *stream) const
|
||||||
{
|
{
|
||||||
int is_constructor = (startswith (physname, "__ct__"));
|
int is_constructor = (startswith (physname, "__ct__"));
|
||||||
int is_destructor = (startswith (physname, "__dt__"));
|
int is_destructor = (startswith (physname, "__dt__"));
|
||||||
@ -195,18 +164,13 @@ pascal_type_print_method_args (const char *physname, const char *methodname,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print any asterisks or open-parentheses needed before the
|
/* See p-lang.h. */
|
||||||
variable name (to describe its type).
|
|
||||||
|
|
||||||
On outermost call, pass 0 for PASSED_A_PTR.
|
|
||||||
On outermost call, SHOW > 0 means should ignore
|
|
||||||
any typename for TYPE and show its details.
|
|
||||||
SHOW is always zero on recursive calls. */
|
|
||||||
|
|
||||||
void
|
void
|
||||||
pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
|
pascal_language::type_print_varspec_prefix (struct type *type,
|
||||||
|
struct ui_file *stream,
|
||||||
int show, int passed_a_ptr,
|
int show, int passed_a_ptr,
|
||||||
const struct type_print_options *flags)
|
const struct type_print_options *flags) const
|
||||||
{
|
{
|
||||||
if (type == 0)
|
if (type == 0)
|
||||||
return;
|
return;
|
||||||
@ -220,7 +184,7 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
|
|||||||
{
|
{
|
||||||
case TYPE_CODE_PTR:
|
case TYPE_CODE_PTR:
|
||||||
fprintf_filtered (stream, "^");
|
fprintf_filtered (stream, "^");
|
||||||
pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1,
|
type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1,
|
||||||
flags);
|
flags);
|
||||||
break; /* Pointer should be handled normally
|
break; /* Pointer should be handled normally
|
||||||
in pascal. */
|
in pascal. */
|
||||||
@ -241,14 +205,14 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
|
|||||||
if (passed_a_ptr)
|
if (passed_a_ptr)
|
||||||
{
|
{
|
||||||
fprintf_filtered (stream, " ");
|
fprintf_filtered (stream, " ");
|
||||||
pascal_type_print_base (TYPE_SELF_TYPE (type),
|
type_print_base (TYPE_SELF_TYPE (type),
|
||||||
stream, 0, passed_a_ptr, flags);
|
stream, 0, passed_a_ptr, flags);
|
||||||
fprintf_filtered (stream, "::");
|
fprintf_filtered (stream, "::");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_CODE_REF:
|
case TYPE_CODE_REF:
|
||||||
pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1,
|
type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1,
|
||||||
flags);
|
flags);
|
||||||
fprintf_filtered (stream, "&");
|
fprintf_filtered (stream, "&");
|
||||||
break;
|
break;
|
||||||
@ -301,14 +265,16 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
|
|||||||
gcc -Wall will reveal any types that haven't been handled. */
|
gcc -Wall will reveal any types that haven't been handled. */
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
error (_("type not handled in pascal_type_print_varspec_prefix()"));
|
gdb_assert_not_reached ("unexpected type");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
/* See p-lang.h. */
|
||||||
pascal_print_func_args (struct type *type, struct ui_file *stream,
|
|
||||||
const struct type_print_options *flags)
|
void
|
||||||
|
pascal_language::print_func_args (struct type *type, struct ui_file *stream,
|
||||||
|
const struct type_print_options *flags) const
|
||||||
{
|
{
|
||||||
int i, len = type->num_fields ();
|
int i, len = type->num_fields ();
|
||||||
|
|
||||||
@ -328,7 +294,7 @@ pascal_print_func_args (struct type *type, struct ui_file *stream,
|
|||||||
{
|
{
|
||||||
fprintf_filtered (stream, "var ");
|
fprintf_filtered (stream, "var ");
|
||||||
} */
|
} */
|
||||||
pascal_print_type (type->field (i).type (), "" /* TYPE_FIELD_NAME
|
print_type (type->field (i).type (), "" /* TYPE_FIELD_NAME
|
||||||
seems invalid! */
|
seems invalid! */
|
||||||
,stream, -1, 0, flags);
|
,stream, -1, 0, flags);
|
||||||
}
|
}
|
||||||
@ -338,42 +304,41 @@ pascal_print_func_args (struct type *type, struct ui_file *stream,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper for pascal_type_print_varspec_suffix to print the suffix of
|
/* See p-lang.h. */
|
||||||
a function or method. */
|
|
||||||
|
|
||||||
static void
|
void
|
||||||
pascal_type_print_func_varspec_suffix (struct type *type, struct ui_file *stream,
|
pascal_language::type_print_func_varspec_suffix (struct type *type,
|
||||||
|
struct ui_file *stream,
|
||||||
int show, int passed_a_ptr,
|
int show, int passed_a_ptr,
|
||||||
int demangled_args,
|
int demangled_args,
|
||||||
const struct type_print_options *flags)
|
const struct type_print_options *flags) const
|
||||||
{
|
{
|
||||||
if (TYPE_TARGET_TYPE (type) == NULL
|
if (TYPE_TARGET_TYPE (type) == NULL
|
||||||
|| TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID)
|
|| TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID)
|
||||||
{
|
{
|
||||||
fprintf_filtered (stream, " : ");
|
fprintf_filtered (stream, " : ");
|
||||||
pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type),
|
type_print_varspec_prefix (TYPE_TARGET_TYPE (type),
|
||||||
stream, 0, 0, flags);
|
stream, 0, 0, flags);
|
||||||
|
|
||||||
if (TYPE_TARGET_TYPE (type) == NULL)
|
if (TYPE_TARGET_TYPE (type) == NULL)
|
||||||
type_print_unknown_return_type (stream);
|
type_print_unknown_return_type (stream);
|
||||||
else
|
else
|
||||||
pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0,
|
type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0,
|
||||||
flags);
|
flags);
|
||||||
|
|
||||||
pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
|
type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
|
||||||
passed_a_ptr, 0, flags);
|
passed_a_ptr, 0, flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print any array sizes, function arguments or close parentheses
|
/* See p-lang.h. */
|
||||||
needed after the variable name (to describe its type).
|
|
||||||
Args work like pascal_type_print_varspec_prefix. */
|
|
||||||
|
|
||||||
static void
|
void
|
||||||
pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
|
pascal_language::type_print_varspec_suffix (struct type *type,
|
||||||
|
struct ui_file *stream,
|
||||||
int show, int passed_a_ptr,
|
int show, int passed_a_ptr,
|
||||||
int demangled_args,
|
int demangled_args,
|
||||||
const struct type_print_options *flags)
|
const struct type_print_options *flags) const
|
||||||
{
|
{
|
||||||
if (type == 0)
|
if (type == 0)
|
||||||
return;
|
return;
|
||||||
@ -393,16 +358,14 @@ pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
|
|||||||
case TYPE_CODE_METHOD:
|
case TYPE_CODE_METHOD:
|
||||||
if (passed_a_ptr)
|
if (passed_a_ptr)
|
||||||
fprintf_filtered (stream, ")");
|
fprintf_filtered (stream, ")");
|
||||||
pascal_type_print_method_args ("",
|
type_print_method_args ("", "", stream);
|
||||||
"",
|
type_print_func_varspec_suffix (type, stream, show,
|
||||||
stream);
|
|
||||||
pascal_type_print_func_varspec_suffix (type, stream, show,
|
|
||||||
passed_a_ptr, 0, flags);
|
passed_a_ptr, 0, flags);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_CODE_PTR:
|
case TYPE_CODE_PTR:
|
||||||
case TYPE_CODE_REF:
|
case TYPE_CODE_REF:
|
||||||
pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type),
|
type_print_varspec_suffix (TYPE_TARGET_TYPE (type),
|
||||||
stream, 0, 1, 0, flags);
|
stream, 0, 1, 0, flags);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -410,8 +373,8 @@ pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
|
|||||||
if (passed_a_ptr)
|
if (passed_a_ptr)
|
||||||
fprintf_filtered (stream, ")");
|
fprintf_filtered (stream, ")");
|
||||||
if (!demangled_args)
|
if (!demangled_args)
|
||||||
pascal_print_func_args (type, stream, flags);
|
print_func_args (type, stream, flags);
|
||||||
pascal_type_print_func_varspec_suffix (type, stream, show,
|
type_print_func_varspec_suffix (type, stream, show,
|
||||||
passed_a_ptr, 0, flags);
|
passed_a_ptr, 0, flags);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -435,30 +398,16 @@ pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
|
|||||||
gcc -Wall will report types that may not have been considered. */
|
gcc -Wall will report types that may not have been considered. */
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
error (_("type not handled in pascal_type_print_varspec_suffix()"));
|
gdb_assert_not_reached ("unexpected type");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print the name of the type (or the ultimate pointer target,
|
/* See p-lang.h. */
|
||||||
function value or array element), or the description of a
|
|
||||||
structure or union.
|
|
||||||
|
|
||||||
SHOW positive means print details about the type (e.g. enum values),
|
|
||||||
and print structure elements passing SHOW - 1 for show.
|
|
||||||
SHOW negative means just print the type name or struct tag if there is one.
|
|
||||||
If there is no name, print something sensible but concise like
|
|
||||||
"struct {...}".
|
|
||||||
SHOW zero means just print the type name or struct tag if there is one.
|
|
||||||
If there is no name, print something sensible but not as concise like
|
|
||||||
"struct {int x; int y;}".
|
|
||||||
|
|
||||||
LEVEL is the number of spaces to indent by.
|
|
||||||
We increase it for some recursive calls. */
|
|
||||||
|
|
||||||
void
|
void
|
||||||
pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
|
pascal_language::type_print_base (struct type *type, struct ui_file *stream, int show,
|
||||||
int level, const struct type_print_options *flags)
|
int level, const struct type_print_options *flags) const
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int len;
|
int len;
|
||||||
@ -502,27 +451,16 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
|
|||||||
case TYPE_CODE_TYPEDEF:
|
case TYPE_CODE_TYPEDEF:
|
||||||
case TYPE_CODE_PTR:
|
case TYPE_CODE_PTR:
|
||||||
case TYPE_CODE_REF:
|
case TYPE_CODE_REF:
|
||||||
/* case TYPE_CODE_FUNC:
|
type_print_base (TYPE_TARGET_TYPE (type), stream, show, level,
|
||||||
case TYPE_CODE_METHOD: */
|
|
||||||
pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level,
|
|
||||||
flags);
|
flags);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_CODE_ARRAY:
|
case TYPE_CODE_ARRAY:
|
||||||
/* pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type),
|
print_type (TYPE_TARGET_TYPE (type), NULL, stream, 0, 0, flags);
|
||||||
stream, 0, 0);
|
|
||||||
pascal_type_print_base (TYPE_TARGET_TYPE (type),
|
|
||||||
stream, show, level);
|
|
||||||
pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type),
|
|
||||||
stream, 0, 0, 0); */
|
|
||||||
pascal_print_type (TYPE_TARGET_TYPE (type), NULL, stream, 0, 0, flags);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_CODE_FUNC:
|
case TYPE_CODE_FUNC:
|
||||||
case TYPE_CODE_METHOD:
|
case TYPE_CODE_METHOD:
|
||||||
/*
|
|
||||||
pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
|
|
||||||
only after args !! */
|
|
||||||
break;
|
break;
|
||||||
case TYPE_CODE_STRUCT:
|
case TYPE_CODE_STRUCT:
|
||||||
if (type->name () != NULL)
|
if (type->name () != NULL)
|
||||||
@ -558,7 +496,7 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
|
|||||||
}
|
}
|
||||||
else if (show > 0 || type->name () == NULL)
|
else if (show > 0 || type->name () == NULL)
|
||||||
{
|
{
|
||||||
pascal_type_print_derivation_info (stream, type);
|
type_print_derivation_info (stream, type);
|
||||||
|
|
||||||
fprintf_filtered (stream, "\n");
|
fprintf_filtered (stream, "\n");
|
||||||
if ((type->num_fields () == 0) && (TYPE_NFN_FIELDS (type) == 0))
|
if ((type->num_fields () == 0) && (TYPE_NFN_FIELDS (type) == 0))
|
||||||
@ -626,7 +564,7 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
|
|||||||
print_spaces_filtered (level + 4, stream);
|
print_spaces_filtered (level + 4, stream);
|
||||||
if (field_is_static (&type->field (i)))
|
if (field_is_static (&type->field (i)))
|
||||||
fprintf_filtered (stream, "static ");
|
fprintf_filtered (stream, "static ");
|
||||||
pascal_print_type (type->field (i).type (),
|
print_type (type->field (i).type (),
|
||||||
TYPE_FIELD_NAME (type, i),
|
TYPE_FIELD_NAME (type, i),
|
||||||
stream, show - 1, level + 4, flags);
|
stream, show - 1, level + 4, flags);
|
||||||
if (!field_is_static (&type->field (i))
|
if (!field_is_static (&type->field (i))
|
||||||
@ -725,9 +663,7 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
|
|||||||
}
|
}
|
||||||
/* This does not work, no idea why !! */
|
/* This does not work, no idea why !! */
|
||||||
|
|
||||||
pascal_type_print_method_args (physname,
|
type_print_method_args (physname, method_name, stream);
|
||||||
method_name,
|
|
||||||
stream);
|
|
||||||
|
|
||||||
if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) != 0
|
if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) != 0
|
||||||
&& TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE(f, j))->code () != TYPE_CODE_VOID)
|
&& TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE(f, j))->code () != TYPE_CODE_VOID)
|
||||||
@ -813,7 +749,7 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
|
|||||||
|
|
||||||
case TYPE_CODE_SET:
|
case TYPE_CODE_SET:
|
||||||
fputs_filtered ("set of ", stream);
|
fputs_filtered ("set of ", stream);
|
||||||
pascal_print_type (type->index_type (), "", stream,
|
print_type (type->index_type (), "", stream,
|
||||||
show - 1, level, flags);
|
show - 1, level, flags);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -64,9 +64,9 @@ static const struct generic_val_print_decorations p_decorations =
|
|||||||
/* See p-lang.h. */
|
/* See p-lang.h. */
|
||||||
|
|
||||||
void
|
void
|
||||||
pascal_value_print_inner (struct value *val, struct ui_file *stream,
|
pascal_language::value_print_inner (struct value *val,
|
||||||
int recurse,
|
struct ui_file *stream, int recurse,
|
||||||
const struct value_print_options *options)
|
const struct value_print_options *options) const
|
||||||
|
|
||||||
{
|
{
|
||||||
struct type *type = check_typedef (value_type (val));
|
struct type *type = check_typedef (value_type (val));
|
||||||
@ -200,8 +200,8 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
|
|||||||
as GDB does not recognize stabs pascal strings
|
as GDB does not recognize stabs pascal strings
|
||||||
Pascal strings are mapped to records
|
Pascal strings are mapped to records
|
||||||
with lowercase names PM. */
|
with lowercase names PM. */
|
||||||
if (is_pascal_string_type (elttype, &length_pos, &length_size,
|
if (pascal_is_string_type (elttype, &length_pos, &length_size,
|
||||||
&string_pos, &char_type, NULL)
|
&string_pos, &char_type, NULL) > 0
|
||||||
&& addr != 0)
|
&& addr != 0)
|
||||||
{
|
{
|
||||||
ULONGEST string_length;
|
ULONGEST string_length;
|
||||||
@ -313,8 +313,8 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (is_pascal_string_type (type, &length_pos, &length_size,
|
if (pascal_is_string_type (type, &length_pos, &length_size,
|
||||||
&string_pos, &char_type, NULL))
|
&string_pos, &char_type, NULL) > 0)
|
||||||
{
|
{
|
||||||
len = extract_unsigned_integer (valaddr + length_pos,
|
len = extract_unsigned_integer (valaddr + length_pos,
|
||||||
length_size, byte_order);
|
length_size, byte_order);
|
||||||
@ -402,8 +402,8 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
pascal_value_print (struct value *val, struct ui_file *stream,
|
pascal_language::value_print (struct value *val, struct ui_file *stream,
|
||||||
const struct value_print_options *options)
|
const struct value_print_options *options) const
|
||||||
{
|
{
|
||||||
struct type *type = value_type (val);
|
struct type *type = value_type (val);
|
||||||
struct value_print_options opts = *options;
|
struct value_print_options opts = *options;
|
||||||
@ -499,9 +499,7 @@ pascal_object_is_vtbl_member (struct type *type)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mutually recursive subroutines of pascal_object_print_value and
|
/* Helper function for print pascal objects.
|
||||||
pascal_value_print to print out a structure's fields:
|
|
||||||
pascal_object_print_value_fields and pascal_object_print_value.
|
|
||||||
|
|
||||||
VAL, STREAM, RECURSE, and OPTIONS have the same meanings as in
|
VAL, STREAM, RECURSE, and OPTIONS have the same meanings as in
|
||||||
pascal_object_print_value and c_value_print.
|
pascal_object_print_value and c_value_print.
|
||||||
|
Reference in New Issue
Block a user