gdb: Convert language la_is_string_type_p field to a method
[deliverable/binutils-gdb.git] / gdb / language.c
index 941e0df5e95d04d08882d3829c5aaf6e9befe7e4..c993cfc57a6e1d0e96e74be555ea5d8c41111670 100644 (file)
 #include <algorithm>
 #include "gdbarch.h"
 
-static int unk_lang_parser (struct parser_state *);
-
 static void set_range_case (void);
 
-static void unk_lang_emit_char (int c, struct type *type,
-                               struct ui_file *stream, int quoter);
-
-static void unk_lang_printchar (int c, struct type *type,
-                               struct ui_file *stream);
-
-static void unk_lang_value_print (struct value *, struct ui_file *,
-                                 const struct value_print_options *);
-
-static CORE_ADDR unk_lang_trampoline (struct frame_info *, CORE_ADDR pc);
-
 /* The current (default at startup) state of type and range checking.
    (If the modes are set to "auto", though, these are changed based
    on the default language at startup, and then again based on the
@@ -567,13 +554,10 @@ skip_language_trampoline (struct frame_info *frame, CORE_ADDR pc)
 {
   for (const auto &lang : language_defn::languages)
     {
-      if (lang->skip_trampoline != NULL)
-       {
-         CORE_ADDR real_pc = lang->skip_trampoline (frame, pc);
+      CORE_ADDR real_pc = lang->skip_trampoline (frame, pc);
 
-         if (real_pc)
-           return real_pc;
-       }
+      if (real_pc != 0)
+       return real_pc;
     }
 
   return 0;
@@ -589,35 +573,8 @@ char *
 language_demangle (const struct language_defn *current_language, 
                                const char *mangled, int options)
 {
-  if (current_language != NULL && current_language->la_demangle)
-    return current_language->la_demangle (mangled, options);
-  return NULL;
-}
-
-/* See language.h.  */
-
-int
-language_sniff_from_mangled_name (const struct language_defn *lang,
-                                 const char *mangled, char **demangled)
-{
-  gdb_assert (lang != NULL);
-
-  if (lang->la_sniff_from_mangled_name == NULL)
-    {
-      *demangled = NULL;
-      return 0;
-    }
-
-  return lang->la_sniff_from_mangled_name (mangled, demangled);
-}
-
-/* Return class name from physname or NULL.  */
-char *
-language_class_name_from_physname (const struct language_defn *lang,
-                                  const char *physname)
-{
-  if (lang != NULL && lang->la_class_name_from_physname)
-    return lang->la_class_name_from_physname (physname);
+  if (current_language != NULL)
+    return current_language->demangle (mangled, options);
   return NULL;
 }
 
@@ -656,134 +613,155 @@ language_defn::print_array_index (struct type *index_type, LONGEST index,
 
 /* See language.h.  */
 
-bool
-default_symbol_name_matcher (const char *symbol_search_name,
-                            const lookup_name_info &lookup_name,
-                            completion_match_result *comp_match_res)
+gdb::unique_xmalloc_ptr<char>
+language_defn::watch_location_expression (struct type *type,
+                                         CORE_ADDR addr) const
 {
-  gdb::string_view name = lookup_name.name ();
-  completion_match_for_lcd *match_for_lcd
-    = (comp_match_res != NULL ? &comp_match_res->match_for_lcd : NULL);
-  strncmp_iw_mode mode = (lookup_name.completion_mode ()
-                         ? strncmp_iw_mode::NORMAL
-                         : strncmp_iw_mode::MATCH_PARAMS);
-
-  if (strncmp_iw_with_mode (symbol_search_name, name.data (), name.size (),
-                           mode, language_minimal, match_for_lcd) == 0)
-    {
-      if (comp_match_res != NULL)
-       comp_match_res->set_match (symbol_search_name);
-      return true;
-    }
-  else
-    return false;
+  /* Generates an expression that assumes a C like syntax is valid.  */
+  type = check_typedef (TYPE_TARGET_TYPE (check_typedef (type)));
+  std::string name = type_to_string (type);
+  return gdb::unique_xmalloc_ptr<char>
+    (xstrprintf ("* (%s *) %s", name.c_str (), core_addr_to_string (addr)));
 }
 
 /* See language.h.  */
 
-bool
-default_is_string_type_p (struct type *type)
+void
+language_defn::value_print (struct value *val, struct ui_file *stream,
+              const struct value_print_options *options) const
 {
-  type = check_typedef (type);
-  while (type->code () == TYPE_CODE_REF)
-    {
-      type = TYPE_TARGET_TYPE (type);
-      type = check_typedef (type);
-    }
-  return (type->code ()  == TYPE_CODE_STRING);
+  return c_value_print (val, stream, options);
 }
 
 /* See language.h.  */
 
-symbol_name_matcher_ftype *
-get_symbol_name_matcher (const language_defn *lang,
-                        const lookup_name_info &lookup_name)
+int
+language_defn::parser (struct parser_state *ps) const
 {
-  /* If currently in Ada mode, and the lookup name is wrapped in
-     '<...>', hijack all symbol name comparisons using the Ada
-     matcher, which handles the verbatim matching.  */
-  if (current_language->la_language == language_ada
-      && lookup_name.ada ().verbatim_p ())
-    return current_language->la_get_symbol_name_matcher (lookup_name);
-
-  if (lang->la_get_symbol_name_matcher != nullptr)
-    return lang->la_get_symbol_name_matcher (lookup_name);
-  return default_symbol_name_matcher;
+  return c_parse (ps);
 }
 
-/* Define the language that is no language.  */
+/* See language.h.  */
 
-static int
-unk_lang_parser (struct parser_state *ps)
+void
+language_defn::value_print_inner
+       (struct value *val, struct ui_file *stream, int recurse,
+        const struct value_print_options *options) const
 {
-  return 1;
+  return c_value_print_inner (val, stream, recurse, options);
 }
 
-static void
-unk_lang_emit_char (int c, struct type *type, struct ui_file *stream,
-                   int quoter)
+/* See language.h.  */
+
+void
+language_defn::emitchar (int ch, struct type *chtype,
+                        struct ui_file * stream, int quoter) const
 {
-  error (_("internal error - unimplemented "
-          "function unk_lang_emit_char called."));
+  c_emit_char (ch, chtype, stream, quoter);
 }
 
-static void
-unk_lang_printchar (int c, struct type *type, struct ui_file *stream)
+/* See language.h.  */
+
+void
+language_defn::printchar (int ch, struct type *chtype,
+                         struct ui_file * stream) const
 {
-  error (_("internal error - unimplemented "
-          "function unk_lang_printchar called."));
+  c_printchar (ch, chtype, stream);
 }
 
-static void
-unk_lang_printstr (struct ui_file *stream, struct type *type,
-                  const gdb_byte *string, unsigned int length,
-                  const char *encoding, int force_ellipses,
-                  const struct value_print_options *options)
+/* See language.h.  */
+
+void
+language_defn::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
 {
-  error (_("internal error - unimplemented "
-          "function unk_lang_printstr called."));
+  c_printstr (stream, elttype, string, length, encoding, force_ellipses,
+             options);
 }
 
-static void
-unk_lang_print_type (struct type *type, const char *varstring,
-                    struct ui_file *stream, int show, int level,
-                    const struct type_print_options *flags)
+/* See language.h.  */
+
+void
+language_defn::print_typedef (struct type *type, struct symbol *new_symbol,
+                             struct ui_file *stream) const
 {
-  error (_("internal error - unimplemented "
-          "function unk_lang_print_type called."));
+  c_print_typedef (type, new_symbol, stream);
 }
 
-static void
-unk_lang_value_print_inner (struct value *val,
-                           struct ui_file *stream, int recurse,
-                           const struct value_print_options *options)
+/* See language.h.  */
+
+bool
+language_defn::is_string_type_p (struct type *type) const
 {
-  error (_("internal error - unimplemented "
-          "function unk_lang_value_print_inner called."));
+  return c_is_string_type_p (type);
 }
 
-static void
-unk_lang_value_print (struct value *val, struct ui_file *stream,
-                     const struct value_print_options *options)
+/* The default implementation of the get_symbol_name_matcher_inner method
+   from the language_defn class.  Matches with strncmp_iw.  */
+
+static bool
+default_symbol_name_matcher (const char *symbol_search_name,
+                            const lookup_name_info &lookup_name,
+                            completion_match_result *comp_match_res)
 {
-  error (_("internal error - unimplemented "
-          "function unk_lang_value_print called."));
+  gdb::string_view name = lookup_name.name ();
+  completion_match_for_lcd *match_for_lcd
+    = (comp_match_res != NULL ? &comp_match_res->match_for_lcd : NULL);
+  strncmp_iw_mode mode = (lookup_name.completion_mode ()
+                         ? strncmp_iw_mode::NORMAL
+                         : strncmp_iw_mode::MATCH_PARAMS);
+
+  if (strncmp_iw_with_mode (symbol_search_name, name.data (), name.size (),
+                           mode, language_minimal, match_for_lcd) == 0)
+    {
+      if (comp_match_res != NULL)
+       comp_match_res->set_match (symbol_search_name);
+      return true;
+    }
+  else
+    return false;
 }
 
-static CORE_ADDR unk_lang_trampoline (struct frame_info *frame, CORE_ADDR pc)
+/* See language.h.  */
+
+symbol_name_matcher_ftype *
+language_defn::get_symbol_name_matcher
+       (const lookup_name_info &lookup_name) const
 {
-  return 0;
+  /* If currently in Ada mode, and the lookup name is wrapped in
+     '<...>', hijack all symbol name comparisons using the Ada
+     matcher, which handles the verbatim matching.  */
+  if (current_language->la_language == language_ada
+      && lookup_name.ada ().verbatim_p ())
+    return current_language->get_symbol_name_matcher_inner (lookup_name);
+
+  return this->get_symbol_name_matcher_inner (lookup_name);
 }
 
-/* Unknown languages just use the cplus demangler.  */
-static char *unk_lang_demangle (const char *mangled, int options)
+/* See language.h.  */
+
+symbol_name_matcher_ftype *
+language_defn::get_symbol_name_matcher_inner
+       (const lookup_name_info &lookup_name) const
 {
-  return gdb_demangle (mangled, options);
+  return default_symbol_name_matcher;
 }
 
-static char *unk_lang_class_name (const char *mangled)
+/* Return true if TYPE is a string type, otherwise return false.  This
+   default implementation only detects TYPE_CODE_STRING.  */
+
+static bool
+default_is_string_type_p (struct type *type)
 {
-  return NULL;
+  type = check_typedef (type);
+  while (type->code () == TYPE_CODE_REF)
+    {
+      type = TYPE_TARGET_TYPE (type);
+      type = check_typedef (type);
+    }
+  return (type->code ()  == TYPE_CODE_STRING);
 }
 
 static const struct op_print unk_op_print_tab[] =
@@ -814,34 +792,12 @@ extern const struct language_data unknown_language_data =
   macro_expansion_no,
   NULL,
   &exp_descriptor_standard,
-  unk_lang_parser,
-  null_post_parser,
-  unk_lang_printchar,          /* Print character constant */
-  unk_lang_printstr,
-  unk_lang_emit_char,
-  unk_lang_print_type,         /* Print a type using appropriate syntax */
-  default_print_typedef,       /* Print a typedef using appropriate syntax */
-  unk_lang_value_print_inner,  /* la_value_print_inner */
-  unk_lang_value_print,                /* Print a top-level value */
-  unk_lang_trampoline,         /* Language specific skip_trampoline */
   "this",                      /* name_of_this */
   true,                                /* store_sym_names_in_linkage_form_p */
-  basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
-  unk_lang_demangle,           /* Language specific symbol demangler */
-  NULL,
-  unk_lang_class_name,         /* Language specific
-                                  class_name_from_physname */
   unk_op_print_tab,            /* expression operators for printing */
   1,                           /* c-style arrays */
   0,                           /* String lower bound */
-  default_word_break_characters,
-  default_collect_symbol_completion_matches,
-  c_watch_location_expression,
-  NULL,                                /* la_get_symbol_name_matcher */
-  default_search_name_hash,
   &default_varobj_ops,
-  NULL,
-  default_is_string_type_p,
   "{...}"                      /* la_struct_too_deep_ellipsis */
 };
 
@@ -860,6 +816,89 @@ public:
   {
     unknown_language_arch_info (gdbarch, lai);
   }
+
+  /* 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
+  {
+    error (_("unimplemented unknown_language::print_type called"));
+  }
+
+  /* See language.h.  */
+
+  char *demangle (const char *mangled, int options) const override
+  {
+    /* The unknown language just uses the C++ demangler.  */
+    return gdb_demangle (mangled, options);
+  }
+
+  /* See language.h.  */
+
+  void value_print (struct value *val, struct ui_file *stream,
+                   const struct value_print_options *options) const override
+  {
+    error (_("unimplemented unknown_language::value_print called"));
+  }
+
+  /* See language.h.  */
+
+  void value_print_inner
+       (struct value *val, struct ui_file *stream, int recurse,
+        const struct value_print_options *options) const override
+  {
+    error (_("unimplemented unknown_language::value_print_inner called"));
+  }
+
+  /* See language.h.  */
+
+  int parser (struct parser_state *ps) const override
+  {
+    /* No parsing is done, just claim success.  */
+    return 1;
+  }
+
+  /* See language.h.  */
+
+  void emitchar (int ch, struct type *chtype,
+                struct ui_file *stream, int quoter) const override
+  {
+    error (_("unimplemented unknown_language::emitchar called"));
+  }
+
+  /* See language.h.  */
+
+  void printchar (int ch, struct type *chtype,
+                 struct ui_file *stream) const override
+  {
+    error (_("unimplemented unknown_language::printchar called"));
+  }
+
+  /* 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
+  {
+    error (_("unimplemented unknown_language::printstr called"));
+  }
+
+  /* See language.h.  */
+
+  void print_typedef (struct type *type, struct symbol *new_symbol,
+                     struct ui_file *stream) const override
+  {
+    error (_("unimplemented unknown_language::print_typedef called"));
+  }
+
+  /* See language.h.  */
+
+  bool is_string_type_p (struct type *type) const override
+  {
+    return default_is_string_type_p (type);
+  }
 };
 
 /* Single instance of the unknown language class.  */
@@ -879,34 +918,12 @@ extern const struct language_data auto_language_data =
   macro_expansion_no,
   NULL,
   &exp_descriptor_standard,
-  unk_lang_parser,
-  null_post_parser,
-  unk_lang_printchar,          /* Print character constant */
-  unk_lang_printstr,
-  unk_lang_emit_char,
-  unk_lang_print_type,         /* Print a type using appropriate syntax */
-  default_print_typedef,       /* Print a typedef using appropriate syntax */
-  unk_lang_value_print_inner,  /* la_value_print_inner */
-  unk_lang_value_print,                /* Print a top-level value */
-  unk_lang_trampoline,         /* Language specific skip_trampoline */
   "this",                      /* name_of_this */
   false,                       /* store_sym_names_in_linkage_form_p */
-  basic_lookup_symbol_nonlocal,        /* lookup_symbol_nonlocal */
-  unk_lang_demangle,           /* Language specific symbol demangler */
-  NULL,
-  unk_lang_class_name,         /* Language specific
-                                  class_name_from_physname */
   unk_op_print_tab,            /* expression operators for printing */
   1,                           /* c-style arrays */
   0,                           /* String lower bound */
-  default_word_break_characters,
-  default_collect_symbol_completion_matches,
-  c_watch_location_expression,
-  NULL,                                /* la_get_symbol_name_matcher */
-  default_search_name_hash,
   &default_varobj_ops,
-  NULL,
-  default_is_string_type_p,
   "{...}"                      /* la_struct_too_deep_ellipsis */
 };
 
@@ -925,6 +942,89 @@ public:
   {
     unknown_language_arch_info (gdbarch, lai);
   }
+
+  /* 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
+  {
+    error (_("unimplemented auto_language::print_type called"));
+  }
+
+  /* See language.h.  */
+
+  char *demangle (const char *mangled, int options) const override
+  {
+    /* The auto language just uses the C++ demangler.  */
+    return gdb_demangle (mangled, options);
+  }
+
+  /* See language.h.  */
+
+  void value_print (struct value *val, struct ui_file *stream,
+                   const struct value_print_options *options) const override
+  {
+    error (_("unimplemented auto_language::value_print called"));
+  }
+
+  /* See language.h.  */
+
+  void value_print_inner
+       (struct value *val, struct ui_file *stream, int recurse,
+        const struct value_print_options *options) const override
+  {
+    error (_("unimplemented auto_language::value_print_inner called"));
+  }
+
+  /* See language.h.  */
+
+  int parser (struct parser_state *ps) const override
+  {
+    /* No parsing is done, just claim success.  */
+    return 1;
+  }
+
+  /* See language.h.  */
+
+  void emitchar (int ch, struct type *chtype,
+                struct ui_file *stream, int quoter) const override
+  {
+    error (_("unimplemented auto_language::emitchar called"));
+  }
+
+  /* See language.h.  */
+
+  void printchar (int ch, struct type *chtype,
+                 struct ui_file *stream) const override
+  {
+    error (_("unimplemented auto_language::printchar called"));
+  }
+
+  /* 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
+  {
+    error (_("unimplemented auto_language::printstr called"));
+  }
+
+  /* See language.h.  */
+
+  void print_typedef (struct type *type, struct symbol *new_symbol,
+                     struct ui_file *stream) const override
+  {
+    error (_("unimplemented auto_language::print_typedef called"));
+  }
+
+  /* See language.h.  */
+
+  bool is_string_type_p (struct type *type) const override
+  {
+    return default_is_string_type_p (type);
+  }
 };
 
 /* Single instance of the fake "auto" language.  */
This page took 0.02981 seconds and 4 git commands to generate.