198944Sobrien/* Longjump free calls to gdb internal routines. 298944Sobrien Copyright 1999, 2000 Free Software Foundation, Inc. 398944Sobrien 498944Sobrien This program is free software; you can redistribute it and/or modify 598944Sobrien it under the terms of the GNU General Public License as published by 698944Sobrien the Free Software Foundation; either version 2 of the License, or 798944Sobrien (at your option) any later version. 898944Sobrien 998944Sobrien This program is distributed in the hope that it will be useful, 1098944Sobrien but WITHOUT ANY WARRANTY; without even the implied warranty of 1198944Sobrien MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1298944Sobrien GNU General Public License for more details. 1398944Sobrien 1498944Sobrien You should have received a copy of the GNU General Public License 1598944Sobrien along with this program; if not, write to the Free Software 1698944Sobrien Foundation, Inc., 59 Temple Place - Suite 330, 1798944Sobrien Boston, MA 02111-1307, USA. */ 1898944Sobrien 1998944Sobrien#include "defs.h" 2098944Sobrien#include "value.h" 2198944Sobrien#include "wrapper.h" 2298944Sobrien 2398944Sobrien/* Use this struct to pass arguments to wrapper routines. We assume 2498944Sobrien (arbitrarily) that no gdb function takes more than ten arguments. */ 2598944Sobrienstruct gdb_wrapper_arguments 2698944Sobrien { 2798944Sobrien 2898944Sobrien /* Pointer to some result from the gdb function call, if any */ 2998944Sobrien union wrapper_results 3098944Sobrien { 3198944Sobrien int integer; 3298944Sobrien void *pointer; 3398944Sobrien } result; 3498944Sobrien 3598944Sobrien 3698944Sobrien /* The list of arguments. */ 3798944Sobrien union wrapper_args 3898944Sobrien { 3998944Sobrien int integer; 4098944Sobrien void *pointer; 4198944Sobrien } args[10]; 4298944Sobrien }; 4398944Sobrien 4498944Sobrienstruct captured_value_struct_elt_args 4598944Sobrien{ 4698944Sobrien struct value **argp; 4798944Sobrien struct value **args; 4898944Sobrien char *name; 4998944Sobrien int *static_memfuncp; 5098944Sobrien char *err; 5198944Sobrien struct value **result_ptr; 5298944Sobrien}; 5398944Sobrien 5498944Sobrienstatic int wrap_parse_exp_1 (char *); 5598944Sobrien 5698944Sobrienstatic int wrap_evaluate_expression (char *); 5798944Sobrien 5898944Sobrienstatic int wrap_value_fetch_lazy (char *); 5998944Sobrien 6098944Sobrienstatic int wrap_value_equal (char *); 6198944Sobrien 6298944Sobrienstatic int wrap_value_assign (char *); 6398944Sobrien 6498944Sobrienstatic int wrap_value_subscript (char *); 6598944Sobrien 6698944Sobrienstatic int wrap_value_ind (char *opaque_arg); 6798944Sobrien 6898944Sobrienstatic int do_captured_value_struct_elt (struct ui_out *uiout, void *data); 6998944Sobrien 7098944Sobrienstatic int wrap_parse_and_eval_type (char *); 7198944Sobrien 7298944Sobrienint 7398944Sobriengdb_parse_exp_1 (char **stringptr, struct block *block, int comma, 7498944Sobrien struct expression **expression) 7598944Sobrien{ 7698944Sobrien struct gdb_wrapper_arguments args; 7798944Sobrien args.args[0].pointer = stringptr; 7898944Sobrien args.args[1].pointer = block; 7998944Sobrien args.args[2].integer = comma; 8098944Sobrien 8198944Sobrien if (!catch_errors ((catch_errors_ftype *) wrap_parse_exp_1, &args, 8298944Sobrien "", RETURN_MASK_ERROR)) 8398944Sobrien { 8498944Sobrien /* An error occurred */ 8598944Sobrien return 0; 8698944Sobrien } 8798944Sobrien 8898944Sobrien *expression = (struct expression *) args.result.pointer; 8998944Sobrien return 1; 9098944Sobrien 9198944Sobrien} 9298944Sobrien 9398944Sobrienstatic int 9498944Sobrienwrap_parse_exp_1 (char *argptr) 9598944Sobrien{ 9698944Sobrien struct gdb_wrapper_arguments *args 9798944Sobrien = (struct gdb_wrapper_arguments *) argptr; 9898944Sobrien args->result.pointer = parse_exp_1((char **) args->args[0].pointer, 9998944Sobrien (struct block *) args->args[1].pointer, 10098944Sobrien args->args[2].integer); 10198944Sobrien return 1; 10298944Sobrien} 10398944Sobrien 10498944Sobrienint 10598944Sobriengdb_evaluate_expression (struct expression *exp, struct value **value) 10698944Sobrien{ 10798944Sobrien struct gdb_wrapper_arguments args; 10898944Sobrien args.args[0].pointer = exp; 10998944Sobrien 11098944Sobrien if (!catch_errors ((catch_errors_ftype *) wrap_evaluate_expression, &args, 11198944Sobrien "", RETURN_MASK_ERROR)) 11298944Sobrien { 11398944Sobrien /* An error occurred */ 11498944Sobrien return 0; 11598944Sobrien } 11698944Sobrien 11798944Sobrien *value = (struct value *) args.result.pointer; 11898944Sobrien return 1; 11998944Sobrien} 12098944Sobrien 12198944Sobrienstatic int 12298944Sobrienwrap_evaluate_expression (char *a) 12398944Sobrien{ 12498944Sobrien struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a; 12598944Sobrien 12698944Sobrien (args)->result.pointer = 12798944Sobrien (char *) evaluate_expression ((struct expression *) args->args[0].pointer); 12898944Sobrien return 1; 12998944Sobrien} 13098944Sobrien 13198944Sobrienint 13298944Sobriengdb_value_fetch_lazy (struct value *value) 13398944Sobrien{ 13498944Sobrien struct gdb_wrapper_arguments args; 13598944Sobrien 13698944Sobrien args.args[0].pointer = value; 13798944Sobrien return catch_errors ((catch_errors_ftype *) wrap_value_fetch_lazy, &args, 13898944Sobrien "", RETURN_MASK_ERROR); 13998944Sobrien} 14098944Sobrien 14198944Sobrienstatic int 14298944Sobrienwrap_value_fetch_lazy (char *a) 14398944Sobrien{ 14498944Sobrien struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a; 14598944Sobrien 14698944Sobrien value_fetch_lazy ((struct value *) (args)->args[0].pointer); 14798944Sobrien return 1; 14898944Sobrien} 14998944Sobrien 15098944Sobrienint 15198944Sobriengdb_value_equal (struct value *val1, struct value *val2, int *result) 15298944Sobrien{ 15398944Sobrien struct gdb_wrapper_arguments args; 15498944Sobrien 15598944Sobrien args.args[0].pointer = val1; 15698944Sobrien args.args[1].pointer = val2; 15798944Sobrien 15898944Sobrien if (!catch_errors ((catch_errors_ftype *) wrap_value_equal, &args, 15998944Sobrien "", RETURN_MASK_ERROR)) 16098944Sobrien { 16198944Sobrien /* An error occurred */ 16298944Sobrien return 0; 16398944Sobrien } 16498944Sobrien 16598944Sobrien *result = args.result.integer; 16698944Sobrien return 1; 16798944Sobrien} 16898944Sobrien 16998944Sobrienstatic int 17098944Sobrienwrap_value_equal (char *a) 17198944Sobrien{ 17298944Sobrien struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a; 17398944Sobrien struct value *val1; 17498944Sobrien struct value *val2; 17598944Sobrien 17698944Sobrien val1 = (struct value *) (args)->args[0].pointer; 17798944Sobrien val2 = (struct value *) (args)->args[1].pointer; 17898944Sobrien 17998944Sobrien (args)->result.integer = value_equal (val1, val2); 18098944Sobrien return 1; 18198944Sobrien} 18298944Sobrien 18398944Sobrienint 18498944Sobriengdb_value_assign (struct value *val1, struct value *val2, struct value **result) 18598944Sobrien{ 18698944Sobrien struct gdb_wrapper_arguments args; 18798944Sobrien 18898944Sobrien args.args[0].pointer = val1; 18998944Sobrien args.args[1].pointer = val2; 19098944Sobrien 19198944Sobrien if (!catch_errors ((catch_errors_ftype *) wrap_value_assign, &args, 19298944Sobrien "", RETURN_MASK_ERROR)) 19398944Sobrien { 19498944Sobrien /* An error occurred */ 19598944Sobrien return 0; 19698944Sobrien } 19798944Sobrien 19898944Sobrien *result = (struct value *) args.result.pointer; 19998944Sobrien return 1; 20098944Sobrien} 20198944Sobrien 20298944Sobrienstatic int 20398944Sobrienwrap_value_assign (char *a) 20498944Sobrien{ 20598944Sobrien struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a; 20698944Sobrien struct value *val1; 20798944Sobrien struct value *val2; 20898944Sobrien 20998944Sobrien val1 = (struct value *) (args)->args[0].pointer; 21098944Sobrien val2 = (struct value *) (args)->args[1].pointer; 21198944Sobrien 21298944Sobrien (args)->result.pointer = value_assign (val1, val2); 21398944Sobrien return 1; 21498944Sobrien} 21598944Sobrien 21698944Sobrienint 21798944Sobriengdb_value_subscript (struct value *val1, struct value *val2, struct value **rval) 21898944Sobrien{ 21998944Sobrien struct gdb_wrapper_arguments args; 22098944Sobrien 22198944Sobrien args.args[0].pointer = val1; 22298944Sobrien args.args[1].pointer = val2; 22398944Sobrien 22498944Sobrien if (!catch_errors ((catch_errors_ftype *) wrap_value_subscript, &args, 22598944Sobrien "", RETURN_MASK_ERROR)) 22698944Sobrien { 22798944Sobrien /* An error occurred */ 22898944Sobrien return 0; 22998944Sobrien } 23098944Sobrien 23198944Sobrien *rval = (struct value *) args.result.pointer; 23298944Sobrien return 1; 23398944Sobrien} 23498944Sobrien 23598944Sobrienstatic int 23698944Sobrienwrap_value_subscript (char *a) 23798944Sobrien{ 23898944Sobrien struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a; 23998944Sobrien struct value *val1; 24098944Sobrien struct value *val2; 24198944Sobrien 24298944Sobrien val1 = (struct value *) (args)->args[0].pointer; 24398944Sobrien val2 = (struct value *) (args)->args[1].pointer; 24498944Sobrien 24598944Sobrien (args)->result.pointer = value_subscript (val1, val2); 24698944Sobrien return 1; 24798944Sobrien} 24898944Sobrien 24998944Sobrienint 25098944Sobriengdb_value_ind (struct value *val, struct value **rval) 25198944Sobrien{ 25298944Sobrien struct gdb_wrapper_arguments args; 25398944Sobrien 25498944Sobrien args.args[0].pointer = val; 25598944Sobrien 25698944Sobrien if (!catch_errors ((catch_errors_ftype *) wrap_value_ind, &args, 25798944Sobrien "", RETURN_MASK_ERROR)) 25898944Sobrien { 25998944Sobrien /* An error occurred */ 26098944Sobrien return 0; 26198944Sobrien } 26298944Sobrien 26398944Sobrien *rval = (struct value *) args.result.pointer; 26498944Sobrien return 1; 26598944Sobrien} 26698944Sobrien 26798944Sobrienstatic int 26898944Sobrienwrap_value_ind (char *opaque_arg) 26998944Sobrien{ 27098944Sobrien struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) opaque_arg; 27198944Sobrien struct value *val; 27298944Sobrien 27398944Sobrien val = (struct value *) (args)->args[0].pointer; 27498944Sobrien (args)->result.pointer = value_ind (val); 27598944Sobrien return 1; 27698944Sobrien} 27798944Sobrien 27898944Sobrienint 27998944Sobriengdb_parse_and_eval_type (char *p, int length, struct type **type) 28098944Sobrien{ 28198944Sobrien struct gdb_wrapper_arguments args; 28298944Sobrien args.args[0].pointer = p; 28398944Sobrien args.args[1].integer = length; 28498944Sobrien 28598944Sobrien if (!catch_errors ((catch_errors_ftype *) wrap_parse_and_eval_type, &args, 28698944Sobrien "", RETURN_MASK_ALL)) 28798944Sobrien { 28898944Sobrien /* An error occurred */ 28998944Sobrien return 0; 29098944Sobrien } 29198944Sobrien 29298944Sobrien *type = (struct type *) args.result.pointer; 29398944Sobrien return 1; 29498944Sobrien} 29598944Sobrien 29698944Sobrienstatic int 29798944Sobrienwrap_parse_and_eval_type (char *a) 29898944Sobrien{ 29998944Sobrien struct gdb_wrapper_arguments *args = (struct gdb_wrapper_arguments *) a; 30098944Sobrien 30198944Sobrien char *p = (char *) args->args[0].pointer; 30298944Sobrien int length = args->args[1].integer; 30398944Sobrien 30498944Sobrien args->result.pointer = (char *) parse_and_eval_type (p, length); 30598944Sobrien 30698944Sobrien return 1; 30798944Sobrien} 30898944Sobrien 30998944Sobrienenum gdb_rc 31098944Sobriengdb_value_struct_elt (struct ui_out *uiout, struct value **result, struct value **argp, 31198944Sobrien struct value **args, char *name, int *static_memfuncp, 31298944Sobrien char *err) 31398944Sobrien{ 31498944Sobrien struct captured_value_struct_elt_args cargs; 31598944Sobrien cargs.argp = argp; 31698944Sobrien cargs.args = args; 31798944Sobrien cargs.name = name; 31898944Sobrien cargs.static_memfuncp = static_memfuncp; 31998944Sobrien cargs.err = err; 32098944Sobrien cargs.result_ptr = result; 32198944Sobrien return catch_exceptions (uiout, do_captured_value_struct_elt, &cargs, 32298944Sobrien NULL, RETURN_MASK_ALL); 32398944Sobrien} 32498944Sobrien 32598944Sobrienstatic int 32698944Sobriendo_captured_value_struct_elt (struct ui_out *uiout, void *data) 32798944Sobrien{ 32898944Sobrien struct captured_value_struct_elt_args *cargs = data; 32998944Sobrien *cargs->result_ptr = value_struct_elt (cargs->argp, cargs->args, cargs->name, 33098944Sobrien cargs->static_memfuncp, cargs->err); 33198944Sobrien return GDB_RC_OK; 33298944Sobrien} 33398944Sobrien 334