[RFA] Use TRY_CATCH in wrapper.c

Mark Kettenis kettenis@gnu.org
Wed Feb 16 03:38:00 GMT 2005


Andrew,

Am I right in assuming that TRY_CATCH was added to make things like
this possible?  It sure cleans things up up ;-).

Mark


Index: ChangeLog
from  Mark Kettenis  <kettenis@gnu.org>

	* wrapper.h: Update copyright year.  Properly wrap a few
	prototypes.
	(struct gdb_wrapper_arguments): Remove forward declaration.
	* wrapper.c: Update copyright year.  Include "ui-out.h".
	(struct gdb_wrapper_arguments): Remove.
	(struct captured_value_struct_elt_args): Remove.
	(wrapper_parse_exp_1, wrap_evaluate_expression)
	(wrap_value_fetch_lazy, wrap_value_equal, wrap_value_assign)
	(wrap_value_subscript, wrap_value_ind, wrap_parse_and_eval_type)
	(do_captured_value_struct_elf): Remove functions.
	(gdb_parse_exp_1, gdb_evaluate_expression, gdb_value_fetch_lazy)
	(gdb_value_equal, gdb_value_assign, gdb_value_subscript)
	(gdb_value_ind, gdb_parse_and_eval_type, gdb_value_struct_elt):
	Re-implement using TRY_CATCH.

Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.698
diff -u -p -r1.698 Makefile.in
--- Makefile.in 10 Feb 2005 18:15:40 -0000 1.698
+++ Makefile.in 16 Feb 2005 01:06:11 -0000
@@ -2709,7 +2709,8 @@ wince.o: wince.c $(defs_h) $(frame_h) $(
 	$(objfiles_h) $(gdb_string_h) $(gdbthread_h) $(gdbcmd_h) \
 	$(wince_stub_h) $(regcache_h) $(mips_tdep_h)
 wince-stub.o: wince-stub.c $(wince_stub_h)
-wrapper.o: wrapper.c $(defs_h) $(value_h) $(exceptions_h) $(wrapper_h)
+wrapper.o: wrapper.c $(defs_h) $(value_h) $(exceptions_h) $(wrapper_h) \
+	$(ui_out_h)
 xcoffread.o: xcoffread.c $(defs_h) $(bfd_h) $(gdb_string_h) $(gdb_stat_h) \
 	$(coff_internal_h) $(libcoff_h) $(coff_xcoff_h) $(libxcoff_h) \
 	$(coff_rs6000_h) $(symtab_h) $(gdbtypes_h) $(symfile_h) \
Index: wrapper.c
===================================================================
RCS file: /cvs/src/src/gdb/wrapper.c,v
retrieving revision 1.16
diff -u -p -r1.16 wrapper.c
--- wrapper.c 14 Jan 2005 23:27:14 -0000 1.16
+++ wrapper.c 16 Feb 2005 01:06:11 -0000
@@ -1,5 +1,6 @@
-/* Longjump free calls to gdb internal routines.
-   Copyright 1999, 2000 Free Software Foundation, Inc.
+/* Longjump free calls to GDB internal routines.
+
+   Copyright 1999, 2000, 2005 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -20,315 +21,144 @@
 #include "value.h"
 #include "exceptions.h"
 #include "wrapper.h"
-
-/* Use this struct to pass arguments to wrapper routines. We assume
-   (arbitrarily) that no gdb function takes more than ten arguments. */
-struct gdb_wrapper_arguments
-  {
-
-    /* Pointer to some result from the gdb function call, if any */
-    union wrapper_results 
-      {
-	int   integer;
-	void *pointer;
-      } result;
-	
-
-    /* The list of arguments. */
-    union wrapper_args 
-      {
-	int   integer;
-	void *pointer;
-      } args[10];
-  };
-
-struct captured_value_struct_elt_args
-{
-  struct value **argp;
-  struct value **args;
-  char *name;
-  int *static_memfuncp;
-  char *err;
-  struct value **result_ptr;
-};
-
-static int wrap_parse_exp_1 (char *);
-
-static int wrap_evaluate_expression (char *);
-
-static int wrap_value_fetch_lazy (char *);
-
-static int wrap_value_equal (char *);
-
-static int wrap_value_assign (char *);
-
-static int wrap_value_subscript (char *);
-
-static int wrap_value_ind (char *opaque_arg);
-
-static int do_captured_value_struct_elt (struct ui_out *uiout, void *data);
-
-static int wrap_parse_and_eval_type (char *);
+#include "ui-out.h"
 
 int
 gdb_parse_exp_1 (char **stringptr, struct block *block, int comma,
 		 struct expression **expression)
 {
-  struct gdb_wrapper_arguments args;
-  args.args[0].pointer = stringptr;
-  args.args[1].pointer = block;
-  args.args[2].integer = comma;
+  volatile struct exception except;
 
-  if (!catch_errors ((catch_errors_ftype *) wrap_parse_exp_1, &args,
-		     "", RETURN_MASK_ERROR))
+  TRY_CATCH (except, RETURN_MASK_ERROR)
     {
-      /* An error occurred */
-      return 0;
+      *expression = parse_exp_1 (stringptr, block, comma);
     }
 
-  *expression = (struct expression *) args.result.pointer;
-  return 1;
-  
-}
-
-static int
-wrap_parse_exp_1 (char *argptr)
-{
-  struct gdb_wrapper_arguments *args 
-    = (struct gdb_wrapper_arguments *) argptr;
-  args->result.pointer = parse_exp_1((char **) args->args[0].pointer,
-				     (struct block *) args->args[1].pointer,
-				     args->args[2].integer);
+  if (except.reason < 0)
+    return 0;
   return 1;
 }
 
 int
 gdb_evaluate_expression (struct expression *exp, struct value **value)
 {
-  struct gdb_wrapper_arguments args;
-  args.args[0].pointer = exp;
+  volatile struct exception except;
 
-  if (!catch_errors ((catch_errors_ftype *) wrap_evaluate_expression, &args,
-		     "", RETURN_MASK_ERROR))
+  TRY_CATCH (except, RETURN_MASK_ERROR)
     {
-      /* An error occurred */
-      return 0;
+      *value = evaluate_expression(exp);
     }
 
-  *value = (struct value *) args.result.pointer;
-  return 1;
-}
-
-static int
-wrap_evaluate_expression (char *a)
-{
-  struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a;
-
-  (args)->result.pointer =
-    (char *) evaluate_expression ((struct expression *) args->args[0].pointer);
+  if (except.reason < 0)
+    return 0;
   return 1;
 }
 
 int
-gdb_value_fetch_lazy (struct value *value)
+gdb_value_fetch_lazy (struct value *val)
 {
-  struct gdb_wrapper_arguments args;
+  volatile struct exception except;
 
-  args.args[0].pointer = value;
-  return catch_errors ((catch_errors_ftype *) wrap_value_fetch_lazy, &args,
-		       "", RETURN_MASK_ERROR);
-}
-
-static int
-wrap_value_fetch_lazy (char *a)
-{
-  struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a;
+  TRY_CATCH (except, RETURN_MASK_ERROR)
+    {
+      value_fetch_lazy (val);
+    }
 
-  value_fetch_lazy ((struct value *) (args)->args[0].pointer);
+  if (except.reason < 0)
+    return 0;
   return 1;
 }
 
 int
 gdb_value_equal (struct value *val1, struct value *val2, int *result)
 {
-  struct gdb_wrapper_arguments args;
-
-  args.args[0].pointer = val1;
-  args.args[1].pointer = val2;
+  volatile struct exception except;
 
-  if (!catch_errors ((catch_errors_ftype *) wrap_value_equal, &args,
-		     "", RETURN_MASK_ERROR))
+  TRY_CATCH (except, RETURN_MASK_ERROR)
     {
-      /* An error occurred */
-      return 0;
+      *result = value_equal (val1, val2);
     }
 
-  *result = args.result.integer;
-  return 1;
-}
-
-static int
-wrap_value_equal (char *a)
-{
-  struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a;
-  struct value *val1;
-  struct value *val2;
-
-  val1 = (struct value *) (args)->args[0].pointer;
-  val2 = (struct value *) (args)->args[1].pointer;
-
-  (args)->result.integer = value_equal (val1, val2);
+  if (except.reason < 0)
+    return 0;
   return 1;
 }
 
 int
-gdb_value_assign (struct value *val1, struct value *val2, struct value **result)
+gdb_value_assign (struct value *val1, struct value *val2,
+		  struct value **result)
 {
-  struct gdb_wrapper_arguments args;
+  volatile struct exception except;
 
-  args.args[0].pointer = val1;
-  args.args[1].pointer = val2;
-
-  if (!catch_errors ((catch_errors_ftype *) wrap_value_assign, &args,
-		     "", RETURN_MASK_ERROR))
+  TRY_CATCH (except, RETURN_MASK_ERROR)
     {
-      /* An error occurred */
-      return 0;
+      *result = value_assign (val1, val2);
     }
 
-  *result = (struct value *) args.result.pointer;
-  return 1;
-}
-
-static int
-wrap_value_assign (char *a)
-{
-  struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a;
-  struct value *val1;
-  struct value *val2;
-
-  val1 = (struct value *) (args)->args[0].pointer;
-  val2 = (struct value *) (args)->args[1].pointer;
-
-  (args)->result.pointer = value_assign (val1, val2);
+  if (except.reason < 0)
+    return 0;
   return 1;
 }
 
 int
-gdb_value_subscript (struct value *val1, struct value *val2, struct value **rval)
+gdb_value_subscript (struct value *val1, struct value *val2,
+		     struct value **result)
 {
-  struct gdb_wrapper_arguments args;
+  volatile struct exception except;
 
-  args.args[0].pointer = val1;
-  args.args[1].pointer = val2;
-
-  if (!catch_errors ((catch_errors_ftype *) wrap_value_subscript, &args,
-		     "", RETURN_MASK_ERROR))
+  TRY_CATCH (except, RETURN_MASK_ERROR)
     {
-      /* An error occurred */
-      return 0;
+      *result = value_subscript (val1, val2);
     }
 
-  *rval = (struct value *) args.result.pointer;
-  return 1;
-}
-
-static int
-wrap_value_subscript (char *a)
-{
-  struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a;
-  struct value *val1;
-  struct value *val2;
-
-  val1 = (struct value *) (args)->args[0].pointer;
-  val2 = (struct value *) (args)->args[1].pointer;
-
-  (args)->result.pointer = value_subscript (val1, val2);
+  if (except.reason < 0)
+    return 0;
   return 1;
 }
 
 int
-gdb_value_ind (struct value *val, struct value **rval)
+gdb_value_ind (struct value *val, struct value **result)
 {
-  struct gdb_wrapper_arguments args;
-
-  args.args[0].pointer = val;
+  volatile struct exception except;
 
-  if (!catch_errors ((catch_errors_ftype *) wrap_value_ind, &args,
-		     "", RETURN_MASK_ERROR))
+  TRY_CATCH (except, RETURN_MASK_ERROR)
     {
-      /* An error occurred */
-      return 0;
+      *result = value_ind (val);
     }
 
-  *rval = (struct value *) args.result.pointer;
-  return 1;
-}
-
-static int
-wrap_value_ind (char *opaque_arg)
-{
-  struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) opaque_arg;
-  struct value *val;
-
-  val = (struct value *) (args)->args[0].pointer;
-  (args)->result.pointer = value_ind (val);
+  if (except.reason < 0)
+    return 0;
   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;
+  volatile struct exception except;
 
-  if (!catch_errors ((catch_errors_ftype *) wrap_parse_and_eval_type, &args,
-		     "", RETURN_MASK_ALL))
+  TRY_CATCH (except, RETURN_MASK_ERROR)
     {
-      /* An error occurred */
-      return 0;
+      *type = parse_and_eval_type (p, length);
     }
 
-  *type = (struct type *) args.result.pointer;
-  return 1;
-}
-
-static 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);
-
+  if (except.reason < 0)
+    return 0;
   return 1;
 }
 
 enum gdb_rc
-gdb_value_struct_elt (struct ui_out *uiout, struct value **result, struct value **argp,
-		      struct value **args, char *name, int *static_memfuncp,
-		      char *err)
+gdb_value_struct_elt (struct ui_out *uiout, struct value **result,
+		      struct value **argp, struct value **args, char *name,
+		      int *static_memfuncp, char *err)
 {
-  struct captured_value_struct_elt_args cargs;
-  cargs.argp = argp;
-  cargs.args = args;
-  cargs.name = name;
-  cargs.static_memfuncp = static_memfuncp;
-  cargs.err = err;
-  cargs.result_ptr = result;
-  return catch_exceptions (uiout, do_captured_value_struct_elt, &cargs,
-			   RETURN_MASK_ALL);
-}
+  volatile struct exception except;
 
-static int
-do_captured_value_struct_elt (struct ui_out *uiout, void *data)
-{
-  struct captured_value_struct_elt_args *cargs = data;
-  *cargs->result_ptr = value_struct_elt (cargs->argp, cargs->args, cargs->name,
-			     cargs->static_memfuncp, cargs->err);
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    {
+      *result = value_struct_elt (argp, args, name, static_memfuncp, err);
+    }
+
+  if (except.reason < 0)
+    return GDB_RC_FAIL;
   return GDB_RC_OK;
 }
-
Index: wrapper.h
===================================================================
RCS file: /cvs/src/src/gdb/wrapper.h,v
retrieving revision 1.13
diff -u -p -r1.13 wrapper.h
--- wrapper.h 6 Feb 2003 01:19:12 -0000 1.13
+++ wrapper.h 16 Feb 2005 01:06:11 -0000
@@ -1,5 +1,6 @@
-/* Longjump free calls to gdb internal routines.
-   Copyright 1999, 2000 Free Software Foundation, Inc.
+/* Longjump free calls to GDB internal routines.
+
+   Copyright 1999, 2000, 2005 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -18,15 +19,13 @@
 
 #ifndef WRAPPER_H
 #define WRAPPER_H 1
+
 #include "gdb.h"
 
 struct value;
 struct expression;
 struct block;
 
-/* Use this struct to pass arguments to wrapper routines. */
-struct gdb_wrapper_arguments;
-
 extern int gdb_parse_exp_1 (char **, struct block *,
 			    int, struct expression **);
 
@@ -38,14 +37,17 @@ extern int gdb_value_equal (struct value
 
 extern int gdb_value_assign (struct value *, struct value *, struct value **);
 
-extern int gdb_value_subscript (struct value *, struct value *, struct value **);
+extern int gdb_value_subscript (struct value *, struct value *,
+				struct value **);
 
-extern enum gdb_rc gdb_value_struct_elt (struct ui_out *uiout, struct value **result_ptr,
-					 struct value **argp, struct value **args,
-					 char *name, int *static_memfuncp, char *err);
+extern enum gdb_rc gdb_value_struct_elt (struct ui_out *uiout,
+					 struct value **result_ptr,
+					 struct value **argp,
+					 struct value **args, char *name,
+					 int *static_memfuncp, char *err);
 
 extern int gdb_value_ind (struct value *val, struct value ** rval);
 
 extern int gdb_parse_and_eval_type (char *, int, struct type **);
 
-#endif /* WRAPPER_H */
+#endif /* wrapper.h */



More information about the Gdb-patches mailing list