1 /* Scheme interface to values. 2 3 Copyright (C) 2008-2019 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 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 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 const SCM keywords[] = { type_keyword, SCM_BOOL_F }; 307 308 int type_arg_pos = -1; 309 SCM type_scm = SCM_UNDEFINED; 310 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG2, keywords, "#O", rest, 311 &type_arg_pos, &type_scm); 312 313 struct type *type = NULL; 314 if (type_arg_pos > 0) 315 { 316 type_smob *t_smob = tyscm_get_type_smob_arg_unsafe (type_scm, 317 type_arg_pos, 318 FUNC_NAME); 319 type = tyscm_type_smob_type (t_smob); 320 } 321 322 return gdbscm_wrap ([=] 323 { 324 scoped_value_mark free_values; 325 326 SCM except_scm; 327 struct value *value 328 = vlscm_convert_typed_value_from_scheme (FUNC_NAME, SCM_ARG1, x, 329 type_arg_pos, type_scm, type, 330 &except_scm, 331 get_current_arch (), 332 current_language); 333 if (value == NULL) 334 return except_scm; 335 336 return vlscm_scm_from_value (value); 337 }); 338 } 339 340 /* (make-lazy-value <gdb:type> address) -> <gdb:value> */ 341 342 static SCM 343 gdbscm_make_lazy_value (SCM type_scm, SCM address_scm) 344 { 345 type_smob *t_smob = tyscm_get_type_smob_arg_unsafe (type_scm, 346 SCM_ARG1, FUNC_NAME); 347 struct type *type = tyscm_type_smob_type (t_smob); 348 349 ULONGEST address; 350 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG2, NULL, "U", 351 address_scm, &address); 352 353 return gdbscm_wrap ([=] 354 { 355 scoped_value_mark free_values; 356 357 struct value *value = value_from_contents_and_address (type, NULL, 358 address); 359 return vlscm_scm_from_value (value); 360 }); 361 } 362 363 /* (value-optimized-out? <gdb:value>) -> boolean */ 364 365 static SCM 366 gdbscm_value_optimized_out_p (SCM self) 367 { 368 value_smob *v_smob 369 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 370 371 return gdbscm_wrap ([=] 372 { 373 return scm_from_bool (value_optimized_out (v_smob->value)); 374 }); 375 } 376 377 /* (value-address <gdb:value>) -> integer 378 Returns #f if the value doesn't have one. */ 379 380 static SCM 381 gdbscm_value_address (SCM self) 382 { 383 value_smob *v_smob 384 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 385 struct value *value = v_smob->value; 386 387 return gdbscm_wrap ([=] 388 { 389 if (SCM_UNBNDP (v_smob->address)) 390 { 391 scoped_value_mark free_values; 392 393 SCM address = SCM_BOOL_F; 394 395 TRY 396 { 397 address = vlscm_scm_from_value (value_addr (value)); 398 } 399 CATCH (except, RETURN_MASK_ALL) 400 { 401 } 402 END_CATCH 403 404 if (gdbscm_is_exception (address)) 405 return address; 406 407 v_smob->address = address; 408 } 409 410 return v_smob->address; 411 }); 412 } 413 414 /* (value-dereference <gdb:value>) -> <gdb:value> 415 Given a value of a pointer type, apply the C unary * operator to it. */ 416 417 static SCM 418 gdbscm_value_dereference (SCM self) 419 { 420 value_smob *v_smob 421 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 422 423 return gdbscm_wrap ([=] 424 { 425 scoped_value_mark free_values; 426 427 struct value *res_val = value_ind (v_smob->value); 428 return vlscm_scm_from_value (res_val); 429 }); 430 } 431 432 /* (value-referenced-value <gdb:value>) -> <gdb:value> 433 Given a value of a reference type, return the value referenced. 434 The difference between this function and gdbscm_value_dereference is that 435 the latter applies * unary operator to a value, which need not always 436 result in the value referenced. 437 For example, for a value which is a reference to an 'int' pointer ('int *'), 438 gdbscm_value_dereference will result in a value of type 'int' while 439 gdbscm_value_referenced_value will result in a value of type 'int *'. */ 440 441 static SCM 442 gdbscm_value_referenced_value (SCM self) 443 { 444 value_smob *v_smob 445 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 446 struct value *value = v_smob->value; 447 448 return gdbscm_wrap ([=] 449 { 450 scoped_value_mark free_values; 451 452 struct value *res_val; 453 454 switch (TYPE_CODE (check_typedef (value_type (value)))) 455 { 456 case TYPE_CODE_PTR: 457 res_val = value_ind (value); 458 break; 459 case TYPE_CODE_REF: 460 res_val = coerce_ref (value); 461 break; 462 default: 463 error (_("Trying to get the referenced value from a value which is" 464 " neither a pointer nor a reference")); 465 } 466 467 return vlscm_scm_from_value (res_val); 468 }); 469 } 470 471 /* (value-type <gdb:value>) -> <gdb:type> */ 472 473 static SCM 474 gdbscm_value_type (SCM self) 475 { 476 value_smob *v_smob 477 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 478 struct value *value = v_smob->value; 479 480 if (SCM_UNBNDP (v_smob->type)) 481 v_smob->type = tyscm_scm_from_type (value_type (value)); 482 483 return v_smob->type; 484 } 485 486 /* (value-dynamic-type <gdb:value>) -> <gdb:type> */ 487 488 static SCM 489 gdbscm_value_dynamic_type (SCM self) 490 { 491 value_smob *v_smob 492 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 493 struct value *value = v_smob->value; 494 struct type *type = NULL; 495 496 if (! SCM_UNBNDP (v_smob->dynamic_type)) 497 return v_smob->dynamic_type; 498 499 TRY 500 { 501 scoped_value_mark free_values; 502 503 type = value_type (value); 504 type = check_typedef (type); 505 506 if (((TYPE_CODE (type) == TYPE_CODE_PTR) 507 || (TYPE_CODE (type) == TYPE_CODE_REF)) 508 && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRUCT)) 509 { 510 struct value *target; 511 int was_pointer = TYPE_CODE (type) == TYPE_CODE_PTR; 512 513 if (was_pointer) 514 target = value_ind (value); 515 else 516 target = coerce_ref (value); 517 type = value_rtti_type (target, NULL, NULL, NULL); 518 519 if (type) 520 { 521 if (was_pointer) 522 type = lookup_pointer_type (type); 523 else 524 type = lookup_lvalue_reference_type (type); 525 } 526 } 527 else if (TYPE_CODE (type) == TYPE_CODE_STRUCT) 528 type = value_rtti_type (value, NULL, NULL, NULL); 529 else 530 { 531 /* Re-use object's static type. */ 532 type = NULL; 533 } 534 } 535 CATCH (except, RETURN_MASK_ALL) 536 { 537 GDBSCM_HANDLE_GDB_EXCEPTION (except); 538 } 539 END_CATCH 540 541 if (type == NULL) 542 v_smob->dynamic_type = gdbscm_value_type (self); 543 else 544 v_smob->dynamic_type = tyscm_scm_from_type (type); 545 546 return v_smob->dynamic_type; 547 } 548 549 /* A helper function that implements the various cast operators. */ 550 551 static SCM 552 vlscm_do_cast (SCM self, SCM type_scm, enum exp_opcode op, 553 const char *func_name) 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 type_smob *t_smob 559 = tyscm_get_type_smob_arg_unsafe (type_scm, SCM_ARG2, FUNC_NAME); 560 struct type *type = tyscm_type_smob_type (t_smob); 561 562 return gdbscm_wrap ([=] 563 { 564 scoped_value_mark free_values; 565 566 struct value *res_val; 567 if (op == UNOP_DYNAMIC_CAST) 568 res_val = value_dynamic_cast (type, value); 569 else if (op == UNOP_REINTERPRET_CAST) 570 res_val = value_reinterpret_cast (type, value); 571 else 572 { 573 gdb_assert (op == UNOP_CAST); 574 res_val = value_cast (type, value); 575 } 576 577 return vlscm_scm_from_value (res_val); 578 }); 579 } 580 581 /* (value-cast <gdb:value> <gdb:type>) -> <gdb:value> */ 582 583 static SCM 584 gdbscm_value_cast (SCM self, SCM new_type) 585 { 586 return vlscm_do_cast (self, new_type, UNOP_CAST, FUNC_NAME); 587 } 588 589 /* (value-dynamic-cast <gdb:value> <gdb:type>) -> <gdb:value> */ 590 591 static SCM 592 gdbscm_value_dynamic_cast (SCM self, SCM new_type) 593 { 594 return vlscm_do_cast (self, new_type, UNOP_DYNAMIC_CAST, FUNC_NAME); 595 } 596 597 /* (value-reinterpret-cast <gdb:value> <gdb:type>) -> <gdb:value> */ 598 599 static SCM 600 gdbscm_value_reinterpret_cast (SCM self, SCM new_type) 601 { 602 return vlscm_do_cast (self, new_type, UNOP_REINTERPRET_CAST, FUNC_NAME); 603 } 604 605 /* (value-field <gdb:value> string) -> <gdb:value> 606 Given string name of an element inside structure, return its <gdb:value> 607 object. */ 608 609 static SCM 610 gdbscm_value_field (SCM self, SCM field_scm) 611 { 612 value_smob *v_smob 613 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 614 615 SCM_ASSERT_TYPE (scm_is_string (field_scm), field_scm, SCM_ARG2, FUNC_NAME, 616 _("string")); 617 618 return gdbscm_wrap ([=] 619 { 620 scoped_value_mark free_values; 621 622 gdb::unique_xmalloc_ptr<char> field = gdbscm_scm_to_c_string (field_scm); 623 624 struct value *tmp = v_smob->value; 625 626 struct value *res_val = value_struct_elt (&tmp, NULL, field.get (), NULL, 627 "struct/class/union"); 628 629 return vlscm_scm_from_value (res_val); 630 }); 631 } 632 633 /* (value-subscript <gdb:value> integer|<gdb:value>) -> <gdb:value> 634 Return the specified value in an array. */ 635 636 static SCM 637 gdbscm_value_subscript (SCM self, SCM index_scm) 638 { 639 value_smob *v_smob 640 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 641 struct value *value = v_smob->value; 642 struct type *type = value_type (value); 643 644 SCM_ASSERT (type != NULL, self, SCM_ARG2, FUNC_NAME); 645 646 return gdbscm_wrap ([=] 647 { 648 scoped_value_mark free_values; 649 650 SCM except_scm; 651 struct value *index 652 = vlscm_convert_value_from_scheme (FUNC_NAME, SCM_ARG2, index_scm, 653 &except_scm, 654 get_type_arch (type), 655 current_language); 656 if (index == NULL) 657 return except_scm; 658 659 /* Assume we are attempting an array access, and let the value code 660 throw an exception if the index has an invalid type. 661 Check the value's type is something that can be accessed via 662 a subscript. */ 663 struct value *tmp = coerce_ref (value); 664 struct type *tmp_type = check_typedef (value_type (tmp)); 665 if (TYPE_CODE (tmp_type) != TYPE_CODE_ARRAY 666 && TYPE_CODE (tmp_type) != TYPE_CODE_PTR) 667 error (_("Cannot subscript requested type")); 668 669 struct value *res_val = value_subscript (tmp, value_as_long (index)); 670 return vlscm_scm_from_value (res_val); 671 }); 672 } 673 674 /* (value-call <gdb:value> arg-list) -> <gdb:value> 675 Perform an inferior function call on the value. */ 676 677 static SCM 678 gdbscm_value_call (SCM self, SCM args) 679 { 680 value_smob *v_smob 681 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 682 struct value *function = v_smob->value; 683 struct type *ftype = NULL; 684 long args_count; 685 struct value **vargs = NULL; 686 687 TRY 688 { 689 ftype = check_typedef (value_type (function)); 690 } 691 CATCH (except, RETURN_MASK_ALL) 692 { 693 GDBSCM_HANDLE_GDB_EXCEPTION (except); 694 } 695 END_CATCH 696 697 SCM_ASSERT_TYPE (TYPE_CODE (ftype) == TYPE_CODE_FUNC, self, 698 SCM_ARG1, FUNC_NAME, 699 _("function (value of TYPE_CODE_FUNC)")); 700 701 SCM_ASSERT_TYPE (gdbscm_is_true (scm_list_p (args)), args, 702 SCM_ARG2, FUNC_NAME, _("list")); 703 704 args_count = scm_ilength (args); 705 if (args_count > 0) 706 { 707 struct gdbarch *gdbarch = get_current_arch (); 708 const struct language_defn *language = current_language; 709 SCM except_scm; 710 long i; 711 712 vargs = XALLOCAVEC (struct value *, args_count); 713 for (i = 0; i < args_count; i++) 714 { 715 SCM arg = scm_car (args); 716 717 vargs[i] = vlscm_convert_value_from_scheme (FUNC_NAME, 718 GDBSCM_ARG_NONE, arg, 719 &except_scm, 720 gdbarch, language); 721 if (vargs[i] == NULL) 722 gdbscm_throw (except_scm); 723 724 args = scm_cdr (args); 725 } 726 gdb_assert (gdbscm_is_true (scm_null_p (args))); 727 } 728 729 return gdbscm_wrap ([=] 730 { 731 scoped_value_mark free_values; 732 733 auto av = gdb::make_array_view (vargs, args_count); 734 value *return_value = call_function_by_hand (function, NULL, av); 735 return vlscm_scm_from_value (return_value); 736 }); 737 } 738 739 /* (value->bytevector <gdb:value>) -> bytevector */ 740 741 static SCM 742 gdbscm_value_to_bytevector (SCM self) 743 { 744 value_smob *v_smob 745 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 746 struct value *value = v_smob->value; 747 struct type *type; 748 size_t length = 0; 749 const gdb_byte *contents = NULL; 750 SCM bv; 751 752 type = value_type (value); 753 754 TRY 755 { 756 type = check_typedef (type); 757 length = TYPE_LENGTH (type); 758 contents = value_contents (value); 759 } 760 CATCH (except, RETURN_MASK_ALL) 761 { 762 GDBSCM_HANDLE_GDB_EXCEPTION (except); 763 } 764 END_CATCH 765 766 bv = scm_c_make_bytevector (length); 767 memcpy (SCM_BYTEVECTOR_CONTENTS (bv), contents, length); 768 769 return bv; 770 } 771 772 /* Helper function to determine if a type is "int-like". */ 773 774 static int 775 is_intlike (struct type *type, int ptr_ok) 776 { 777 return (TYPE_CODE (type) == TYPE_CODE_INT 778 || TYPE_CODE (type) == TYPE_CODE_ENUM 779 || TYPE_CODE (type) == TYPE_CODE_BOOL 780 || TYPE_CODE (type) == TYPE_CODE_CHAR 781 || (ptr_ok && TYPE_CODE (type) == TYPE_CODE_PTR)); 782 } 783 784 /* (value->bool <gdb:value>) -> boolean 785 Throws an error if the value is not integer-like. */ 786 787 static SCM 788 gdbscm_value_to_bool (SCM self) 789 { 790 value_smob *v_smob 791 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 792 struct value *value = v_smob->value; 793 struct type *type; 794 LONGEST l = 0; 795 796 type = value_type (value); 797 798 TRY 799 { 800 type = check_typedef (type); 801 } 802 CATCH (except, RETURN_MASK_ALL) 803 { 804 GDBSCM_HANDLE_GDB_EXCEPTION (except); 805 } 806 END_CATCH 807 808 SCM_ASSERT_TYPE (is_intlike (type, 1), self, SCM_ARG1, FUNC_NAME, 809 _("integer-like gdb value")); 810 811 TRY 812 { 813 if (TYPE_CODE (type) == TYPE_CODE_PTR) 814 l = value_as_address (value); 815 else 816 l = value_as_long (value); 817 } 818 CATCH (except, RETURN_MASK_ALL) 819 { 820 GDBSCM_HANDLE_GDB_EXCEPTION (except); 821 } 822 END_CATCH 823 824 return scm_from_bool (l != 0); 825 } 826 827 /* (value->integer <gdb:value>) -> integer 828 Throws an error if the value is not integer-like. */ 829 830 static SCM 831 gdbscm_value_to_integer (SCM self) 832 { 833 value_smob *v_smob 834 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 835 struct value *value = v_smob->value; 836 struct type *type; 837 LONGEST l = 0; 838 839 type = value_type (value); 840 841 TRY 842 { 843 type = check_typedef (type); 844 } 845 CATCH (except, RETURN_MASK_ALL) 846 { 847 GDBSCM_HANDLE_GDB_EXCEPTION (except); 848 } 849 END_CATCH 850 851 SCM_ASSERT_TYPE (is_intlike (type, 1), self, SCM_ARG1, FUNC_NAME, 852 _("integer-like gdb value")); 853 854 TRY 855 { 856 if (TYPE_CODE (type) == TYPE_CODE_PTR) 857 l = value_as_address (value); 858 else 859 l = value_as_long (value); 860 } 861 CATCH (except, RETURN_MASK_ALL) 862 { 863 GDBSCM_HANDLE_GDB_EXCEPTION (except); 864 } 865 END_CATCH 866 867 if (TYPE_UNSIGNED (type)) 868 return gdbscm_scm_from_ulongest (l); 869 else 870 return gdbscm_scm_from_longest (l); 871 } 872 873 /* (value->real <gdb:value>) -> real 874 Throws an error if the value is not a number. */ 875 876 static SCM 877 gdbscm_value_to_real (SCM self) 878 { 879 value_smob *v_smob 880 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 881 struct value *value = v_smob->value; 882 struct type *type; 883 double d = 0; 884 struct value *check = nullptr; 885 886 type = value_type (value); 887 888 TRY 889 { 890 type = check_typedef (type); 891 } 892 CATCH (except, RETURN_MASK_ALL) 893 { 894 GDBSCM_HANDLE_GDB_EXCEPTION (except); 895 } 896 END_CATCH 897 898 SCM_ASSERT_TYPE (is_intlike (type, 0) || TYPE_CODE (type) == TYPE_CODE_FLT, 899 self, SCM_ARG1, FUNC_NAME, _("number")); 900 901 TRY 902 { 903 if (is_floating_value (value)) 904 { 905 d = target_float_to_host_double (value_contents (value), type); 906 check = allocate_value (type); 907 target_float_from_host_double (value_contents_raw (check), type, d); 908 } 909 else if (TYPE_UNSIGNED (type)) 910 { 911 d = (ULONGEST) value_as_long (value); 912 check = value_from_ulongest (type, (ULONGEST) d); 913 } 914 else 915 { 916 d = value_as_long (value); 917 check = value_from_longest (type, (LONGEST) d); 918 } 919 } 920 CATCH (except, RETURN_MASK_ALL) 921 { 922 GDBSCM_HANDLE_GDB_EXCEPTION (except); 923 } 924 END_CATCH 925 926 /* TODO: Is there a better way to check if the value fits? */ 927 if (!value_equal (value, check)) 928 gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG1, self, 929 _("number can't be converted to a double")); 930 931 return scm_from_double (d); 932 } 933 934 /* (value->string <gdb:value> 935 [#:encoding encoding] 936 [#:errors #f | 'error | 'substitute] 937 [#:length length]) 938 -> string 939 Return Unicode string with value's contents, which must be a string. 940 941 If ENCODING is not given, the string is assumed to be encoded in 942 the target's charset. 943 944 ERRORS is one of #f, 'error or 'substitute. 945 An error setting of #f means use the default, which is Guile's 946 %default-port-conversion-strategy when using Guile >= 2.0.6, or 'error if 947 using an earlier version of Guile. Earlier versions do not properly 948 support obtaining the default port conversion strategy. 949 If the default is not one of 'error or 'substitute, 'substitute is used. 950 An error setting of "error" causes an exception to be thrown if there's 951 a decoding error. An error setting of "substitute" causes invalid 952 characters to be replaced with "?". 953 954 If LENGTH is provided, only fetch string to the length provided. 955 LENGTH must be a Scheme integer, it can't be a <gdb:value> integer. */ 956 957 static SCM 958 gdbscm_value_to_string (SCM self, SCM rest) 959 { 960 value_smob *v_smob 961 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 962 struct value *value = v_smob->value; 963 const SCM keywords[] = { 964 encoding_keyword, errors_keyword, length_keyword, SCM_BOOL_F 965 }; 966 int encoding_arg_pos = -1, errors_arg_pos = -1, length_arg_pos = -1; 967 char *encoding = NULL; 968 SCM errors = SCM_BOOL_F; 969 /* Avoid an uninitialized warning from gcc. */ 970 gdb_byte *buffer_contents = nullptr; 971 int length = -1; 972 const char *la_encoding = NULL; 973 struct type *char_type = NULL; 974 SCM result; 975 976 /* The sequencing here, as everywhere else, is important. 977 We can't have existing cleanups when a Scheme exception is thrown. */ 978 979 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG2, keywords, "#sOi", rest, 980 &encoding_arg_pos, &encoding, 981 &errors_arg_pos, &errors, 982 &length_arg_pos, &length); 983 984 if (errors_arg_pos > 0 985 && errors != SCM_BOOL_F 986 && !scm_is_eq (errors, error_symbol) 987 && !scm_is_eq (errors, substitute_symbol)) 988 { 989 SCM excp 990 = gdbscm_make_out_of_range_error (FUNC_NAME, errors_arg_pos, errors, 991 _("invalid error kind")); 992 993 xfree (encoding); 994 gdbscm_throw (excp); 995 } 996 if (errors == SCM_BOOL_F) 997 { 998 /* N.B. scm_port_conversion_strategy in Guile versions prior to 2.0.6 999 will throw a Scheme error when passed #f. */ 1000 if (gdbscm_guile_version_is_at_least (2, 0, 6)) 1001 errors = scm_port_conversion_strategy (SCM_BOOL_F); 1002 else 1003 errors = error_symbol; 1004 } 1005 /* We don't assume anything about the result of scm_port_conversion_strategy. 1006 From this point on, if errors is not 'errors, use 'substitute. */ 1007 1008 TRY 1009 { 1010 gdb::unique_xmalloc_ptr<gdb_byte> buffer; 1011 LA_GET_STRING (value, &buffer, &length, &char_type, &la_encoding); 1012 buffer_contents = buffer.release (); 1013 } 1014 CATCH (except, RETURN_MASK_ALL) 1015 { 1016 xfree (encoding); 1017 GDBSCM_HANDLE_GDB_EXCEPTION (except); 1018 } 1019 END_CATCH 1020 1021 /* If errors is "error", scm_from_stringn may throw a Scheme exception. 1022 Make sure we don't leak. This is done via scm_dynwind_begin, et.al. */ 1023 1024 scm_dynwind_begin ((scm_t_dynwind_flags) 0); 1025 1026 gdbscm_dynwind_xfree (encoding); 1027 gdbscm_dynwind_xfree (buffer_contents); 1028 1029 result = scm_from_stringn ((const char *) buffer_contents, 1030 length * TYPE_LENGTH (char_type), 1031 (encoding != NULL && *encoding != '\0' 1032 ? encoding 1033 : la_encoding), 1034 scm_is_eq (errors, error_symbol) 1035 ? SCM_FAILED_CONVERSION_ERROR 1036 : SCM_FAILED_CONVERSION_QUESTION_MARK); 1037 1038 scm_dynwind_end (); 1039 1040 return result; 1041 } 1042 1043 /* (value->lazy-string <gdb:value> [#:encoding encoding] [#:length length]) 1044 -> <gdb:lazy-string> 1045 Return a Scheme object representing a lazy_string_object type. 1046 A lazy string is a pointer to a string with an optional encoding and length. 1047 If ENCODING is not given, the target's charset is used. 1048 If LENGTH is provided then the length parameter is set to LENGTH. 1049 Otherwise if the value is an array of known length then the array's length 1050 is used. Otherwise the length will be set to -1 (meaning first null of 1051 appropriate with). 1052 LENGTH must be a Scheme integer, it can't be a <gdb:value> integer. */ 1053 1054 static SCM 1055 gdbscm_value_to_lazy_string (SCM self, SCM rest) 1056 { 1057 value_smob *v_smob 1058 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 1059 struct value *value = v_smob->value; 1060 const SCM keywords[] = { encoding_keyword, length_keyword, SCM_BOOL_F }; 1061 int encoding_arg_pos = -1, length_arg_pos = -1; 1062 char *encoding = NULL; 1063 int length = -1; 1064 SCM result = SCM_BOOL_F; /* -Wall */ 1065 struct gdb_exception except = exception_none; 1066 1067 /* The sequencing here, as everywhere else, is important. 1068 We can't have existing cleanups when a Scheme exception is thrown. */ 1069 1070 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG2, keywords, "#si", rest, 1071 &encoding_arg_pos, &encoding, 1072 &length_arg_pos, &length); 1073 1074 if (length < -1) 1075 { 1076 gdbscm_out_of_range_error (FUNC_NAME, length_arg_pos, 1077 scm_from_int (length), 1078 _("invalid length")); 1079 } 1080 1081 TRY 1082 { 1083 scoped_value_mark free_values; 1084 1085 struct type *type, *realtype; 1086 CORE_ADDR addr; 1087 1088 type = value_type (value); 1089 realtype = check_typedef (type); 1090 1091 switch (TYPE_CODE (realtype)) 1092 { 1093 case TYPE_CODE_ARRAY: 1094 { 1095 LONGEST array_length = -1; 1096 LONGEST low_bound, high_bound; 1097 1098 /* PR 20786: There's no way to specify an array of length zero. 1099 Record a length of [0,-1] which is how Ada does it. Anything 1100 we do is broken, but this one possible solution. */ 1101 if (get_array_bounds (realtype, &low_bound, &high_bound)) 1102 array_length = high_bound - low_bound + 1; 1103 if (length == -1) 1104 length = array_length; 1105 else if (array_length == -1) 1106 { 1107 type = lookup_array_range_type (TYPE_TARGET_TYPE (realtype), 1108 0, length - 1); 1109 } 1110 else if (length != array_length) 1111 { 1112 /* We need to create a new array type with the 1113 specified length. */ 1114 if (length > array_length) 1115 error (_("length is larger than array size")); 1116 type = lookup_array_range_type (TYPE_TARGET_TYPE (type), 1117 low_bound, 1118 low_bound + length - 1); 1119 } 1120 addr = value_address (value); 1121 break; 1122 } 1123 case TYPE_CODE_PTR: 1124 /* If a length is specified we defer creating an array of the 1125 specified width until we need to. */ 1126 addr = value_as_address (value); 1127 break; 1128 default: 1129 /* Should flag an error here. PR 20769. */ 1130 addr = value_address (value); 1131 break; 1132 } 1133 1134 result = lsscm_make_lazy_string (addr, length, encoding, type); 1135 } 1136 CATCH (ex, RETURN_MASK_ALL) 1137 { 1138 except = ex; 1139 } 1140 END_CATCH 1141 1142 xfree (encoding); 1143 GDBSCM_HANDLE_GDB_EXCEPTION (except); 1144 1145 if (gdbscm_is_exception (result)) 1146 gdbscm_throw (result); 1147 1148 return result; 1149 } 1150 1151 /* (value-lazy? <gdb:value>) -> boolean */ 1152 1153 static SCM 1154 gdbscm_value_lazy_p (SCM self) 1155 { 1156 value_smob *v_smob 1157 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 1158 struct value *value = v_smob->value; 1159 1160 return scm_from_bool (value_lazy (value)); 1161 } 1162 1163 /* (value-fetch-lazy! <gdb:value>) -> unspecified */ 1164 1165 static SCM 1166 gdbscm_value_fetch_lazy_x (SCM self) 1167 { 1168 value_smob *v_smob 1169 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 1170 struct value *value = v_smob->value; 1171 1172 return gdbscm_wrap ([=] 1173 { 1174 if (value_lazy (value)) 1175 value_fetch_lazy (value); 1176 return SCM_UNSPECIFIED; 1177 }); 1178 } 1179 1180 /* (value-print <gdb:value>) -> string */ 1181 1182 static SCM 1183 gdbscm_value_print (SCM self) 1184 { 1185 value_smob *v_smob 1186 = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); 1187 struct value *value = v_smob->value; 1188 struct value_print_options opts; 1189 1190 get_user_print_options (&opts); 1191 opts.deref_ref = 0; 1192 1193 string_file stb; 1194 1195 TRY 1196 { 1197 common_val_print (value, &stb, 0, &opts, current_language); 1198 } 1199 CATCH (except, RETURN_MASK_ALL) 1200 { 1201 GDBSCM_HANDLE_GDB_EXCEPTION (except); 1202 } 1203 END_CATCH 1204 1205 /* Use SCM_FAILED_CONVERSION_QUESTION_MARK to ensure this doesn't 1206 throw an error if the encoding fails. 1207 IWBN to use scm_take_locale_string here, but we'd have to temporarily 1208 override the default port conversion handler because contrary to 1209 documentation it doesn't necessarily free the input string. */ 1210 return scm_from_stringn (stb.c_str (), stb.size (), host_charset (), 1211 SCM_FAILED_CONVERSION_QUESTION_MARK); 1212 } 1213 1214 /* (parse-and-eval string) -> <gdb:value> 1215 Parse a string and evaluate the string as an expression. */ 1216 1217 static SCM 1218 gdbscm_parse_and_eval (SCM expr_scm) 1219 { 1220 char *expr_str; 1221 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, NULL, "s", 1222 expr_scm, &expr_str); 1223 1224 return gdbscm_wrap ([=] 1225 { 1226 scoped_value_mark free_values; 1227 return vlscm_scm_from_value (parse_and_eval (expr_str)); 1228 }); 1229 } 1230 1231 /* (history-ref integer) -> <gdb:value> 1232 Return the specified value from GDB's value history. */ 1233 1234 static SCM 1235 gdbscm_history_ref (SCM index) 1236 { 1237 int i; 1238 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, NULL, "i", index, &i); 1239 1240 return gdbscm_wrap ([=] 1241 { 1242 return vlscm_scm_from_value (access_value_history (i)); 1243 }); 1244 } 1245 1246 /* (history-append! <gdb:value>) -> index 1247 Append VALUE to GDB's value history. Return its index in the history. */ 1248 1249 static SCM 1250 gdbscm_history_append_x (SCM value) 1251 { 1252 value_smob *v_smob 1253 = vlscm_get_value_smob_arg_unsafe (value, SCM_ARG1, FUNC_NAME); 1254 return gdbscm_wrap ([=] 1255 { 1256 return scm_from_int (record_latest_value (v_smob->value)); 1257 }); 1258 } 1259 1260 /* Initialize the Scheme value code. */ 1261 1262 static const scheme_function value_functions[] = 1263 { 1264 { "value?", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_p), 1265 "\ 1266 Return #t if the object is a <gdb:value> object." }, 1267 1268 { "make-value", 1, 0, 1, as_a_scm_t_subr (gdbscm_make_value), 1269 "\ 1270 Create a <gdb:value> representing object.\n\ 1271 Typically this is used to convert numbers and strings to\n\ 1272 <gdb:value> objects.\n\ 1273 \n\ 1274 Arguments: object [#:type <gdb:type>]" }, 1275 1276 { "value-optimized-out?", 1, 0, 0, 1277 as_a_scm_t_subr (gdbscm_value_optimized_out_p), 1278 "\ 1279 Return #t if the value has been optimizd out." }, 1280 1281 { "value-address", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_address), 1282 "\ 1283 Return the address of the value." }, 1284 1285 { "value-type", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_type), 1286 "\ 1287 Return the type of the value." }, 1288 1289 { "value-dynamic-type", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_dynamic_type), 1290 "\ 1291 Return the dynamic type of the value." }, 1292 1293 { "value-cast", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_cast), 1294 "\ 1295 Cast the value to the supplied type.\n\ 1296 \n\ 1297 Arguments: <gdb:value> <gdb:type>" }, 1298 1299 { "value-dynamic-cast", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_dynamic_cast), 1300 "\ 1301 Cast the value to the supplied type, as if by the C++\n\ 1302 dynamic_cast operator.\n\ 1303 \n\ 1304 Arguments: <gdb:value> <gdb:type>" }, 1305 1306 { "value-reinterpret-cast", 2, 0, 0, 1307 as_a_scm_t_subr (gdbscm_value_reinterpret_cast), 1308 "\ 1309 Cast the value to the supplied type, as if by the C++\n\ 1310 reinterpret_cast operator.\n\ 1311 \n\ 1312 Arguments: <gdb:value> <gdb:type>" }, 1313 1314 { "value-dereference", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_dereference), 1315 "\ 1316 Return the result of applying the C unary * operator to the value." }, 1317 1318 { "value-referenced-value", 1, 0, 0, 1319 as_a_scm_t_subr (gdbscm_value_referenced_value), 1320 "\ 1321 Given a value of a reference type, return the value referenced.\n\ 1322 The difference between this function and value-dereference is that\n\ 1323 the latter applies * unary operator to a value, which need not always\n\ 1324 result in the value referenced.\n\ 1325 For example, for a value which is a reference to an 'int' pointer ('int *'),\n\ 1326 value-dereference will result in a value of type 'int' while\n\ 1327 value-referenced-value will result in a value of type 'int *'." }, 1328 1329 { "value-field", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_field), 1330 "\ 1331 Return the specified field of the value.\n\ 1332 \n\ 1333 Arguments: <gdb:value> string" }, 1334 1335 { "value-subscript", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_subscript), 1336 "\ 1337 Return the value of the array at the specified index.\n\ 1338 \n\ 1339 Arguments: <gdb:value> integer" }, 1340 1341 { "value-call", 2, 0, 0, as_a_scm_t_subr (gdbscm_value_call), 1342 "\ 1343 Perform an inferior function call taking the value as a pointer to the\n\ 1344 function to call.\n\ 1345 Each element of the argument list must be a <gdb:value> object or an object\n\ 1346 that can be converted to one.\n\ 1347 The result is the value returned by the function.\n\ 1348 \n\ 1349 Arguments: <gdb:value> arg-list" }, 1350 1351 { "value->bool", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_to_bool), 1352 "\ 1353 Return the Scheme boolean representing the GDB value.\n\ 1354 The value must be \"integer like\". Pointers are ok." }, 1355 1356 { "value->integer", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_to_integer), 1357 "\ 1358 Return the Scheme integer representing the GDB value.\n\ 1359 The value must be \"integer like\". Pointers are ok." }, 1360 1361 { "value->real", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_to_real), 1362 "\ 1363 Return the Scheme real number representing the GDB value.\n\ 1364 The value must be a number." }, 1365 1366 { "value->bytevector", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_to_bytevector), 1367 "\ 1368 Return a Scheme bytevector with the raw contents of the GDB value.\n\ 1369 No transformation, endian or otherwise, is performed." }, 1370 1371 { "value->string", 1, 0, 1, as_a_scm_t_subr (gdbscm_value_to_string), 1372 "\ 1373 Return the Unicode string of the value's contents.\n\ 1374 If ENCODING is not given, the string is assumed to be encoded in\n\ 1375 the target's charset.\n\ 1376 An error setting \"error\" causes an exception to be thrown if there's\n\ 1377 a decoding error. An error setting of \"substitute\" causes invalid\n\ 1378 characters to be replaced with \"?\". The default is \"error\".\n\ 1379 If LENGTH is provided, only fetch string to the length provided.\n\ 1380 \n\ 1381 Arguments: <gdb:value>\n\ 1382 [#:encoding encoding] [#:errors \"error\"|\"substitute\"]\n\ 1383 [#:length length]" }, 1384 1385 { "value->lazy-string", 1, 0, 1, 1386 as_a_scm_t_subr (gdbscm_value_to_lazy_string), 1387 "\ 1388 Return a Scheme object representing a lazily fetched Unicode string\n\ 1389 of the value's contents.\n\ 1390 If ENCODING is not given, the string is assumed to be encoded in\n\ 1391 the target's charset.\n\ 1392 If LENGTH is provided, only fetch string to the length provided.\n\ 1393 \n\ 1394 Arguments: <gdb:value> [#:encoding encoding] [#:length length]" }, 1395 1396 { "value-lazy?", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_lazy_p), 1397 "\ 1398 Return #t if the value is lazy (not fetched yet from the inferior).\n\ 1399 A lazy value is fetched when needed, or when the value-fetch-lazy! function\n\ 1400 is called." }, 1401 1402 { "make-lazy-value", 2, 0, 0, as_a_scm_t_subr (gdbscm_make_lazy_value), 1403 "\ 1404 Create a <gdb:value> that will be lazily fetched from the target.\n\ 1405 \n\ 1406 Arguments: <gdb:type> address" }, 1407 1408 { "value-fetch-lazy!", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_fetch_lazy_x), 1409 "\ 1410 Fetch the value from the inferior, if it was lazy.\n\ 1411 The result is \"unspecified\"." }, 1412 1413 { "value-print", 1, 0, 0, as_a_scm_t_subr (gdbscm_value_print), 1414 "\ 1415 Return the string representation (print form) of the value." }, 1416 1417 { "parse-and-eval", 1, 0, 0, as_a_scm_t_subr (gdbscm_parse_and_eval), 1418 "\ 1419 Evaluates string in gdb and returns the result as a <gdb:value> object." }, 1420 1421 { "history-ref", 1, 0, 0, as_a_scm_t_subr (gdbscm_history_ref), 1422 "\ 1423 Return the specified value from GDB's value history." }, 1424 1425 { "history-append!", 1, 0, 0, as_a_scm_t_subr (gdbscm_history_append_x), 1426 "\ 1427 Append the specified value onto GDB's value history." }, 1428 1429 END_FUNCTIONS 1430 }; 1431 1432 void 1433 gdbscm_initialize_values (void) 1434 { 1435 value_smob_tag = gdbscm_make_smob_type (value_smob_name, 1436 sizeof (value_smob)); 1437 scm_set_smob_free (value_smob_tag, vlscm_free_value_smob); 1438 scm_set_smob_print (value_smob_tag, vlscm_print_value_smob); 1439 scm_set_smob_equalp (value_smob_tag, vlscm_equal_p_value_smob); 1440 1441 gdbscm_define_functions (value_functions, 1); 1442 1443 type_keyword = scm_from_latin1_keyword ("type"); 1444 encoding_keyword = scm_from_latin1_keyword ("encoding"); 1445 errors_keyword = scm_from_latin1_keyword ("errors"); 1446 length_keyword = scm_from_latin1_keyword ("length"); 1447 1448 error_symbol = scm_from_latin1_symbol ("error"); 1449 escape_symbol = scm_from_latin1_symbol ("escape"); 1450 substitute_symbol = scm_from_latin1_symbol ("substitute"); 1451 } 1452