Move "catch exec" to a new file
[binutils-gdb.git] / gdb / objc-lang.c
index 8e8cc053531846c0516751fb102a9c086d7006f8..72470144abf2602d343c344093f50ecce99726a2 100644 (file)
@@ -1,6 +1,6 @@
 /* Objective-C language support routines for GDB, the GNU debugger.
 
-   Copyright (C) 2002-2021 Free Software Foundation, Inc.
+   Copyright (C) 2002-2022 Free Software Foundation, Inc.
 
    Contributed by Apple Computer, Inc.
    Written by Michael Snyder.
@@ -37,7 +37,7 @@
 #include "gdbcore.h"
 #include "gdbcmd.h"
 #include "frame.h"
-#include "gdb_regex.h"
+#include "gdbsupport/gdb_regex.h"
 #include "regcache.h"
 #include "block.h"
 #include "infcall.h"
@@ -216,72 +216,6 @@ value_nsstring (struct gdbarch *gdbarch, const char *ptr, int len)
   return nsstringValue;
 }
 
-/* Objective-C name demangling.  */
-
-char *
-objc_demangle (const char *mangled, int options)
-{
-  char *demangled, *cp;
-
-  if (mangled[0] == '_' &&
-     (mangled[1] == 'i' || mangled[1] == 'c') &&
-      mangled[2] == '_')
-    {
-      cp = demangled = (char *) xmalloc (strlen (mangled) + 2);
-
-      if (mangled[1] == 'i')
-       *cp++ = '-';            /* for instance method */
-      else
-       *cp++ = '+';            /* for class    method */
-
-      *cp++ = '[';             /* opening left brace  */
-      strcpy(cp, mangled+3);   /* Tack on the rest of the mangled name.  */
-
-      while (*cp && *cp == '_')
-       cp++;                   /* Skip any initial underbars in class
-                                  name.  */
-
-      cp = strchr(cp, '_');
-      if (!cp)                 /* Find first non-initial underbar.  */
-       {
-         xfree(demangled);     /* not mangled name */
-         return NULL;
-       }
-      if (cp[1] == '_')                /* Easy case: no category name.    */
-       {
-         *cp++ = ' ';          /* Replace two '_' with one ' '.   */
-         strcpy(cp, mangled + (cp - demangled) + 2);
-       }
-      else
-       {
-         *cp++ = '(';          /* Less easy case: category name.  */
-         cp = strchr(cp, '_');
-         if (!cp)
-           {
-             xfree(demangled); /* not mangled name */
-             return NULL;
-           }
-         *cp++ = ')';
-         *cp++ = ' ';          /* Overwriting 1st char of method name...  */
-         strcpy(cp, mangled + (cp - demangled));       /* Get it back.  */
-       }
-
-      while (*cp && *cp == '_')
-       cp++;                   /* Skip any initial underbars in
-                                  method name.  */
-
-      for (; *cp; cp++)
-       if (*cp == '_')
-         *cp = ':';            /* Replace remaining '_' with ':'.  */
-
-      *cp++ = ']';             /* closing right brace */
-      *cp++ = 0;               /* string terminator */
-      return demangled;
-    }
-  else
-    return NULL;       /* Not an objc mangled name.  */
-}
-
 /* Class representing the Objective-C language.  */
 
 class objc_language : public language_defn
@@ -317,19 +251,18 @@ public:
   }
 
   /* See language.h.  */
-  bool sniff_from_mangled_name (const char *mangled,
-                               char **demangled) const override
+  bool sniff_from_mangled_name
+       (const char *mangled, gdb::unique_xmalloc_ptr<char> *demangled)
+       const override
   {
-    *demangled = objc_demangle (mangled, 0);
+    *demangled = demangle_symbol (mangled, 0);
     return *demangled != NULL;
   }
 
   /* See language.h.  */
 
-  char *demangle_symbol (const char *mangled, int options) const override
-  {
-    return objc_demangle (mangled, options);
-  }
+  gdb::unique_xmalloc_ptr<char> demangle_symbol (const char *mangled,
+                                                int options) const override;
 
   /* See language.h.  */
 
@@ -385,6 +318,72 @@ public:
   { return macro_expansion_c; }
 };
 
+/* See declaration of objc_language::demangle_symbol above.  */
+
+gdb::unique_xmalloc_ptr<char>
+objc_language::demangle_symbol (const char *mangled, int options) const
+{
+  char *demangled, *cp;
+
+  if (mangled[0] == '_'
+      && (mangled[1] == 'i' || mangled[1] == 'c')
+      && mangled[2] == '_')
+    {
+      cp = demangled = (char *) xmalloc (strlen (mangled) + 2);
+
+      if (mangled[1] == 'i')
+       *cp++ = '-';            /* for instance method */
+      else
+       *cp++ = '+';            /* for class    method */
+
+      *cp++ = '[';             /* opening left brace  */
+      strcpy(cp, mangled+3);   /* Tack on the rest of the mangled name.  */
+
+      while (*cp != '\0' && *cp == '_')
+       cp++;                   /* Skip any initial underbars in class
+                                  name.  */
+
+      cp = strchr(cp, '_');
+      if (cp == nullptr)       /* Find first non-initial underbar.  */
+       {
+         xfree(demangled);     /* not mangled name */
+         return nullptr;
+       }
+      if (cp[1] == '_')                /* Easy case: no category name.    */
+       {
+         *cp++ = ' ';          /* Replace two '_' with one ' '.   */
+         strcpy(cp, mangled + (cp - demangled) + 2);
+       }
+      else
+       {
+         *cp++ = '(';          /* Less easy case: category name.  */
+         cp = strchr(cp, '_');
+         if (cp == nullptr)
+           {
+             xfree(demangled); /* not mangled name */
+             return nullptr;
+           }
+         *cp++ = ')';
+         *cp++ = ' ';          /* Overwriting 1st char of method name...  */
+         strcpy(cp, mangled + (cp - demangled));       /* Get it back.  */
+       }
+
+      while (*cp != '\0' && *cp == '_')
+       cp++;                   /* Skip any initial underbars in
+                                  method name.  */
+
+      for (; *cp != '\0'; cp++)
+       if (*cp == '_')
+         *cp = ':';            /* Replace remaining '_' with ':'.  */
+
+      *cp++ = ']';             /* closing right brace */
+      *cp++ = 0;               /* string terminator */
+      return gdb::unique_xmalloc_ptr<char> (demangled);
+    }
+  else
+    return nullptr;    /* Not an objc mangled name.  */
+}
+
 /* Single instance of the class representing the Objective-C language.  */
 
 static objc_language objc_language_defn;
@@ -1322,9 +1321,10 @@ _initialize_objc_language ()
            _("All Objective-C selectors, or those matching REGEXP."));
   add_info ("classes", info_classes_command,
            _("All Objective-C classes, or those matching REGEXP."));
-  add_com ("print-object", class_vars, print_object_command, 
-          _("Ask an Objective-C object to print itself."));
-  add_com_alias ("po", "print-object", class_vars, 1);
+  cmd_list_element *print_object_cmd
+    = add_com ("print-object", class_vars, print_object_command,
+              _("Ask an Objective-C object to print itself."));
+  add_com_alias ("po", print_object_cmd, class_vars, 1);
 }
 
 static void