[PATCH]: Add expected type to hand_function_call
Elena Zannoni
ezannoni@redhat.com
Wed Feb 19 20:31:00 GMT 2003
Adam Fedor writes:
> This patch adds a parameter to hand_function_call that can be used to
> check the type of the function return. This is used often with
> Objective-C as this information is known by the runtime and can be used
> to check the validity of the function.
>
> 2002-11-24 Adam Fedor <fedor@gnu.org>
>
> * valops.c (find_function_addr): Make non-static.
> (hand_function_call): Add expect_type arg, use it to check
> return type of function (updated by Klee Dienes <kdienes@apple.com>).
> (call_function_by_hand): Update for change in hand_function_call.
> (call_function_by_hand_expecting_type): New function.
> * value.h (find_function_addr,
> call_function_by_hand_expecting_type): Declare.
>
> Index: valops.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/valops.c,v
> retrieving revision 1.79
> diff -u -p -r1.79 valops.c
> --- valops.c 7 Nov 2002 02:45:27 -0000 1.79
> +++ valops.c 25 Nov 2002 02:50:17 -0000
> @@ -48,7 +48,6 @@ extern int overload_debug;
> static int typecmp (int staticp, int varargs, int nargs,
> struct field t1[], struct value *t2[]);
>
> -static CORE_ADDR find_function_addr (struct value *, struct type **);
> static struct value *value_arg_coerce (struct value *, struct type *, int);
>
>
> @@ -1228,7 +1227,7 @@ value_arg_coerce (struct value *arg, str
> /* Determine a function's address and its return type from its value.
> Calls error() if the function is not valid for calling. */
>
> -static CORE_ADDR
> +CORE_ADDR
> find_function_addr (struct value *function, struct type **retval_type)
> {
> register struct type *ftype = check_typedef (VALUE_TYPE (function));
> @@ -1296,7 +1295,8 @@ find_function_addr (struct value *functi
> ARGS is modified to contain coerced values. */
>
> static struct value *
> -hand_function_call (struct value *function, int nargs, struct value **args)
> +hand_function_call (struct value *function, struct type *expect_type,
> + int nargs, struct value **args)
> {
> register CORE_ADDR sp;
> register int i;
> @@ -1342,6 +1342,17 @@ hand_function_call (struct value *functi
> if (!target_has_execution)
> noprocess ();
>
> + funaddr = find_function_addr (function, &value_type);
> + CHECK_TYPEDEF (value_type);
> +
> + if ((value_type == NULL) || (TYPE_CODE (value_type) == TYPE_CODE_ERROR))
> + value_type = expect_type;
> +
> + if ((value_type == NULL) || (TYPE_CODE (value_type) == TYPE_CODE_ERROR))
> + error ("Unable to call function at 0x%lx: no return type information available.\n"
> + "To call this function anyway, you can cast the return type explicitly (e.g. 'print (float) fabs (3.0)')",
> + (unsigned long) funaddr);
> +
Could this code be moved into the new function? This way you could leave
hand_function_call alone, and just have 2 wrappers call_function_by_hand and
call_function_by_hand_expecting_type.
elena
> /* Create a cleanup chain that contains the retbuf (buffer
> containing the register values). This chain is create BEFORE the
> inf_status chain so that the inferior status can cleaned up
> @@ -1428,9 +1439,6 @@ hand_function_call (struct value *functi
> a SIZEOF_DUMMY1 (via SIZEOF_CALL_DUMMY_WORDS) such that all local
> alignment requirements are met. */
>
> - funaddr = find_function_addr (function, &value_type);
> - CHECK_TYPEDEF (value_type);
> -
> {
> struct block *b = block_for_pc (funaddr);
> /* If compiled without -g, assume GCC 2. */
> @@ -1891,7 +1899,22 @@ call_function_by_hand (struct value *fun
> {
> if (CALL_DUMMY_P)
> {
> - return hand_function_call (function, nargs, args);
> + return hand_function_call (function, NULL, nargs, args);
> + }
> + else
> + {
> + error ("Cannot invoke functions on this machine.");
> + }
> +}
> +
> +struct value *
> +call_function_by_hand_expecting_type (struct value *function,
> + struct type *expect_type,
> + int nargs, struct value **args)
> +{
> + if (CALL_DUMMY_P)
> + {
> + return hand_function_call (function, expect_type, nargs, args);
> }
> else
> {
> Index: value.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/value.h,v
> retrieving revision 1.37
> diff -u -p -r1.37 value.h
> --- value.h 14 Oct 2002 02:02:42 -0000 1.37
> +++ value.h 25 Nov 2002 02:50:17 -0000
> @@ -548,6 +548,10 @@ extern struct value *value_slice (struct
> extern struct value *call_function_by_hand (struct value *, int,
> struct value **);
>
> +extern struct value *call_function_by_hand_expecting_type (struct value *,
> + struct type *, int,
> + struct value **);
> +
> extern int default_coerce_float_to_double (struct type *, struct type *);
>
> extern int standard_coerce_float_to_double (struct type *, struct type *);
> @@ -565,6 +569,8 @@ extern struct value *value_allocate_spac
> extern CORE_ADDR default_push_arguments (int nargs, struct value ** args,
> CORE_ADDR sp, int struct_return,
> CORE_ADDR struct_addr);
> +
> +extern CORE_ADDR find_function_addr (struct value *, struct type **);
>
> extern struct value *value_of_local (const char *name, int complain);
>
More information about the Gdb-patches
mailing list