1e93f7393Sniklas /* Scheme/Guile language support routines for GDB, the GNU debugger.
2b725ae77Skettenis
3b725ae77Skettenis Copyright 1995, 1996, 1998, 2000, 2001, 2002, 2003, 2004 Free Software
4b725ae77Skettenis Foundation, Inc.
5e93f7393Sniklas
6e93f7393Sniklas This file is part of GDB.
7e93f7393Sniklas
8e93f7393Sniklas This program is free software; you can redistribute it and/or modify
9e93f7393Sniklas it under the terms of the GNU General Public License as published by
10e93f7393Sniklas the Free Software Foundation; either version 2 of the License, or
11e93f7393Sniklas (at your option) any later version.
12e93f7393Sniklas
13e93f7393Sniklas This program is distributed in the hope that it will be useful,
14e93f7393Sniklas but WITHOUT ANY WARRANTY; without even the implied warranty of
15e93f7393Sniklas MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16e93f7393Sniklas GNU General Public License for more details.
17e93f7393Sniklas
18e93f7393Sniklas You should have received a copy of the GNU General Public License
19e93f7393Sniklas along with this program; if not, write to the Free Software
20b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
21b725ae77Skettenis Boston, MA 02111-1307, USA. */
22e93f7393Sniklas
23e93f7393Sniklas #include "defs.h"
24e93f7393Sniklas #include "symtab.h"
25e93f7393Sniklas #include "gdbtypes.h"
26e93f7393Sniklas #include "expression.h"
27e93f7393Sniklas #include "parser-defs.h"
28e93f7393Sniklas #include "language.h"
29e93f7393Sniklas #include "value.h"
30e93f7393Sniklas #include "c-lang.h"
31e93f7393Sniklas #include "scm-lang.h"
32e93f7393Sniklas #include "scm-tags.h"
33b725ae77Skettenis #include "source.h"
34e93f7393Sniklas #include "gdb_string.h"
35e93f7393Sniklas #include "gdbcore.h"
36b725ae77Skettenis #include "infcall.h"
37e93f7393Sniklas
38b725ae77Skettenis extern void _initialize_scheme_language (void);
39b725ae77Skettenis static struct value *evaluate_subexp_scm (struct type *, struct expression *,
40b725ae77Skettenis int *, enum noside);
41b725ae77Skettenis static struct value *scm_lookup_name (char *);
42b725ae77Skettenis static int in_eval_c (void);
43b725ae77Skettenis static void scm_printstr (struct ui_file * stream, char *string,
44b725ae77Skettenis unsigned int length, int width,
45b725ae77Skettenis int force_ellipses);
46e93f7393Sniklas
47e93f7393Sniklas struct type *builtin_type_scm;
48e93f7393Sniklas
49e93f7393Sniklas void
scm_printchar(int c,struct ui_file * stream)50b725ae77Skettenis scm_printchar (int c, struct ui_file *stream)
51e93f7393Sniklas {
52e93f7393Sniklas fprintf_filtered (stream, "#\\%c", c);
53e93f7393Sniklas }
54e93f7393Sniklas
55e93f7393Sniklas static void
scm_printstr(struct ui_file * stream,char * string,unsigned int length,int width,int force_ellipses)56b725ae77Skettenis scm_printstr (struct ui_file *stream, char *string, unsigned int length,
57b725ae77Skettenis int width, int force_ellipses)
58e93f7393Sniklas {
59e93f7393Sniklas fprintf_filtered (stream, "\"%s\"", string);
60e93f7393Sniklas }
61e93f7393Sniklas
62e93f7393Sniklas int
is_scmvalue_type(struct type * type)63b725ae77Skettenis is_scmvalue_type (struct type *type)
64e93f7393Sniklas {
65e93f7393Sniklas if (TYPE_CODE (type) == TYPE_CODE_INT
66e93f7393Sniklas && TYPE_NAME (type) && strcmp (TYPE_NAME (type), "SCM") == 0)
67e93f7393Sniklas {
68e93f7393Sniklas return 1;
69e93f7393Sniklas }
70e93f7393Sniklas return 0;
71e93f7393Sniklas }
72e93f7393Sniklas
73e93f7393Sniklas /* Get the INDEX'th SCM value, assuming SVALUE is the address
74e93f7393Sniklas of the 0'th one. */
75e93f7393Sniklas
76e93f7393Sniklas LONGEST
scm_get_field(LONGEST svalue,int index)77b725ae77Skettenis scm_get_field (LONGEST svalue, int index)
78e93f7393Sniklas {
79e93f7393Sniklas char buffer[20];
80e93f7393Sniklas read_memory (SCM2PTR (svalue) + index * TYPE_LENGTH (builtin_type_scm),
81e93f7393Sniklas buffer, TYPE_LENGTH (builtin_type_scm));
82e93f7393Sniklas return extract_signed_integer (buffer, TYPE_LENGTH (builtin_type_scm));
83e93f7393Sniklas }
84e93f7393Sniklas
85e93f7393Sniklas /* Unpack a value of type TYPE in buffer VALADDR as an integer
86e93f7393Sniklas (if CONTEXT == TYPE_CODE_IN), a pointer (CONTEXT == TYPE_CODE_PTR),
87e93f7393Sniklas or Boolean (CONTEXT == TYPE_CODE_BOOL). */
88e93f7393Sniklas
89e93f7393Sniklas LONGEST
scm_unpack(struct type * type,const char * valaddr,enum type_code context)90b725ae77Skettenis scm_unpack (struct type *type, const char *valaddr, enum type_code context)
91e93f7393Sniklas {
92e93f7393Sniklas if (is_scmvalue_type (type))
93e93f7393Sniklas {
94e93f7393Sniklas LONGEST svalue = extract_signed_integer (valaddr, TYPE_LENGTH (type));
95e93f7393Sniklas if (context == TYPE_CODE_BOOL)
96e93f7393Sniklas {
97e93f7393Sniklas if (svalue == SCM_BOOL_F)
98e93f7393Sniklas return 0;
99e93f7393Sniklas else
100e93f7393Sniklas return 1;
101e93f7393Sniklas }
102b725ae77Skettenis switch (7 & (int) svalue)
103e93f7393Sniklas {
104b725ae77Skettenis case 2:
105b725ae77Skettenis case 6: /* fixnum */
106e93f7393Sniklas return svalue >> 2;
107e93f7393Sniklas case 4: /* other immediate value */
108e93f7393Sniklas if (SCM_ICHRP (svalue)) /* character */
109e93f7393Sniklas return SCM_ICHR (svalue);
110e93f7393Sniklas else if (SCM_IFLAGP (svalue))
111e93f7393Sniklas {
112b725ae77Skettenis switch ((int) svalue)
113e93f7393Sniklas {
114e93f7393Sniklas #ifndef SICP
115e93f7393Sniklas case SCM_EOL:
116e93f7393Sniklas #endif
117e93f7393Sniklas case SCM_BOOL_F:
118e93f7393Sniklas return 0;
119e93f7393Sniklas case SCM_BOOL_T:
120e93f7393Sniklas return 1;
121e93f7393Sniklas }
122e93f7393Sniklas }
123e93f7393Sniklas error ("Value can't be converted to integer.");
124e93f7393Sniklas default:
125e93f7393Sniklas return svalue;
126e93f7393Sniklas }
127e93f7393Sniklas }
128e93f7393Sniklas else
129e93f7393Sniklas return unpack_long (type, valaddr);
130e93f7393Sniklas }
131e93f7393Sniklas
132e93f7393Sniklas /* True if we're correctly in Guile's eval.c (the evaluator and apply). */
133e93f7393Sniklas
134e93f7393Sniklas static int
in_eval_c(void)135b725ae77Skettenis in_eval_c (void)
136e93f7393Sniklas {
137b725ae77Skettenis struct symtab_and_line cursal = get_current_source_symtab_and_line ();
138b725ae77Skettenis
139b725ae77Skettenis if (cursal.symtab && cursal.symtab->filename)
140e93f7393Sniklas {
141b725ae77Skettenis char *filename = cursal.symtab->filename;
142e93f7393Sniklas int len = strlen (filename);
143e93f7393Sniklas if (len >= 6 && strcmp (filename + len - 6, "eval.c") == 0)
144e93f7393Sniklas return 1;
145e93f7393Sniklas }
146e93f7393Sniklas return 0;
147e93f7393Sniklas }
148e93f7393Sniklas
149e93f7393Sniklas /* Lookup a value for the variable named STR.
150e93f7393Sniklas First lookup in Scheme context (using the scm_lookup_cstr inferior
151e93f7393Sniklas function), then try lookup_symbol for compiled variables. */
152e93f7393Sniklas
153b725ae77Skettenis static struct value *
scm_lookup_name(char * str)154b725ae77Skettenis scm_lookup_name (char *str)
155e93f7393Sniklas {
156b725ae77Skettenis struct value *args[3];
157e93f7393Sniklas int len = strlen (str);
158b725ae77Skettenis struct value *func;
159b725ae77Skettenis struct value *val;
160e93f7393Sniklas struct symbol *sym;
161e93f7393Sniklas args[0] = value_allocate_space_in_inferior (len);
162e93f7393Sniklas args[1] = value_from_longest (builtin_type_int, len);
163e93f7393Sniklas write_memory (value_as_long (args[0]), str, len);
164e93f7393Sniklas
165e93f7393Sniklas if (in_eval_c ()
166e93f7393Sniklas && (sym = lookup_symbol ("env",
167e93f7393Sniklas expression_context_block,
168b725ae77Skettenis VAR_DOMAIN, (int *) NULL,
169e93f7393Sniklas (struct symtab **) NULL)) != NULL)
170e93f7393Sniklas args[2] = value_of_variable (sym, expression_context_block);
171e93f7393Sniklas else
172e93f7393Sniklas /* FIXME in this case, we should try lookup_symbol first */
173e93f7393Sniklas args[2] = value_from_longest (builtin_type_scm, SCM_EOL);
174e93f7393Sniklas
175e93f7393Sniklas func = find_function_in_inferior ("scm_lookup_cstr");
176e93f7393Sniklas val = call_function_by_hand (func, 3, args);
177e93f7393Sniklas if (!value_logical_not (val))
178e93f7393Sniklas return value_ind (val);
179e93f7393Sniklas
180e93f7393Sniklas sym = lookup_symbol (str,
181e93f7393Sniklas expression_context_block,
182b725ae77Skettenis VAR_DOMAIN, (int *) NULL,
183e93f7393Sniklas (struct symtab **) NULL);
184e93f7393Sniklas if (sym)
185e93f7393Sniklas return value_of_variable (sym, NULL);
186b725ae77Skettenis error ("No symbol \"%s\" in current context.", str);
187e93f7393Sniklas }
188e93f7393Sniklas
189b725ae77Skettenis struct value *
scm_evaluate_string(char * str,int len)190b725ae77Skettenis scm_evaluate_string (char *str, int len)
191e93f7393Sniklas {
192b725ae77Skettenis struct value *func;
193b725ae77Skettenis struct value *addr = value_allocate_space_in_inferior (len + 1);
194e93f7393Sniklas LONGEST iaddr = value_as_long (addr);
195e93f7393Sniklas write_memory (iaddr, str, len);
196e93f7393Sniklas /* FIXME - should find and pass env */
197e93f7393Sniklas write_memory (iaddr + len, "", 1);
198e93f7393Sniklas func = find_function_in_inferior ("scm_evstr");
199e93f7393Sniklas return call_function_by_hand (func, 1, &addr);
200e93f7393Sniklas }
201e93f7393Sniklas
202b725ae77Skettenis static struct value *
evaluate_subexp_scm(struct type * expect_type,struct expression * exp,int * pos,enum noside noside)203b725ae77Skettenis evaluate_subexp_scm (struct type *expect_type, struct expression *exp,
204b725ae77Skettenis int *pos, enum noside noside)
205e93f7393Sniklas {
206e93f7393Sniklas enum exp_opcode op = exp->elts[*pos].opcode;
207b725ae77Skettenis int len, pc;
208b725ae77Skettenis char *str;
209e93f7393Sniklas switch (op)
210e93f7393Sniklas {
211e93f7393Sniklas case OP_NAME:
212e93f7393Sniklas pc = (*pos)++;
213e93f7393Sniklas len = longest_to_int (exp->elts[pc + 1].longconst);
214e93f7393Sniklas (*pos) += 3 + BYTES_TO_EXP_ELEM (len + 1);
215e93f7393Sniklas if (noside == EVAL_SKIP)
216e93f7393Sniklas goto nosideret;
217e93f7393Sniklas str = &exp->elts[pc + 2].string;
218e93f7393Sniklas return scm_lookup_name (str);
219e93f7393Sniklas case OP_EXPRSTRING:
220e93f7393Sniklas pc = (*pos)++;
221e93f7393Sniklas len = longest_to_int (exp->elts[pc + 1].longconst);
222e93f7393Sniklas (*pos) += 3 + BYTES_TO_EXP_ELEM (len + 1);
223e93f7393Sniklas if (noside == EVAL_SKIP)
224e93f7393Sniklas goto nosideret;
225e93f7393Sniklas str = &exp->elts[pc + 2].string;
226e93f7393Sniklas return scm_evaluate_string (str, len);
227e93f7393Sniklas default:;
228e93f7393Sniklas }
229e93f7393Sniklas return evaluate_subexp_standard (expect_type, exp, pos, noside);
230e93f7393Sniklas nosideret:
231e93f7393Sniklas return value_from_longest (builtin_type_long, (LONGEST) 1);
232e93f7393Sniklas }
233e93f7393Sniklas
234b725ae77Skettenis const struct exp_descriptor exp_descriptor_scm =
235b725ae77Skettenis {
236b725ae77Skettenis print_subexp_standard,
237b725ae77Skettenis operator_length_standard,
238b725ae77Skettenis op_name_standard,
239b725ae77Skettenis dump_subexp_body_standard,
240b725ae77Skettenis evaluate_subexp_scm
241b725ae77Skettenis };
242b725ae77Skettenis
243b725ae77Skettenis const struct language_defn scm_language_defn =
244b725ae77Skettenis {
245e93f7393Sniklas "scheme", /* Language name */
246e93f7393Sniklas language_scm,
247*63addd46Skettenis NULL,
248e93f7393Sniklas range_check_off,
249e93f7393Sniklas type_check_off,
250b725ae77Skettenis case_sensitive_off,
251*63addd46Skettenis array_row_major,
252b725ae77Skettenis &exp_descriptor_scm,
253e93f7393Sniklas scm_parse,
254e93f7393Sniklas c_error,
255*63addd46Skettenis null_post_parser,
256e93f7393Sniklas scm_printchar, /* Print a character constant */
257e93f7393Sniklas scm_printstr, /* Function to print string constant */
258b725ae77Skettenis NULL, /* Function to print a single character */
259e93f7393Sniklas NULL, /* Create fundamental type in this language */
260e93f7393Sniklas c_print_type, /* Print a type using appropriate syntax */
261e93f7393Sniklas scm_val_print, /* Print a value using appropriate syntax */
262e93f7393Sniklas scm_value_print, /* Print a top-level value */
263b725ae77Skettenis NULL, /* Language specific skip_trampoline */
264b725ae77Skettenis value_of_this, /* value_of_this */
265b725ae77Skettenis basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
266b725ae77Skettenis basic_lookup_transparent_type,/* lookup_transparent_type */
267b725ae77Skettenis NULL, /* Language specific symbol demangler */
268*63addd46Skettenis NULL, /* Language specific class_name_from_physname */
269e93f7393Sniklas NULL, /* expression operators for printing */
270e93f7393Sniklas 1, /* c-style arrays */
271e93f7393Sniklas 0, /* String lower bound */
272*63addd46Skettenis NULL,
273b725ae77Skettenis default_word_break_characters,
274*63addd46Skettenis c_language_arch_info,
275e93f7393Sniklas LANG_MAGIC
276e93f7393Sniklas };
277e93f7393Sniklas
278e93f7393Sniklas void
_initialize_scheme_language(void)279b725ae77Skettenis _initialize_scheme_language (void)
280e93f7393Sniklas {
281e93f7393Sniklas add_language (&scm_language_defn);
282e93f7393Sniklas builtin_type_scm = init_type (TYPE_CODE_INT,
283e93f7393Sniklas TARGET_LONG_BIT / TARGET_CHAR_BIT,
284e93f7393Sniklas 0, "SCM", (struct objfile *) NULL);
285e93f7393Sniklas }
286