1 /* Scheme interface to values.
3 Copyright (C) 2008-2019 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
20 /* See README file in this directory for implementation notes, coding
21 conventions, et.al. */
24 #include "arch-utils.h"
27 #include "target-float.h"
29 #include "symtab.h" /* Needed by language.h. */
33 #include "guile-internal.h"
35 /* The <gdb:value> smob. */
37 typedef struct _value_smob
39 /* This always appears first. */
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
;
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. */
60 static const char value_smob_name
[] = "gdb:value";
62 /* The tag Guile knows the value smob by. */
63 static scm_t_bits value_smob_tag
;
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
;
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
;
76 /* Possible #:errors values. */
77 static SCM error_symbol
;
78 static SCM escape_symbol
;
79 static SCM substitute_symbol
;
81 /* Administrivia for value smobs. */
83 /* Iterate over all the <gdb:value> objects, calling preserve_one_value on
85 This is the extension_language_ops.preserve_values "method". */
88 gdbscm_preserve_values (const struct extension_language_defn
*extlang
,
89 struct objfile
*objfile
, htab_t copied_types
)
93 for (iter
= values_in_scheme
; iter
; iter
= iter
->next
)
94 preserve_one_value (iter
->value
, objfile
, copied_types
);
97 /* Helper to add a value_smob to the global list. */
100 vlscm_remember_scheme_value (value_smob
*v_smob
)
102 v_smob
->next
= values_in_scheme
;
104 v_smob
->next
->prev
= v_smob
;
106 values_in_scheme
= v_smob
;
109 /* Helper to remove a value_smob from the global list. */
112 vlscm_forget_value_smob (value_smob
*v_smob
)
114 /* Remove SELF from the global list. */
116 v_smob
->prev
->next
= v_smob
->next
;
119 gdb_assert (values_in_scheme
== v_smob
);
120 values_in_scheme
= v_smob
->next
;
123 v_smob
->next
->prev
= v_smob
->prev
;
126 /* The smob "free" function for <gdb:value>. */
129 vlscm_free_value_smob (SCM self
)
131 value_smob
*v_smob
= (value_smob
*) SCM_SMOB_DATA (self
);
133 vlscm_forget_value_smob (v_smob
);
134 value_decref (v_smob
->value
);
139 /* The smob "print" function for <gdb:value>. */
142 vlscm_print_value_smob (SCM self
, SCM port
, scm_print_state
*pstate
)
144 value_smob
*v_smob
= (value_smob
*) SCM_SMOB_DATA (self
);
145 struct value_print_options opts
;
147 if (pstate
->writingp
)
148 gdbscm_printf (port
, "#<%s ", value_smob_name
);
150 get_user_print_options (&opts
);
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
;
159 gdbscm_gdb_exception exc
{};
164 common_val_print (v_smob
->value
, &stb
, 0, &opts
, current_language
);
165 scm_puts (stb
.c_str (), port
);
167 catch (const gdb_exception
&except
)
169 exc
= unpack (except
);
172 GDBSCM_HANDLE_GDB_EXCEPTION (exc
);
173 if (pstate
->writingp
)
174 scm_puts (">", port
);
176 scm_remember_upto_here_1 (self
);
178 /* Non-zero means success. */
182 /* The smob "equalp" function for <gdb:value>. */
185 vlscm_equal_p_value_smob (SCM v1
, SCM v2
)
187 const value_smob
*v1_smob
= (value_smob
*) SCM_SMOB_DATA (v1
);
188 const value_smob
*v2_smob
= (value_smob
*) SCM_SMOB_DATA (v2
);
191 gdbscm_gdb_exception exc
{};
194 result
= value_equal (v1_smob
->value
, v2_smob
->value
);
196 catch (const gdb_exception
&except
)
198 exc
= unpack (except
);
201 GDBSCM_HANDLE_GDB_EXCEPTION (exc
);
202 return scm_from_bool (result
);
205 /* Low level routine to create a <gdb:value> object. */
208 vlscm_make_value_smob (void)
210 value_smob
*v_smob
= (value_smob
*)
211 scm_gc_malloc (sizeof (value_smob
), value_smob_name
);
214 /* These must be filled in by the caller. */
215 v_smob
->value
= NULL
;
219 /* These are lazily computed. */
220 v_smob
->address
= SCM_UNDEFINED
;
221 v_smob
->type
= SCM_UNDEFINED
;
222 v_smob
->dynamic_type
= SCM_UNDEFINED
;
224 v_scm
= scm_new_smob (value_smob_tag
, (scm_t_bits
) v_smob
);
225 gdbscm_init_gsmob (&v_smob
->base
);
230 /* Return non-zero if SCM is a <gdb:value> object. */
233 vlscm_is_value (SCM scm
)
235 return SCM_SMOB_PREDICATE (value_smob_tag
, scm
);
238 /* (value? object) -> boolean */
241 gdbscm_value_p (SCM scm
)
243 return scm_from_bool (vlscm_is_value (scm
));
246 /* Create a new <gdb:value> object that encapsulates VALUE.
247 The value is released from the all_values chain so its lifetime is not
248 bound to the execution of a command. */
251 vlscm_scm_from_value (struct value
*value
)
253 /* N.B. It's important to not cause any side-effects until we know the
254 conversion worked. */
255 SCM v_scm
= vlscm_make_value_smob ();
256 value_smob
*v_smob
= (value_smob
*) SCM_SMOB_DATA (v_scm
);
258 v_smob
->value
= release_value (value
).release ();
259 vlscm_remember_scheme_value (v_smob
);
264 /* Returns the <gdb:value> object in SELF.
265 Throws an exception if SELF is not a <gdb:value> object. */
268 vlscm_get_value_arg_unsafe (SCM self
, int arg_pos
, const char *func_name
)
270 SCM_ASSERT_TYPE (vlscm_is_value (self
), self
, arg_pos
, func_name
,
276 /* Returns a pointer to the value smob of SELF.
277 Throws an exception if SELF is not a <gdb:value> object. */
280 vlscm_get_value_smob_arg_unsafe (SCM self
, int arg_pos
, const char *func_name
)
282 SCM v_scm
= vlscm_get_value_arg_unsafe (self
, arg_pos
, func_name
);
283 value_smob
*v_smob
= (value_smob
*) SCM_SMOB_DATA (v_scm
);
288 /* Return the value field of V_SCM, an object of type <gdb:value>.
289 This exists so that we don't have to export the struct's contents. */
292 vlscm_scm_to_value (SCM v_scm
)
296 gdb_assert (vlscm_is_value (v_scm
));
297 v_smob
= (value_smob
*) SCM_SMOB_DATA (v_scm
);
298 return v_smob
->value
;
303 /* (make-value x [#:type type]) -> <gdb:value> */
306 gdbscm_make_value (SCM x
, SCM rest
)
308 const SCM keywords
[] = { type_keyword
, SCM_BOOL_F
};
310 int type_arg_pos
= -1;
311 SCM type_scm
= SCM_UNDEFINED
;
312 gdbscm_parse_function_args (FUNC_NAME
, SCM_ARG2
, keywords
, "#O", rest
,
313 &type_arg_pos
, &type_scm
);
315 struct type
*type
= NULL
;
316 if (type_arg_pos
> 0)
318 type_smob
*t_smob
= tyscm_get_type_smob_arg_unsafe (type_scm
,
321 type
= tyscm_type_smob_type (t_smob
);
324 return gdbscm_wrap ([=]
326 scoped_value_mark free_values
;
330 = vlscm_convert_typed_value_from_scheme (FUNC_NAME
, SCM_ARG1
, x
,
331 type_arg_pos
, type_scm
, type
,
338 return vlscm_scm_from_value (value
);
342 /* (make-lazy-value <gdb:type> address) -> <gdb:value> */
345 gdbscm_make_lazy_value (SCM type_scm
, SCM address_scm
)
347 type_smob
*t_smob
= tyscm_get_type_smob_arg_unsafe (type_scm
,
348 SCM_ARG1
, FUNC_NAME
);
349 struct type
*type
= tyscm_type_smob_type (t_smob
);
352 gdbscm_parse_function_args (FUNC_NAME
, SCM_ARG2
, NULL
, "U",
353 address_scm
, &address
);
355 return gdbscm_wrap ([=]
357 scoped_value_mark free_values
;
359 struct value
*value
= value_from_contents_and_address (type
, NULL
,
361 return vlscm_scm_from_value (value
);
365 /* (value-optimized-out? <gdb:value>) -> boolean */
368 gdbscm_value_optimized_out_p (SCM self
)
371 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
373 return gdbscm_wrap ([=]
375 return scm_from_bool (value_optimized_out (v_smob
->value
));
379 /* (value-address <gdb:value>) -> integer
380 Returns #f if the value doesn't have one. */
383 gdbscm_value_address (SCM self
)
386 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
387 struct value
*value
= v_smob
->value
;
389 return gdbscm_wrap ([=]
391 if (SCM_UNBNDP (v_smob
->address
))
393 scoped_value_mark free_values
;
395 SCM address
= SCM_BOOL_F
;
399 address
= vlscm_scm_from_value (value_addr (value
));
401 catch (const gdb_exception
&except
)
405 if (gdbscm_is_exception (address
))
408 v_smob
->address
= address
;
411 return v_smob
->address
;
415 /* (value-dereference <gdb:value>) -> <gdb:value>
416 Given a value of a pointer type, apply the C unary * operator to it. */
419 gdbscm_value_dereference (SCM self
)
422 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
424 return gdbscm_wrap ([=]
426 scoped_value_mark free_values
;
428 struct value
*res_val
= value_ind (v_smob
->value
);
429 return vlscm_scm_from_value (res_val
);
433 /* (value-referenced-value <gdb:value>) -> <gdb:value>
434 Given a value of a reference type, return the value referenced.
435 The difference between this function and gdbscm_value_dereference is that
436 the latter applies * unary operator to a value, which need not always
437 result in the value referenced.
438 For example, for a value which is a reference to an 'int' pointer ('int *'),
439 gdbscm_value_dereference will result in a value of type 'int' while
440 gdbscm_value_referenced_value will result in a value of type 'int *'. */
443 gdbscm_value_referenced_value (SCM self
)
446 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
447 struct value
*value
= v_smob
->value
;
449 return gdbscm_wrap ([=]
451 scoped_value_mark free_values
;
453 struct value
*res_val
;
455 switch (TYPE_CODE (check_typedef (value_type (value
))))
458 res_val
= value_ind (value
);
461 res_val
= coerce_ref (value
);
464 error (_("Trying to get the referenced value from a value which is"
465 " neither a pointer nor a reference"));
468 return vlscm_scm_from_value (res_val
);
472 /* (value-type <gdb:value>) -> <gdb:type> */
475 gdbscm_value_type (SCM self
)
478 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
479 struct value
*value
= v_smob
->value
;
481 if (SCM_UNBNDP (v_smob
->type
))
482 v_smob
->type
= tyscm_scm_from_type (value_type (value
));
487 /* (value-dynamic-type <gdb:value>) -> <gdb:type> */
490 gdbscm_value_dynamic_type (SCM self
)
493 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
494 struct value
*value
= v_smob
->value
;
495 struct type
*type
= NULL
;
497 if (! SCM_UNBNDP (v_smob
->dynamic_type
))
498 return v_smob
->dynamic_type
;
500 gdbscm_gdb_exception exc
{};
503 scoped_value_mark free_values
;
505 type
= value_type (value
);
506 type
= check_typedef (type
);
508 if (((TYPE_CODE (type
) == TYPE_CODE_PTR
)
509 || (TYPE_CODE (type
) == TYPE_CODE_REF
))
510 && (TYPE_CODE (TYPE_TARGET_TYPE (type
)) == TYPE_CODE_STRUCT
))
512 struct value
*target
;
513 int was_pointer
= TYPE_CODE (type
) == TYPE_CODE_PTR
;
516 target
= value_ind (value
);
518 target
= coerce_ref (value
);
519 type
= value_rtti_type (target
, NULL
, NULL
, NULL
);
524 type
= lookup_pointer_type (type
);
526 type
= lookup_lvalue_reference_type (type
);
529 else if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
530 type
= value_rtti_type (value
, NULL
, NULL
, NULL
);
533 /* Re-use object's static type. */
537 catch (const gdb_exception
&except
)
539 exc
= unpack (except
);
542 GDBSCM_HANDLE_GDB_EXCEPTION (exc
);
544 v_smob
->dynamic_type
= gdbscm_value_type (self
);
546 v_smob
->dynamic_type
= tyscm_scm_from_type (type
);
548 return v_smob
->dynamic_type
;
551 /* A helper function that implements the various cast operators. */
554 vlscm_do_cast (SCM self
, SCM type_scm
, enum exp_opcode op
,
555 const char *func_name
)
558 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
559 struct value
*value
= v_smob
->value
;
561 = tyscm_get_type_smob_arg_unsafe (type_scm
, SCM_ARG2
, FUNC_NAME
);
562 struct type
*type
= tyscm_type_smob_type (t_smob
);
564 return gdbscm_wrap ([=]
566 scoped_value_mark free_values
;
568 struct value
*res_val
;
569 if (op
== UNOP_DYNAMIC_CAST
)
570 res_val
= value_dynamic_cast (type
, value
);
571 else if (op
== UNOP_REINTERPRET_CAST
)
572 res_val
= value_reinterpret_cast (type
, value
);
575 gdb_assert (op
== UNOP_CAST
);
576 res_val
= value_cast (type
, value
);
579 return vlscm_scm_from_value (res_val
);
583 /* (value-cast <gdb:value> <gdb:type>) -> <gdb:value> */
586 gdbscm_value_cast (SCM self
, SCM new_type
)
588 return vlscm_do_cast (self
, new_type
, UNOP_CAST
, FUNC_NAME
);
591 /* (value-dynamic-cast <gdb:value> <gdb:type>) -> <gdb:value> */
594 gdbscm_value_dynamic_cast (SCM self
, SCM new_type
)
596 return vlscm_do_cast (self
, new_type
, UNOP_DYNAMIC_CAST
, FUNC_NAME
);
599 /* (value-reinterpret-cast <gdb:value> <gdb:type>) -> <gdb:value> */
602 gdbscm_value_reinterpret_cast (SCM self
, SCM new_type
)
604 return vlscm_do_cast (self
, new_type
, UNOP_REINTERPRET_CAST
, FUNC_NAME
);
607 /* (value-field <gdb:value> string) -> <gdb:value>
608 Given string name of an element inside structure, return its <gdb:value>
612 gdbscm_value_field (SCM self
, SCM field_scm
)
615 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
617 SCM_ASSERT_TYPE (scm_is_string (field_scm
), field_scm
, SCM_ARG2
, FUNC_NAME
,
620 return gdbscm_wrap ([=]
622 scoped_value_mark free_values
;
624 gdb::unique_xmalloc_ptr
<char> field
= gdbscm_scm_to_c_string (field_scm
);
626 struct value
*tmp
= v_smob
->value
;
628 struct value
*res_val
= value_struct_elt (&tmp
, NULL
, field
.get (), NULL
,
629 "struct/class/union");
631 return vlscm_scm_from_value (res_val
);
635 /* (value-subscript <gdb:value> integer|<gdb:value>) -> <gdb:value>
636 Return the specified value in an array. */
639 gdbscm_value_subscript (SCM self
, SCM index_scm
)
642 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
643 struct value
*value
= v_smob
->value
;
644 struct type
*type
= value_type (value
);
646 SCM_ASSERT (type
!= NULL
, self
, SCM_ARG2
, FUNC_NAME
);
648 return gdbscm_wrap ([=]
650 scoped_value_mark free_values
;
654 = vlscm_convert_value_from_scheme (FUNC_NAME
, SCM_ARG2
, index_scm
,
656 get_type_arch (type
),
661 /* Assume we are attempting an array access, and let the value code
662 throw an exception if the index has an invalid type.
663 Check the value's type is something that can be accessed via
665 struct value
*tmp
= coerce_ref (value
);
666 struct type
*tmp_type
= check_typedef (value_type (tmp
));
667 if (TYPE_CODE (tmp_type
) != TYPE_CODE_ARRAY
668 && TYPE_CODE (tmp_type
) != TYPE_CODE_PTR
)
669 error (_("Cannot subscript requested type"));
671 struct value
*res_val
= value_subscript (tmp
, value_as_long (index
));
672 return vlscm_scm_from_value (res_val
);
676 /* (value-call <gdb:value> arg-list) -> <gdb:value>
677 Perform an inferior function call on the value. */
680 gdbscm_value_call (SCM self
, SCM args
)
683 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
684 struct value
*function
= v_smob
->value
;
685 struct type
*ftype
= NULL
;
687 struct value
**vargs
= NULL
;
689 gdbscm_gdb_exception exc
{};
692 ftype
= check_typedef (value_type (function
));
694 catch (const gdb_exception
&except
)
696 exc
= unpack (except
);
699 GDBSCM_HANDLE_GDB_EXCEPTION (exc
);
700 SCM_ASSERT_TYPE (TYPE_CODE (ftype
) == TYPE_CODE_FUNC
, self
,
702 _("function (value of TYPE_CODE_FUNC)"));
704 SCM_ASSERT_TYPE (gdbscm_is_true (scm_list_p (args
)), args
,
705 SCM_ARG2
, FUNC_NAME
, _("list"));
707 args_count
= scm_ilength (args
);
710 struct gdbarch
*gdbarch
= get_current_arch ();
711 const struct language_defn
*language
= current_language
;
715 vargs
= XALLOCAVEC (struct value
*, args_count
);
716 for (i
= 0; i
< args_count
; i
++)
718 SCM arg
= scm_car (args
);
720 vargs
[i
] = vlscm_convert_value_from_scheme (FUNC_NAME
,
721 GDBSCM_ARG_NONE
, arg
,
724 if (vargs
[i
] == NULL
)
725 gdbscm_throw (except_scm
);
727 args
= scm_cdr (args
);
729 gdb_assert (gdbscm_is_true (scm_null_p (args
)));
732 return gdbscm_wrap ([=]
734 scoped_value_mark free_values
;
736 auto av
= gdb::make_array_view (vargs
, args_count
);
737 value
*return_value
= call_function_by_hand (function
, NULL
, av
);
738 return vlscm_scm_from_value (return_value
);
742 /* (value->bytevector <gdb:value>) -> bytevector */
745 gdbscm_value_to_bytevector (SCM self
)
748 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
749 struct value
*value
= v_smob
->value
;
752 const gdb_byte
*contents
= NULL
;
755 type
= value_type (value
);
757 gdbscm_gdb_exception exc
{};
760 type
= check_typedef (type
);
761 length
= TYPE_LENGTH (type
);
762 contents
= value_contents (value
);
764 catch (const gdb_exception
&except
)
766 exc
= unpack (except
);
769 GDBSCM_HANDLE_GDB_EXCEPTION (exc
);
770 bv
= scm_c_make_bytevector (length
);
771 memcpy (SCM_BYTEVECTOR_CONTENTS (bv
), contents
, length
);
776 /* Helper function to determine if a type is "int-like". */
779 is_intlike (struct type
*type
, int ptr_ok
)
781 return (TYPE_CODE (type
) == TYPE_CODE_INT
782 || TYPE_CODE (type
) == TYPE_CODE_ENUM
783 || TYPE_CODE (type
) == TYPE_CODE_BOOL
784 || TYPE_CODE (type
) == TYPE_CODE_CHAR
785 || (ptr_ok
&& TYPE_CODE (type
) == TYPE_CODE_PTR
));
788 /* (value->bool <gdb:value>) -> boolean
789 Throws an error if the value is not integer-like. */
792 gdbscm_value_to_bool (SCM self
)
795 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
796 struct value
*value
= v_smob
->value
;
800 type
= value_type (value
);
802 gdbscm_gdb_exception exc
{};
805 type
= check_typedef (type
);
807 catch (const gdb_exception
&except
)
809 exc
= unpack (except
);
812 GDBSCM_HANDLE_GDB_EXCEPTION (exc
);
813 SCM_ASSERT_TYPE (is_intlike (type
, 1), self
, SCM_ARG1
, FUNC_NAME
,
814 _("integer-like gdb value"));
818 if (TYPE_CODE (type
) == TYPE_CODE_PTR
)
819 l
= value_as_address (value
);
821 l
= value_as_long (value
);
823 catch (const gdb_exception
&except
)
825 exc
= unpack (except
);
828 GDBSCM_HANDLE_GDB_EXCEPTION (exc
);
829 return scm_from_bool (l
!= 0);
832 /* (value->integer <gdb:value>) -> integer
833 Throws an error if the value is not integer-like. */
836 gdbscm_value_to_integer (SCM self
)
839 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
840 struct value
*value
= v_smob
->value
;
844 type
= value_type (value
);
846 gdbscm_gdb_exception exc
{};
849 type
= check_typedef (type
);
851 catch (const gdb_exception
&except
)
853 exc
= unpack (except
);
856 GDBSCM_HANDLE_GDB_EXCEPTION (exc
);
857 SCM_ASSERT_TYPE (is_intlike (type
, 1), self
, SCM_ARG1
, FUNC_NAME
,
858 _("integer-like gdb value"));
862 if (TYPE_CODE (type
) == TYPE_CODE_PTR
)
863 l
= value_as_address (value
);
865 l
= value_as_long (value
);
867 catch (const gdb_exception
&except
)
869 exc
= unpack (except
);
872 GDBSCM_HANDLE_GDB_EXCEPTION (exc
);
873 if (TYPE_UNSIGNED (type
))
874 return gdbscm_scm_from_ulongest (l
);
876 return gdbscm_scm_from_longest (l
);
879 /* (value->real <gdb:value>) -> real
880 Throws an error if the value is not a number. */
883 gdbscm_value_to_real (SCM self
)
886 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
887 struct value
*value
= v_smob
->value
;
890 struct value
*check
= nullptr;
892 type
= value_type (value
);
894 gdbscm_gdb_exception exc
{};
897 type
= check_typedef (type
);
899 catch (const gdb_exception
&except
)
901 exc
= unpack (except
);
904 GDBSCM_HANDLE_GDB_EXCEPTION (exc
);
905 SCM_ASSERT_TYPE (is_intlike (type
, 0) || TYPE_CODE (type
) == TYPE_CODE_FLT
,
906 self
, SCM_ARG1
, FUNC_NAME
, _("number"));
910 if (is_floating_value (value
))
912 d
= target_float_to_host_double (value_contents (value
), type
);
913 check
= value_from_host_double (type
, d
);
915 else if (TYPE_UNSIGNED (type
))
917 d
= (ULONGEST
) value_as_long (value
);
918 check
= value_from_ulongest (type
, (ULONGEST
) d
);
922 d
= value_as_long (value
);
923 check
= value_from_longest (type
, (LONGEST
) d
);
926 catch (const gdb_exception
&except
)
928 exc
= unpack (except
);
931 GDBSCM_HANDLE_GDB_EXCEPTION (exc
);
932 /* TODO: Is there a better way to check if the value fits? */
933 if (!value_equal (value
, check
))
934 gdbscm_out_of_range_error (FUNC_NAME
, SCM_ARG1
, self
,
935 _("number can't be converted to a double"));
937 return scm_from_double (d
);
940 /* (value->string <gdb:value>
941 [#:encoding encoding]
942 [#:errors #f | 'error | 'substitute]
945 Return Unicode string with value's contents, which must be a string.
947 If ENCODING is not given, the string is assumed to be encoded in
948 the target's charset.
950 ERRORS is one of #f, 'error or 'substitute.
951 An error setting of #f means use the default, which is Guile's
952 %default-port-conversion-strategy when using Guile >= 2.0.6, or 'error if
953 using an earlier version of Guile. Earlier versions do not properly
954 support obtaining the default port conversion strategy.
955 If the default is not one of 'error or 'substitute, 'substitute is used.
956 An error setting of "error" causes an exception to be thrown if there's
957 a decoding error. An error setting of "substitute" causes invalid
958 characters to be replaced with "?".
960 If LENGTH is provided, only fetch string to the length provided.
961 LENGTH must be a Scheme integer, it can't be a <gdb:value> integer. */
964 gdbscm_value_to_string (SCM self
, SCM rest
)
967 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
968 struct value
*value
= v_smob
->value
;
969 const SCM keywords
[] = {
970 encoding_keyword
, errors_keyword
, length_keyword
, SCM_BOOL_F
972 int encoding_arg_pos
= -1, errors_arg_pos
= -1, length_arg_pos
= -1;
973 char *encoding
= NULL
;
974 SCM errors
= SCM_BOOL_F
;
975 /* Avoid an uninitialized warning from gcc. */
976 gdb_byte
*buffer_contents
= nullptr;
978 const char *la_encoding
= NULL
;
979 struct type
*char_type
= NULL
;
982 /* The sequencing here, as everywhere else, is important.
983 We can't have existing cleanups when a Scheme exception is thrown. */
985 gdbscm_parse_function_args (FUNC_NAME
, SCM_ARG2
, keywords
, "#sOi", rest
,
986 &encoding_arg_pos
, &encoding
,
987 &errors_arg_pos
, &errors
,
988 &length_arg_pos
, &length
);
990 if (errors_arg_pos
> 0
991 && errors
!= SCM_BOOL_F
992 && !scm_is_eq (errors
, error_symbol
)
993 && !scm_is_eq (errors
, substitute_symbol
))
996 = gdbscm_make_out_of_range_error (FUNC_NAME
, errors_arg_pos
, errors
,
997 _("invalid error kind"));
1000 gdbscm_throw (excp
);
1002 if (errors
== SCM_BOOL_F
)
1004 /* N.B. scm_port_conversion_strategy in Guile versions prior to 2.0.6
1005 will throw a Scheme error when passed #f. */
1006 if (gdbscm_guile_version_is_at_least (2, 0, 6))
1007 errors
= scm_port_conversion_strategy (SCM_BOOL_F
);
1009 errors
= error_symbol
;
1011 /* We don't assume anything about the result of scm_port_conversion_strategy.
1012 From this point on, if errors is not 'errors, use 'substitute. */
1014 gdbscm_gdb_exception exc
{};
1017 gdb::unique_xmalloc_ptr
<gdb_byte
> buffer
;
1018 LA_GET_STRING (value
, &buffer
, &length
, &char_type
, &la_encoding
);
1019 buffer_contents
= buffer
.release ();
1021 catch (const gdb_exception
&except
)
1024 exc
= unpack (except
);
1026 GDBSCM_HANDLE_GDB_EXCEPTION (exc
);
1028 /* If errors is "error", scm_from_stringn may throw a Scheme exception.
1029 Make sure we don't leak. This is done via scm_dynwind_begin, et.al. */
1031 scm_dynwind_begin ((scm_t_dynwind_flags
) 0);
1033 gdbscm_dynwind_xfree (encoding
);
1034 gdbscm_dynwind_xfree (buffer_contents
);
1036 result
= scm_from_stringn ((const char *) buffer_contents
,
1037 length
* TYPE_LENGTH (char_type
),
1038 (encoding
!= NULL
&& *encoding
!= '\0'
1041 scm_is_eq (errors
, error_symbol
)
1042 ? SCM_FAILED_CONVERSION_ERROR
1043 : SCM_FAILED_CONVERSION_QUESTION_MARK
);
1050 /* (value->lazy-string <gdb:value> [#:encoding encoding] [#:length length])
1051 -> <gdb:lazy-string>
1052 Return a Scheme object representing a lazy_string_object type.
1053 A lazy string is a pointer to a string with an optional encoding and length.
1054 If ENCODING is not given, the target's charset is used.
1055 If LENGTH is provided then the length parameter is set to LENGTH.
1056 Otherwise if the value is an array of known length then the array's length
1057 is used. Otherwise the length will be set to -1 (meaning first null of
1059 LENGTH must be a Scheme integer, it can't be a <gdb:value> integer. */
1062 gdbscm_value_to_lazy_string (SCM self
, SCM rest
)
1065 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
1066 struct value
*value
= v_smob
->value
;
1067 const SCM keywords
[] = { encoding_keyword
, length_keyword
, SCM_BOOL_F
};
1068 int encoding_arg_pos
= -1, length_arg_pos
= -1;
1069 char *encoding
= NULL
;
1071 SCM result
= SCM_BOOL_F
; /* -Wall */
1072 gdbscm_gdb_exception except
{};
1074 /* The sequencing here, as everywhere else, is important.
1075 We can't have existing cleanups when a Scheme exception is thrown. */
1077 gdbscm_parse_function_args (FUNC_NAME
, SCM_ARG2
, keywords
, "#si", rest
,
1078 &encoding_arg_pos
, &encoding
,
1079 &length_arg_pos
, &length
);
1083 gdbscm_out_of_range_error (FUNC_NAME
, length_arg_pos
,
1084 scm_from_int (length
),
1085 _("invalid length"));
1090 scoped_value_mark free_values
;
1092 struct type
*type
, *realtype
;
1095 type
= value_type (value
);
1096 realtype
= check_typedef (type
);
1098 switch (TYPE_CODE (realtype
))
1100 case TYPE_CODE_ARRAY
:
1102 LONGEST array_length
= -1;
1103 LONGEST low_bound
, high_bound
;
1105 /* PR 20786: There's no way to specify an array of length zero.
1106 Record a length of [0,-1] which is how Ada does it. Anything
1107 we do is broken, but this one possible solution. */
1108 if (get_array_bounds (realtype
, &low_bound
, &high_bound
))
1109 array_length
= high_bound
- low_bound
+ 1;
1111 length
= array_length
;
1112 else if (array_length
== -1)
1114 type
= lookup_array_range_type (TYPE_TARGET_TYPE (realtype
),
1117 else if (length
!= array_length
)
1119 /* We need to create a new array type with the
1120 specified length. */
1121 if (length
> array_length
)
1122 error (_("length is larger than array size"));
1123 type
= lookup_array_range_type (TYPE_TARGET_TYPE (type
),
1125 low_bound
+ length
- 1);
1127 addr
= value_address (value
);
1131 /* If a length is specified we defer creating an array of the
1132 specified width until we need to. */
1133 addr
= value_as_address (value
);
1136 /* Should flag an error here. PR 20769. */
1137 addr
= value_address (value
);
1141 result
= lsscm_make_lazy_string (addr
, length
, encoding
, type
);
1143 catch (const gdb_exception
&ex
)
1145 except
= unpack (ex
);
1149 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
1151 if (gdbscm_is_exception (result
))
1152 gdbscm_throw (result
);
1157 /* (value-lazy? <gdb:value>) -> boolean */
1160 gdbscm_value_lazy_p (SCM self
)
1163 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
1164 struct value
*value
= v_smob
->value
;
1166 return scm_from_bool (value_lazy (value
));
1169 /* (value-fetch-lazy! <gdb:value>) -> unspecified */
1172 gdbscm_value_fetch_lazy_x (SCM self
)
1175 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
1176 struct value
*value
= v_smob
->value
;
1178 return gdbscm_wrap ([=]
1180 if (value_lazy (value
))
1181 value_fetch_lazy (value
);
1182 return SCM_UNSPECIFIED
;
1186 /* (value-print <gdb:value>) -> string */
1189 gdbscm_value_print (SCM self
)
1192 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
1193 struct value
*value
= v_smob
->value
;
1194 struct value_print_options opts
;
1196 get_user_print_options (&opts
);
1201 gdbscm_gdb_exception exc
{};
1204 common_val_print (value
, &stb
, 0, &opts
, current_language
);
1206 catch (const gdb_exception
&except
)
1208 exc
= unpack (except
);
1211 GDBSCM_HANDLE_GDB_EXCEPTION (exc
);
1212 /* Use SCM_FAILED_CONVERSION_QUESTION_MARK to ensure this doesn't
1213 throw an error if the encoding fails.
1214 IWBN to use scm_take_locale_string here, but we'd have to temporarily
1215 override the default port conversion handler because contrary to
1216 documentation it doesn't necessarily free the input string. */
1217 return scm_from_stringn (stb
.c_str (), stb
.size (), host_charset (),
1218 SCM_FAILED_CONVERSION_QUESTION_MARK
);
1221 /* (parse-and-eval string) -> <gdb:value>
1222 Parse a string and evaluate the string as an expression. */
1225 gdbscm_parse_and_eval (SCM expr_scm
)
1228 gdbscm_parse_function_args (FUNC_NAME
, SCM_ARG1
, NULL
, "s",
1229 expr_scm
, &expr_str
);
1231 return gdbscm_wrap ([=]
1233 scoped_value_mark free_values
;
1234 return vlscm_scm_from_value (parse_and_eval (expr_str
));
1238 /* (history-ref integer) -> <gdb:value>
1239 Return the specified value from GDB's value history. */
1242 gdbscm_history_ref (SCM index
)
1245 gdbscm_parse_function_args (FUNC_NAME
, SCM_ARG1
, NULL
, "i", index
, &i
);
1247 return gdbscm_wrap ([=]
1249 return vlscm_scm_from_value (access_value_history (i
));
1253 /* (history-append! <gdb:value>) -> index
1254 Append VALUE to GDB's value history. Return its index in the history. */
1257 gdbscm_history_append_x (SCM value
)
1260 = vlscm_get_value_smob_arg_unsafe (value
, SCM_ARG1
, FUNC_NAME
);
1261 return gdbscm_wrap ([=]
1263 return scm_from_int (record_latest_value (v_smob
->value
));
1267 /* Initialize the Scheme value code. */
1269 static const scheme_function value_functions
[] =
1271 { "value?", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_p
),
1273 Return #t if the object is a <gdb:value> object." },
1275 { "make-value", 1, 0, 1, as_a_scm_t_subr (gdbscm_make_value
),
1277 Create a <gdb:value> representing object.\n\
1278 Typically this is used to convert numbers and strings to\n\
1279 <gdb:value> objects.\n\
1281 Arguments: object [#:type <gdb:type>]" },
1283 { "value-optimized-out?", 1, 0, 0,
1284 as_a_scm_t_subr (gdbscm_value_optimized_out_p
),
1286 Return #t if the value has been optimizd out." },
1288 { "value-address", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_address
),
1290 Return the address of the value." },
1292 { "value-type", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_type
),
1294 Return the type of the value." },
1296 { "value-dynamic-type", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_dynamic_type
),
1298 Return the dynamic type of the value." },
1300 { "value-cast", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_cast
),
1302 Cast the value to the supplied type.\n\
1304 Arguments: <gdb:value> <gdb:type>" },
1306 { "value-dynamic-cast", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_dynamic_cast
),
1308 Cast the value to the supplied type, as if by the C++\n\
1309 dynamic_cast operator.\n\
1311 Arguments: <gdb:value> <gdb:type>" },
1313 { "value-reinterpret-cast", 2, 0, 0,
1314 as_a_scm_t_subr (gdbscm_value_reinterpret_cast
),
1316 Cast the value to the supplied type, as if by the C++\n\
1317 reinterpret_cast operator.\n\
1319 Arguments: <gdb:value> <gdb:type>" },
1321 { "value-dereference", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_dereference
),
1323 Return the result of applying the C unary * operator to the value." },
1325 { "value-referenced-value", 1, 0, 0,
1326 as_a_scm_t_subr (gdbscm_value_referenced_value
),
1328 Given a value of a reference type, return the value referenced.\n\
1329 The difference between this function and value-dereference is that\n\
1330 the latter applies * unary operator to a value, which need not always\n\
1331 result in the value referenced.\n\
1332 For example, for a value which is a reference to an 'int' pointer ('int *'),\n\
1333 value-dereference will result in a value of type 'int' while\n\
1334 value-referenced-value will result in a value of type 'int *'." },
1336 { "value-field", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_field
),
1338 Return the specified field of the value.\n\
1340 Arguments: <gdb:value> string" },
1342 { "value-subscript", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_subscript
),
1344 Return the value of the array at the specified index.\n\
1346 Arguments: <gdb:value> integer" },
1348 { "value-call", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_call
),
1350 Perform an inferior function call taking the value as a pointer to the\n\
1351 function to call.\n\
1352 Each element of the argument list must be a <gdb:value> object or an object\n\
1353 that can be converted to one.\n\
1354 The result is the value returned by the function.\n\
1356 Arguments: <gdb:value> arg-list" },
1358 { "value->bool", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_to_bool
),
1360 Return the Scheme boolean representing the GDB value.\n\
1361 The value must be \"integer like\". Pointers are ok." },
1363 { "value->integer", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_to_integer
),
1365 Return the Scheme integer representing the GDB value.\n\
1366 The value must be \"integer like\". Pointers are ok." },
1368 { "value->real", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_to_real
),
1370 Return the Scheme real number representing the GDB value.\n\
1371 The value must be a number." },
1373 { "value->bytevector", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_to_bytevector
),
1375 Return a Scheme bytevector with the raw contents of the GDB value.\n\
1376 No transformation, endian or otherwise, is performed." },
1378 { "value->string", 1, 0, 1, as_a_scm_t_subr (gdbscm_value_to_string
),
1380 Return the Unicode string of the value's contents.\n\
1381 If ENCODING is not given, the string is assumed to be encoded in\n\
1382 the target's charset.\n\
1383 An error setting \"error\" causes an exception to be thrown if there's\n\
1384 a decoding error. An error setting of \"substitute\" causes invalid\n\
1385 characters to be replaced with \"?\". The default is \"error\".\n\
1386 If LENGTH is provided, only fetch string to the length provided.\n\
1388 Arguments: <gdb:value>\n\
1389 [#:encoding encoding] [#:errors \"error\"|\"substitute\"]\n\
1390 [#:length length]" },
1392 { "value->lazy-string", 1, 0, 1,
1393 as_a_scm_t_subr (gdbscm_value_to_lazy_string
),
1395 Return a Scheme object representing a lazily fetched Unicode string\n\
1396 of the value's contents.\n\
1397 If ENCODING is not given, the string is assumed to be encoded in\n\
1398 the target's charset.\n\
1399 If LENGTH is provided, only fetch string to the length provided.\n\
1401 Arguments: <gdb:value> [#:encoding encoding] [#:length length]" },
1403 { "value-lazy?", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_lazy_p
),
1405 Return #t if the value is lazy (not fetched yet from the inferior).\n\
1406 A lazy value is fetched when needed, or when the value-fetch-lazy! function\n\
1409 { "make-lazy-value", 2, 0, 0, as_a_scm_t_subr (gdbscm_make_lazy_value
),
1411 Create a <gdb:value> that will be lazily fetched from the target.\n\
1413 Arguments: <gdb:type> address" },
1415 { "value-fetch-lazy!", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_fetch_lazy_x
),
1417 Fetch the value from the inferior, if it was lazy.\n\
1418 The result is \"unspecified\"." },
1420 { "value-print", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_print
),
1422 Return the string representation (print form) of the value." },
1424 { "parse-and-eval", 1, 0, 0, as_a_scm_t_subr (gdbscm_parse_and_eval
),
1426 Evaluates string in gdb and returns the result as a <gdb:value> object." },
1428 { "history-ref", 1, 0, 0, as_a_scm_t_subr (gdbscm_history_ref
),
1430 Return the specified value from GDB's value history." },
1432 { "history-append!", 1, 0, 0, as_a_scm_t_subr (gdbscm_history_append_x
),
1434 Append the specified value onto GDB's value history." },
1440 gdbscm_initialize_values (void)
1442 value_smob_tag
= gdbscm_make_smob_type (value_smob_name
,
1443 sizeof (value_smob
));
1444 scm_set_smob_free (value_smob_tag
, vlscm_free_value_smob
);
1445 scm_set_smob_print (value_smob_tag
, vlscm_print_value_smob
);
1446 scm_set_smob_equalp (value_smob_tag
, vlscm_equal_p_value_smob
);
1448 gdbscm_define_functions (value_functions
, 1);
1450 type_keyword
= scm_from_latin1_keyword ("type");
1451 encoding_keyword
= scm_from_latin1_keyword ("encoding");
1452 errors_keyword
= scm_from_latin1_keyword ("errors");
1453 length_keyword
= scm_from_latin1_keyword ("length");
1455 error_symbol
= scm_from_latin1_symbol ("error");
1456 escape_symbol
= scm_from_latin1_symbol ("escape");
1457 substitute_symbol
= scm_from_latin1_symbol ("substitute");