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