OLD | NEW |
1 /* Support for printing D values for GDB, the GNU debugger. | 1 /* Support for printing D values for GDB, the GNU debugger. |
2 | 2 |
3 Copyright (C) 2008-2012 Free Software Foundation, Inc. | 3 Copyright (C) 2008-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. |
11 | 11 |
12 This program is distributed in the hope that it will be useful, | 12 This program is distributed in the hope that it will be useful, |
13 but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 GNU General Public License for more details. | 15 GNU General Public License for more details. |
16 | 16 |
17 You should have received a copy of the GNU General Public License | 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/>. */ | 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
19 | 19 |
20 #include "defs.h" | 20 #include "defs.h" |
21 #include "gdbtypes.h" | 21 #include "gdbtypes.h" |
22 #include "gdbcore.h" | 22 #include "gdbcore.h" |
23 #include "d-lang.h" | 23 #include "d-lang.h" |
24 #include "c-lang.h" | 24 #include "c-lang.h" |
25 | 25 |
26 /* Assuming that TYPE is a TYPE_CODE_STRUCT, verify that TYPE is | 26 /* Assuming that TYPE is a TYPE_CODE_STRUCT, verify that TYPE is a |
27 a dynamic array, and then print its value to STREAM. Return | 27 dynamic array, and then print its value to STREAM. Return zero if |
28 the number of string characters printed, or -1 if TYPE is not | 28 TYPE is a dynamic array, non-zero otherwise. */ |
29 a dynamic array. */ | 29 |
30 static int | 30 static int |
31 dynamic_array_type (struct type *type, const gdb_byte *valaddr, | 31 dynamic_array_type (struct type *type, const gdb_byte *valaddr, |
32 int embedded_offset, CORE_ADDR address, | 32 int embedded_offset, CORE_ADDR address, |
33 struct ui_file *stream, int recurse, | 33 struct ui_file *stream, int recurse, |
34 const struct value *val, | 34 const struct value *val, |
35 const struct value_print_options *options) | 35 const struct value_print_options *options) |
36 { | 36 { |
37 if (TYPE_NFIELDS (type) == 2 | 37 if (TYPE_NFIELDS (type) == 2 |
38 && TYPE_CODE (TYPE_FIELD_TYPE (type, 0)) == TYPE_CODE_INT | 38 && TYPE_CODE (TYPE_FIELD_TYPE (type, 0)) == TYPE_CODE_INT |
39 && strcmp (TYPE_FIELD_NAME (type, 0), "length") == 0 | 39 && strcmp (TYPE_FIELD_NAME (type, 0), "length") == 0 |
(...skipping 13 matching lines...) Expand all Loading... |
53 ptr_type = TYPE_FIELD_TYPE (type, 1); | 53 ptr_type = TYPE_FIELD_TYPE (type, 1); |
54 elttype = check_typedef (TYPE_TARGET_TYPE (ptr_type)); | 54 elttype = check_typedef (TYPE_TARGET_TYPE (ptr_type)); |
55 addr = unpack_pointer (ptr_type, | 55 addr = unpack_pointer (ptr_type, |
56 valaddr + TYPE_FIELD_BITPOS (type, 1) / 8 | 56 valaddr + TYPE_FIELD_BITPOS (type, 1) / 8 |
57 + embedded_offset); | 57 + embedded_offset); |
58 true_type = check_typedef (elttype); | 58 true_type = check_typedef (elttype); |
59 | 59 |
60 true_type = lookup_array_range_type (true_type, 0, length - 1); | 60 true_type = lookup_array_range_type (true_type, 0, length - 1); |
61 ival = value_at (true_type, addr); | 61 ival = value_at (true_type, addr); |
62 | 62 |
63 return d_val_print (true_type, | 63 d_val_print (true_type, |
64 » » » value_contents_for_printing (ival), | 64 » » value_contents_for_printing (ival), |
65 » » » value_embedded_offset (ival), addr, | 65 » » value_embedded_offset (ival), addr, |
66 » » » stream, recurse + 1, ival, options); | 66 » » stream, recurse + 1, ival, options); |
| 67 return 0; |
67 } | 68 } |
68 return -1; | 69 return 1; |
69 } | 70 } |
70 | 71 |
71 /* Implements the la_val_print routine for language D. */ | 72 /* Implements the la_val_print routine for language D. */ |
72 int | 73 void |
73 d_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, | 74 d_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, |
74 CORE_ADDR address, struct ui_file *stream, int recurse, | 75 CORE_ADDR address, struct ui_file *stream, int recurse, |
75 const struct value *val, | 76 const struct value *val, |
76 const struct value_print_options *options) | 77 const struct value_print_options *options) |
77 { | 78 { |
78 int ret; | 79 int ret; |
79 | 80 |
80 CHECK_TYPEDEF (type); | 81 CHECK_TYPEDEF (type); |
81 switch (TYPE_CODE (type)) | 82 switch (TYPE_CODE (type)) |
82 { | 83 { |
83 case TYPE_CODE_STRUCT: | 84 case TYPE_CODE_STRUCT: |
84 ret = dynamic_array_type (type, valaddr, embedded_offset, address, | 85 ret = dynamic_array_type (type, valaddr, embedded_offset, address, |
85 stream, recurse, val, options); | 86 stream, recurse, val, options); |
86 » if (ret != -1) | 87 » if (ret == 0) |
87 » break; | 88 » break; |
88 default: | 89 default: |
89 » ret = c_val_print (type, valaddr, embedded_offset, address, stream, | 90 » c_val_print (type, valaddr, embedded_offset, address, stream, |
90 » » » recurse, val, options); | 91 » » recurse, val, options); |
91 } | 92 } |
92 | |
93 return ret; | |
94 } | 93 } |
OLD | NEW |