Per-inferior/Inferior-qualified thread IDs
[external/binutils.git] / gdb / guile / scm-value.c
1 /* Scheme interface to values.
2
3    Copyright (C) 2008-2016 Free Software Foundation, Inc.
4
5    This file is part of GDB.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20 /* See README file in this directory for implementation notes, coding
21    conventions, et.al.  */
22
23 #include "defs.h"
24 #include "arch-utils.h"
25 #include "charset.h"
26 #include "cp-abi.h"
27 #include "infcall.h"
28 #include "symtab.h" /* Needed by language.h.  */
29 #include "language.h"
30 #include "valprint.h"
31 #include "value.h"
32 #include "guile-internal.h"
33
34 /* The <gdb:value> smob.  */
35
36 typedef struct _value_smob
37 {
38   /* This always appears first.  */
39   gdb_smob base;
40
41   /* Doubly linked list of values in values_in_scheme.
42      IWBN to use a chained_gdb_smob instead, which is doable, it just requires
43      a bit more casting than normal.  */
44   struct _value_smob *next;
45   struct _value_smob *prev;
46
47   struct value *value;
48
49   /* These are cached here to avoid making multiple copies of them.
50      Plus computing the dynamic_type can be a bit expensive.
51      We use #f to indicate that the value doesn't exist (e.g. value doesn't
52      have an address), so we need another value to indicate that we haven't
53      computed the value yet.  For this we use SCM_UNDEFINED.  */
54   SCM address;
55   SCM type;
56   SCM dynamic_type;
57 } value_smob;
58
59 static const char value_smob_name[] = "gdb:value";
60
61 /* The tag Guile knows the value smob by.  */
62 static scm_t_bits value_smob_tag;
63
64 /* List of all values which are currently exposed to Scheme. It is
65    maintained so that when an objfile is discarded, preserve_values
66    can copy the values' types if needed.  */
67 static value_smob *values_in_scheme;
68
69 /* Keywords used by Scheme procedures in this file.  */
70 static SCM type_keyword;
71 static SCM encoding_keyword;
72 static SCM errors_keyword;
73 static SCM length_keyword;
74
75 /* Possible #:errors values.  */
76 static SCM error_symbol;
77 static SCM escape_symbol;
78 static SCM substitute_symbol;
79 \f
80 /* Administrivia for value smobs.  */
81
82 /* Iterate over all the <gdb:value> objects, calling preserve_one_value on
83    each.
84    This is the extension_language_ops.preserve_values "method".  */
85
86 void
87 gdbscm_preserve_values (const struct extension_language_defn *extlang,
88                         struct objfile *objfile, htab_t copied_types)
89 {
90   value_smob *iter;
91
92   for (iter = values_in_scheme; iter; iter = iter->next)
93     preserve_one_value (iter->value, objfile, copied_types);
94 }
95
96 /* Helper to add a value_smob to the global list.  */
97
98 static void
99 vlscm_remember_scheme_value (value_smob *v_smob)
100 {
101   v_smob->next = values_in_scheme;
102   if (v_smob->next)
103     v_smob->next->prev = v_smob;
104   v_smob->prev = NULL;
105   values_in_scheme = v_smob;
106 }
107
108 /* Helper to remove a value_smob from the global list.  */
109
110 static void
111 vlscm_forget_value_smob (value_smob *v_smob)
112 {
113   /* Remove SELF from the global list.  */
114   if (v_smob->prev)
115     v_smob->prev->next = v_smob->next;
116   else
117     {
118       gdb_assert (values_in_scheme == v_smob);
119       values_in_scheme = v_smob->next;
120     }
121   if (v_smob->next)
122     v_smob->next->prev = v_smob->prev;
123 }
124
125 /* The smob "free" function for <gdb:value>.  */
126
127 static size_t
128 vlscm_free_value_smob (SCM self)
129 {
130   value_smob *v_smob = (value_smob *) SCM_SMOB_DATA (self);
131
132   vlscm_forget_value_smob (v_smob);
133   value_free (v_smob->value);
134
135   return 0;
136 }
137
138 /* The smob "print" function for <gdb:value>.  */
139
140 static int
141 vlscm_print_value_smob (SCM self, SCM port, scm_print_state *pstate)
142 {
143   value_smob *v_smob = (value_smob *) SCM_SMOB_DATA (self);
144   char *s = NULL;
145   struct value_print_options opts;
146
147   if (pstate->writingp)
148     gdbscm_printf (port, "#<%s ", value_smob_name);
149
150   get_user_print_options (&opts);
151   opts.deref_ref = 0;
152
153   /* pstate->writingp = zero if invoked by display/~A, and nonzero if
154      invoked by write/~S.  What to do here may need to evolve.
155      IWBN if we could pass an argument to format that would we could use
156      instead of writingp.  */
157   opts.raw = !!pstate->writingp;
158
159   TRY
160     {
161       struct ui_file *stb = mem_fileopen ();
162       struct cleanup *old_chain = make_cleanup_ui_file_delete (stb);
163
164       common_val_print (v_smob->value, stb, 0, &opts, current_language);
165       s = ui_file_xstrdup (stb, NULL);
166
167       do_cleanups (old_chain);
168     }
169   CATCH (except, RETURN_MASK_ALL)
170     {
171       GDBSCM_HANDLE_GDB_EXCEPTION (except);
172     }
173   END_CATCH
174
175   if (s != NULL)
176     {
177       scm_puts (s, port);
178       xfree (s);
179     }
180
181   if (pstate->writingp)
182     scm_puts (">", port);
183
184   scm_remember_upto_here_1 (self);
185
186   /* Non-zero means success.  */
187   return 1;
188 }
189
190 /* The smob "equalp" function for <gdb:value>.  */
191
192 static SCM
193 vlscm_equal_p_value_smob (SCM v1, SCM v2)
194 {
195   const value_smob *v1_smob = (value_smob *) SCM_SMOB_DATA (v1);
196   const value_smob *v2_smob = (value_smob *) SCM_SMOB_DATA (v2);
197   int result = 0;
198
199   TRY
200     {
201       result = value_equal (v1_smob->value, v2_smob->value);
202     }
203   CATCH (except, RETURN_MASK_ALL)
204     {
205       GDBSCM_HANDLE_GDB_EXCEPTION (except);
206     }
207   END_CATCH
208
209   return scm_from_bool (result);
210 }
211
212 /* Low level routine to create a <gdb:value> object.  */
213
214 static SCM
215 vlscm_make_value_smob (void)
216 {
217   value_smob *v_smob = (value_smob *)
218     scm_gc_malloc (sizeof (value_smob), value_smob_name);
219   SCM v_scm;
220
221   /* These must be filled in by the caller.  */
222   v_smob->value = NULL;
223   v_smob->prev = NULL;
224   v_smob->next = NULL;
225
226   /* These are lazily computed.  */
227   v_smob->address = SCM_UNDEFINED;
228   v_smob->type = SCM_UNDEFINED;
229   v_smob->dynamic_type = SCM_UNDEFINED;
230
231   v_scm = scm_new_smob (value_smob_tag, (scm_t_bits) v_smob);
232   gdbscm_init_gsmob (&v_smob->base);
233
234   return v_scm;
235 }
236
237 /* Return non-zero if SCM is a <gdb:value> object.  */
238
239 int
240 vlscm_is_value (SCM scm)
241 {
242   return SCM_SMOB_PREDICATE (value_smob_tag, scm);
243 }
244
245 /* (value? object) -> boolean */
246
247 static SCM
248 gdbscm_value_p (SCM scm)
249 {
250   return scm_from_bool (vlscm_is_value (scm));
251 }
252
253 /* Create a new <gdb:value> object that encapsulates VALUE.
254    The value is released from the all_values chain so its lifetime is not
255    bound to the execution of a command.  */
256
257 SCM
258 vlscm_scm_from_value (struct value *value)
259 {
260   /* N.B. It's important to not cause any side-effects until we know the
261      conversion worked.  */
262   SCM v_scm = vlscm_make_value_smob ();
263   value_smob *v_smob = (value_smob *) SCM_SMOB_DATA (v_scm);
264
265   v_smob->value = value;
266   release_value_or_incref (value);
267   vlscm_remember_scheme_value (v_smob);
268
269   return v_scm;
270 }
271
272 /* Returns the <gdb:value> object in SELF.
273    Throws an exception if SELF is not a <gdb:value> object.  */
274
275 static SCM
276 vlscm_get_value_arg_unsafe (SCM self, int arg_pos, const char *func_name)
277 {
278   SCM_ASSERT_TYPE (vlscm_is_value (self), self, arg_pos, func_name,
279                    value_smob_name);
280
281   return self;
282 }
283
284 /* Returns a pointer to the value smob of SELF.
285    Throws an exception if SELF is not a <gdb:value> object.  */
286
287 static value_smob *
288 vlscm_get_value_smob_arg_unsafe (SCM self, int arg_pos, const char *func_name)
289 {
290   SCM v_scm = vlscm_get_value_arg_unsafe (self, arg_pos, func_name);
291   value_smob *v_smob = (value_smob *) SCM_SMOB_DATA (v_scm);
292
293   return v_smob;
294 }
295
296 /* Return the value field of V_SCM, an object of type <gdb:value>.
297    This exists so that we don't have to export the struct's contents.  */
298
299 struct value *
300 vlscm_scm_to_value (SCM v_scm)
301 {
302   value_smob *v_smob;
303
304   gdb_assert (vlscm_is_value (v_scm));
305   v_smob = (value_smob *) SCM_SMOB_DATA (v_scm);
306   return v_smob->value;
307 }
308 \f
309 /* Value methods.  */
310
311 /* (make-value x [#:type type]) -> <gdb:value> */
312
313 static SCM
314 gdbscm_make_value (SCM x, SCM rest)
315 {
316   struct gdbarch *gdbarch = get_current_arch ();
317   const struct language_defn *language = current_language;
318   const SCM keywords[] = { type_keyword, SCM_BOOL_F };
319   int type_arg_pos = -1;
320   SCM type_scm = SCM_UNDEFINED;
321   SCM except_scm, result;
322   type_smob *t_smob;
323   struct type *type = NULL;
324   struct value *value;
325   struct cleanup *cleanups;
326
327   gdbscm_parse_function_args (FUNC_NAME, SCM_ARG2, keywords, "#O", rest,
328                               &type_arg_pos, &type_scm);
329
330   if (type_arg_pos > 0)
331     {
332       t_smob = tyscm_get_type_smob_arg_unsafe (type_scm, type_arg_pos,
333                                                FUNC_NAME);
334       type = tyscm_type_smob_type (t_smob);
335     }
336
337   cleanups = make_cleanup_value_free_to_mark (value_mark ());
338
339   value = vlscm_convert_typed_value_from_scheme (FUNC_NAME, SCM_ARG1, x,
340                                                  type_arg_pos, type_scm, type,
341                                                  &except_scm,
342                                                  gdbarch, language);
343   if (value == NULL)
344     {
345       do_cleanups (cleanups);
346       gdbscm_throw (except_scm);
347     }
348
349   result = vlscm_scm_from_value (value);
350
351   do_cleanups (cleanups);
352
353   if (gdbscm_is_exception (result))
354     gdbscm_throw (result);
355   return result;
356 }
357
358 /* (make-lazy-value <gdb:type> address) -> <gdb:value> */
359
360 static SCM
361 gdbscm_make_lazy_value (SCM type_scm, SCM address_scm)
362 {
363   type_smob *t_smob;
364   struct type *type;
365   ULONGEST address;
366   struct value *value = NULL;
367   SCM result;
368   struct cleanup *cleanups;
369
370   t_smob = tyscm_get_type_smob_arg_unsafe (type_scm, SCM_ARG1, FUNC_NAME);
371   type = tyscm_type_smob_type (t_smob);
372
373   gdbscm_parse_function_args (FUNC_NAME, SCM_ARG2, NULL, "U",
374                               address_scm, &address);
375
376   cleanups = make_cleanup_value_free_to_mark (value_mark ());
377
378   /* There's no (current) need to wrap this in a TRY_CATCH, but for consistency
379      and future-proofing we do.  */
380   TRY
381   {
382     value = value_from_contents_and_address (type, NULL, address);
383   }
384   CATCH (except, RETURN_MASK_ALL)
385     {
386       GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
387     }
388   END_CATCH
389
390   result = vlscm_scm_from_value (value);
391
392   do_cleanups (cleanups);
393
394   if (gdbscm_is_exception (result))
395     gdbscm_throw (result);
396   return result;
397 }
398
399 /* (value-optimized-out? <gdb:value>) -> boolean */
400
401 static SCM
402 gdbscm_value_optimized_out_p (SCM self)
403 {
404   value_smob *v_smob
405     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
406   struct value *value = v_smob->value;
407   int opt = 0;
408
409   TRY
410     {
411       opt = value_optimized_out (value);
412     }
413   CATCH (except, RETURN_MASK_ALL)
414     {
415       GDBSCM_HANDLE_GDB_EXCEPTION (except);
416     }
417   END_CATCH
418
419   return scm_from_bool (opt);
420 }
421
422 /* (value-address <gdb:value>) -> integer
423    Returns #f if the value doesn't have one.  */
424
425 static SCM
426 gdbscm_value_address (SCM self)
427 {
428   value_smob *v_smob
429     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
430   struct value *value = v_smob->value;
431
432   if (SCM_UNBNDP (v_smob->address))
433     {
434       struct value *res_val = NULL;
435       struct cleanup *cleanup
436         = make_cleanup_value_free_to_mark (value_mark ());
437       SCM address;
438
439       TRY
440         {
441           res_val = value_addr (value);
442         }
443       CATCH (except, RETURN_MASK_ALL)
444         {
445           address = SCM_BOOL_F;
446         }
447       END_CATCH
448
449       if (res_val != NULL)
450         address = vlscm_scm_from_value (res_val);
451
452       do_cleanups (cleanup);
453
454       if (gdbscm_is_exception (address))
455         gdbscm_throw (address);
456
457       v_smob->address = address;
458     }
459
460   return v_smob->address;
461 }
462
463 /* (value-dereference <gdb:value>) -> <gdb:value>
464    Given a value of a pointer type, apply the C unary * operator to it.  */
465
466 static SCM
467 gdbscm_value_dereference (SCM self)
468 {
469   value_smob *v_smob
470     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
471   struct value *value = v_smob->value;
472   SCM result;
473   struct value *res_val = NULL;
474   struct cleanup *cleanups;
475
476   cleanups = make_cleanup_value_free_to_mark (value_mark ());
477
478   TRY
479     {
480       res_val = value_ind (value);
481     }
482   CATCH (except, RETURN_MASK_ALL)
483     {
484       GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
485     }
486   END_CATCH
487
488   result = vlscm_scm_from_value (res_val);
489
490   do_cleanups (cleanups);
491
492   if (gdbscm_is_exception (result))
493     gdbscm_throw (result);
494
495   return result;
496 }
497
498 /* (value-referenced-value <gdb:value>) -> <gdb:value>
499    Given a value of a reference type, return the value referenced.
500    The difference between this function and gdbscm_value_dereference is that
501    the latter applies * unary operator to a value, which need not always
502    result in the value referenced.
503    For example, for a value which is a reference to an 'int' pointer ('int *'),
504    gdbscm_value_dereference will result in a value of type 'int' while
505    gdbscm_value_referenced_value will result in a value of type 'int *'.  */
506
507 static SCM
508 gdbscm_value_referenced_value (SCM self)
509 {
510   value_smob *v_smob
511     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
512   struct value *value = v_smob->value;
513   SCM result;
514   struct value *res_val = NULL;
515   struct cleanup *cleanups;
516
517   cleanups = make_cleanup_value_free_to_mark (value_mark ());
518
519   TRY
520     {
521       switch (TYPE_CODE (check_typedef (value_type (value))))
522         {
523         case TYPE_CODE_PTR:
524           res_val = value_ind (value);
525           break;
526         case TYPE_CODE_REF:
527           res_val = coerce_ref (value);
528           break;
529         default:
530           error (_("Trying to get the referenced value from a value which is"
531                    " neither a pointer nor a reference"));
532         }
533     }
534   CATCH (except, RETURN_MASK_ALL)
535     {
536       GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
537     }
538   END_CATCH
539
540   result = vlscm_scm_from_value (res_val);
541
542   do_cleanups (cleanups);
543
544   if (gdbscm_is_exception (result))
545     gdbscm_throw (result);
546
547   return result;
548 }
549
550 /* (value-type <gdb:value>) -> <gdb:type> */
551
552 static SCM
553 gdbscm_value_type (SCM self)
554 {
555   value_smob *v_smob
556     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
557   struct value *value = v_smob->value;
558
559   if (SCM_UNBNDP (v_smob->type))
560     v_smob->type = tyscm_scm_from_type (value_type (value));
561
562   return v_smob->type;
563 }
564
565 /* (value-dynamic-type <gdb:value>) -> <gdb:type> */
566
567 static SCM
568 gdbscm_value_dynamic_type (SCM self)
569 {
570   value_smob *v_smob
571     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
572   struct value *value = v_smob->value;
573   struct type *type = NULL;
574
575   if (! SCM_UNBNDP (v_smob->dynamic_type))
576     return v_smob->dynamic_type;
577
578   TRY
579     {
580       struct cleanup *cleanup
581         = make_cleanup_value_free_to_mark (value_mark ());
582
583       type = value_type (value);
584       type = check_typedef (type);
585
586       if (((TYPE_CODE (type) == TYPE_CODE_PTR)
587            || (TYPE_CODE (type) == TYPE_CODE_REF))
588           && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRUCT))
589         {
590           struct value *target;
591           int was_pointer = TYPE_CODE (type) == TYPE_CODE_PTR;
592
593           if (was_pointer)
594             target = value_ind (value);
595           else
596             target = coerce_ref (value);
597           type = value_rtti_type (target, NULL, NULL, NULL);
598
599           if (type)
600             {
601               if (was_pointer)
602                 type = lookup_pointer_type (type);
603               else
604                 type = lookup_reference_type (type);
605             }
606         }
607       else if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
608         type = value_rtti_type (value, NULL, NULL, NULL);
609       else
610         {
611           /* Re-use object's static type.  */
612           type = NULL;
613         }
614
615       do_cleanups (cleanup);
616     }
617   CATCH (except, RETURN_MASK_ALL)
618     {
619       GDBSCM_HANDLE_GDB_EXCEPTION (except);
620     }
621   END_CATCH
622
623   if (type == NULL)
624     v_smob->dynamic_type = gdbscm_value_type (self);
625   else
626     v_smob->dynamic_type = tyscm_scm_from_type (type);
627
628   return v_smob->dynamic_type;
629 }
630
631 /* A helper function that implements the various cast operators.  */
632
633 static SCM
634 vlscm_do_cast (SCM self, SCM type_scm, enum exp_opcode op,
635                const char *func_name)
636 {
637   value_smob *v_smob
638     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
639   struct value *value = v_smob->value;
640   type_smob *t_smob
641     = tyscm_get_type_smob_arg_unsafe (type_scm, SCM_ARG2, FUNC_NAME);
642   struct type *type = tyscm_type_smob_type (t_smob);
643   SCM result;
644   struct value *res_val = NULL;
645   struct cleanup *cleanups;
646
647   cleanups = make_cleanup_value_free_to_mark (value_mark ());
648
649   TRY
650     {
651       if (op == UNOP_DYNAMIC_CAST)
652         res_val = value_dynamic_cast (type, value);
653       else if (op == UNOP_REINTERPRET_CAST)
654         res_val = value_reinterpret_cast (type, value);
655       else
656         {
657           gdb_assert (op == UNOP_CAST);
658           res_val = value_cast (type, value);
659         }
660     }
661   CATCH (except, RETURN_MASK_ALL)
662     {
663       GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
664     }
665   END_CATCH
666
667   gdb_assert (res_val != NULL);
668   result = vlscm_scm_from_value (res_val);
669
670   do_cleanups (cleanups);
671
672   if (gdbscm_is_exception (result))
673     gdbscm_throw (result);
674
675   return result;
676 }
677
678 /* (value-cast <gdb:value> <gdb:type>) -> <gdb:value> */
679
680 static SCM
681 gdbscm_value_cast (SCM self, SCM new_type)
682 {
683   return vlscm_do_cast (self, new_type, UNOP_CAST, FUNC_NAME);
684 }
685
686 /* (value-dynamic-cast <gdb:value> <gdb:type>) -> <gdb:value> */
687
688 static SCM
689 gdbscm_value_dynamic_cast (SCM self, SCM new_type)
690 {
691   return vlscm_do_cast (self, new_type, UNOP_DYNAMIC_CAST, FUNC_NAME);
692 }
693
694 /* (value-reinterpret-cast <gdb:value> <gdb:type>) -> <gdb:value> */
695
696 static SCM
697 gdbscm_value_reinterpret_cast (SCM self, SCM new_type)
698 {
699   return vlscm_do_cast (self, new_type, UNOP_REINTERPRET_CAST, FUNC_NAME);
700 }
701
702 /* (value-field <gdb:value> string) -> <gdb:value>
703    Given string name of an element inside structure, return its <gdb:value>
704    object.  */
705
706 static SCM
707 gdbscm_value_field (SCM self, SCM field_scm)
708 {
709   value_smob *v_smob
710     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
711   struct value *value = v_smob->value;
712   char *field = NULL;
713   struct value *res_val = NULL;
714   SCM result;
715   struct cleanup *cleanups;
716
717   SCM_ASSERT_TYPE (scm_is_string (field_scm), field_scm, SCM_ARG2, FUNC_NAME,
718                    _("string"));
719
720   cleanups = make_cleanup_value_free_to_mark (value_mark ());
721
722   field = gdbscm_scm_to_c_string (field_scm);
723   make_cleanup (xfree, field);
724
725   TRY
726     {
727       struct value *tmp = value;
728
729       res_val = value_struct_elt (&tmp, NULL, field, NULL, NULL);
730     }
731   CATCH (except, RETURN_MASK_ALL)
732     {
733       GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
734     }
735   END_CATCH
736
737   gdb_assert (res_val != NULL);
738   result = vlscm_scm_from_value (res_val);
739
740   do_cleanups (cleanups);
741
742   if (gdbscm_is_exception (result))
743     gdbscm_throw (result);
744
745   return result;
746 }
747
748 /* (value-subscript <gdb:value> integer|<gdb:value>) -> <gdb:value>
749    Return the specified value in an array.  */
750
751 static SCM
752 gdbscm_value_subscript (SCM self, SCM index_scm)
753 {
754   value_smob *v_smob
755     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
756   struct value *value = v_smob->value;
757   struct value *index = NULL;
758   struct value *res_val = NULL;
759   struct type *type = value_type (value);
760   struct gdbarch *gdbarch;
761   SCM result, except_scm;
762   struct cleanup *cleanups;
763
764   /* The sequencing here, as everywhere else, is important.
765      We can't have existing cleanups when a Scheme exception is thrown.  */
766
767   SCM_ASSERT (type != NULL, self, SCM_ARG2, FUNC_NAME);
768   gdbarch = get_type_arch (type);
769
770   cleanups = make_cleanup_value_free_to_mark (value_mark ());
771
772   index = vlscm_convert_value_from_scheme (FUNC_NAME, SCM_ARG2, index_scm,
773                                            &except_scm,
774                                            gdbarch, current_language);
775   if (index == NULL)
776     {
777       do_cleanups (cleanups);
778       gdbscm_throw (except_scm);
779     }
780
781   TRY
782     {
783       struct value *tmp = value;
784
785       /* Assume we are attempting an array access, and let the value code
786          throw an exception if the index has an invalid type.
787          Check the value's type is something that can be accessed via
788          a subscript.  */
789       tmp = coerce_ref (tmp);
790       type = check_typedef (value_type (tmp));
791       if (TYPE_CODE (type) != TYPE_CODE_ARRAY
792           && TYPE_CODE (type) != TYPE_CODE_PTR)
793         error (_("Cannot subscript requested type"));
794
795       res_val = value_subscript (tmp, value_as_long (index));
796    }
797   CATCH (except, RETURN_MASK_ALL)
798     {
799       GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
800     }
801   END_CATCH
802
803   gdb_assert (res_val != NULL);
804   result = vlscm_scm_from_value (res_val);
805
806   do_cleanups (cleanups);
807
808   if (gdbscm_is_exception (result))
809     gdbscm_throw (result);
810
811   return result;
812 }
813
814 /* (value-call <gdb:value> arg-list) -> <gdb:value>
815    Perform an inferior function call on the value.  */
816
817 static SCM
818 gdbscm_value_call (SCM self, SCM args)
819 {
820   value_smob *v_smob
821     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
822   struct value *function = v_smob->value;
823   struct value *mark = value_mark ();
824   struct type *ftype = NULL;
825   long args_count;
826   struct value **vargs = NULL;
827   SCM result = SCM_BOOL_F;
828
829   TRY
830     {
831       ftype = check_typedef (value_type (function));
832     }
833   CATCH (except, RETURN_MASK_ALL)
834     {
835       GDBSCM_HANDLE_GDB_EXCEPTION (except);
836     }
837   END_CATCH
838
839   SCM_ASSERT_TYPE (TYPE_CODE (ftype) == TYPE_CODE_FUNC, self,
840                    SCM_ARG1, FUNC_NAME,
841                    _("function (value of TYPE_CODE_FUNC)"));
842
843   SCM_ASSERT_TYPE (gdbscm_is_true (scm_list_p (args)), args,
844                    SCM_ARG2, FUNC_NAME, _("list"));
845
846   args_count = scm_ilength (args);
847   if (args_count > 0)
848     {
849       struct gdbarch *gdbarch = get_current_arch ();
850       const struct language_defn *language = current_language;
851       SCM except_scm;
852       long i;
853
854       vargs = XALLOCAVEC (struct value *, args_count);
855       for (i = 0; i < args_count; i++)
856         {
857           SCM arg = scm_car (args);
858
859           vargs[i] = vlscm_convert_value_from_scheme (FUNC_NAME,
860                                                       GDBSCM_ARG_NONE, arg,
861                                                       &except_scm,
862                                                       gdbarch, language);
863           if (vargs[i] == NULL)
864             gdbscm_throw (except_scm);
865
866           args = scm_cdr (args);
867         }
868       gdb_assert (gdbscm_is_true (scm_null_p (args)));
869     }
870
871   TRY
872     {
873       struct cleanup *cleanup = make_cleanup_value_free_to_mark (mark);
874       struct value *return_value;
875
876       return_value = call_function_by_hand (function, args_count, vargs);
877       result = vlscm_scm_from_value (return_value);
878       do_cleanups (cleanup);
879     }
880   CATCH (except, RETURN_MASK_ALL)
881     {
882       GDBSCM_HANDLE_GDB_EXCEPTION (except);
883     }
884   END_CATCH
885
886   if (gdbscm_is_exception (result))
887     gdbscm_throw (result);
888
889   return result;
890 }
891
892 /* (value->bytevector <gdb:value>) -> bytevector */
893
894 static SCM
895 gdbscm_value_to_bytevector (SCM self)
896 {
897   value_smob *v_smob
898     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
899   struct value *value = v_smob->value;
900   struct type *type;
901   size_t length = 0;
902   const gdb_byte *contents = NULL;
903   SCM bv;
904
905   type = value_type (value);
906
907   TRY
908     {
909       type = check_typedef (type);
910       length = TYPE_LENGTH (type);
911       contents = value_contents (value);
912     }
913   CATCH (except, RETURN_MASK_ALL)
914     {
915       GDBSCM_HANDLE_GDB_EXCEPTION (except);
916     }
917   END_CATCH
918
919   bv = scm_c_make_bytevector (length);
920   memcpy (SCM_BYTEVECTOR_CONTENTS (bv), contents, length);
921
922   return bv;
923 }
924
925 /* Helper function to determine if a type is "int-like".  */
926
927 static int
928 is_intlike (struct type *type, int ptr_ok)
929 {
930   return (TYPE_CODE (type) == TYPE_CODE_INT
931           || TYPE_CODE (type) == TYPE_CODE_ENUM
932           || TYPE_CODE (type) == TYPE_CODE_BOOL
933           || TYPE_CODE (type) == TYPE_CODE_CHAR
934           || (ptr_ok && TYPE_CODE (type) == TYPE_CODE_PTR));
935 }
936
937 /* (value->bool <gdb:value>) -> boolean
938    Throws an error if the value is not integer-like.  */
939
940 static SCM
941 gdbscm_value_to_bool (SCM self)
942 {
943   value_smob *v_smob
944     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
945   struct value *value = v_smob->value;
946   struct type *type;
947   LONGEST l = 0;
948
949   type = value_type (value);
950
951   TRY
952     {
953       type = check_typedef (type);
954     }
955   CATCH (except, RETURN_MASK_ALL)
956     {
957       GDBSCM_HANDLE_GDB_EXCEPTION (except);
958     }
959   END_CATCH
960
961   SCM_ASSERT_TYPE (is_intlike (type, 1), self, SCM_ARG1, FUNC_NAME,
962                    _("integer-like gdb value"));
963
964   TRY
965     {
966       if (TYPE_CODE (type) == TYPE_CODE_PTR)
967         l = value_as_address (value);
968       else
969         l = value_as_long (value);
970     }
971   CATCH (except, RETURN_MASK_ALL)
972     {
973       GDBSCM_HANDLE_GDB_EXCEPTION (except);
974     }
975   END_CATCH
976
977   return scm_from_bool (l != 0);
978 }
979
980 /* (value->integer <gdb:value>) -> integer
981    Throws an error if the value is not integer-like.  */
982
983 static SCM
984 gdbscm_value_to_integer (SCM self)
985 {
986   value_smob *v_smob
987     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
988   struct value *value = v_smob->value;
989   struct type *type;
990   LONGEST l = 0;
991
992   type = value_type (value);
993
994   TRY
995     {
996       type = check_typedef (type);
997     }
998   CATCH (except, RETURN_MASK_ALL)
999     {
1000       GDBSCM_HANDLE_GDB_EXCEPTION (except);
1001     }
1002   END_CATCH
1003
1004   SCM_ASSERT_TYPE (is_intlike (type, 1), self, SCM_ARG1, FUNC_NAME,
1005                    _("integer-like gdb value"));
1006
1007   TRY
1008     {
1009       if (TYPE_CODE (type) == TYPE_CODE_PTR)
1010         l = value_as_address (value);
1011       else
1012         l = value_as_long (value);
1013     }
1014   CATCH (except, RETURN_MASK_ALL)
1015     {
1016       GDBSCM_HANDLE_GDB_EXCEPTION (except);
1017     }
1018   END_CATCH
1019
1020   if (TYPE_UNSIGNED (type))
1021     return gdbscm_scm_from_ulongest (l);
1022   else
1023     return gdbscm_scm_from_longest (l);
1024 }
1025
1026 /* (value->real <gdb:value>) -> real
1027    Throws an error if the value is not a number.  */
1028
1029 static SCM
1030 gdbscm_value_to_real (SCM self)
1031 {
1032   value_smob *v_smob
1033     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
1034   struct value *value = v_smob->value;
1035   struct type *type;
1036   DOUBLEST d = 0;
1037
1038   type = value_type (value);
1039
1040   TRY
1041     {
1042       type = check_typedef (type);
1043     }
1044   CATCH (except, RETURN_MASK_ALL)
1045     {
1046       GDBSCM_HANDLE_GDB_EXCEPTION (except);
1047     }
1048   END_CATCH
1049
1050   SCM_ASSERT_TYPE (is_intlike (type, 0) || TYPE_CODE (type) == TYPE_CODE_FLT,
1051                    self, SCM_ARG1, FUNC_NAME, _("number"));
1052
1053   TRY
1054     {
1055       d = value_as_double (value);
1056     }
1057   CATCH (except, RETURN_MASK_ALL)
1058     {
1059       GDBSCM_HANDLE_GDB_EXCEPTION (except);
1060     }
1061   END_CATCH
1062
1063   /* TODO: Is there a better way to check if the value fits?  */
1064   if (d != (double) d)
1065     gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG1, self,
1066                                _("number can't be converted to a double"));
1067
1068   return scm_from_double (d);
1069 }
1070
1071 /* (value->string <gdb:value>
1072        [#:encoding encoding]
1073        [#:errors #f | 'error | 'substitute]
1074        [#:length length])
1075      -> string
1076    Return Unicode string with value's contents, which must be a string.
1077
1078    If ENCODING is not given, the string is assumed to be encoded in
1079    the target's charset.
1080
1081    ERRORS is one of #f, 'error or 'substitute.
1082    An error setting of #f means use the default, which is Guile's
1083    %default-port-conversion-strategy when using Guile >= 2.0.6, or 'error if
1084    using an earlier version of Guile.  Earlier versions do not properly
1085    support obtaining the default port conversion strategy.
1086    If the default is not one of 'error or 'substitute, 'substitute is used.
1087    An error setting of "error" causes an exception to be thrown if there's
1088    a decoding error.  An error setting of "substitute" causes invalid
1089    characters to be replaced with "?".
1090
1091    If LENGTH is provided, only fetch string to the length provided.
1092    LENGTH must be a Scheme integer, it can't be a <gdb:value> integer.  */
1093
1094 static SCM
1095 gdbscm_value_to_string (SCM self, SCM rest)
1096 {
1097   value_smob *v_smob
1098     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
1099   struct value *value = v_smob->value;
1100   const SCM keywords[] = {
1101     encoding_keyword, errors_keyword, length_keyword, SCM_BOOL_F
1102   };
1103   int encoding_arg_pos = -1, errors_arg_pos = -1, length_arg_pos = -1;
1104   char *encoding = NULL;
1105   SCM errors = SCM_BOOL_F;
1106   int length = -1;
1107   gdb_byte *buffer = NULL;
1108   const char *la_encoding = NULL;
1109   struct type *char_type = NULL;
1110   SCM result;
1111   struct cleanup *cleanups;
1112
1113   /* The sequencing here, as everywhere else, is important.
1114      We can't have existing cleanups when a Scheme exception is thrown.  */
1115
1116   gdbscm_parse_function_args (FUNC_NAME, SCM_ARG2, keywords, "#sOi", rest,
1117                               &encoding_arg_pos, &encoding,
1118                               &errors_arg_pos, &errors,
1119                               &length_arg_pos, &length);
1120
1121   cleanups = make_cleanup (xfree, encoding);
1122
1123   if (errors_arg_pos > 0
1124       && errors != SCM_BOOL_F
1125       && !scm_is_eq (errors, error_symbol)
1126       && !scm_is_eq (errors, substitute_symbol))
1127     {
1128       SCM excp
1129         = gdbscm_make_out_of_range_error (FUNC_NAME, errors_arg_pos, errors,
1130                                           _("invalid error kind"));
1131
1132       do_cleanups (cleanups);
1133       gdbscm_throw (excp);
1134     }
1135   if (errors == SCM_BOOL_F)
1136     {
1137       /* N.B. scm_port_conversion_strategy in Guile versions prior to 2.0.6
1138          will throw a Scheme error when passed #f.  */
1139       if (gdbscm_guile_version_is_at_least (2, 0, 6))
1140         errors = scm_port_conversion_strategy (SCM_BOOL_F);
1141       else
1142         errors = error_symbol;
1143     }
1144   /* We don't assume anything about the result of scm_port_conversion_strategy.
1145      From this point on, if errors is not 'errors, use 'substitute.  */
1146
1147   TRY
1148     {
1149       LA_GET_STRING (value, &buffer, &length, &char_type, &la_encoding);
1150     }
1151   CATCH (except, RETURN_MASK_ALL)
1152     {
1153       GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
1154     }
1155   END_CATCH
1156
1157   /* If errors is "error" scm_from_stringn may throw a Scheme exception.
1158      Make sure we don't leak.  This is done via scm_dynwind_begin, et.al.  */
1159   discard_cleanups (cleanups);
1160
1161   scm_dynwind_begin ((scm_t_dynwind_flags) 0);
1162
1163   gdbscm_dynwind_xfree (encoding);
1164   gdbscm_dynwind_xfree (buffer);
1165
1166   result = scm_from_stringn ((const char *) buffer,
1167                              length * TYPE_LENGTH (char_type),
1168                              (encoding != NULL && *encoding != '\0'
1169                               ? encoding
1170                               : la_encoding),
1171                              scm_is_eq (errors, error_symbol)
1172                              ? SCM_FAILED_CONVERSION_ERROR
1173                              : SCM_FAILED_CONVERSION_QUESTION_MARK);
1174
1175   scm_dynwind_end ();
1176
1177   return result;
1178 }
1179
1180 /* (value->lazy-string <gdb:value> [#:encoding encoding] [#:length length])
1181      -> <gdb:lazy-string>
1182    Return a Scheme object representing a lazy_string_object type.
1183    A lazy string is a pointer to a string with an optional encoding and length.
1184    If ENCODING is not given, the target's charset is used.
1185    If LENGTH is provided then the length parameter is set to LENGTH, otherwise
1186    length will be set to -1 (first null of appropriate with).
1187    LENGTH must be a Scheme integer, it can't be a <gdb:value> integer.  */
1188
1189 static SCM
1190 gdbscm_value_to_lazy_string (SCM self, SCM rest)
1191 {
1192   value_smob *v_smob
1193     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
1194   struct value *value = v_smob->value;
1195   const SCM keywords[] = { encoding_keyword, length_keyword, SCM_BOOL_F };
1196   int encoding_arg_pos = -1, length_arg_pos = -1;
1197   char *encoding = NULL;
1198   int length = -1;
1199   SCM result = SCM_BOOL_F; /* -Wall */
1200   struct cleanup *cleanups;
1201   struct gdb_exception except = exception_none;
1202
1203   /* The sequencing here, as everywhere else, is important.
1204      We can't have existing cleanups when a Scheme exception is thrown.  */
1205
1206   gdbscm_parse_function_args (FUNC_NAME, SCM_ARG2, keywords, "#si", rest,
1207                               &encoding_arg_pos, &encoding,
1208                               &length_arg_pos, &length);
1209
1210   cleanups = make_cleanup (xfree, encoding);
1211
1212   TRY
1213     {
1214       struct cleanup *inner_cleanup
1215         = make_cleanup_value_free_to_mark (value_mark ());
1216
1217       if (TYPE_CODE (value_type (value)) == TYPE_CODE_PTR)
1218         value = value_ind (value);
1219
1220       result = lsscm_make_lazy_string (value_address (value), length,
1221                                        encoding, value_type (value));
1222
1223       do_cleanups (inner_cleanup);
1224     }
1225   CATCH (ex, RETURN_MASK_ALL)
1226     {
1227       except = ex;
1228     }
1229   END_CATCH
1230
1231   do_cleanups (cleanups);
1232   GDBSCM_HANDLE_GDB_EXCEPTION (except);
1233
1234   if (gdbscm_is_exception (result))
1235     gdbscm_throw (result);
1236
1237   return result;
1238 }
1239
1240 /* (value-lazy? <gdb:value>) -> boolean */
1241
1242 static SCM
1243 gdbscm_value_lazy_p (SCM self)
1244 {
1245   value_smob *v_smob
1246     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
1247   struct value *value = v_smob->value;
1248
1249   return scm_from_bool (value_lazy (value));
1250 }
1251
1252 /* (value-fetch-lazy! <gdb:value>) -> unspecified */
1253
1254 static SCM
1255 gdbscm_value_fetch_lazy_x (SCM self)
1256 {
1257   value_smob *v_smob
1258     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
1259   struct value *value = v_smob->value;
1260
1261   TRY
1262     {
1263       if (value_lazy (value))
1264         value_fetch_lazy (value);
1265     }
1266   CATCH (except, RETURN_MASK_ALL)
1267     {
1268       GDBSCM_HANDLE_GDB_EXCEPTION (except);
1269     }
1270   END_CATCH
1271
1272   return SCM_UNSPECIFIED;
1273 }
1274
1275 /* (value-print <gdb:value>) -> string */
1276
1277 static SCM
1278 gdbscm_value_print (SCM self)
1279 {
1280   value_smob *v_smob
1281     = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
1282   struct value *value = v_smob->value;
1283   struct value_print_options opts;
1284   char *s = NULL;
1285   SCM result;
1286
1287   get_user_print_options (&opts);
1288   opts.deref_ref = 0;
1289
1290   TRY
1291     {
1292       struct ui_file *stb = mem_fileopen ();
1293       struct cleanup *old_chain = make_cleanup_ui_file_delete (stb);
1294
1295       common_val_print (value, stb, 0, &opts, current_language);
1296       s = ui_file_xstrdup (stb, NULL);
1297
1298       do_cleanups (old_chain);
1299     }
1300   CATCH (except, RETURN_MASK_ALL)
1301     {
1302       GDBSCM_HANDLE_GDB_EXCEPTION (except);
1303     }
1304   END_CATCH
1305
1306   /* Use SCM_FAILED_CONVERSION_QUESTION_MARK to ensure this doesn't
1307      throw an error if the encoding fails.
1308      IWBN to use scm_take_locale_string here, but we'd have to temporarily
1309      override the default port conversion handler because contrary to
1310      documentation it doesn't necessarily free the input string.  */
1311   result = scm_from_stringn (s, strlen (s), host_charset (),
1312                              SCM_FAILED_CONVERSION_QUESTION_MARK);
1313   xfree (s);
1314
1315   return result;
1316 }
1317 \f
1318 /* (parse-and-eval string) -> <gdb:value>
1319    Parse a string and evaluate the string as an expression.  */
1320
1321 static SCM
1322 gdbscm_parse_and_eval (SCM expr_scm)
1323 {
1324   char *expr_str;
1325   struct value *res_val = NULL;
1326   SCM result;
1327   struct cleanup *cleanups;
1328
1329   /* The sequencing here, as everywhere else, is important.
1330      We can't have existing cleanups when a Scheme exception is thrown.  */
1331
1332   gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, NULL, "s",
1333                               expr_scm, &expr_str);
1334
1335   cleanups = make_cleanup_value_free_to_mark (value_mark ());
1336   make_cleanup (xfree, expr_str);
1337
1338   TRY
1339     {
1340       res_val = parse_and_eval (expr_str);
1341     }
1342   CATCH (except, RETURN_MASK_ALL)
1343     {
1344       GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
1345     }
1346   END_CATCH
1347
1348   gdb_assert (res_val != NULL);
1349   result = vlscm_scm_from_value (res_val);
1350
1351   do_cleanups (cleanups);
1352
1353   if (gdbscm_is_exception (result))
1354     gdbscm_throw (result);
1355
1356   return result;
1357 }
1358
1359 /* (history-ref integer) -> <gdb:value>
1360    Return the specified value from GDB's value history.  */
1361
1362 static SCM
1363 gdbscm_history_ref (SCM index)
1364 {
1365   int i;
1366   struct value *res_val = NULL; /* Initialize to appease gcc warning.  */
1367
1368   gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, NULL, "i", index, &i);
1369
1370   TRY
1371     {
1372       res_val = access_value_history (i);
1373     }
1374   CATCH (except, RETURN_MASK_ALL)
1375     {
1376       GDBSCM_HANDLE_GDB_EXCEPTION (except);
1377     }
1378   END_CATCH
1379
1380   return vlscm_scm_from_value (res_val);
1381 }
1382
1383 /* (history-append! <gdb:value>) -> index
1384    Append VALUE to GDB's value history.  Return its index in the history.  */
1385
1386 static SCM
1387 gdbscm_history_append_x (SCM value)
1388 {
1389   int res_index = -1;
1390   struct value *v;
1391   value_smob *v_smob;
1392
1393   v_smob = vlscm_get_value_smob_arg_unsafe (value, SCM_ARG1, FUNC_NAME);
1394   v = v_smob->value;
1395
1396   TRY
1397     {
1398       res_index = record_latest_value (v);
1399     }
1400   CATCH (except, RETURN_MASK_ALL)
1401     {
1402       GDBSCM_HANDLE_GDB_EXCEPTION (except);
1403     }
1404   END_CATCH
1405
1406   return scm_from_int (res_index);
1407 }
1408 \f
1409 /* Initialize the Scheme value code.  */
1410
1411 static const scheme_function value_functions[] =
1412 {
1413   { "value?", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_p),
1414     "\
1415 Return #t if the object is a <gdb:value> object." },
1416
1417   { "make-value", 1, 0, 1, as_a_scm_t_subr (gdbscm_make_value),
1418     "\
1419 Create a <gdb:value> representing object.\n\
1420 Typically this is used to convert numbers and strings to\n\
1421 <gdb:value> objects.\n\
1422 \n\
1423   Arguments: object [#:type <gdb:type>]" },
1424
1425   { "value-optimized-out?", 1, 0, 0,
1426     as_a_scm_t_subr (gdbscm_value_optimized_out_p),
1427     "\
1428 Return #t if the value has been optimizd out." },
1429
1430   { "value-address", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_address),
1431     "\
1432 Return the address of the value." },
1433
1434   { "value-type", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_type),
1435     "\
1436 Return the type of the value." },
1437
1438   { "value-dynamic-type", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_dynamic_type),
1439     "\
1440 Return the dynamic type of the value." },
1441
1442   { "value-cast", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_cast),
1443     "\
1444 Cast the value to the supplied type.\n\
1445 \n\
1446   Arguments: <gdb:value> <gdb:type>" },
1447
1448   { "value-dynamic-cast", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_dynamic_cast),
1449     "\
1450 Cast the value to the supplied type, as if by the C++\n\
1451 dynamic_cast operator.\n\
1452 \n\
1453   Arguments: <gdb:value> <gdb:type>" },
1454
1455   { "value-reinterpret-cast", 2, 0, 0,
1456     as_a_scm_t_subr (gdbscm_value_reinterpret_cast),
1457     "\
1458 Cast the value to the supplied type, as if by the C++\n\
1459 reinterpret_cast operator.\n\
1460 \n\
1461   Arguments: <gdb:value> <gdb:type>" },
1462
1463   { "value-dereference", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_dereference),
1464     "\
1465 Return the result of applying the C unary * operator to the value." },
1466
1467   { "value-referenced-value", 1, 0, 0,
1468     as_a_scm_t_subr (gdbscm_value_referenced_value),
1469     "\
1470 Given a value of a reference type, return the value referenced.\n\
1471 The difference between this function and value-dereference is that\n\
1472 the latter applies * unary operator to a value, which need not always\n\
1473 result in the value referenced.\n\
1474 For example, for a value which is a reference to an 'int' pointer ('int *'),\n\
1475 value-dereference will result in a value of type 'int' while\n\
1476 value-referenced-value will result in a value of type 'int *'." },
1477
1478   { "value-field", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_field),
1479     "\
1480 Return the specified field of the value.\n\
1481 \n\
1482   Arguments: <gdb:value> string" },
1483
1484   { "value-subscript", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_subscript),
1485     "\
1486 Return the value of the array at the specified index.\n\
1487 \n\
1488   Arguments: <gdb:value> integer" },
1489
1490   { "value-call", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_call),
1491     "\
1492 Perform an inferior function call taking the value as a pointer to the\n\
1493 function to call.\n\
1494 Each element of the argument list must be a <gdb:value> object or an object\n\
1495 that can be converted to one.\n\
1496 The result is the value returned by the function.\n\
1497 \n\
1498   Arguments: <gdb:value> arg-list" },
1499
1500   { "value->bool", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_to_bool),
1501     "\
1502 Return the Scheme boolean representing the GDB value.\n\
1503 The value must be \"integer like\".  Pointers are ok." },
1504
1505   { "value->integer", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_to_integer),
1506     "\
1507 Return the Scheme integer representing the GDB value.\n\
1508 The value must be \"integer like\".  Pointers are ok." },
1509
1510   { "value->real", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_to_real),
1511     "\
1512 Return the Scheme real number representing the GDB value.\n\
1513 The value must be a number." },
1514
1515   { "value->bytevector", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_to_bytevector),
1516     "\
1517 Return a Scheme bytevector with the raw contents of the GDB value.\n\
1518 No transformation, endian or otherwise, is performed." },
1519
1520   { "value->string", 1, 0, 1, as_a_scm_t_subr (gdbscm_value_to_string),
1521     "\
1522 Return the Unicode string of the value's contents.\n\
1523 If ENCODING is not given, the string is assumed to be encoded in\n\
1524 the target's charset.\n\
1525 An error setting \"error\" causes an exception to be thrown if there's\n\
1526 a decoding error.  An error setting of \"substitute\" causes invalid\n\
1527 characters to be replaced with \"?\".  The default is \"error\".\n\
1528 If LENGTH is provided, only fetch string to the length provided.\n\
1529 \n\
1530   Arguments: <gdb:value>\n\
1531              [#:encoding encoding] [#:errors \"error\"|\"substitute\"]\n\
1532              [#:length length]" },
1533
1534   { "value->lazy-string", 1, 0, 1,
1535     as_a_scm_t_subr (gdbscm_value_to_lazy_string),
1536     "\
1537 Return a Scheme object representing a lazily fetched Unicode string\n\
1538 of the value's contents.\n\
1539 If ENCODING is not given, the string is assumed to be encoded in\n\
1540 the target's charset.\n\
1541 If LENGTH is provided, only fetch string to the length provided.\n\
1542 \n\
1543   Arguments: <gdb:value> [#:encoding encoding] [#:length length]" },
1544
1545   { "value-lazy?", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_lazy_p),
1546     "\
1547 Return #t if the value is lazy (not fetched yet from the inferior).\n\
1548 A lazy value is fetched when needed, or when the value-fetch-lazy! function\n\
1549 is called." },
1550
1551   { "make-lazy-value", 2, 0, 0, as_a_scm_t_subr (gdbscm_make_lazy_value),
1552     "\
1553 Create a <gdb:value> that will be lazily fetched from the target.\n\
1554 \n\
1555   Arguments: <gdb:type> address" },
1556
1557   { "value-fetch-lazy!", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_fetch_lazy_x),
1558     "\
1559 Fetch the value from the inferior, if it was lazy.\n\
1560 The result is \"unspecified\"." },
1561
1562   { "value-print", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_print),
1563     "\
1564 Return the string representation (print form) of the value." },
1565
1566   { "parse-and-eval", 1, 0, 0, as_a_scm_t_subr (gdbscm_parse_and_eval),
1567     "\
1568 Evaluates string in gdb and returns the result as a <gdb:value> object." },
1569
1570   { "history-ref", 1, 0, 0, as_a_scm_t_subr (gdbscm_history_ref),
1571     "\
1572 Return the specified value from GDB's value history." },
1573
1574   { "history-append!", 1, 0, 0, as_a_scm_t_subr (gdbscm_history_append_x),
1575     "\
1576 Append the specified value onto GDB's value history." },
1577
1578   END_FUNCTIONS
1579 };
1580
1581 void
1582 gdbscm_initialize_values (void)
1583 {
1584   value_smob_tag = gdbscm_make_smob_type (value_smob_name,
1585                                           sizeof (value_smob));
1586   scm_set_smob_free (value_smob_tag, vlscm_free_value_smob);
1587   scm_set_smob_print (value_smob_tag, vlscm_print_value_smob);
1588   scm_set_smob_equalp (value_smob_tag, vlscm_equal_p_value_smob);
1589
1590   gdbscm_define_functions (value_functions, 1);
1591
1592   type_keyword = scm_from_latin1_keyword ("type");
1593   encoding_keyword = scm_from_latin1_keyword ("encoding");
1594   errors_keyword = scm_from_latin1_keyword ("errors");
1595   length_keyword = scm_from_latin1_keyword ("length");
1596
1597   error_symbol = scm_from_latin1_symbol ("error");
1598   escape_symbol = scm_from_latin1_symbol ("escape");
1599   substitute_symbol = scm_from_latin1_symbol ("substitute");
1600 }