This is the mail archive of the gdb-patches@sourceware.cygnus.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: RFA: patch to ignore C++ method conversion errors


I wrote:

>I'll go ahead and change my patch to use wrapper.c

Here's the wrapperized patch.  No regressions were evident.  I'll go ahead
and commit it if there are no objections.

Nick

Index: gdbtypes.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtypes.c,v
retrieving revision 1.6
diff -u -r1.6 gdbtypes.c
--- gdbtypes.c	2000/03/28 02:25:14	1.6
+++ gdbtypes.c	2000/04/01 06:12:58
@@ -33,6 +33,7 @@
 #include "demangle.h"
 #include "complaints.h"
 #include "gdbcmd.h"
+#include "wrapper.h"
 
 /* These variables point to the objects
    representing the predefined C data types.  */
@@ -1422,6 +1423,30 @@
 #undef ADD_EXTRA
 /* End of new code added to support parsing of Cfront stabs strings */
 
+/* Parse a type expression in the string [P..P+LENGTH).  If an error occurs,
+   silently return builtin_type_void. */
+
+struct type *
+safe_parse_type (char *p, int length)
+{
+  struct ui_file *saved_gdb_stderr;
+  struct type *type;
+
+  /* Suppress error messages. */
+  saved_gdb_stderr = gdb_stderr;
+  gdb_stderr = ui_file_new ();
+
+  /* Call parse_and_eval_type() without fear of longjmp()s. */
+  if (!gdb_parse_and_eval_type (p, length, &type))
+    type = builtin_type_void;
+
+  /* Stop suppressing error messages. */
+  ui_file_delete (gdb_stderr);
+  gdb_stderr = saved_gdb_stderr;
+
+  return type;
+}
+
 /* Ugly hack to convert method stubs into method types.
 
    He ain't kiddin'.  This demangles the name of the method into a string
@@ -1496,7 +1521,7 @@
 	      if (strncmp (argtypetext, "...", p - argtypetext) != 0)
 		{
 		  argtypes[argcount] =
-		    parse_and_eval_type (argtypetext, p - argtypetext);
+		    safe_parse_type (argtypetext, p - argtypetext);
 		  argcount += 1;
 		}
 	      argtypetext = p + 1;
Index: wrapper.c
===================================================================
RCS file: /cvs/src/src/gdb/wrapper.c,v
retrieving revision 1.4
diff -u -r1.4 wrapper.c
--- wrapper.c	2000/03/30 20:15:35	1.4
+++ wrapper.c	2000/04/01 06:12:58
@@ -61,6 +61,9 @@
 int gdb_value_ind PARAMS ((value_ptr val, value_ptr * rval));
 int wrap_value_ind PARAMS ((char *opaque_arg));
 
+int gdb_parse_and_eval_type (char *, int, struct type **);
+int wrap_parse_and_eval_type (char *);
+
 int
 gdb_parse_exp_1 (stringptr, block, comma, expression)
      char **stringptr;
@@ -252,3 +255,33 @@
   return 1;
 }
 
+int
+gdb_parse_and_eval_type (char *p, int length, struct type **type)
+{
+  struct gdb_wrapper_arguments args;
+  args.args[0].pointer = p;
+  args.args[1].integer = length;
+
+  if (!catch_errors ((catch_errors_ftype *) wrap_parse_and_eval_type, &args,
+		     "", RETURN_MASK_ALL))
+    {
+      /* An error occurred */
+      return 0;
+    }
+
+  *type = (struct type *) args.result.pointer;
+  return 1;
+}
+
+int
+wrap_parse_and_eval_type (char *a)
+{
+  struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a;
+
+  char *p = (char *) args->args[0].pointer;
+  int length = args->args[1].integer;
+
+  args->result.pointer = (char *) parse_and_eval_type (p, length);
+
+  return 1;
+}
Index: wrapper.h
===================================================================
RCS file: /cvs/src/src/gdb/wrapper.h,v
retrieving revision 1.2
diff -u -r1.2 wrapper.h
--- wrapper.h	2000/03/13 21:51:45	1.2
+++ wrapper.h	2000/04/01 06:12:58
@@ -38,4 +38,7 @@
 extern int gdb_value_ind PARAMS ((value_ptr val, value_ptr * rval));
 extern int wrap_value_ind PARAMS ((char *opaque_arg));
 
+extern int gdb_parse_and_eval_type (char *, int, struct type **);
+extern int wrap_parse_and_eval_type (char *);
+
 #endif /* WRAPPER_H */

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]