gdb: move pascal_language into p-lang.h
authorAndrew Burgess <andrew.burgess@embecosm.com>
Wed, 28 Oct 2020 18:10:01 +0000 (18:10 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Wed, 23 Dec 2020 20:53:14 +0000 (20:53 +0000)
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.

gdb/ChangeLog
gdb/p-exp.y
gdb/p-lang.c
gdb/p-lang.h
gdb/p-typeprint.c
gdb/p-valprint.c

index a0f46226211467053ef289e6fd79fb249bdf1089..57d8065bfe3ae041f44515d48778790f740bdd70 100644 (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>
 
        * go-exp.y (go_parse): Rename to...
index 618557c472aa47e01248eb7659da517468cdf551..469c284a33c901b83d156da85a262a76987161c7 100644 (file)
@@ -301,10 +301,9 @@ exp        :       field_exp COMPLETE
 exp    :       exp '['
                        /* We need to save the current_type value.  */
                        { const char *arrayname;
-                         int arrayfieldindex;
-                         arrayfieldindex = is_pascal_string_type (
-                               current_type, NULL, NULL,
-                               NULL, NULL, &arrayname);
+                         int arrayfieldindex
+                           = pascal_is_string_type (current_type, NULL, NULL,
+                                                    NULL, NULL, &arrayname);
                          if (arrayfieldindex)
                            {
                              struct stoken stringsval;
@@ -1727,8 +1726,10 @@ yylex (void)
   }
 }
 
+/* See language.h.  */
+
 int
-pascal_parse (struct parser_state *par_state)
+pascal_language::parser (struct parser_state *par_state) const
 {
   /* Setting up the parser state.  */
   scoped_restore pstate_restore = make_scoped_restore (&pstate);
index 1610c0accae4231ff4948be212debabf06c6b848..3e58cccc0065d5dccd737315c5b36ef2eb8a9f63 100644 (file)
@@ -84,20 +84,11 @@ pascal_main_name (void)
   return NULL;
 }
 
-/* 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.  */
+/* See p-lang.h.  */
+
 int
-is_pascal_string_type (struct type *type,int *length_pos,
-                      int *length_size, int *string_pos,
-                      struct type **char_type,
+pascal_is_string_type (struct type *type,int *length_pos, int *length_size,
+                      int *string_pos, struct type **char_type,
                       const char **arrayname)
 {
   if (type != NULL && type->code () == TYPE_CODE_STRUCT)
@@ -152,14 +143,11 @@ is_pascal_string_type (struct type *type,int *length_pos,
   return 0;
 }
 
-static void pascal_one_char (int, struct ui_file *, int *);
-
-/* 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.  */
+/* See p-lang.h.  */
 
-static void
-pascal_one_char (int c, struct ui_file *stream, int *in_quotes)
+void
+pascal_language::print_one_char (int c, struct ui_file *stream,
+                                int *in_quotes) const
 {
   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
-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;
 
-  pascal_one_char (c, stream, &in_quotes);
+  print_one_char (c, stream, &in_quotes);
   if (in_quotes)
     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
    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_ASSIGN, PREC_ASSIGN, 1},
@@ -228,249 +219,138 @@ const struct op_print pascal_op_print_tab[] =
 };
 \f
 
-/* 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);
-
-    /* Helper function to allow shorter lines below.  */
-    auto add  = [&] (struct type * t)
-    {
-      lai->add_primitive_type (t);
-    };
-
-    add (builtin->builtin_int);
-    add (builtin->builtin_long);
-    add (builtin->builtin_short);
-    add (builtin->builtin_char);
-    add (builtin->builtin_float);
-    add (builtin->builtin_double);
-    add (builtin->builtin_void);
-    add (builtin->builtin_long_long);
-    add (builtin->builtin_signed_char);
-    add (builtin->builtin_unsigned_char);
-    add (builtin->builtin_unsigned_short);
-    add (builtin->builtin_unsigned_int);
-    add (builtin->builtin_unsigned_long);
-    add (builtin->builtin_unsigned_long_long);
-    add (builtin->builtin_long_double);
-    add (builtin->builtin_complex);
-    add (builtin->builtin_double_complex);
-
-    lai->set_string_char_type (builtin->builtin_char);
-    lai->set_bool_type (builtin->builtin_bool, "boolean");
-  }
-
-  /* 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
-  {
-    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.  */
+  const struct builtin_type *builtin = builtin_type (gdbarch);
 
-  void printchar (int ch, struct type *chtype,
-                 struct ui_file *stream) const override
+  /* Helper function to allow shorter lines below.  */
+  auto add  = [&] (struct type * t)
   {
-    pascal_printchar (ch, chtype, stream);
-  }
+    lai->add_primitive_type (t);
+  };
+
+  add (builtin->builtin_int);
+  add (builtin->builtin_long);
+  add (builtin->builtin_short);
+  add (builtin->builtin_char);
+  add (builtin->builtin_float);
+  add (builtin->builtin_double);
+  add (builtin->builtin_void);
+  add (builtin->builtin_long_long);
+  add (builtin->builtin_signed_char);
+  add (builtin->builtin_unsigned_char);
+  add (builtin->builtin_unsigned_short);
+  add (builtin->builtin_unsigned_int);
+  add (builtin->builtin_unsigned_long);
+  add (builtin->builtin_unsigned_long_long);
+  add (builtin->builtin_long_double);
+  add (builtin->builtin_complex);
+  add (builtin->builtin_double_complex);
+
+  lai->set_string_char_type (builtin->builtin_char);
+  lai->set_bool_type (builtin->builtin_bool, "boolean");
+}
 
-  /* See language.h.  */
+/* 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
-  {
-    enum bfd_endian byte_order = type_byte_order (elttype);
-    unsigned int i;
-    unsigned int things_printed = 0;
-    int in_quotes = 0;
-    int need_comma = 0;
-    int width;
-
-    /* Preserve ELTTYPE's original type, just set its LENGTH.  */
-    check_typedef (elttype);
-    width = TYPE_LENGTH (elttype);
-
-    /* If the string was not truncated due to `set print elements', and
-       the last byte of it is a null, we don't print that, in traditional C
-       style.  */
-    if ((!force_ellipses) && length > 0
-       && extract_unsigned_integer (string + (length - 1) * width, width,
-                                    byte_order) == 0)
-      length--;
-
-    if (length == 0)
-      {
-       fputs_filtered ("''", stream);
-       return;
-      }
-
-    for (i = 0; i < length && things_printed < options->print_max; ++i)
-      {
-       /* Position of the character we are examining
-          to see whether it is repeated.  */
-       unsigned int rep1;
-       /* Number of repetitions we have detected so far.  */
-       unsigned int reps;
-       unsigned long int current_char;
-
-       QUIT;
-
-       if (need_comma)
-         {
-           fputs_filtered (", ", stream);
-           need_comma = 0;
-         }
-
-       current_char = extract_unsigned_integer (string + i * width, width,
-                                                byte_order);
-
-       rep1 = i + 1;
-       reps = 1;
-       while (rep1 < length
-              && extract_unsigned_integer (string + rep1 * width, width,
-                                           byte_order) == current_char)
-         {
-           ++rep1;
-           ++reps;
-         }
-
-       if (reps > options->repeat_count_threshold)
-         {
-           if (in_quotes)
-             {
-               fputs_filtered ("', ", stream);
-               in_quotes = 0;
-             }
-           pascal_printchar (current_char, elttype, stream);
-           fprintf_filtered (stream, " %p[<repeats %u times>%p]",
-                             metadata_style.style ().ptr (),
-                             reps, nullptr);
-           i = rep1 - 1;
-           things_printed += options->repeat_count_threshold;
-           need_comma = 1;
-         }
-       else
-         {
-           if ((!in_quotes) && (PRINT_LITERAL_FORM (current_char)))
-             {
-               fputs_filtered ("'", stream);
-               in_quotes = 1;
-             }
-           pascal_one_char (current_char, stream, &in_quotes);
-           ++things_printed;
-         }
-      }
-
-    /* Terminate the quotes if necessary.  */
-    if (in_quotes)
-      fputs_filtered ("'", stream);
-
-    if (force_ellipses || i < length)
-      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);
-  }
+void
+pascal_language::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
+{
+  enum bfd_endian byte_order = type_byte_order (elttype);
+  unsigned int i;
+  unsigned int things_printed = 0;
+  int in_quotes = 0;
+  int need_comma = 0;
+  int width;
+
+  /* Preserve ELTTYPE's original type, just set its LENGTH.  */
+  check_typedef (elttype);
+  width = TYPE_LENGTH (elttype);
+
+  /* If the string was not truncated due to `set print elements', and
+     the last byte of it is a null, we don't print that, in traditional C
+     style.  */
+  if ((!force_ellipses) && length > 0
+      && extract_unsigned_integer (string + (length - 1) * width, width,
+                                  byte_order) == 0)
+    length--;
+
+  if (length == 0)
+    {
+      fputs_filtered ("''", stream);
+      return;
+    }
 
-  /* See language.h.  */
+  for (i = 0; i < length && things_printed < options->print_max; ++i)
+    {
+      /* Position of the character we are examining
+        to see whether it is repeated.  */
+      unsigned int rep1;
+      /* Number of repetitions we have detected so far.  */
+      unsigned int reps;
+      unsigned long int current_char;
 
-  bool is_string_type_p (struct type *type) const override
-  {
-    return is_pascal_string_type (type, nullptr, nullptr, nullptr,
-                                 nullptr, nullptr) > 0;
-  }
+      QUIT;
 
-  /* See language.h.  */
+      if (need_comma)
+       {
+         fputs_filtered (", ", stream);
+         need_comma = 0;
+       }
 
-  const char *name_of_this () const override
-  { return "this"; }
+      current_char = extract_unsigned_integer (string + i * width, width,
+                                              byte_order);
 
-  /* See language.h.  */
+      rep1 = i + 1;
+      reps = 1;
+      while (rep1 < length
+            && extract_unsigned_integer (string + rep1 * width, width,
+                                         byte_order) == current_char)
+       {
+         ++rep1;
+         ++reps;
+       }
 
-  bool range_checking_on_by_default () const override
-  { return true; }
+      if (reps > options->repeat_count_threshold)
+       {
+         if (in_quotes)
+           {
+             fputs_filtered ("', ", stream);
+             in_quotes = 0;
+           }
+         printchar (current_char, elttype, stream);
+         fprintf_filtered (stream, " %p[<repeats %u times>%p]",
+                           metadata_style.style ().ptr (),
+                           reps, nullptr);
+         i = rep1 - 1;
+         things_printed += options->repeat_count_threshold;
+         need_comma = 1;
+       }
+      else
+       {
+         if ((!in_quotes) && (PRINT_LITERAL_FORM (current_char)))
+           {
+             fputs_filtered ("'", stream);
+             in_quotes = 1;
+           }
+         print_one_char (current_char, stream, &in_quotes);
+         ++things_printed;
+       }
+    }
 
-  /* See language.h.  */
+  /* Terminate the quotes if necessary.  */
+  if (in_quotes)
+    fputs_filtered ("'", stream);
 
-  const struct op_print *opcode_print_table () const override
-  { return pascal_op_print_tab; }
-};
+  if (force_ellipses || i < length)
+    fputs_filtered ("...", stream);
+}
 
 /* Single instance of the Pascal language class.  */
 
index 3eaad015a6e88ed1915fd64252852150e0239338..3f08a26d2b30df0e6ded3c1584581132ab223701 100644 (file)
 struct value;
 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 */
+
 extern const char *pascal_main_name (void);
 
-extern int pascal_parse (struct parser_state *); /* Defined in p-exp.y */
+/* These are in p-lang.c: */
 
-/* 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 int is_pascal_string_type (struct type *, int *, int *, int *,
+                                 struct type **, const char **);
 
-extern void pascal_print_typedef (struct type *, struct symbol *,
-                                 struct ui_file *);
+extern int pascal_object_is_vtbl_ptr_type (struct type *);
 
-/* Implement la_value_print_inner for Pascal.  */
+extern int pascal_object_is_vtbl_member (struct type *);
 
-extern void pascal_value_print_inner (struct value *, struct ui_file *, int,
-                                     const struct value_print_options *);
+/* Class representing the Pascal language.  */
 
-extern void pascal_value_print (struct value *, struct ui_file *,
-                               const struct value_print_options *);
+class pascal_language : public language_defn
+{
+public:
+  pascal_language ()
+    : language_defn (language_pascal)
+  { /* Nothing.  */ }
 
-extern void pascal_type_print_method_args (const char *, const char *,
-                                          struct ui_file *);
+  /* See language.h.  */
 
-/* These are in p-lang.c: */
+  const char *name () const override
+  { return "pascal"; }
 
-extern int
-  is_pascal_string_type (struct type *, int *, int *, int *,
-                        struct type **, const char **);
+  /* See language.h.  */
 
-extern void pascal_printchar (int, struct type *, struct ui_file *);
+  const char *natural_name () const override
+  { return "Pascal"; }
 
-extern struct type **const pascal_builtin_types[];
+  /* See language.h.  */
 
-/* These are in p-typeprint.c: */
+  const std::vector<const char *> &filename_extensions () const override
+  {
+    static const std::vector<const char *> extensions
+      = { ".pas", ".p", ".pp" };
+    return extensions;
+  }
 
-extern void
-  pascal_type_print_base (struct type *, struct ui_file *, int, int,
-                         const struct type_print_options *);
+  /* See language.h.  */
 
-extern void
-  pascal_type_print_varspec_prefix (struct type *, struct ui_file *, int, int,
-                                   const struct type_print_options *);
+  void language_arch_info (struct gdbarch *gdbarch,
+                          struct language_arch_info *lai) const override;
 
-extern int pascal_object_is_vtbl_ptr_type (struct type *);
+  /* See language.h.  */
 
-extern int pascal_object_is_vtbl_member (struct type *);
+  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 */
index b53a0de0c97680c51fb1d1f1f7fecf3ef3986b1e..36c337c8f9a8203b970a44aafc95e3d8ddb22b69 100644 (file)
 #include <ctype.h>
 #include "cli/cli-style.h"
 
-static void pascal_type_print_varspec_suffix (struct type *, struct ui_file *,
-                                             int, int, int,
-                                             const struct type_print_options *);
-
-static void pascal_type_print_derivation_info (struct ui_file *,
-                                              struct type *);
-
-\f
-
-/* LEVEL is the depth to indent lines by.  */
+/* See language.h.  */
 
 void
-pascal_print_type (struct type *type, const char *varstring,
-                  struct ui_file *stream, int show, int level,
-                  const struct type_print_options *flags)
+pascal_language::print_type (struct type *type, const char *varstring,
+                            struct ui_file *stream, int show, int level,
+                            const struct type_print_options *flags) const
 {
   enum type_code code;
   int demangled_args;
@@ -61,7 +52,7 @@ pascal_print_type (struct type *type, const char *varstring,
   if ((code == TYPE_CODE_FUNC
        || 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 */
   fputs_filtered (varstring, stream);
@@ -76,26 +67,24 @@ pascal_print_type (struct type *type, const char *varstring,
   if (!(code == TYPE_CODE_FUNC
        || 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,
      so don't print an additional pair of ()'s.  */
 
   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);
 
 }
 
-/* Print a typedef using Pascal syntax.  TYPE is the underlying type.
-   NEW_SYMBOL is the symbol naming the type.  STREAM is the stream on
-   which to print.  */
+/* See language.h.  */
 
 void
-pascal_print_typedef (struct type *type, struct symbol *new_symbol,
-                     struct ui_file *stream)
+pascal_language::print_typedef (struct type *type, struct symbol *new_symbol,
+                               struct ui_file *stream) const
 {
   type = check_typedef (type);
   fprintf_filtered (stream, "type ");
@@ -104,32 +93,11 @@ pascal_print_typedef (struct type *type, struct symbol *new_symbol,
   fprintf_filtered (stream, ";");
 }
 
-/* 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.  */
+/* See p-lang.h.  */
 
-static void
-pascal_type_print_derivation_info (struct ui_file *stream, struct type *type)
+void
+pascal_language::type_print_derivation_info (struct ui_file *stream,
+                                            struct type *type) const
 {
   const char *name;
   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
-pascal_type_print_method_args (const char *physname, const char *methodname,
-                              struct ui_file *stream)
+pascal_language::type_print_method_args (const char *physname,
+                                        const char *methodname,
+                                        struct ui_file *stream) const
 {
   int is_constructor = (startswith (physname, "__ct__"));
   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
-   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.  */
+/* See p-lang.h.  */
 
 void
-pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
-                                 int show, int passed_a_ptr,
-                                 const struct type_print_options *flags)
+pascal_language::type_print_varspec_prefix (struct type *type,
+                                           struct ui_file *stream,
+                                           int show, int passed_a_ptr,
+                                           const struct type_print_options *flags) const
 {
   if (type == 0)
     return;
@@ -220,7 +184,7 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
     {
     case TYPE_CODE_PTR:
       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);
       break;                   /* Pointer should be handled normally
                                   in pascal.  */
@@ -241,15 +205,15 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
       if (passed_a_ptr)
        {
          fprintf_filtered (stream, " ");
-         pascal_type_print_base (TYPE_SELF_TYPE (type),
+         type_print_base (TYPE_SELF_TYPE (type),
                                  stream, 0, passed_a_ptr, flags);
          fprintf_filtered (stream, "::");
        }
       break;
 
     case TYPE_CODE_REF:
-      pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1,
-                                       flags);
+      type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1,
+                                flags);
       fprintf_filtered (stream, "&");
       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.  */
       break;
     default:
-      error (_("type not handled in pascal_type_print_varspec_prefix()"));
+      gdb_assert_not_reached ("unexpected type");
       break;
     }
 }
 
-static void
-pascal_print_func_args (struct type *type, struct ui_file *stream,
-                       const struct type_print_options *flags)
+/* See p-lang.h.  */
+
+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 ();
 
@@ -324,12 +290,12 @@ pascal_print_func_args (struct type *type, struct ui_file *stream,
          wrap_here ("    ");
        }
       /*  Can we find if it is a var parameter ??
-        if ( TYPE_FIELD(type, i) == )
-        {
-        fprintf_filtered (stream, "var ");
-        } */
-      pascal_print_type (type->field (i).type (), ""   /* TYPE_FIELD_NAME
-                                                          seems invalid!  */
+         if ( TYPE_FIELD(type, i) == )
+         {
+           fprintf_filtered (stream, "var ");
+         } */
+      print_type (type->field (i).type (), ""  /* TYPE_FIELD_NAME
+                                                  seems invalid!  */
                         ,stream, -1, 0, flags);
     }
   if (len)
@@ -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
-   a function or method.  */
+/* See p-lang.h.  */
 
-static void
-pascal_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)
+void
+pascal_language::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
 {
   if (TYPE_TARGET_TYPE (type) == NULL
       || TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID)
     {
       fprintf_filtered (stream, " : ");
-      pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type),
+      type_print_varspec_prefix (TYPE_TARGET_TYPE (type),
                                        stream, 0, 0, flags);
 
       if (TYPE_TARGET_TYPE (type) == NULL)
        type_print_unknown_return_type (stream);
       else
-       pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0,
+       type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0,
                                flags);
 
-      pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
-                                       passed_a_ptr, 0, flags);
+      type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
+                                passed_a_ptr, 0, flags);
     }
 }
 
-/* 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.  */
+/* See p-lang.h.  */
 
-static void
-pascal_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)
+void
+pascal_language::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
 {
   if (type == 0)
     return;
@@ -393,25 +358,23 @@ pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
     case TYPE_CODE_METHOD:
       if (passed_a_ptr)
        fprintf_filtered (stream, ")");
-      pascal_type_print_method_args ("",
-                                    "",
-                                    stream);
-      pascal_type_print_func_varspec_suffix (type, stream, show,
+      type_print_method_args ("", "", stream);
+      type_print_func_varspec_suffix (type, stream, show,
                                             passed_a_ptr, 0, flags);
       break;
 
     case TYPE_CODE_PTR:
     case TYPE_CODE_REF:
-      pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type),
-                                       stream, 0, 1, 0, flags);
+      type_print_varspec_suffix (TYPE_TARGET_TYPE (type),
+                                stream, 0, 1, 0, flags);
       break;
 
     case TYPE_CODE_FUNC:
       if (passed_a_ptr)
        fprintf_filtered (stream, ")");
       if (!demangled_args)
-       pascal_print_func_args (type, stream, flags);
-      pascal_type_print_func_varspec_suffix (type, stream, show,
+       print_func_args (type, stream, flags);
+      type_print_func_varspec_suffix (type, stream, show,
                                             passed_a_ptr, 0, flags);
       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.  */
       break;
     default:
-      error (_("type not handled in pascal_type_print_varspec_suffix()"));
+      gdb_assert_not_reached ("unexpected type");
       break;
     }
 }
 
-/* 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.  */
+/* See p-lang.h.  */
 
 void
-pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
-                       int level, const struct type_print_options *flags)
+pascal_language::type_print_base (struct type *type, struct ui_file *stream, int show,
+                                 int level, const struct type_print_options *flags) const
 {
   int i;
   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_PTR:
     case TYPE_CODE_REF:
-      /* case TYPE_CODE_FUNC:
-        case TYPE_CODE_METHOD: */
-      pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level,
-                             flags);
+      type_print_base (TYPE_TARGET_TYPE (type), stream, show, level,
+                      flags);
       break;
 
     case TYPE_CODE_ARRAY:
-      /* pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type),
-                                          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);
+      print_type (TYPE_TARGET_TYPE (type), NULL, stream, 0, 0, flags);
       break;
 
     case TYPE_CODE_FUNC:
     case TYPE_CODE_METHOD:
-      /*
-        pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
-        only after args !!  */
       break;
     case TYPE_CODE_STRUCT:
       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)
        {
-         pascal_type_print_derivation_info (stream, type);
+         type_print_derivation_info (stream, type);
 
          fprintf_filtered (stream, "\n");
          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);
              if (field_is_static (&type->field (i)))
                fprintf_filtered (stream, "static ");
-             pascal_print_type (type->field (i).type (),
+             print_type (type->field (i).type (),
                                 TYPE_FIELD_NAME (type, i),
                                 stream, show - 1, level + 4, flags);
              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 !!  */
 
-                 pascal_type_print_method_args (physname,
-                                                method_name,
-                                                stream);
+                 type_print_method_args (physname, method_name, stream);
 
                  if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) != 0
                      && 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:
       fputs_filtered ("set of ", stream);
-      pascal_print_type (type->index_type (), "", stream,
+      print_type (type->index_type (), "", stream,
                         show - 1, level, flags);
       break;
 
index 8f785b71ea43333308702fd45530736a1c3b6b91..b748c066fb0990d82a1c80d94589674b57142d12 100644 (file)
@@ -64,9 +64,9 @@ static const struct generic_val_print_decorations p_decorations =
 /* See p-lang.h.  */
 
 void
-pascal_value_print_inner (struct value *val, struct ui_file *stream,
-                         int recurse,
-                         const struct value_print_options *options)
+pascal_language::value_print_inner (struct value *val,
+                                   struct ui_file *stream, int recurse,
+                                   const struct value_print_options *options) const
 
 {
   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
         Pascal strings are mapped to records
         with lowercase names PM.  */
-      if (is_pascal_string_type (elttype, &length_pos, &length_size,
-                                &string_pos, &char_type, NULL)
+      if (pascal_is_string_type (elttype, &length_pos, &length_size,
+                                &string_pos, &char_type, NULL) > 0
          && addr != 0)
        {
          ULONGEST string_length;
@@ -313,8 +313,8 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
        }
       else
        {
-         if (is_pascal_string_type (type, &length_pos, &length_size,
-                                    &string_pos, &char_type, NULL))
+          if (pascal_is_string_type (type, &length_pos, &length_size,
+                                    &string_pos, &char_type, NULL) > 0)
            {
              len = extract_unsigned_integer (valaddr + length_pos,
                                              length_size, byte_order);
@@ -402,8 +402,8 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
 
 \f
 void
-pascal_value_print (struct value *val, struct ui_file *stream,
-                   const struct value_print_options *options)
+pascal_language::value_print (struct value *val, struct ui_file *stream,
+                             const struct value_print_options *options) const
 {
   struct type *type = value_type (val);
   struct value_print_options opts = *options;
@@ -499,9 +499,7 @@ pascal_object_is_vtbl_member (struct type *type)
   return 0;
 }
 
-/* Mutually recursive subroutines of pascal_object_print_value and
-   pascal_value_print to print out a structure's fields:
-   pascal_object_print_value_fields and pascal_object_print_value.
+/* Helper function for print pascal objects.
 
    VAL, STREAM, RECURSE, and OPTIONS have the same meanings as in
    pascal_object_print_value and c_value_print.