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