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:
Andrew Burgess
2020-10-28 18:10:01 +00:00
parent 82fc57fd6b
commit 46157d77c3
6 changed files with 514 additions and 444 deletions

View File

@ -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...

View File

@ -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);

View File

@ -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. */

View File

@ -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 */

View File

@ -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;

View File

@ -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.