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