| OLD | NEW |
| 1 /* Support for printing Java values for GDB, the GNU debugger. | 1 /* Support for printing Java values for GDB, the GNU debugger. |
| 2 | 2 |
| 3 Copyright (C) 1997-2005, 2007-2012 Free Software Foundation, Inc. | 3 Copyright (C) 1997-2005, 2007-2012 Free Software Foundation, Inc. |
| 4 | 4 |
| 5 This file is part of GDB. | 5 This file is part of GDB. |
| 6 | 6 |
| 7 This program is free software; you can redistribute it and/or modify | 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 | 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 | 9 the Free Software Foundation; either version 3 of the License, or |
| 10 (at your option) any later version. | 10 (at your option) any later version. |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "demangle.h" | 26 #include "demangle.h" |
| 27 #include "valprint.h" | 27 #include "valprint.h" |
| 28 #include "language.h" | 28 #include "language.h" |
| 29 #include "jv-lang.h" | 29 #include "jv-lang.h" |
| 30 #include "c-lang.h" | 30 #include "c-lang.h" |
| 31 #include "annotate.h" | 31 #include "annotate.h" |
| 32 #include "gdb_string.h" | 32 #include "gdb_string.h" |
| 33 | 33 |
| 34 /* Local functions */ | 34 /* Local functions */ |
| 35 | 35 |
| 36 int | 36 void |
| 37 java_value_print (struct value *val, struct ui_file *stream, | 37 java_value_print (struct value *val, struct ui_file *stream, |
| 38 const struct value_print_options *options) | 38 const struct value_print_options *options) |
| 39 { | 39 { |
| 40 struct gdbarch *gdbarch = get_type_arch (value_type (val)); | 40 struct gdbarch *gdbarch = get_type_arch (value_type (val)); |
| 41 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); | 41 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); |
| 42 struct type *type; | 42 struct type *type; |
| 43 CORE_ADDR address; | 43 CORE_ADDR address; |
| 44 int i; | 44 int i; |
| 45 char *name; | 45 const char *name; |
| 46 struct value_print_options opts; | 46 struct value_print_options opts; |
| 47 | 47 |
| 48 type = value_type (val); | 48 type = value_type (val); |
| 49 address = value_address (val); | 49 address = value_address (val); |
| 50 | 50 |
| 51 if (is_object_type (type)) | 51 if (is_object_type (type)) |
| 52 { | 52 { |
| 53 CORE_ADDR obj_addr; | 53 CORE_ADDR obj_addr; |
| 54 struct value *tem = val; |
| 54 | 55 |
| 55 /* Get the run-time type, and cast the object into that. */ | 56 /* Get the run-time type, and cast the object into that. */ |
| 57 while (TYPE_CODE (value_type (tem)) == TYPE_CODE_PTR) |
| 58 tem = value_ind (tem); |
| 56 | 59 |
| 57 obj_addr = unpack_pointer (type, value_contents (val)); | 60 obj_addr = value_address (tem); |
| 58 | 61 |
| 59 if (obj_addr != 0) | 62 if (obj_addr != 0) |
| 60 { | 63 { |
| 61 type = type_from_class (gdbarch, java_class_from_object (val)); | 64 type = type_from_class (gdbarch, java_class_from_object (val)); |
| 62 type = lookup_pointer_type (type); | 65 type = lookup_pointer_type (type); |
| 63 | 66 |
| 64 val = value_at (type, address); | 67 val = value_at (type, address); |
| 65 } | 68 } |
| 66 } | 69 } |
| 67 | 70 |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 things_printed++; | 201 things_printed++; |
| 199 i += reps; | 202 i += reps; |
| 200 } | 203 } |
| 201 } | 204 } |
| 202 | 205 |
| 203 if (i < length) | 206 if (i < length) |
| 204 fprintf_filtered (stream, "..."); | 207 fprintf_filtered (stream, "..."); |
| 205 | 208 |
| 206 fprintf_filtered (stream, "}"); | 209 fprintf_filtered (stream, "}"); |
| 207 | 210 |
| 208 return 0; | 211 return; |
| 209 } | 212 } |
| 210 | 213 |
| 211 /* If it's type String, print it. */ | 214 /* If it's type String, print it. */ |
| 212 | 215 |
| 213 if (TYPE_CODE (type) == TYPE_CODE_PTR | 216 if (TYPE_CODE (type) == TYPE_CODE_PTR |
| 214 && TYPE_TARGET_TYPE (type) | 217 && TYPE_TARGET_TYPE (type) |
| 215 && TYPE_TAG_NAME (TYPE_TARGET_TYPE (type)) | 218 && TYPE_TAG_NAME (TYPE_TARGET_TYPE (type)) |
| 216 && strcmp (TYPE_TAG_NAME (TYPE_TARGET_TYPE (type)), | 219 && strcmp (TYPE_TAG_NAME (TYPE_TARGET_TYPE (type)), |
| 217 "java.lang.String") == 0 | 220 "java.lang.String") == 0 |
| 218 && (options->format == 0 || options->format == 's') | 221 && (options->format == 0 || options->format == 's') |
| 219 && address != 0 | 222 && address != 0 |
| 220 && value_as_address (val) != 0) | 223 && value_as_address (val) != 0) |
| 221 { | 224 { |
| 222 struct type *char_type; | 225 struct type *char_type; |
| 223 struct value *data_val; | 226 struct value *data_val; |
| 224 CORE_ADDR data; | 227 CORE_ADDR data; |
| 225 struct value *boffset_val; | 228 struct value *boffset_val; |
| 226 unsigned long boffset; | 229 unsigned long boffset; |
| 227 struct value *count_val; | 230 struct value *count_val; |
| 228 unsigned long count; | 231 unsigned long count; |
| 229 struct value *mark; | 232 struct value *mark; |
| 230 | 233 |
| 234 fputs_filtered (" ", stream); |
| 235 |
| 231 mark = value_mark (); /* Remember start of new values. */ | 236 mark = value_mark (); /* Remember start of new values. */ |
| 232 | 237 |
| 233 data_val = value_struct_elt (&val, NULL, "data", NULL, NULL); | 238 data_val = value_struct_elt (&val, NULL, "data", NULL, NULL); |
| 234 data = value_as_address (data_val); | 239 data = value_as_address (data_val); |
| 235 | 240 |
| 236 boffset_val = value_struct_elt (&val, NULL, "boffset", NULL, NULL); | 241 boffset_val = value_struct_elt (&val, NULL, "boffset", NULL, NULL); |
| 237 boffset = value_as_address (boffset_val); | 242 boffset = value_as_address (boffset_val); |
| 238 | 243 |
| 239 count_val = value_struct_elt (&val, NULL, "count", NULL, NULL); | 244 count_val = value_struct_elt (&val, NULL, "count", NULL, NULL); |
| 240 count = value_as_address (count_val); | 245 count = value_as_address (count_val); |
| 241 | 246 |
| 242 value_free_to_mark (mark); /* Release unnecessary values. */ | 247 value_free_to_mark (mark); /* Release unnecessary values. */ |
| 243 | 248 |
| 244 char_type = builtin_java_type (gdbarch)->builtin_char; | 249 char_type = builtin_java_type (gdbarch)->builtin_char; |
| 245 val_print_string (char_type, NULL, data + boffset, count, stream, | 250 val_print_string (char_type, NULL, data + boffset, count, stream, |
| 246 options); | 251 options); |
| 247 | 252 |
| 248 return 0; | 253 return; |
| 249 } | 254 } |
| 250 | 255 |
| 251 opts = *options; | 256 opts = *options; |
| 252 opts.deref_ref = 1; | 257 opts.deref_ref = 1; |
| 253 return common_val_print (val, stream, 0, &opts, current_language); | 258 common_val_print (val, stream, 0, &opts, current_language); |
| 254 } | 259 } |
| 255 | 260 |
| 256 /* TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and OPTIONS have the | 261 /* TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and OPTIONS have the |
| 257 same meanings as in cp_print_value and c_val_print. | 262 same meanings as in cp_print_value and c_val_print. |
| 258 | 263 |
| 259 DONT_PRINT is an array of baseclass types that we | 264 DONT_PRINT is an array of baseclass types that we |
| 260 should not print, or zero if called from top level. */ | 265 should not print, or zero if called from top level. */ |
| 261 | 266 |
| 262 static void | 267 static void |
| 263 java_print_value_fields (struct type *type, const gdb_byte *valaddr, | 268 java_print_value_fields (struct type *type, const gdb_byte *valaddr, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 276 n_baseclasses = TYPE_N_BASECLASSES (type); | 281 n_baseclasses = TYPE_N_BASECLASSES (type); |
| 277 | 282 |
| 278 if (n_baseclasses > 0) | 283 if (n_baseclasses > 0) |
| 279 { | 284 { |
| 280 int i, n_baseclasses = TYPE_N_BASECLASSES (type); | 285 int i, n_baseclasses = TYPE_N_BASECLASSES (type); |
| 281 | 286 |
| 282 for (i = 0; i < n_baseclasses; i++) | 287 for (i = 0; i < n_baseclasses; i++) |
| 283 { | 288 { |
| 284 int boffset; | 289 int boffset; |
| 285 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i)); | 290 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i)); |
| 286 » char *basename = TYPE_NAME (baseclass); | 291 » const char *basename = TYPE_NAME (baseclass); |
| 287 const gdb_byte *base_valaddr; | 292 const gdb_byte *base_valaddr; |
| 288 | 293 |
| 289 if (BASETYPE_VIA_VIRTUAL (type, i)) | 294 if (BASETYPE_VIA_VIRTUAL (type, i)) |
| 290 continue; | 295 continue; |
| 291 | 296 |
| 292 if (basename != NULL && strcmp (basename, "java.lang.Object") == 0) | 297 if (basename != NULL && strcmp (basename, "java.lang.Object") == 0) |
| 293 continue; | 298 continue; |
| 294 | 299 |
| 295 boffset = 0; | 300 boffset = 0; |
| 296 | 301 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 318 fprintf_filtered (stream, "<No data fields>"); | 323 fprintf_filtered (stream, "<No data fields>"); |
| 319 else | 324 else |
| 320 { | 325 { |
| 321 int fields_seen = 0; | 326 int fields_seen = 0; |
| 322 | 327 |
| 323 for (i = n_baseclasses; i < len; i++) | 328 for (i = n_baseclasses; i < len; i++) |
| 324 { | 329 { |
| 325 /* If requested, skip printing of static fields. */ | 330 /* If requested, skip printing of static fields. */ |
| 326 if (field_is_static (&TYPE_FIELD (type, i))) | 331 if (field_is_static (&TYPE_FIELD (type, i))) |
| 327 { | 332 { |
| 328 » char *name = TYPE_FIELD_NAME (type, i); | 333 » const char *name = TYPE_FIELD_NAME (type, i); |
| 329 | 334 |
| 330 if (!options->static_field_print) | 335 if (!options->static_field_print) |
| 331 continue; | 336 continue; |
| 332 if (name != NULL && strcmp (name, "class") == 0) | 337 if (name != NULL && strcmp (name, "class") == 0) |
| 333 continue; | 338 continue; |
| 334 } | 339 } |
| 335 if (fields_seen) | 340 if (fields_seen) |
| 336 fprintf_filtered (stream, ", "); | 341 fprintf_filtered (stream, ", "); |
| 337 else if (n_baseclasses > 0) | 342 else if (n_baseclasses > 0) |
| 338 { | 343 { |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 if (options->pretty) | 473 if (options->pretty) |
| 469 { | 474 { |
| 470 fprintf_filtered (stream, "\n"); | 475 fprintf_filtered (stream, "\n"); |
| 471 print_spaces_filtered (2 * recurse, stream); | 476 print_spaces_filtered (2 * recurse, stream); |
| 472 } | 477 } |
| 473 } | 478 } |
| 474 fprintf_filtered (stream, "}"); | 479 fprintf_filtered (stream, "}"); |
| 475 } | 480 } |
| 476 | 481 |
| 477 /* See val_print for a description of the various parameters of this | 482 /* See val_print for a description of the various parameters of this |
| 478 function; they are identical. The semantics of the return value is | 483 function; they are identical. */ |
| 479 also identical to val_print. */ | |
| 480 | 484 |
| 481 int | 485 void |
| 482 java_val_print (struct type *type, const gdb_byte *valaddr, | 486 java_val_print (struct type *type, const gdb_byte *valaddr, |
| 483 int embedded_offset, CORE_ADDR address, | 487 int embedded_offset, CORE_ADDR address, |
| 484 struct ui_file *stream, int recurse, | 488 struct ui_file *stream, int recurse, |
| 485 const struct value *val, | 489 const struct value *val, |
| 486 const struct value_print_options *options) | 490 const struct value_print_options *options) |
| 487 { | 491 { |
| 488 struct gdbarch *gdbarch = get_type_arch (type); | 492 struct gdbarch *gdbarch = get_type_arch (type); |
| 489 unsigned int i = 0; /* Number of characters printed. */ | 493 unsigned int i = 0; /* Number of characters printed. */ |
| 490 struct type *target_type; | 494 struct type *target_type; |
| 491 CORE_ADDR addr; | 495 CORE_ADDR addr; |
| 492 | 496 |
| 493 CHECK_TYPEDEF (type); | 497 CHECK_TYPEDEF (type); |
| 494 switch (TYPE_CODE (type)) | 498 switch (TYPE_CODE (type)) |
| 495 { | 499 { |
| 496 case TYPE_CODE_PTR: | 500 case TYPE_CODE_PTR: |
| 497 if (options->format && options->format != 's') | 501 if (options->format && options->format != 's') |
| 498 { | 502 { |
| 499 val_print_scalar_formatted (type, valaddr, embedded_offset, | 503 val_print_scalar_formatted (type, valaddr, embedded_offset, |
| 500 val, options, 0, stream); | 504 val, options, 0, stream); |
| 501 break; | 505 break; |
| 502 } | 506 } |
| 503 #if 0 | |
| 504 if (options->vtblprint && cp_is_vtbl_ptr_type (type)) | |
| 505 { | |
| 506 /* Print the unmangled name if desired. */ | |
| 507 /* Print vtable entry - we only get here if we ARE using | |
| 508 -fvtable_thunks. (Otherwise, look under TYPE_CODE_STRUCT.) */ | |
| 509 /* Extract an address, assume that it is unsigned. */ | |
| 510 print_address_demangle | |
| 511 (gdbarch, | |
| 512 extract_unsigned_integer (valaddr + embedded_offset, | |
| 513 TYPE_LENGTH (type)), | |
| 514 stream, demangle); | |
| 515 break; | |
| 516 } | |
| 517 #endif | |
| 518 addr = unpack_pointer (type, valaddr + embedded_offset); | 507 addr = unpack_pointer (type, valaddr + embedded_offset); |
| 519 if (addr == 0) | 508 if (addr == 0) |
| 520 { | 509 { |
| 521 fputs_filtered ("null", stream); | 510 fputs_filtered ("null", stream); |
| 522 » return i; | 511 » return; |
| 523 } | 512 } |
| 524 target_type = check_typedef (TYPE_TARGET_TYPE (type)); | 513 target_type = check_typedef (TYPE_TARGET_TYPE (type)); |
| 525 | 514 |
| 526 if (TYPE_CODE (target_type) == TYPE_CODE_FUNC) | 515 if (TYPE_CODE (target_type) == TYPE_CODE_FUNC) |
| 527 { | 516 { |
| 528 /* Try to print what function it points to. */ | 517 /* Try to print what function it points to. */ |
| 529 » print_address_demangle (gdbarch, addr, stream, demangle); | 518 » print_address_demangle (options, gdbarch, addr, stream, demangle); |
| 530 » /* Return value is irrelevant except for string pointers. */ | 519 » return; |
| 531 » return (0); | |
| 532 } | 520 } |
| 533 | 521 |
| 534 if (options->addressprint && options->format != 's') | 522 if (options->addressprint && options->format != 's') |
| 535 { | 523 { |
| 536 fputs_filtered ("@", stream); | 524 fputs_filtered ("@", stream); |
| 537 print_longest (stream, 'x', 0, (ULONGEST) addr); | 525 print_longest (stream, 'x', 0, (ULONGEST) addr); |
| 538 } | 526 } |
| 539 | 527 |
| 540 return i; | 528 return; |
| 541 | 529 |
| 542 case TYPE_CODE_CHAR: | 530 case TYPE_CODE_CHAR: |
| 543 case TYPE_CODE_INT: | 531 case TYPE_CODE_INT: |
| 544 /* Can't just call c_val_print because that prints bytes as C | 532 /* Can't just call c_val_print because that prints bytes as C |
| 545 chars. */ | 533 chars. */ |
| 546 if (options->format || options->output_format) | 534 if (options->format || options->output_format) |
| 547 { | 535 { |
| 548 struct value_print_options opts = *options; | 536 struct value_print_options opts = *options; |
| 549 | 537 |
| 550 opts.format = (options->format ? options->format | 538 opts.format = (options->format ? options->format |
| (...skipping 10 matching lines...) Expand all Loading... |
| 561 else | 549 else |
| 562 val_print_type_code_int (type, valaddr + embedded_offset, stream); | 550 val_print_type_code_int (type, valaddr + embedded_offset, stream); |
| 563 break; | 551 break; |
| 564 | 552 |
| 565 case TYPE_CODE_STRUCT: | 553 case TYPE_CODE_STRUCT: |
| 566 java_print_value_fields (type, valaddr, embedded_offset, | 554 java_print_value_fields (type, valaddr, embedded_offset, |
| 567 address, stream, recurse, val, options); | 555 address, stream, recurse, val, options); |
| 568 break; | 556 break; |
| 569 | 557 |
| 570 default: | 558 default: |
| 571 return c_val_print (type, valaddr, embedded_offset, address, stream, | 559 c_val_print (type, valaddr, embedded_offset, address, stream, |
| 572 » » » recurse, val, options); | 560 » » recurse, val, options); |
| 561 break; |
| 573 } | 562 } |
| 574 | |
| 575 return 0; | |
| 576 } | 563 } |
| OLD | NEW |