1 /* Scheme interface to values.
3 Copyright (C) 2008-2018 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_free (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
;
163 common_val_print (v_smob
->value
, &stb
, 0, &opts
, current_language
);
164 scm_puts (stb
.c_str (), port
);
166 CATCH (except
, RETURN_MASK_ALL
)
168 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
172 if (pstate
->writingp
)
173 scm_puts (">", port
);
175 scm_remember_upto_here_1 (self
);
177 /* Non-zero means success. */
181 /* The smob "equalp" function for <gdb:value>. */
184 vlscm_equal_p_value_smob (SCM v1
, SCM v2
)
186 const value_smob
*v1_smob
= (value_smob
*) SCM_SMOB_DATA (v1
);
187 const value_smob
*v2_smob
= (value_smob
*) SCM_SMOB_DATA (v2
);
192 result
= value_equal (v1_smob
->value
, v2_smob
->value
);
194 CATCH (except
, RETURN_MASK_ALL
)
196 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
200 return scm_from_bool (result
);
203 /* Low level routine to create a <gdb:value> object. */
206 vlscm_make_value_smob (void)
208 value_smob
*v_smob
= (value_smob
*)
209 scm_gc_malloc (sizeof (value_smob
), value_smob_name
);
212 /* These must be filled in by the caller. */
213 v_smob
->value
= NULL
;
217 /* These are lazily computed. */
218 v_smob
->address
= SCM_UNDEFINED
;
219 v_smob
->type
= SCM_UNDEFINED
;
220 v_smob
->dynamic_type
= SCM_UNDEFINED
;
222 v_scm
= scm_new_smob (value_smob_tag
, (scm_t_bits
) v_smob
);
223 gdbscm_init_gsmob (&v_smob
->base
);
228 /* Return non-zero if SCM is a <gdb:value> object. */
231 vlscm_is_value (SCM scm
)
233 return SCM_SMOB_PREDICATE (value_smob_tag
, scm
);
236 /* (value? object) -> boolean */
239 gdbscm_value_p (SCM scm
)
241 return scm_from_bool (vlscm_is_value (scm
));
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. */
249 vlscm_scm_from_value (struct value
*value
)
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
);
256 v_smob
->value
= value
;
257 release_value_or_incref (value
);
258 vlscm_remember_scheme_value (v_smob
);
263 /* Returns the <gdb:value> object in SELF.
264 Throws an exception if SELF is not a <gdb:value> object. */
267 vlscm_get_value_arg_unsafe (SCM self
, int arg_pos
, const char *func_name
)
269 SCM_ASSERT_TYPE (vlscm_is_value (self
), self
, arg_pos
, func_name
,
275 /* Returns a pointer to the value smob of SELF.
276 Throws an exception if SELF is not a <gdb:value> object. */
279 vlscm_get_value_smob_arg_unsafe (SCM self
, int arg_pos
, const char *func_name
)
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
);
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. */
291 vlscm_scm_to_value (SCM v_scm
)
295 gdb_assert (vlscm_is_value (v_scm
));
296 v_smob
= (value_smob
*) SCM_SMOB_DATA (v_scm
);
297 return v_smob
->value
;
302 /* (make-value x [#:type type]) -> <gdb:value> */
305 gdbscm_make_value (SCM x
, SCM rest
)
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
;
314 struct type
*type
= NULL
;
316 struct cleanup
*cleanups
;
318 gdbscm_parse_function_args (FUNC_NAME
, SCM_ARG2
, keywords
, "#O", rest
,
319 &type_arg_pos
, &type_scm
);
321 if (type_arg_pos
> 0)
323 t_smob
= tyscm_get_type_smob_arg_unsafe (type_scm
, type_arg_pos
,
325 type
= tyscm_type_smob_type (t_smob
);
328 cleanups
= make_cleanup_value_free_to_mark (value_mark ());
330 value
= vlscm_convert_typed_value_from_scheme (FUNC_NAME
, SCM_ARG1
, x
,
331 type_arg_pos
, type_scm
, type
,
336 do_cleanups (cleanups
);
337 gdbscm_throw (except_scm
);
340 result
= vlscm_scm_from_value (value
);
342 do_cleanups (cleanups
);
344 if (gdbscm_is_exception (result
))
345 gdbscm_throw (result
);
349 /* (make-lazy-value <gdb:type> address) -> <gdb:value> */
352 gdbscm_make_lazy_value (SCM type_scm
, SCM address_scm
)
357 struct value
*value
= NULL
;
359 struct cleanup
*cleanups
;
361 t_smob
= tyscm_get_type_smob_arg_unsafe (type_scm
, SCM_ARG1
, FUNC_NAME
);
362 type
= tyscm_type_smob_type (t_smob
);
364 gdbscm_parse_function_args (FUNC_NAME
, SCM_ARG2
, NULL
, "U",
365 address_scm
, &address
);
367 cleanups
= make_cleanup_value_free_to_mark (value_mark ());
369 /* There's no (current) need to wrap this in a TRY_CATCH, but for consistency
370 and future-proofing we do. */
373 value
= value_from_contents_and_address (type
, NULL
, address
);
375 CATCH (except
, RETURN_MASK_ALL
)
377 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except
, cleanups
);
381 result
= vlscm_scm_from_value (value
);
383 do_cleanups (cleanups
);
385 if (gdbscm_is_exception (result
))
386 gdbscm_throw (result
);
390 /* (value-optimized-out? <gdb:value>) -> boolean */
393 gdbscm_value_optimized_out_p (SCM self
)
396 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
397 struct value
*value
= v_smob
->value
;
402 opt
= value_optimized_out (value
);
404 CATCH (except
, RETURN_MASK_ALL
)
406 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
410 return scm_from_bool (opt
);
413 /* (value-address <gdb:value>) -> integer
414 Returns #f if the value doesn't have one. */
417 gdbscm_value_address (SCM self
)
420 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
421 struct value
*value
= v_smob
->value
;
423 if (SCM_UNBNDP (v_smob
->address
))
425 struct cleanup
*cleanup
426 = make_cleanup_value_free_to_mark (value_mark ());
427 SCM address
= SCM_BOOL_F
;
431 address
= vlscm_scm_from_value (value_addr (value
));
433 CATCH (except
, RETURN_MASK_ALL
)
438 do_cleanups (cleanup
);
440 if (gdbscm_is_exception (address
))
441 gdbscm_throw (address
);
443 v_smob
->address
= address
;
446 return v_smob
->address
;
449 /* (value-dereference <gdb:value>) -> <gdb:value>
450 Given a value of a pointer type, apply the C unary * operator to it. */
453 gdbscm_value_dereference (SCM self
)
456 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
457 struct value
*value
= v_smob
->value
;
459 struct value
*res_val
= NULL
;
460 struct cleanup
*cleanups
;
462 cleanups
= make_cleanup_value_free_to_mark (value_mark ());
466 res_val
= value_ind (value
);
468 CATCH (except
, RETURN_MASK_ALL
)
470 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except
, cleanups
);
474 result
= vlscm_scm_from_value (res_val
);
476 do_cleanups (cleanups
);
478 if (gdbscm_is_exception (result
))
479 gdbscm_throw (result
);
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 *'. */
494 gdbscm_value_referenced_value (SCM self
)
497 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
498 struct value
*value
= v_smob
->value
;
500 struct value
*res_val
= NULL
;
501 struct cleanup
*cleanups
;
503 cleanups
= make_cleanup_value_free_to_mark (value_mark ());
507 switch (TYPE_CODE (check_typedef (value_type (value
))))
510 res_val
= value_ind (value
);
513 res_val
= coerce_ref (value
);
516 error (_("Trying to get the referenced value from a value which is"
517 " neither a pointer nor a reference"));
520 CATCH (except
, RETURN_MASK_ALL
)
522 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except
, cleanups
);
526 result
= vlscm_scm_from_value (res_val
);
528 do_cleanups (cleanups
);
530 if (gdbscm_is_exception (result
))
531 gdbscm_throw (result
);
536 /* (value-type <gdb:value>) -> <gdb:type> */
539 gdbscm_value_type (SCM self
)
542 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
543 struct value
*value
= v_smob
->value
;
545 if (SCM_UNBNDP (v_smob
->type
))
546 v_smob
->type
= tyscm_scm_from_type (value_type (value
));
551 /* (value-dynamic-type <gdb:value>) -> <gdb:type> */
554 gdbscm_value_dynamic_type (SCM self
)
557 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
558 struct value
*value
= v_smob
->value
;
559 struct type
*type
= NULL
;
561 if (! SCM_UNBNDP (v_smob
->dynamic_type
))
562 return v_smob
->dynamic_type
;
566 struct cleanup
*cleanup
567 = make_cleanup_value_free_to_mark (value_mark ());
569 type
= value_type (value
);
570 type
= check_typedef (type
);
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
))
576 struct value
*target
;
577 int was_pointer
= TYPE_CODE (type
) == TYPE_CODE_PTR
;
580 target
= value_ind (value
);
582 target
= coerce_ref (value
);
583 type
= value_rtti_type (target
, NULL
, NULL
, NULL
);
588 type
= lookup_pointer_type (type
);
590 type
= lookup_lvalue_reference_type (type
);
593 else if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
594 type
= value_rtti_type (value
, NULL
, NULL
, NULL
);
597 /* Re-use object's static type. */
601 do_cleanups (cleanup
);
603 CATCH (except
, RETURN_MASK_ALL
)
605 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
610 v_smob
->dynamic_type
= gdbscm_value_type (self
);
612 v_smob
->dynamic_type
= tyscm_scm_from_type (type
);
614 return v_smob
->dynamic_type
;
617 /* A helper function that implements the various cast operators. */
620 vlscm_do_cast (SCM self
, SCM type_scm
, enum exp_opcode op
,
621 const char *func_name
)
624 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
625 struct value
*value
= v_smob
->value
;
627 = tyscm_get_type_smob_arg_unsafe (type_scm
, SCM_ARG2
, FUNC_NAME
);
628 struct type
*type
= tyscm_type_smob_type (t_smob
);
630 struct value
*res_val
= NULL
;
631 struct cleanup
*cleanups
;
633 cleanups
= make_cleanup_value_free_to_mark (value_mark ());
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
);
643 gdb_assert (op
== UNOP_CAST
);
644 res_val
= value_cast (type
, value
);
647 CATCH (except
, RETURN_MASK_ALL
)
649 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except
, cleanups
);
653 gdb_assert (res_val
!= NULL
);
654 result
= vlscm_scm_from_value (res_val
);
656 do_cleanups (cleanups
);
658 if (gdbscm_is_exception (result
))
659 gdbscm_throw (result
);
664 /* (value-cast <gdb:value> <gdb:type>) -> <gdb:value> */
667 gdbscm_value_cast (SCM self
, SCM new_type
)
669 return vlscm_do_cast (self
, new_type
, UNOP_CAST
, FUNC_NAME
);
672 /* (value-dynamic-cast <gdb:value> <gdb:type>) -> <gdb:value> */
675 gdbscm_value_dynamic_cast (SCM self
, SCM new_type
)
677 return vlscm_do_cast (self
, new_type
, UNOP_DYNAMIC_CAST
, FUNC_NAME
);
680 /* (value-reinterpret-cast <gdb:value> <gdb:type>) -> <gdb:value> */
683 gdbscm_value_reinterpret_cast (SCM self
, SCM new_type
)
685 return vlscm_do_cast (self
, new_type
, UNOP_REINTERPRET_CAST
, FUNC_NAME
);
688 /* (value-field <gdb:value> string) -> <gdb:value>
689 Given string name of an element inside structure, return its <gdb:value>
693 gdbscm_value_field (SCM self
, SCM field_scm
)
696 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
697 struct value
*value
= v_smob
->value
;
699 struct value
*res_val
= NULL
;
701 struct cleanup
*cleanups
;
703 SCM_ASSERT_TYPE (scm_is_string (field_scm
), field_scm
, SCM_ARG2
, FUNC_NAME
,
706 cleanups
= make_cleanup_value_free_to_mark (value_mark ());
708 field
= gdbscm_scm_to_c_string (field_scm
);
709 make_cleanup (xfree
, field
);
713 struct value
*tmp
= value
;
715 res_val
= value_struct_elt (&tmp
, NULL
, field
, NULL
,
716 "struct/class/union");
718 CATCH (except
, RETURN_MASK_ALL
)
720 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except
, cleanups
);
724 gdb_assert (res_val
!= NULL
);
725 result
= vlscm_scm_from_value (res_val
);
727 do_cleanups (cleanups
);
729 if (gdbscm_is_exception (result
))
730 gdbscm_throw (result
);
735 /* (value-subscript <gdb:value> integer|<gdb:value>) -> <gdb:value>
736 Return the specified value in an array. */
739 gdbscm_value_subscript (SCM self
, SCM index_scm
)
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
;
751 /* The sequencing here, as everywhere else, is important.
752 We can't have existing cleanups when a Scheme exception is thrown. */
754 SCM_ASSERT (type
!= NULL
, self
, SCM_ARG2
, FUNC_NAME
);
755 gdbarch
= get_type_arch (type
);
757 cleanups
= make_cleanup_value_free_to_mark (value_mark ());
759 index
= vlscm_convert_value_from_scheme (FUNC_NAME
, SCM_ARG2
, index_scm
,
761 gdbarch
, current_language
);
764 do_cleanups (cleanups
);
765 gdbscm_throw (except_scm
);
770 struct value
*tmp
= value
;
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
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"));
782 res_val
= value_subscript (tmp
, value_as_long (index
));
784 CATCH (except
, RETURN_MASK_ALL
)
786 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except
, cleanups
);
790 gdb_assert (res_val
!= NULL
);
791 result
= vlscm_scm_from_value (res_val
);
793 do_cleanups (cleanups
);
795 if (gdbscm_is_exception (result
))
796 gdbscm_throw (result
);
801 /* (value-call <gdb:value> arg-list) -> <gdb:value>
802 Perform an inferior function call on the value. */
805 gdbscm_value_call (SCM self
, SCM args
)
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
;
813 struct value
**vargs
= NULL
;
814 SCM result
= SCM_BOOL_F
;
818 ftype
= check_typedef (value_type (function
));
820 CATCH (except
, RETURN_MASK_ALL
)
822 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
826 SCM_ASSERT_TYPE (TYPE_CODE (ftype
) == TYPE_CODE_FUNC
, self
,
828 _("function (value of TYPE_CODE_FUNC)"));
830 SCM_ASSERT_TYPE (gdbscm_is_true (scm_list_p (args
)), args
,
831 SCM_ARG2
, FUNC_NAME
, _("list"));
833 args_count
= scm_ilength (args
);
836 struct gdbarch
*gdbarch
= get_current_arch ();
837 const struct language_defn
*language
= current_language
;
841 vargs
= XALLOCAVEC (struct value
*, args_count
);
842 for (i
= 0; i
< args_count
; i
++)
844 SCM arg
= scm_car (args
);
846 vargs
[i
] = vlscm_convert_value_from_scheme (FUNC_NAME
,
847 GDBSCM_ARG_NONE
, arg
,
850 if (vargs
[i
] == NULL
)
851 gdbscm_throw (except_scm
);
853 args
= scm_cdr (args
);
855 gdb_assert (gdbscm_is_true (scm_null_p (args
)));
860 struct cleanup
*cleanup
= make_cleanup_value_free_to_mark (mark
);
861 struct value
*return_value
;
863 return_value
= call_function_by_hand (function
, NULL
, args_count
, vargs
);
864 result
= vlscm_scm_from_value (return_value
);
865 do_cleanups (cleanup
);
867 CATCH (except
, RETURN_MASK_ALL
)
869 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
873 if (gdbscm_is_exception (result
))
874 gdbscm_throw (result
);
879 /* (value->bytevector <gdb:value>) -> bytevector */
882 gdbscm_value_to_bytevector (SCM self
)
885 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
886 struct value
*value
= v_smob
->value
;
889 const gdb_byte
*contents
= NULL
;
892 type
= value_type (value
);
896 type
= check_typedef (type
);
897 length
= TYPE_LENGTH (type
);
898 contents
= value_contents (value
);
900 CATCH (except
, RETURN_MASK_ALL
)
902 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
906 bv
= scm_c_make_bytevector (length
);
907 memcpy (SCM_BYTEVECTOR_CONTENTS (bv
), contents
, length
);
912 /* Helper function to determine if a type is "int-like". */
915 is_intlike (struct type
*type
, int ptr_ok
)
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
));
924 /* (value->bool <gdb:value>) -> boolean
925 Throws an error if the value is not integer-like. */
928 gdbscm_value_to_bool (SCM self
)
931 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
932 struct value
*value
= v_smob
->value
;
936 type
= value_type (value
);
940 type
= check_typedef (type
);
942 CATCH (except
, RETURN_MASK_ALL
)
944 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
948 SCM_ASSERT_TYPE (is_intlike (type
, 1), self
, SCM_ARG1
, FUNC_NAME
,
949 _("integer-like gdb value"));
953 if (TYPE_CODE (type
) == TYPE_CODE_PTR
)
954 l
= value_as_address (value
);
956 l
= value_as_long (value
);
958 CATCH (except
, RETURN_MASK_ALL
)
960 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
964 return scm_from_bool (l
!= 0);
967 /* (value->integer <gdb:value>) -> integer
968 Throws an error if the value is not integer-like. */
971 gdbscm_value_to_integer (SCM self
)
974 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
975 struct value
*value
= v_smob
->value
;
979 type
= value_type (value
);
983 type
= check_typedef (type
);
985 CATCH (except
, RETURN_MASK_ALL
)
987 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
991 SCM_ASSERT_TYPE (is_intlike (type
, 1), self
, SCM_ARG1
, FUNC_NAME
,
992 _("integer-like gdb value"));
996 if (TYPE_CODE (type
) == TYPE_CODE_PTR
)
997 l
= value_as_address (value
);
999 l
= value_as_long (value
);
1001 CATCH (except
, RETURN_MASK_ALL
)
1003 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
1007 if (TYPE_UNSIGNED (type
))
1008 return gdbscm_scm_from_ulongest (l
);
1010 return gdbscm_scm_from_longest (l
);
1013 /* (value->real <gdb:value>) -> real
1014 Throws an error if the value is not a number. */
1017 gdbscm_value_to_real (SCM self
)
1020 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
1021 struct value
*value
= v_smob
->value
;
1024 struct value
*check
= nullptr;
1026 type
= value_type (value
);
1030 type
= check_typedef (type
);
1032 CATCH (except
, RETURN_MASK_ALL
)
1034 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
1038 SCM_ASSERT_TYPE (is_intlike (type
, 0) || TYPE_CODE (type
) == TYPE_CODE_FLT
,
1039 self
, SCM_ARG1
, FUNC_NAME
, _("number"));
1043 if (is_floating_value (value
))
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
);
1049 else if (TYPE_UNSIGNED (type
))
1051 d
= (ULONGEST
) value_as_long (value
);
1052 check
= value_from_ulongest (type
, (ULONGEST
) d
);
1056 d
= value_as_long (value
);
1057 check
= value_from_longest (type
, (LONGEST
) d
);
1060 CATCH (except
, RETURN_MASK_ALL
)
1062 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
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"));
1071 return scm_from_double (d
);
1074 /* (value->string <gdb:value>
1075 [#:encoding encoding]
1076 [#:errors #f | 'error | 'substitute]
1079 Return Unicode string with value's contents, which must be a string.
1081 If ENCODING is not given, the string is assumed to be encoded in
1082 the target's charset.
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 "?".
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. */
1098 gdbscm_value_to_string (SCM self
, SCM rest
)
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
1106 int encoding_arg_pos
= -1, errors_arg_pos
= -1, length_arg_pos
= -1;
1107 char *encoding
= NULL
;
1108 SCM errors
= SCM_BOOL_F
;
1110 gdb_byte
*buffer
= NULL
;
1111 const char *la_encoding
= NULL
;
1112 struct type
*char_type
= NULL
;
1114 struct cleanup
*cleanups
;
1116 /* The sequencing here, as everywhere else, is important.
1117 We can't have existing cleanups when a Scheme exception is thrown. */
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
);
1124 cleanups
= make_cleanup (xfree
, encoding
);
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
))
1132 = gdbscm_make_out_of_range_error (FUNC_NAME
, errors_arg_pos
, errors
,
1133 _("invalid error kind"));
1135 do_cleanups (cleanups
);
1136 gdbscm_throw (excp
);
1138 if (errors
== SCM_BOOL_F
)
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
);
1145 errors
= error_symbol
;
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. */
1152 LA_GET_STRING (value
, &buffer
, &length
, &char_type
, &la_encoding
);
1154 CATCH (except
, RETURN_MASK_ALL
)
1156 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except
, cleanups
);
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
);
1164 scm_dynwind_begin ((scm_t_dynwind_flags
) 0);
1166 gdbscm_dynwind_xfree (encoding
);
1167 gdbscm_dynwind_xfree (buffer
);
1169 result
= scm_from_stringn ((const char *) buffer
,
1170 length
* TYPE_LENGTH (char_type
),
1171 (encoding
!= NULL
&& *encoding
!= '\0'
1174 scm_is_eq (errors
, error_symbol
)
1175 ? SCM_FAILED_CONVERSION_ERROR
1176 : SCM_FAILED_CONVERSION_QUESTION_MARK
);
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
1192 LENGTH must be a Scheme integer, it can't be a <gdb:value> integer. */
1195 gdbscm_value_to_lazy_string (SCM self
, SCM rest
)
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
;
1204 SCM result
= SCM_BOOL_F
; /* -Wall */
1205 struct cleanup
*cleanups
;
1206 struct gdb_exception except
= exception_none
;
1208 /* The sequencing here, as everywhere else, is important.
1209 We can't have existing cleanups when a Scheme exception is thrown. */
1211 gdbscm_parse_function_args (FUNC_NAME
, SCM_ARG2
, keywords
, "#si", rest
,
1212 &encoding_arg_pos
, &encoding
,
1213 &length_arg_pos
, &length
);
1217 gdbscm_out_of_range_error (FUNC_NAME
, length_arg_pos
,
1218 scm_from_int (length
),
1219 _("invalid length"));
1222 cleanups
= make_cleanup (xfree
, encoding
);
1226 struct cleanup
*inner_cleanup
1227 = make_cleanup_value_free_to_mark (value_mark ());
1228 struct type
*type
, *realtype
;
1231 type
= value_type (value
);
1232 realtype
= check_typedef (type
);
1234 switch (TYPE_CODE (realtype
))
1236 case TYPE_CODE_ARRAY
:
1238 LONGEST array_length
= -1;
1239 LONGEST low_bound
, high_bound
;
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;
1247 length
= array_length
;
1248 else if (array_length
== -1)
1250 type
= lookup_array_range_type (TYPE_TARGET_TYPE (realtype
),
1253 else if (length
!= array_length
)
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
),
1261 low_bound
+ length
- 1);
1263 addr
= value_address (value
);
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
);
1272 /* Should flag an error here. PR 20769. */
1273 addr
= value_address (value
);
1277 result
= lsscm_make_lazy_string (addr
, length
, encoding
, type
);
1279 do_cleanups (inner_cleanup
);
1281 CATCH (ex
, RETURN_MASK_ALL
)
1287 do_cleanups (cleanups
);
1288 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
1290 if (gdbscm_is_exception (result
))
1291 gdbscm_throw (result
);
1296 /* (value-lazy? <gdb:value>) -> boolean */
1299 gdbscm_value_lazy_p (SCM self
)
1302 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
1303 struct value
*value
= v_smob
->value
;
1305 return scm_from_bool (value_lazy (value
));
1308 /* (value-fetch-lazy! <gdb:value>) -> unspecified */
1311 gdbscm_value_fetch_lazy_x (SCM self
)
1314 = vlscm_get_value_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
1315 struct value
*value
= v_smob
->value
;
1319 if (value_lazy (value
))
1320 value_fetch_lazy (value
);
1322 CATCH (except
, RETURN_MASK_ALL
)
1324 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
1328 return SCM_UNSPECIFIED
;
1331 /* (value-print <gdb:value>) -> string */
1334 gdbscm_value_print (SCM self
)
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
;
1341 get_user_print_options (&opts
);
1348 common_val_print (value
, &stb
, 0, &opts
, current_language
);
1350 CATCH (except
, RETURN_MASK_ALL
)
1352 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
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
);
1365 /* (parse-and-eval string) -> <gdb:value>
1366 Parse a string and evaluate the string as an expression. */
1369 gdbscm_parse_and_eval (SCM expr_scm
)
1372 struct value
*res_val
= NULL
;
1374 struct cleanup
*cleanups
;
1376 /* The sequencing here, as everywhere else, is important.
1377 We can't have existing cleanups when a Scheme exception is thrown. */
1379 gdbscm_parse_function_args (FUNC_NAME
, SCM_ARG1
, NULL
, "s",
1380 expr_scm
, &expr_str
);
1382 cleanups
= make_cleanup_value_free_to_mark (value_mark ());
1383 make_cleanup (xfree
, expr_str
);
1387 res_val
= parse_and_eval (expr_str
);
1389 CATCH (except
, RETURN_MASK_ALL
)
1391 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except
, cleanups
);
1395 gdb_assert (res_val
!= NULL
);
1396 result
= vlscm_scm_from_value (res_val
);
1398 do_cleanups (cleanups
);
1400 if (gdbscm_is_exception (result
))
1401 gdbscm_throw (result
);
1406 /* (history-ref integer) -> <gdb:value>
1407 Return the specified value from GDB's value history. */
1410 gdbscm_history_ref (SCM index
)
1413 struct value
*res_val
= NULL
; /* Initialize to appease gcc warning. */
1415 gdbscm_parse_function_args (FUNC_NAME
, SCM_ARG1
, NULL
, "i", index
, &i
);
1419 res_val
= access_value_history (i
);
1421 CATCH (except
, RETURN_MASK_ALL
)
1423 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
1427 return vlscm_scm_from_value (res_val
);
1430 /* (history-append! <gdb:value>) -> index
1431 Append VALUE to GDB's value history. Return its index in the history. */
1434 gdbscm_history_append_x (SCM value
)
1440 v_smob
= vlscm_get_value_smob_arg_unsafe (value
, SCM_ARG1
, FUNC_NAME
);
1445 res_index
= record_latest_value (v
);
1447 CATCH (except
, RETURN_MASK_ALL
)
1449 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
1453 return scm_from_int (res_index
);
1456 /* Initialize the Scheme value code. */
1458 static const scheme_function value_functions
[] =
1460 { "value?", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_p
),
1462 Return #t if the object is a <gdb:value> object." },
1464 { "make-value", 1, 0, 1, as_a_scm_t_subr (gdbscm_make_value
),
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\
1470 Arguments: object [#:type <gdb:type>]" },
1472 { "value-optimized-out?", 1, 0, 0,
1473 as_a_scm_t_subr (gdbscm_value_optimized_out_p
),
1475 Return #t if the value has been optimizd out." },
1477 { "value-address", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_address
),
1479 Return the address of the value." },
1481 { "value-type", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_type
),
1483 Return the type of the value." },
1485 { "value-dynamic-type", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_dynamic_type
),
1487 Return the dynamic type of the value." },
1489 { "value-cast", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_cast
),
1491 Cast the value to the supplied type.\n\
1493 Arguments: <gdb:value> <gdb:type>" },
1495 { "value-dynamic-cast", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_dynamic_cast
),
1497 Cast the value to the supplied type, as if by the C++\n\
1498 dynamic_cast operator.\n\
1500 Arguments: <gdb:value> <gdb:type>" },
1502 { "value-reinterpret-cast", 2, 0, 0,
1503 as_a_scm_t_subr (gdbscm_value_reinterpret_cast
),
1505 Cast the value to the supplied type, as if by the C++\n\
1506 reinterpret_cast operator.\n\
1508 Arguments: <gdb:value> <gdb:type>" },
1510 { "value-dereference", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_dereference
),
1512 Return the result of applying the C unary * operator to the value." },
1514 { "value-referenced-value", 1, 0, 0,
1515 as_a_scm_t_subr (gdbscm_value_referenced_value
),
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 *'." },
1525 { "value-field", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_field
),
1527 Return the specified field of the value.\n\
1529 Arguments: <gdb:value> string" },
1531 { "value-subscript", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_subscript
),
1533 Return the value of the array at the specified index.\n\
1535 Arguments: <gdb:value> integer" },
1537 { "value-call", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_call
),
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\
1545 Arguments: <gdb:value> arg-list" },
1547 { "value->bool", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_to_bool
),
1549 Return the Scheme boolean representing the GDB value.\n\
1550 The value must be \"integer like\". Pointers are ok." },
1552 { "value->integer", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_to_integer
),
1554 Return the Scheme integer representing the GDB value.\n\
1555 The value must be \"integer like\". Pointers are ok." },
1557 { "value->real", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_to_real
),
1559 Return the Scheme real number representing the GDB value.\n\
1560 The value must be a number." },
1562 { "value->bytevector", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_to_bytevector
),
1564 Return a Scheme bytevector with the raw contents of the GDB value.\n\
1565 No transformation, endian or otherwise, is performed." },
1567 { "value->string", 1, 0, 1, as_a_scm_t_subr (gdbscm_value_to_string
),
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\
1577 Arguments: <gdb:value>\n\
1578 [#:encoding encoding] [#:errors \"error\"|\"substitute\"]\n\
1579 [#:length length]" },
1581 { "value->lazy-string", 1, 0, 1,
1582 as_a_scm_t_subr (gdbscm_value_to_lazy_string
),
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\
1590 Arguments: <gdb:value> [#:encoding encoding] [#:length length]" },
1592 { "value-lazy?", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_lazy_p
),
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\
1598 { "make-lazy-value", 2, 0, 0, as_a_scm_t_subr (gdbscm_make_lazy_value
),
1600 Create a <gdb:value> that will be lazily fetched from the target.\n\
1602 Arguments: <gdb:type> address" },
1604 { "value-fetch-lazy!", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_fetch_lazy_x
),
1606 Fetch the value from the inferior, if it was lazy.\n\
1607 The result is \"unspecified\"." },
1609 { "value-print", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_print
),
1611 Return the string representation (print form) of the value." },
1613 { "parse-and-eval", 1, 0, 0, as_a_scm_t_subr (gdbscm_parse_and_eval
),
1615 Evaluates string in gdb and returns the result as a <gdb:value> object." },
1617 { "history-ref", 1, 0, 0, as_a_scm_t_subr (gdbscm_history_ref
),
1619 Return the specified value from GDB's value history." },
1621 { "history-append!", 1, 0, 0, as_a_scm_t_subr (gdbscm_history_append_x
),
1623 Append the specified value onto GDB's value history." },
1629 gdbscm_initialize_values (void)
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
);
1637 gdbscm_define_functions (value_functions
, 1);
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");
1644 error_symbol
= scm_from_latin1_symbol ("error");
1645 escape_symbol
= scm_from_latin1_symbol ("escape");
1646 substitute_symbol
= scm_from_latin1_symbol ("substitute");