* gdb.base/help.exp: Allow Win32 child process.
[deliverable/binutils-gdb.git] / gdb / objc-lang.c
index dc839518b2499c7abaf79af79ef38f0a324f13c7..255781e783da73acd58cc80664dc7e9af8d848ff 100644 (file)
@@ -1,6 +1,6 @@
 /* Objective-C language support routines for GDB, the GNU debugger.
 
-   Copyright 2002 Free Software Foundation, Inc.
+   Copyright 2002, 2003 Free Software Foundation, Inc.
 
    Contributed by Apple Computer, Inc.
    Written by Michael Snyder.
 #include "value.h"
 #include "symfile.h"
 #include "objfiles.h"
-#include "string.h"            /* for strchr */
+#include "gdb_string.h"                /* for strchr */
 #include "target.h"            /* for target_has_execution */
 #include "gdbcore.h"
 #include "gdbcmd.h"
 #include "frame.h"
 #include "gdb_regex.h"
 #include "regcache.h"
+#include "block.h"
 
 #include <ctype.h>
 
@@ -74,15 +75,6 @@ struct objc_method {
 
 /* Complaints about ObjC classes, selectors, etc.  */
 
-static struct complaint noclass_lookup_complaint = {
-  "no way to lookup Objective-C classes", 0, 0
-};
-
-static struct complaint nosel_lookup_complaint = {
-  "no way to lookup Objective-C selectors", 0, 0
-};
-
-
 #if (!defined __GNUC__ || __GNUC__ < 2 || __GNUC_MINOR__ < (defined __cplusplus ? 6 : 4))
 #define __CHECK_FUNCTION ((__const char *) 0)
 #else
@@ -160,7 +152,7 @@ lookup_objc_class (char *classname)
     function = find_function_in_inferior("objc_lookup_class");
   else
     {
-      complain (&noclass_lookup_complaint, 0);
+      complaint (&symfile_complaints, "no way to lookup Objective-C classes");
       return 0;
     }
 
@@ -187,7 +179,7 @@ lookup_child_selector (char *selname)
     function = find_function_in_inferior("sel_get_any_uid");
   else
     {
-      complain (&nosel_lookup_complaint, 0);
+      complaint (&symfile_complaints, "no way to lookup Objective-C selectors");
       return 0;
     }
 
@@ -266,9 +258,10 @@ objc_demangle (const char *mangled)
       while (*cp && *cp == '_')
        cp++;                   /* skip any initial underbars in class name */
 
-      if (!(cp = strchr(cp, '_')))     /* find first non-initial underbar */
+      cp = strchr(cp, '_');
+      if (!cp)                 /* find first non-initial underbar */
        {
-         free(demangled);      /* not mangled name */
+         xfree(demangled);     /* not mangled name */
          return NULL;
        }
       if (cp[1] == '_') {      /* easy case: no category name     */
@@ -277,9 +270,10 @@ objc_demangle (const char *mangled)
       }
       else {
        *cp++ = '(';            /* less easy case: category name */
-       if (!(cp = strchr(cp, '_')))
+       cp = strchr(cp, '_');
+       if (!cp)
          {
-           free(demangled);    /* not mangled name */
+           xfree(demangled);   /* not mangled name */
            return NULL;
          }
        *cp++ = ')';
@@ -368,7 +362,7 @@ objc_printchar (int c, struct ui_file *stream)
 
 static void
 objc_printstr (struct ui_file *stream, char *string, 
-              unsigned int length, int force_ellipses)
+              unsigned int length, int width, int force_ellipses)
 {
   register unsigned int i;
   unsigned int things_printed = 0;
@@ -739,7 +733,7 @@ add_msglist(struct stoken *str, int addcolon)
   s = (char *)xmalloc(len);
   strcpy(s, msglist_sel);
   strncat(s, p, plen);
-  free(msglist_sel);
+  xfree(msglist_sel);
   msglist_sel = s;
   if (addcolon) {
     s[len-2] = ':';
@@ -764,9 +758,9 @@ end_msglist(void)
   if (!selid)
     error("Can't find selector \"%s\"", p);
   write_exp_elt_longcst (selid);
-  free(p);
+  xfree(p);
   write_exp_elt_longcst (val); /* Number of args */
-  free(sel);
+  xfree(sel);
 
   return val;
 }
@@ -794,23 +788,25 @@ int specialcmp(char *a, char *b)
 }
 
 /*
- * Function: compare_selectors (void *, void *)
+ * Function: compare_selectors (const void *, const void *)
  *
  * Comparison function for use with qsort.  Arguments are symbols or
  * msymbols Compares selector part of objc method name alphabetically.
  */
 
 static int
-compare_selectors (void *a, void *b)
+compare_selectors (const void *a, const void *b)
 {
   char *aname, *bname;
 
-  if ((aname = SYMBOL_SOURCE_NAME (*(struct symbol **) a)) == NULL ||
-      (bname = SYMBOL_SOURCE_NAME (*(struct symbol **) b)) == NULL)
+  aname = SYMBOL_PRINT_NAME (*(struct symbol **) a);
+  bname = SYMBOL_PRINT_NAME (*(struct symbol **) b);
+  if (aname == NULL || bname == NULL)
     error ("internal: compare_selectors(1)");
 
-  if ((aname = strchr(aname, ' ')) == NULL ||
-      (bname = strchr(bname, ' ')) == NULL)
+  aname = strchr(aname, ' ');
+  bname = strchr(bname, ' ');
+  if (aname == NULL || bname == NULL)
     error ("internal: compare_selectors(2)");
 
   return specialcmp (aname+1, bname+1);
@@ -870,8 +866,9 @@ selectors_info (char *regexp, int from_tty)
   ALL_MSYMBOLS (objfile, msymbol)
     {
       QUIT;
-      if ((name = SYMBOL_DEMANGLED_NAME (msymbol)) == NULL)
-       name = SYMBOL_NAME (msymbol);
+      name = SYMBOL_DEMANGLED_NAME (msymbol);
+      if (name == NULL)
+       name = DEPRECATED_SYMBOL_NAME (msymbol);
       if (name &&
         (name[0] == '-' || name[0] == '+') &&
          name[1] == '[')               /* Got a method name.  */
@@ -902,8 +899,9 @@ selectors_info (char *regexp, int from_tty)
       ALL_MSYMBOLS (objfile, msymbol)
        {
          QUIT;
-         if ((name = SYMBOL_DEMANGLED_NAME (msymbol)) == NULL)
-           name = SYMBOL_NAME (msymbol);
+         name = SYMBOL_DEMANGLED_NAME (msymbol);
+         if (name == NULL)
+           name = DEPRECATED_SYMBOL_NAME (msymbol);
          if (name &&
             (name[0] == '-' || name[0] == '+') &&
              name[1] == '[')           /* Got a method name.  */
@@ -927,8 +925,9 @@ selectors_info (char *regexp, int from_tty)
          char *p = asel;
 
          QUIT;
-         if ((name = SYMBOL_DEMANGLED_NAME (sym_arr[ix])) == NULL)
-           name = SYMBOL_NAME (sym_arr[ix]);
+         name = SYMBOL_DEMANGLED_NAME (sym_arr[ix]);
+         if (name == NULL)
+           name = DEPRECATED_SYMBOL_NAME (sym_arr[ix]);
          name = strchr (name, ' ') + 1;
          if (p[0] && specialcmp(name, p) == 0)
            continue;           /* Seen this one already (not unique).  */
@@ -947,19 +946,20 @@ selectors_info (char *regexp, int from_tty)
 }
 
 /*
- * Function: compare_classes (void *, void *)
+ * Function: compare_classes (const void *, const void *)
  *
  * Comparison function for use with qsort.  Arguments are symbols or
  * msymbols Compares class part of objc method name alphabetically. 
  */
 
 static int
-compare_classes (void *a, void *b)
+compare_classes (const void *a, const void *b)
 {
   char *aname, *bname;
 
-  if ((aname = SYMBOL_SOURCE_NAME (*(struct symbol **) a)) == NULL ||
-      (bname = SYMBOL_SOURCE_NAME (*(struct symbol **) b)) == NULL)
+  aname = SYMBOL_PRINT_NAME (*(struct symbol **) a);
+  bname = SYMBOL_PRINT_NAME (*(struct symbol **) b);
+  if (aname == NULL || bname == NULL)
     error ("internal: compare_classes(1)");
 
   return specialcmp (aname+1, bname+1);
@@ -1009,8 +1009,9 @@ classes_info (char *regexp, int from_tty)
   ALL_MSYMBOLS (objfile, msymbol)
     {
       QUIT;
-      if ((name = SYMBOL_DEMANGLED_NAME (msymbol)) == NULL)
-       name = SYMBOL_NAME (msymbol);
+      name = SYMBOL_DEMANGLED_NAME (msymbol);
+      if (name == NULL)
+       name = DEPRECATED_SYMBOL_NAME (msymbol);
       if (name &&
         (name[0] == '-' || name[0] == '+') &&
          name[1] == '[')                       /* Got a method name.  */
@@ -1034,8 +1035,9 @@ classes_info (char *regexp, int from_tty)
       ALL_MSYMBOLS (objfile, msymbol)
        {
          QUIT;
-         if ((name = SYMBOL_DEMANGLED_NAME (msymbol)) == NULL)
-           name = SYMBOL_NAME (msymbol);
+         name = SYMBOL_DEMANGLED_NAME (msymbol);
+         if (name == NULL)
+           name = DEPRECATED_SYMBOL_NAME (msymbol);
          if (name &&
             (name[0] == '-' || name[0] == '+') &&
              name[1] == '[')                   /* Got a method name.  */
@@ -1052,8 +1054,9 @@ classes_info (char *regexp, int from_tty)
          char *p = aclass;
 
          QUIT;
-         if ((name = SYMBOL_DEMANGLED_NAME (sym_arr[ix])) == NULL)
-           name = SYMBOL_NAME (sym_arr[ix]);
+         name = SYMBOL_DEMANGLED_NAME (sym_arr[ix]);
+         if (name == NULL)
+           name = DEPRECATED_SYMBOL_NAME (sym_arr[ix]);
          name += 2;
          if (p[0] && specialcmp(name, p) == 0)
            continue;   /* Seen this one already (not unique).  */
@@ -1270,7 +1273,7 @@ parse_method (char *method, char *type, char **class,
   return s2;
 }
 
-void
+static void
 find_methods (struct symtab *symtab, char type, 
              const char *class, const char *category, 
              const char *selector, struct symbol **syms, 
@@ -1309,14 +1312,14 @@ find_methods (struct symtab *symtab, char type,
        continue;
 
       if (symtab)
-       if ((SYMBOL_VALUE_ADDRESS (msymbol) <  block->startaddr) ||
-           (SYMBOL_VALUE_ADDRESS (msymbol) >= block->endaddr))
+       if ((SYMBOL_VALUE_ADDRESS (msymbol) <  BLOCK_START (block)) ||
+           (SYMBOL_VALUE_ADDRESS (msymbol) >= BLOCK_END (block)))
          /* Not in the specified symtab.  */
          continue;
 
       symname = SYMBOL_DEMANGLED_NAME (msymbol);
       if (symname == NULL)
-       symname = SYMBOL_NAME (msymbol);
+       symname = DEPRECATED_SYMBOL_NAME (msymbol);
       if (symname == NULL)
        continue;
 
@@ -1352,10 +1355,10 @@ find_methods (struct symtab *symtab, char type,
       sym = find_pc_function (SYMBOL_VALUE_ADDRESS (msymbol));
       if (sym != NULL)
         {
-          const char    *newsymname = SYMBOL_DEMANGLED_NAME (sym);
+          const char *newsymname = SYMBOL_DEMANGLED_NAME (sym);
          
           if (newsymname == NULL)
-            newsymname = SYMBOL_NAME (sym);
+            newsymname = DEPRECATED_SYMBOL_NAME (sym);
           if (strcmp (symname, newsymname) == 0)
             {
               /* Found a high-level method sym: swap it into the
@@ -1450,7 +1453,7 @@ char *find_imps (struct symtab *symtab, struct block *block,
     if (msym != NULL) 
       {
        if (syms)
-         syms[csym] = msym;
+         syms[csym] = (struct symbol *)msym;
        csym++;
       }
   }
@@ -1527,7 +1530,7 @@ void
 print_object_command (char *args, int from_tty)
 {
   struct value *object, *function, *description;
-  CORE_ADDR string_addr;
+  CORE_ADDR string_addr, object_addr;
   int i = 0;
   char c = -1;
 
@@ -1541,22 +1544,23 @@ print_object_command (char *args, int from_tty)
       make_cleanup (free_current_contents, &expr);
     int pc = 0;
 
-#if 1
     object = expr->language_defn->evaluate_exp (builtin_type_void_data_ptr,
                                                expr, &pc, EVAL_NORMAL);
-#else
-    object = evaluate_subexp (builtin_type_void_data_ptr, 
-                             expr, &pc, EVAL_NORMAL);
-#endif
     do_cleanups (old_chain);
   }
 
-  if (!(function = find_function_in_inferior ("_NSPrintForDebugger")))
+  /* Validate the address for sanity.  */
+  object_addr = value_as_long (object);
+  read_memory (object_addr, &c, 1);
+
+  function = find_function_in_inferior ("_NSPrintForDebugger");
+  if (function == NULL)
     error ("Unable to locate _NSPrintForDebugger in child process");
 
   description = call_function_by_hand (function, 1, &object);
 
-  if ((string_addr = value_as_long (description)) == 0)
+  string_addr = value_as_long (description);
+  if (string_addr == 0)
     error ("object returns null description");
 
   read_memory (string_addr + i++, &c, 1);
@@ -1580,7 +1584,7 @@ print_object_command (char *args, int from_tty)
 struct objc_methcall {
   char *name;
  /* Return instance method to be called.  */
-  CORE_ADDR (*stop_at) (CORE_ADDR);
+  int (*stop_at) (CORE_ADDR, CORE_ADDR *);
   /* Start of pc range corresponding to method invocation.  */
   CORE_ADDR begin;
   /* End of pc range corresponding to method invocation.  */
@@ -1652,13 +1656,13 @@ find_objc_msgsend (void)
  */
 
 struct objc_submethod_helper_data {
-  CORE_ADDR (*f) (CORE_ADDR, CORE_ADDR *);
+  int (*f) (CORE_ADDR, CORE_ADDR *);
   CORE_ADDR pc;
   CORE_ADDR *new_pc;
 };
 
 int 
-find_objc_msgcall_submethod_helper (PTR arg)
+find_objc_msgcall_submethod_helper (void * arg)
 {
   struct objc_submethod_helper_data *s = 
     (struct objc_submethod_helper_data *) arg;
@@ -1670,7 +1674,7 @@ find_objc_msgcall_submethod_helper (PTR arg)
 }
 
 int 
-find_objc_msgcall_submethod (CORE_ADDR (*f) (CORE_ADDR, CORE_ADDR *),
+find_objc_msgcall_submethod (int (*f) (CORE_ADDR, CORE_ADDR *),
                             CORE_ADDR pc, 
                             CORE_ADDR *new_pc)
 {
@@ -1681,7 +1685,7 @@ find_objc_msgcall_submethod (CORE_ADDR (*f) (CORE_ADDR, CORE_ADDR *),
   s.new_pc = new_pc;
 
   if (catch_errors (find_objc_msgcall_submethod_helper,
-                   (PTR) &s,
+                   (void *) &s,
                    "Unable to determine target of Objective-C method call (ignoring):\n",
                    RETURN_MASK_ALL) == 0) 
     return 1;
@@ -1719,7 +1723,7 @@ _initialize_objc_language (void)
   add_info ("classes", classes_info,       /* 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.\n");
+          "Ask an Objective-C object to print itself.");
   add_com_alias ("po", "print-object", class_vars, 1);
 }
 
This page took 0.037127 seconds and 4 git commands to generate.