mi-cmd-var.c revision 130804
1/* MI Command Set - varobj commands. 2 3 Copyright 2000, 2002, 2004 Free Software Foundation, Inc. 4 5 Contributed by Cygnus Solutions (a Red Hat company). 6 7 This file is part of GDB. 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 2 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program; if not, write to the Free Software 21 Foundation, Inc., 59 Temple Place - Suite 330, 22 Boston, MA 02111-1307, USA. */ 23 24#include "defs.h" 25#include "mi-cmds.h" 26#include "ui-out.h" 27#include "mi-out.h" 28#include "varobj.h" 29#include "value.h" 30#include <ctype.h> 31#include "gdb_string.h" 32 33extern int varobjdebug; /* defined in varobj.c */ 34 35static int varobj_update_one (struct varobj *var); 36 37/* VAROBJ operations */ 38 39enum mi_cmd_result 40mi_cmd_var_create (char *command, char **argv, int argc) 41{ 42 CORE_ADDR frameaddr = 0; 43 struct varobj *var; 44 char *name; 45 char *frame; 46 char *expr; 47 char *type; 48 struct cleanup *old_cleanups; 49 enum varobj_type var_type; 50 51 if (argc != 3) 52 { 53 /* xasprintf (&mi_error_message, 54 "mi_cmd_var_create: Usage: ."); 55 return MI_CMD_ERROR; */ 56 error ("mi_cmd_var_create: Usage: NAME FRAME EXPRESSION."); 57 } 58 59 name = xstrdup (argv[0]); 60 /* Add cleanup for name. Must be free_current_contents as 61 name can be reallocated */ 62 old_cleanups = make_cleanup (free_current_contents, &name); 63 64 frame = xstrdup (argv[1]); 65 old_cleanups = make_cleanup (xfree, frame); 66 67 expr = xstrdup (argv[2]); 68 69 if (strcmp (name, "-") == 0) 70 { 71 xfree (name); 72 name = varobj_gen_name (); 73 } 74 else if (!isalpha (*name)) 75 error ("mi_cmd_var_create: name of object must begin with a letter"); 76 77 if (strcmp (frame, "*") == 0) 78 var_type = USE_CURRENT_FRAME; 79 else if (strcmp (frame, "@") == 0) 80 var_type = USE_SELECTED_FRAME; 81 else 82 { 83 var_type = USE_SPECIFIED_FRAME; 84 frameaddr = string_to_core_addr (frame); 85 } 86 87 if (varobjdebug) 88 fprintf_unfiltered (gdb_stdlog, 89 "Name=\"%s\", Frame=\"%s\" (0x%s), Expression=\"%s\"\n", 90 name, frame, paddr (frameaddr), expr); 91 92 var = varobj_create (name, expr, frameaddr, var_type); 93 94 if (var == NULL) 95 error ("mi_cmd_var_create: unable to create variable object"); 96 97 ui_out_field_string (uiout, "name", name); 98 ui_out_field_int (uiout, "numchild", varobj_get_num_children (var)); 99 type = varobj_get_type (var); 100 if (type == NULL) 101 ui_out_field_string (uiout, "type", ""); 102 else 103 { 104 ui_out_field_string (uiout, "type", type); 105 xfree (type); 106 } 107 108 do_cleanups (old_cleanups); 109 return MI_CMD_DONE; 110} 111 112enum mi_cmd_result 113mi_cmd_var_delete (char *command, char **argv, int argc) 114{ 115 char *name; 116 char *expr; 117 struct varobj *var; 118 int numdel; 119 int children_only_p = 0; 120 struct cleanup *old_cleanups; 121 122 if (argc < 1 || argc > 2) 123 error ("mi_cmd_var_delete: Usage: [-c] EXPRESSION."); 124 125 name = xstrdup (argv[0]); 126 /* Add cleanup for name. Must be free_current_contents as 127 name can be reallocated */ 128 old_cleanups = make_cleanup (free_current_contents, &name); 129 130 /* If we have one single argument it cannot be '-c' or any string 131 starting with '-'. */ 132 if (argc == 1) 133 { 134 if (strcmp (name, "-c") == 0) 135 error ("mi_cmd_var_delete: Missing required argument after '-c': variable object name"); 136 if (*name == '-') 137 error ("mi_cmd_var_delete: Illegal variable object name"); 138 } 139 140 /* If we have 2 arguments they must be '-c' followed by a string 141 which would be the variable name. */ 142 if (argc == 2) 143 { 144 expr = xstrdup (argv[1]); 145 if (strcmp (name, "-c") != 0) 146 error ("mi_cmd_var_delete: Invalid option."); 147 children_only_p = 1; 148 xfree (name); 149 name = xstrdup (expr); 150 xfree (expr); 151 } 152 153 /* If we didn't error out, now NAME contains the name of the 154 variable. */ 155 156 var = varobj_get_handle (name); 157 158 if (var == NULL) 159 error ("mi_cmd_var_delete: Variable object not found."); 160 161 numdel = varobj_delete (var, NULL, children_only_p); 162 163 ui_out_field_int (uiout, "ndeleted", numdel); 164 165 do_cleanups (old_cleanups); 166 return MI_CMD_DONE; 167} 168 169enum mi_cmd_result 170mi_cmd_var_set_format (char *command, char **argv, int argc) 171{ 172 enum varobj_display_formats format; 173 int len; 174 struct varobj *var; 175 char *formspec; 176 177 if (argc != 2) 178 error ("mi_cmd_var_set_format: Usage: NAME FORMAT."); 179 180 /* Get varobj handle, if a valid var obj name was specified */ 181 var = varobj_get_handle (argv[0]); 182 183 if (var == NULL) 184 error ("mi_cmd_var_set_format: Variable object not found"); 185 186 formspec = xstrdup (argv[1]); 187 if (formspec == NULL) 188 error ("mi_cmd_var_set_format: Must specify the format as: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\""); 189 190 len = strlen (formspec); 191 192 if (strncmp (formspec, "natural", len) == 0) 193 format = FORMAT_NATURAL; 194 else if (strncmp (formspec, "binary", len) == 0) 195 format = FORMAT_BINARY; 196 else if (strncmp (formspec, "decimal", len) == 0) 197 format = FORMAT_DECIMAL; 198 else if (strncmp (formspec, "hexadecimal", len) == 0) 199 format = FORMAT_HEXADECIMAL; 200 else if (strncmp (formspec, "octal", len) == 0) 201 format = FORMAT_OCTAL; 202 else 203 error ("mi_cmd_var_set_format: Unknown display format: must be: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\""); 204 205 /* Set the format of VAR to given format */ 206 varobj_set_display_format (var, format); 207 208 /* Report the new current format */ 209 ui_out_field_string (uiout, "format", varobj_format_string[(int) format]); 210 return MI_CMD_DONE; 211} 212 213enum mi_cmd_result 214mi_cmd_var_show_format (char *command, char **argv, int argc) 215{ 216 enum varobj_display_formats format; 217 struct varobj *var; 218 219 if (argc != 1) 220 error ("mi_cmd_var_show_format: Usage: NAME."); 221 222 /* Get varobj handle, if a valid var obj name was specified */ 223 var = varobj_get_handle (argv[0]); 224 if (var == NULL) 225 error ("mi_cmd_var_show_format: Variable object not found"); 226 227 format = varobj_get_display_format (var); 228 229 /* Report the current format */ 230 ui_out_field_string (uiout, "format", varobj_format_string[(int) format]); 231 return MI_CMD_DONE; 232} 233 234enum mi_cmd_result 235mi_cmd_var_info_num_children (char *command, char **argv, int argc) 236{ 237 struct varobj *var; 238 239 if (argc != 1) 240 error ("mi_cmd_var_info_num_children: Usage: NAME."); 241 242 /* Get varobj handle, if a valid var obj name was specified */ 243 var = varobj_get_handle (argv[0]); 244 if (var == NULL) 245 error ("mi_cmd_var_info_num_children: Variable object not found"); 246 247 ui_out_field_int (uiout, "numchild", varobj_get_num_children (var)); 248 return MI_CMD_DONE; 249} 250 251enum mi_cmd_result 252mi_cmd_var_list_children (char *command, char **argv, int argc) 253{ 254 struct varobj *var; 255 struct varobj **childlist; 256 struct varobj **cc; 257 struct cleanup *cleanup_children; 258 int numchild; 259 char *type; 260 enum print_values print_values; 261 262 if (argc != 1 && argc != 2) 263 error ("mi_cmd_var_list_children: Usage: [PRINT_VALUES] NAME"); 264 265 /* Get varobj handle, if a valid var obj name was specified */ 266 if (argc == 1) var = varobj_get_handle (argv[0]); 267 else var = varobj_get_handle (argv[1]); 268 if (var == NULL) 269 error ("Variable object not found"); 270 271 numchild = varobj_list_children (var, &childlist); 272 ui_out_field_int (uiout, "numchild", numchild); 273 if (argc == 2) 274 if (strcmp (argv[0], "0") == 0 275 || strcmp (argv[0], "--no-values") == 0) 276 print_values = PRINT_NO_VALUES; 277 else if (strcmp (argv[0], "1") == 0 278 || strcmp (argv[0], "--all-values") == 0) 279 print_values = PRINT_ALL_VALUES; 280 else 281 error ("Unknown value for PRINT_VALUES: must be: 0 or \"--no-values\", 1 or \"--all-values\""); 282 else print_values = PRINT_NO_VALUES; 283 284 if (numchild <= 0) 285 return MI_CMD_DONE; 286 287 if (mi_version (uiout) == 1) 288 cleanup_children = make_cleanup_ui_out_tuple_begin_end (uiout, "children"); 289 else 290 cleanup_children = make_cleanup_ui_out_list_begin_end (uiout, "children"); 291 cc = childlist; 292 while (*cc != NULL) 293 { 294 struct cleanup *cleanup_child; 295 cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, "child"); 296 ui_out_field_string (uiout, "name", varobj_get_objname (*cc)); 297 ui_out_field_string (uiout, "exp", varobj_get_expression (*cc)); 298 ui_out_field_int (uiout, "numchild", varobj_get_num_children (*cc)); 299 if (print_values) 300 ui_out_field_string (uiout, "value", varobj_get_value (*cc)); 301 type = varobj_get_type (*cc); 302 /* C++ pseudo-variables (public, private, protected) do not have a type */ 303 if (type) 304 ui_out_field_string (uiout, "type", varobj_get_type (*cc)); 305 do_cleanups (cleanup_child); 306 cc++; 307 } 308 do_cleanups (cleanup_children); 309 xfree (childlist); 310 return MI_CMD_DONE; 311} 312 313enum mi_cmd_result 314mi_cmd_var_info_type (char *command, char **argv, int argc) 315{ 316 struct varobj *var; 317 318 if (argc != 1) 319 error ("mi_cmd_var_info_type: Usage: NAME."); 320 321 /* Get varobj handle, if a valid var obj name was specified */ 322 var = varobj_get_handle (argv[0]); 323 if (var == NULL) 324 error ("mi_cmd_var_info_type: Variable object not found"); 325 326 ui_out_field_string (uiout, "type", varobj_get_type (var)); 327 return MI_CMD_DONE; 328} 329 330enum mi_cmd_result 331mi_cmd_var_info_expression (char *command, char **argv, int argc) 332{ 333 enum varobj_languages lang; 334 struct varobj *var; 335 336 if (argc != 1) 337 error ("mi_cmd_var_info_expression: Usage: NAME."); 338 339 /* Get varobj handle, if a valid var obj name was specified */ 340 var = varobj_get_handle (argv[0]); 341 if (var == NULL) 342 error ("mi_cmd_var_info_expression: Variable object not found"); 343 344 lang = varobj_get_language (var); 345 346 ui_out_field_string (uiout, "lang", varobj_language_string[(int) lang]); 347 ui_out_field_string (uiout, "exp", varobj_get_expression (var)); 348 return MI_CMD_DONE; 349} 350 351enum mi_cmd_result 352mi_cmd_var_show_attributes (char *command, char **argv, int argc) 353{ 354 int attr; 355 char *attstr; 356 struct varobj *var; 357 358 if (argc != 1) 359 error ("mi_cmd_var_show_attributes: Usage: NAME."); 360 361 /* Get varobj handle, if a valid var obj name was specified */ 362 var = varobj_get_handle (argv[0]); 363 if (var == NULL) 364 error ("mi_cmd_var_show_attributes: Variable object not found"); 365 366 attr = varobj_get_attributes (var); 367 /* FIXME: define masks for attributes */ 368 if (attr & 0x00000001) 369 attstr = "editable"; 370 else 371 attstr = "noneditable"; 372 373 ui_out_field_string (uiout, "attr", attstr); 374 return MI_CMD_DONE; 375} 376 377enum mi_cmd_result 378mi_cmd_var_evaluate_expression (char *command, char **argv, int argc) 379{ 380 struct varobj *var; 381 382 if (argc != 1) 383 error ("mi_cmd_var_evaluate_expression: Usage: NAME."); 384 385 /* Get varobj handle, if a valid var obj name was specified */ 386 var = varobj_get_handle (argv[0]); 387 if (var == NULL) 388 error ("mi_cmd_var_evaluate_expression: Variable object not found"); 389 390 ui_out_field_string (uiout, "value", varobj_get_value (var)); 391 return MI_CMD_DONE; 392} 393 394enum mi_cmd_result 395mi_cmd_var_assign (char *command, char **argv, int argc) 396{ 397 struct varobj *var; 398 char *expression; 399 400 if (argc != 2) 401 error ("mi_cmd_var_assign: Usage: NAME EXPRESSION."); 402 403 /* Get varobj handle, if a valid var obj name was specified */ 404 var = varobj_get_handle (argv[0]); 405 if (var == NULL) 406 error ("mi_cmd_var_assign: Variable object not found"); 407 408 /* FIXME: define masks for attributes */ 409 if (!(varobj_get_attributes (var) & 0x00000001)) 410 error ("mi_cmd_var_assign: Variable object is not editable"); 411 412 expression = xstrdup (argv[1]); 413 414 if (!varobj_set_value (var, expression)) 415 error ("mi_cmd_var_assign: Could not assign expression to varible object"); 416 417 ui_out_field_string (uiout, "value", varobj_get_value (var)); 418 return MI_CMD_DONE; 419} 420 421enum mi_cmd_result 422mi_cmd_var_update (char *command, char **argv, int argc) 423{ 424 struct varobj *var; 425 struct varobj **rootlist; 426 struct varobj **cr; 427 struct cleanup *cleanup; 428 char *name; 429 int nv; 430 431 if (argc != 1) 432 error ("mi_cmd_var_update: Usage: NAME."); 433 434 name = argv[0]; 435 436 /* Check if the parameter is a "*" which means that we want 437 to update all variables */ 438 439 if ((*name == '*') && (*(name + 1) == '\0')) 440 { 441 nv = varobj_list (&rootlist); 442 if (mi_version (uiout) <= 1) 443 cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, "changelist"); 444 else 445 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "changelist"); 446 if (nv <= 0) 447 { 448 do_cleanups (cleanup); 449 return MI_CMD_DONE; 450 } 451 cr = rootlist; 452 while (*cr != NULL) 453 { 454 varobj_update_one (*cr); 455 cr++; 456 } 457 xfree (rootlist); 458 do_cleanups (cleanup); 459 } 460 else 461 { 462 /* Get varobj handle, if a valid var obj name was specified */ 463 var = varobj_get_handle (name); 464 if (var == NULL) 465 error ("mi_cmd_var_update: Variable object not found"); 466 467 if (mi_version (uiout) <= 1) 468 cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, "changelist"); 469 else 470 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "changelist"); 471 varobj_update_one (var); 472 do_cleanups (cleanup); 473 } 474 return MI_CMD_DONE; 475} 476 477/* Helper for mi_cmd_var_update() Returns 0 if the update for 478 the variable fails (usually because the variable is out of 479 scope), and 1 if it succeeds. */ 480 481static int 482varobj_update_one (struct varobj *var) 483{ 484 struct varobj **changelist; 485 struct varobj **cc; 486 struct cleanup *cleanup = NULL; 487 int nc; 488 489 nc = varobj_update (&var, &changelist); 490 491 /* nc == 0 means that nothing has changed. 492 nc == -1 means that an error occured in updating the variable. 493 nc == -2 means the variable has changed type. */ 494 495 if (nc == 0) 496 return 1; 497 else if (nc == -1) 498 { 499 if (mi_version (uiout) > 1) 500 cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); 501 ui_out_field_string (uiout, "name", varobj_get_objname(var)); 502 ui_out_field_string (uiout, "in_scope", "false"); 503 if (mi_version (uiout) > 1) 504 do_cleanups (cleanup); 505 return -1; 506 } 507 else if (nc == -2) 508 { 509 if (mi_version (uiout) > 1) 510 cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); 511 ui_out_field_string (uiout, "name", varobj_get_objname (var)); 512 ui_out_field_string (uiout, "in_scope", "true"); 513 ui_out_field_string (uiout, "new_type", varobj_get_type(var)); 514 ui_out_field_int (uiout, "new_num_children", 515 varobj_get_num_children(var)); 516 if (mi_version (uiout) > 1) 517 do_cleanups (cleanup); 518 } 519 else 520 { 521 522 cc = changelist; 523 while (*cc != NULL) 524 { 525 if (mi_version (uiout) > 1) 526 cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); 527 ui_out_field_string (uiout, "name", varobj_get_objname (*cc)); 528 ui_out_field_string (uiout, "in_scope", "true"); 529 ui_out_field_string (uiout, "type_changed", "false"); 530 if (mi_version (uiout) > 1) 531 do_cleanups (cleanup); 532 cc++; 533 } 534 xfree (changelist); 535 return 1; 536 } 537 return 1; 538} 539