Use unique_xmalloc_ptr for read_string
[deliverable/binutils-gdb.git] / gdb / guile / scm-value.c
1 /* Scheme interface to values.
2
3 Copyright (C) 2008-2018 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_decref (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 = release_value (value).release ();
257 vlscm_remember_scheme_value (v_smob);
258
259 return v_scm;
260 }
261
262 /* Returns the <gdb:value> object in SELF.
263 Throws an exception if SELF is not a <gdb:value> object. */
264
265 static SCM
266 vlscm_get_value_arg_unsafe (SCM self, int arg_pos, const char *func_name)
267 {
268 SCM_ASSERT_TYPE (vlscm_is_value (self), self, arg_pos, func_name,
269 value_smob_name);
270
271 return self;
272 }
273
274 /* Returns a pointer to the value smob of SELF.
275 Throws an exception if SELF is not a <gdb:value> object. */
276
277 static value_smob *
278 vlscm_get_value_smob_arg_unsafe (SCM self, int arg_pos, const char *func_name)
279 {
280 SCM v_scm = vlscm_get_value_arg_unsafe (self, arg_pos, func_name);
281 value_smob *v_smob = (value_smob *) SCM_SMOB_DATA (v_scm);
282
283 return v_smob;
284 }
285
286 /* Return the value field of V_SCM, an object of type <gdb:value>.
287 This exists so that we don't have to export the struct's contents. */
288
289 struct value *
290 vlscm_scm_to_value (SCM v_scm)
291 {
292 value_smob *v_smob;
293
294 gdb_assert (vlscm_is_value (v_scm));
295 v_smob = (value_smob *) SCM_SMOB_DATA (v_scm);
296 return v_smob->value;
297 }
298 \f
299 /* Value methods. */
300
301 /* (make-value x [#:type type]) -> <gdb:value> */
302
303 static SCM
304 gdbscm_make_value (SCM x, SCM rest)
305 {
306 struct gdbarch *gdbarch = get_current_arch ();
307 const struct language_defn *language = current_language;
308 const SCM keywords[] = { type_keyword, SCM_BOOL_F };
309 int type_arg_pos = -1;
310 SCM type_scm = SCM_UNDEFINED;
311 SCM except_scm, result;
312 type_smob *t_smob;
313 struct type *type = NULL;
314 struct value *value;
315 struct cleanup *cleanups;
316
317 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG2, keywords, "#O", rest,
318 &type_arg_pos, &type_scm);
319
320 if (type_arg_pos > 0)
321 {
322 t_smob = tyscm_get_type_smob_arg_unsafe (type_scm, type_arg_pos,
323 FUNC_NAME);
324 type = tyscm_type_smob_type (t_smob);
325 }
326
327 cleanups = make_cleanup_value_free_to_mark (value_mark ());
328
329 value = vlscm_convert_typed_value_from_scheme (FUNC_NAME, SCM_ARG1, x,
330 type_arg_pos, type_scm, type,
331 &except_scm,
332 gdbarch, language);
333 if (value == NULL)
334 {
335 do_cleanups (cleanups);
336 gdbscm_throw (except_scm);
337 }
338
339 result = vlscm_scm_from_value (value);
340
341 do_cleanups (cleanups);
342
343 if (gdbscm_is_exception (result))
344 gdbscm_throw (result);
345 return result;
346 }
347
348 /* (make-lazy-value <gdb:type> address) -> <gdb:value> */
349
350 static SCM
351 gdbscm_make_lazy_value (SCM type_scm, SCM address_scm)
352 {
353 type_smob *t_smob;
354 struct type *type;
355 ULONGEST address;
356 struct value *value = NULL;
357 SCM result;
358 struct cleanup *cleanups;
359
360 t_smob = tyscm_get_type_smob_arg_unsafe (type_scm, SCM_ARG1, FUNC_NAME);
361 type = tyscm_type_smob_type (t_smob);
362
363 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG2, NULL, "U",
364 address_scm, &address);
365
366 cleanups = make_cleanup_value_free_to_mark (value_mark ());
367
368 /* There's no (current) need to wrap this in a TRY_CATCH, but for consistency
369 and future-proofing we do. */
370 TRY
371 {
372 value = value_from_contents_and_address (type, NULL, address);
373 }
374 CATCH (except, RETURN_MASK_ALL)
375 {
376 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
377 }
378 END_CATCH
379
380 result = vlscm_scm_from_value (value);
381
382 do_cleanups (cleanups);
383
384 if (gdbscm_is_exception (result))
385 gdbscm_throw (result);
386 return result;
387 }
388
389 /* (value-optimized-out? <gdb:value>) -> boolean */
390
391 static SCM
392 gdbscm_value_optimized_out_p (SCM self)
393 {
394 value_smob *v_smob
395 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
396 struct value *value = v_smob->value;
397 int opt = 0;
398
399 TRY
400 {
401 opt = value_optimized_out (value);
402 }
403 CATCH (except, RETURN_MASK_ALL)
404 {
405 GDBSCM_HANDLE_GDB_EXCEPTION (except);
406 }
407 END_CATCH
408
409 return scm_from_bool (opt);
410 }
411
412 /* (value-address <gdb:value>) -> integer
413 Returns #f if the value doesn't have one. */
414
415 static SCM
416 gdbscm_value_address (SCM self)
417 {
418 value_smob *v_smob
419 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
420 struct value *value = v_smob->value;
421
422 if (SCM_UNBNDP (v_smob->address))
423 {
424 struct cleanup *cleanup
425 = make_cleanup_value_free_to_mark (value_mark ());
426 SCM address = SCM_BOOL_F;
427
428 TRY
429 {
430 address = vlscm_scm_from_value (value_addr (value));
431 }
432 CATCH (except, RETURN_MASK_ALL)
433 {
434 }
435 END_CATCH
436
437 do_cleanups (cleanup);
438
439 if (gdbscm_is_exception (address))
440 gdbscm_throw (address);
441
442 v_smob->address = address;
443 }
444
445 return v_smob->address;
446 }
447
448 /* (value-dereference <gdb:value>) -> <gdb:value>
449 Given a value of a pointer type, apply the C unary * operator to it. */
450
451 static SCM
452 gdbscm_value_dereference (SCM self)
453 {
454 value_smob *v_smob
455 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
456 struct value *value = v_smob->value;
457 SCM result;
458 struct value *res_val = NULL;
459 struct cleanup *cleanups;
460
461 cleanups = make_cleanup_value_free_to_mark (value_mark ());
462
463 TRY
464 {
465 res_val = value_ind (value);
466 }
467 CATCH (except, RETURN_MASK_ALL)
468 {
469 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
470 }
471 END_CATCH
472
473 result = vlscm_scm_from_value (res_val);
474
475 do_cleanups (cleanups);
476
477 if (gdbscm_is_exception (result))
478 gdbscm_throw (result);
479
480 return result;
481 }
482
483 /* (value-referenced-value <gdb:value>) -> <gdb:value>
484 Given a value of a reference type, return the value referenced.
485 The difference between this function and gdbscm_value_dereference is that
486 the latter applies * unary operator to a value, which need not always
487 result in the value referenced.
488 For example, for a value which is a reference to an 'int' pointer ('int *'),
489 gdbscm_value_dereference will result in a value of type 'int' while
490 gdbscm_value_referenced_value will result in a value of type 'int *'. */
491
492 static SCM
493 gdbscm_value_referenced_value (SCM self)
494 {
495 value_smob *v_smob
496 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
497 struct value *value = v_smob->value;
498 SCM result;
499 struct value *res_val = NULL;
500 struct cleanup *cleanups;
501
502 cleanups = make_cleanup_value_free_to_mark (value_mark ());
503
504 TRY
505 {
506 switch (TYPE_CODE (check_typedef (value_type (value))))
507 {
508 case TYPE_CODE_PTR:
509 res_val = value_ind (value);
510 break;
511 case TYPE_CODE_REF:
512 res_val = coerce_ref (value);
513 break;
514 default:
515 error (_("Trying to get the referenced value from a value which is"
516 " neither a pointer nor a reference"));
517 }
518 }
519 CATCH (except, RETURN_MASK_ALL)
520 {
521 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
522 }
523 END_CATCH
524
525 result = vlscm_scm_from_value (res_val);
526
527 do_cleanups (cleanups);
528
529 if (gdbscm_is_exception (result))
530 gdbscm_throw (result);
531
532 return result;
533 }
534
535 /* (value-type <gdb:value>) -> <gdb:type> */
536
537 static SCM
538 gdbscm_value_type (SCM self)
539 {
540 value_smob *v_smob
541 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
542 struct value *value = v_smob->value;
543
544 if (SCM_UNBNDP (v_smob->type))
545 v_smob->type = tyscm_scm_from_type (value_type (value));
546
547 return v_smob->type;
548 }
549
550 /* (value-dynamic-type <gdb:value>) -> <gdb:type> */
551
552 static SCM
553 gdbscm_value_dynamic_type (SCM self)
554 {
555 value_smob *v_smob
556 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
557 struct value *value = v_smob->value;
558 struct type *type = NULL;
559
560 if (! SCM_UNBNDP (v_smob->dynamic_type))
561 return v_smob->dynamic_type;
562
563 TRY
564 {
565 struct cleanup *cleanup
566 = make_cleanup_value_free_to_mark (value_mark ());
567
568 type = value_type (value);
569 type = check_typedef (type);
570
571 if (((TYPE_CODE (type) == TYPE_CODE_PTR)
572 || (TYPE_CODE (type) == TYPE_CODE_REF))
573 && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRUCT))
574 {
575 struct value *target;
576 int was_pointer = TYPE_CODE (type) == TYPE_CODE_PTR;
577
578 if (was_pointer)
579 target = value_ind (value);
580 else
581 target = coerce_ref (value);
582 type = value_rtti_type (target, NULL, NULL, NULL);
583
584 if (type)
585 {
586 if (was_pointer)
587 type = lookup_pointer_type (type);
588 else
589 type = lookup_lvalue_reference_type (type);
590 }
591 }
592 else if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
593 type = value_rtti_type (value, NULL, NULL, NULL);
594 else
595 {
596 /* Re-use object's static type. */
597 type = NULL;
598 }
599
600 do_cleanups (cleanup);
601 }
602 CATCH (except, RETURN_MASK_ALL)
603 {
604 GDBSCM_HANDLE_GDB_EXCEPTION (except);
605 }
606 END_CATCH
607
608 if (type == NULL)
609 v_smob->dynamic_type = gdbscm_value_type (self);
610 else
611 v_smob->dynamic_type = tyscm_scm_from_type (type);
612
613 return v_smob->dynamic_type;
614 }
615
616 /* A helper function that implements the various cast operators. */
617
618 static SCM
619 vlscm_do_cast (SCM self, SCM type_scm, enum exp_opcode op,
620 const char *func_name)
621 {
622 value_smob *v_smob
623 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
624 struct value *value = v_smob->value;
625 type_smob *t_smob
626 = tyscm_get_type_smob_arg_unsafe (type_scm, SCM_ARG2, FUNC_NAME);
627 struct type *type = tyscm_type_smob_type (t_smob);
628 SCM result;
629 struct value *res_val = NULL;
630 struct cleanup *cleanups;
631
632 cleanups = make_cleanup_value_free_to_mark (value_mark ());
633
634 TRY
635 {
636 if (op == UNOP_DYNAMIC_CAST)
637 res_val = value_dynamic_cast (type, value);
638 else if (op == UNOP_REINTERPRET_CAST)
639 res_val = value_reinterpret_cast (type, value);
640 else
641 {
642 gdb_assert (op == UNOP_CAST);
643 res_val = value_cast (type, value);
644 }
645 }
646 CATCH (except, RETURN_MASK_ALL)
647 {
648 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
649 }
650 END_CATCH
651
652 gdb_assert (res_val != NULL);
653 result = vlscm_scm_from_value (res_val);
654
655 do_cleanups (cleanups);
656
657 if (gdbscm_is_exception (result))
658 gdbscm_throw (result);
659
660 return result;
661 }
662
663 /* (value-cast <gdb:value> <gdb:type>) -> <gdb:value> */
664
665 static SCM
666 gdbscm_value_cast (SCM self, SCM new_type)
667 {
668 return vlscm_do_cast (self, new_type, UNOP_CAST, FUNC_NAME);
669 }
670
671 /* (value-dynamic-cast <gdb:value> <gdb:type>) -> <gdb:value> */
672
673 static SCM
674 gdbscm_value_dynamic_cast (SCM self, SCM new_type)
675 {
676 return vlscm_do_cast (self, new_type, UNOP_DYNAMIC_CAST, FUNC_NAME);
677 }
678
679 /* (value-reinterpret-cast <gdb:value> <gdb:type>) -> <gdb:value> */
680
681 static SCM
682 gdbscm_value_reinterpret_cast (SCM self, SCM new_type)
683 {
684 return vlscm_do_cast (self, new_type, UNOP_REINTERPRET_CAST, FUNC_NAME);
685 }
686
687 /* (value-field <gdb:value> string) -> <gdb:value>
688 Given string name of an element inside structure, return its <gdb:value>
689 object. */
690
691 static SCM
692 gdbscm_value_field (SCM self, SCM field_scm)
693 {
694 value_smob *v_smob
695 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
696 struct value *value = v_smob->value;
697 char *field = NULL;
698 struct value *res_val = NULL;
699 SCM result;
700 struct cleanup *cleanups;
701
702 SCM_ASSERT_TYPE (scm_is_string (field_scm), field_scm, SCM_ARG2, FUNC_NAME,
703 _("string"));
704
705 cleanups = make_cleanup_value_free_to_mark (value_mark ());
706
707 field = gdbscm_scm_to_c_string (field_scm);
708 make_cleanup (xfree, field);
709
710 TRY
711 {
712 struct value *tmp = value;
713
714 res_val = value_struct_elt (&tmp, NULL, field, NULL,
715 "struct/class/union");
716 }
717 CATCH (except, RETURN_MASK_ALL)
718 {
719 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
720 }
721 END_CATCH
722
723 gdb_assert (res_val != NULL);
724 result = vlscm_scm_from_value (res_val);
725
726 do_cleanups (cleanups);
727
728 if (gdbscm_is_exception (result))
729 gdbscm_throw (result);
730
731 return result;
732 }
733
734 /* (value-subscript <gdb:value> integer|<gdb:value>) -> <gdb:value>
735 Return the specified value in an array. */
736
737 static SCM
738 gdbscm_value_subscript (SCM self, SCM index_scm)
739 {
740 value_smob *v_smob
741 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
742 struct value *value = v_smob->value;
743 struct value *index = NULL;
744 struct value *res_val = NULL;
745 struct type *type = value_type (value);
746 struct gdbarch *gdbarch;
747 SCM result, except_scm;
748 struct cleanup *cleanups;
749
750 /* The sequencing here, as everywhere else, is important.
751 We can't have existing cleanups when a Scheme exception is thrown. */
752
753 SCM_ASSERT (type != NULL, self, SCM_ARG2, FUNC_NAME);
754 gdbarch = get_type_arch (type);
755
756 cleanups = make_cleanup_value_free_to_mark (value_mark ());
757
758 index = vlscm_convert_value_from_scheme (FUNC_NAME, SCM_ARG2, index_scm,
759 &except_scm,
760 gdbarch, current_language);
761 if (index == NULL)
762 {
763 do_cleanups (cleanups);
764 gdbscm_throw (except_scm);
765 }
766
767 TRY
768 {
769 struct value *tmp = value;
770
771 /* Assume we are attempting an array access, and let the value code
772 throw an exception if the index has an invalid type.
773 Check the value's type is something that can be accessed via
774 a subscript. */
775 tmp = coerce_ref (tmp);
776 type = check_typedef (value_type (tmp));
777 if (TYPE_CODE (type) != TYPE_CODE_ARRAY
778 && TYPE_CODE (type) != TYPE_CODE_PTR)
779 error (_("Cannot subscript requested type"));
780
781 res_val = value_subscript (tmp, value_as_long (index));
782 }
783 CATCH (except, RETURN_MASK_ALL)
784 {
785 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
786 }
787 END_CATCH
788
789 gdb_assert (res_val != NULL);
790 result = vlscm_scm_from_value (res_val);
791
792 do_cleanups (cleanups);
793
794 if (gdbscm_is_exception (result))
795 gdbscm_throw (result);
796
797 return result;
798 }
799
800 /* (value-call <gdb:value> arg-list) -> <gdb:value>
801 Perform an inferior function call on the value. */
802
803 static SCM
804 gdbscm_value_call (SCM self, SCM args)
805 {
806 value_smob *v_smob
807 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
808 struct value *function = v_smob->value;
809 struct value *mark = value_mark ();
810 struct type *ftype = NULL;
811 long args_count;
812 struct value **vargs = NULL;
813 SCM result = SCM_BOOL_F;
814
815 TRY
816 {
817 ftype = check_typedef (value_type (function));
818 }
819 CATCH (except, RETURN_MASK_ALL)
820 {
821 GDBSCM_HANDLE_GDB_EXCEPTION (except);
822 }
823 END_CATCH
824
825 SCM_ASSERT_TYPE (TYPE_CODE (ftype) == TYPE_CODE_FUNC, self,
826 SCM_ARG1, FUNC_NAME,
827 _("function (value of TYPE_CODE_FUNC)"));
828
829 SCM_ASSERT_TYPE (gdbscm_is_true (scm_list_p (args)), args,
830 SCM_ARG2, FUNC_NAME, _("list"));
831
832 args_count = scm_ilength (args);
833 if (args_count > 0)
834 {
835 struct gdbarch *gdbarch = get_current_arch ();
836 const struct language_defn *language = current_language;
837 SCM except_scm;
838 long i;
839
840 vargs = XALLOCAVEC (struct value *, args_count);
841 for (i = 0; i < args_count; i++)
842 {
843 SCM arg = scm_car (args);
844
845 vargs[i] = vlscm_convert_value_from_scheme (FUNC_NAME,
846 GDBSCM_ARG_NONE, arg,
847 &except_scm,
848 gdbarch, language);
849 if (vargs[i] == NULL)
850 gdbscm_throw (except_scm);
851
852 args = scm_cdr (args);
853 }
854 gdb_assert (gdbscm_is_true (scm_null_p (args)));
855 }
856
857 TRY
858 {
859 struct cleanup *cleanup = make_cleanup_value_free_to_mark (mark);
860 struct value *return_value;
861
862 return_value = call_function_by_hand (function, NULL, args_count, vargs);
863 result = vlscm_scm_from_value (return_value);
864 do_cleanups (cleanup);
865 }
866 CATCH (except, RETURN_MASK_ALL)
867 {
868 GDBSCM_HANDLE_GDB_EXCEPTION (except);
869 }
870 END_CATCH
871
872 if (gdbscm_is_exception (result))
873 gdbscm_throw (result);
874
875 return result;
876 }
877
878 /* (value->bytevector <gdb:value>) -> bytevector */
879
880 static SCM
881 gdbscm_value_to_bytevector (SCM self)
882 {
883 value_smob *v_smob
884 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
885 struct value *value = v_smob->value;
886 struct type *type;
887 size_t length = 0;
888 const gdb_byte *contents = NULL;
889 SCM bv;
890
891 type = value_type (value);
892
893 TRY
894 {
895 type = check_typedef (type);
896 length = TYPE_LENGTH (type);
897 contents = value_contents (value);
898 }
899 CATCH (except, RETURN_MASK_ALL)
900 {
901 GDBSCM_HANDLE_GDB_EXCEPTION (except);
902 }
903 END_CATCH
904
905 bv = scm_c_make_bytevector (length);
906 memcpy (SCM_BYTEVECTOR_CONTENTS (bv), contents, length);
907
908 return bv;
909 }
910
911 /* Helper function to determine if a type is "int-like". */
912
913 static int
914 is_intlike (struct type *type, int ptr_ok)
915 {
916 return (TYPE_CODE (type) == TYPE_CODE_INT
917 || TYPE_CODE (type) == TYPE_CODE_ENUM
918 || TYPE_CODE (type) == TYPE_CODE_BOOL
919 || TYPE_CODE (type) == TYPE_CODE_CHAR
920 || (ptr_ok && TYPE_CODE (type) == TYPE_CODE_PTR));
921 }
922
923 /* (value->bool <gdb:value>) -> boolean
924 Throws an error if the value is not integer-like. */
925
926 static SCM
927 gdbscm_value_to_bool (SCM self)
928 {
929 value_smob *v_smob
930 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
931 struct value *value = v_smob->value;
932 struct type *type;
933 LONGEST l = 0;
934
935 type = value_type (value);
936
937 TRY
938 {
939 type = check_typedef (type);
940 }
941 CATCH (except, RETURN_MASK_ALL)
942 {
943 GDBSCM_HANDLE_GDB_EXCEPTION (except);
944 }
945 END_CATCH
946
947 SCM_ASSERT_TYPE (is_intlike (type, 1), self, SCM_ARG1, FUNC_NAME,
948 _("integer-like gdb value"));
949
950 TRY
951 {
952 if (TYPE_CODE (type) == TYPE_CODE_PTR)
953 l = value_as_address (value);
954 else
955 l = value_as_long (value);
956 }
957 CATCH (except, RETURN_MASK_ALL)
958 {
959 GDBSCM_HANDLE_GDB_EXCEPTION (except);
960 }
961 END_CATCH
962
963 return scm_from_bool (l != 0);
964 }
965
966 /* (value->integer <gdb:value>) -> integer
967 Throws an error if the value is not integer-like. */
968
969 static SCM
970 gdbscm_value_to_integer (SCM self)
971 {
972 value_smob *v_smob
973 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
974 struct value *value = v_smob->value;
975 struct type *type;
976 LONGEST l = 0;
977
978 type = value_type (value);
979
980 TRY
981 {
982 type = check_typedef (type);
983 }
984 CATCH (except, RETURN_MASK_ALL)
985 {
986 GDBSCM_HANDLE_GDB_EXCEPTION (except);
987 }
988 END_CATCH
989
990 SCM_ASSERT_TYPE (is_intlike (type, 1), self, SCM_ARG1, FUNC_NAME,
991 _("integer-like gdb value"));
992
993 TRY
994 {
995 if (TYPE_CODE (type) == TYPE_CODE_PTR)
996 l = value_as_address (value);
997 else
998 l = value_as_long (value);
999 }
1000 CATCH (except, RETURN_MASK_ALL)
1001 {
1002 GDBSCM_HANDLE_GDB_EXCEPTION (except);
1003 }
1004 END_CATCH
1005
1006 if (TYPE_UNSIGNED (type))
1007 return gdbscm_scm_from_ulongest (l);
1008 else
1009 return gdbscm_scm_from_longest (l);
1010 }
1011
1012 /* (value->real <gdb:value>) -> real
1013 Throws an error if the value is not a number. */
1014
1015 static SCM
1016 gdbscm_value_to_real (SCM self)
1017 {
1018 value_smob *v_smob
1019 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
1020 struct value *value = v_smob->value;
1021 struct type *type;
1022 double d = 0;
1023 struct value *check = nullptr;
1024
1025 type = value_type (value);
1026
1027 TRY
1028 {
1029 type = check_typedef (type);
1030 }
1031 CATCH (except, RETURN_MASK_ALL)
1032 {
1033 GDBSCM_HANDLE_GDB_EXCEPTION (except);
1034 }
1035 END_CATCH
1036
1037 SCM_ASSERT_TYPE (is_intlike (type, 0) || TYPE_CODE (type) == TYPE_CODE_FLT,
1038 self, SCM_ARG1, FUNC_NAME, _("number"));
1039
1040 TRY
1041 {
1042 if (is_floating_value (value))
1043 {
1044 d = target_float_to_host_double (value_contents (value), type);
1045 check = allocate_value (type);
1046 target_float_from_host_double (value_contents_raw (check), type, d);
1047 }
1048 else if (TYPE_UNSIGNED (type))
1049 {
1050 d = (ULONGEST) value_as_long (value);
1051 check = value_from_ulongest (type, (ULONGEST) d);
1052 }
1053 else
1054 {
1055 d = value_as_long (value);
1056 check = value_from_longest (type, (LONGEST) d);
1057 }
1058 }
1059 CATCH (except, RETURN_MASK_ALL)
1060 {
1061 GDBSCM_HANDLE_GDB_EXCEPTION (except);
1062 }
1063 END_CATCH
1064
1065 /* TODO: Is there a better way to check if the value fits? */
1066 if (!value_equal (value, check))
1067 gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG1, self,
1068 _("number can't be converted to a double"));
1069
1070 return scm_from_double (d);
1071 }
1072
1073 /* (value->string <gdb:value>
1074 [#:encoding encoding]
1075 [#:errors #f | 'error | 'substitute]
1076 [#:length length])
1077 -> string
1078 Return Unicode string with value's contents, which must be a string.
1079
1080 If ENCODING is not given, the string is assumed to be encoded in
1081 the target's charset.
1082
1083 ERRORS is one of #f, 'error or 'substitute.
1084 An error setting of #f means use the default, which is Guile's
1085 %default-port-conversion-strategy when using Guile >= 2.0.6, or 'error if
1086 using an earlier version of Guile. Earlier versions do not properly
1087 support obtaining the default port conversion strategy.
1088 If the default is not one of 'error or 'substitute, 'substitute is used.
1089 An error setting of "error" causes an exception to be thrown if there's
1090 a decoding error. An error setting of "substitute" causes invalid
1091 characters to be replaced with "?".
1092
1093 If LENGTH is provided, only fetch string to the length provided.
1094 LENGTH must be a Scheme integer, it can't be a <gdb:value> integer. */
1095
1096 static SCM
1097 gdbscm_value_to_string (SCM self, SCM rest)
1098 {
1099 value_smob *v_smob
1100 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
1101 struct value *value = v_smob->value;
1102 const SCM keywords[] = {
1103 encoding_keyword, errors_keyword, length_keyword, SCM_BOOL_F
1104 };
1105 int encoding_arg_pos = -1, errors_arg_pos = -1, length_arg_pos = -1;
1106 char *encoding = NULL;
1107 SCM errors = SCM_BOOL_F;
1108 int length = -1;
1109 gdb::unique_xmalloc_ptr<gdb_byte> buffer;
1110 const char *la_encoding = NULL;
1111 struct type *char_type = NULL;
1112 SCM result;
1113 struct cleanup *cleanups;
1114
1115 /* The sequencing here, as everywhere else, is important.
1116 We can't have existing cleanups when a Scheme exception is thrown. */
1117
1118 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG2, keywords, "#sOi", rest,
1119 &encoding_arg_pos, &encoding,
1120 &errors_arg_pos, &errors,
1121 &length_arg_pos, &length);
1122
1123 cleanups = make_cleanup (xfree, encoding);
1124
1125 if (errors_arg_pos > 0
1126 && errors != SCM_BOOL_F
1127 && !scm_is_eq (errors, error_symbol)
1128 && !scm_is_eq (errors, substitute_symbol))
1129 {
1130 SCM excp
1131 = gdbscm_make_out_of_range_error (FUNC_NAME, errors_arg_pos, errors,
1132 _("invalid error kind"));
1133
1134 do_cleanups (cleanups);
1135 gdbscm_throw (excp);
1136 }
1137 if (errors == SCM_BOOL_F)
1138 {
1139 /* N.B. scm_port_conversion_strategy in Guile versions prior to 2.0.6
1140 will throw a Scheme error when passed #f. */
1141 if (gdbscm_guile_version_is_at_least (2, 0, 6))
1142 errors = scm_port_conversion_strategy (SCM_BOOL_F);
1143 else
1144 errors = error_symbol;
1145 }
1146 /* We don't assume anything about the result of scm_port_conversion_strategy.
1147 From this point on, if errors is not 'errors, use 'substitute. */
1148
1149 TRY
1150 {
1151 LA_GET_STRING (value, &buffer, &length, &char_type, &la_encoding);
1152 }
1153 CATCH (except, RETURN_MASK_ALL)
1154 {
1155 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
1156 }
1157 END_CATCH
1158
1159 /* If errors is "error" scm_from_stringn may throw a Scheme exception.
1160 Make sure we don't leak. This is done via scm_dynwind_begin, et.al. */
1161 discard_cleanups (cleanups);
1162
1163 scm_dynwind_begin ((scm_t_dynwind_flags) 0);
1164
1165 gdbscm_dynwind_xfree (encoding);
1166 gdb_byte *buffer_contents = buffer.release ();
1167 gdbscm_dynwind_xfree (buffer_contents);
1168
1169 result = scm_from_stringn ((const char *) buffer_contents,
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.064341 seconds and 4 git commands to generate.