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