Remove redundant typedefs
[deliverable/binutils-gdb.git] / gdb / python / py-type.c
CommitLineData
2c74e833
TT
1/* Python interface to types.
2
b811d2c2 3 Copyright (C) 2008-2020 Free Software Foundation, Inc.
2c74e833
TT
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#include "defs.h"
21#include "value.h"
2c74e833
TT
22#include "python-internal.h"
23#include "charset.h"
24#include "gdbtypes.h"
25#include "cp-support.h"
26#include "demangle.h"
27#include "objfiles.h"
e6c014f2 28#include "language.h"
53342f27 29#include "typeprint.h"
2c74e833 30
f99b5177 31struct type_object
2c74e833
TT
32{
33 PyObject_HEAD
34 struct type *type;
35
36 /* If a Type object is associated with an objfile, it is kept on a
37 doubly-linked list, rooted in the objfile. This lets us copy the
38 underlying struct type when the objfile is deleted. */
f99b5177
TT
39 struct type_object *prev;
40 struct type_object *next;
41};
2c74e833 42
e36122e9 43extern PyTypeObject type_object_type
62eec1a5 44 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("type_object");
2c74e833
TT
45
46/* A Field object. */
f99b5177 47struct field_object
2c74e833
TT
48{
49 PyObject_HEAD
50
51 /* Dictionary holding our attributes. */
52 PyObject *dict;
f99b5177 53};
2c74e833 54
e36122e9 55extern PyTypeObject field_object_type
62eec1a5 56 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("field_object");
2c74e833 57
a73bb892 58/* A type iterator object. */
f99b5177 59struct typy_iterator_object {
a73bb892
PK
60 PyObject_HEAD
61 /* The current field index. */
62 int field;
63 /* What to return. */
64 enum gdbpy_iter_kind kind;
65 /* Pointer back to the original source type object. */
f99b5177
TT
66 type_object *source;
67};
a73bb892 68
e36122e9 69extern PyTypeObject type_iterator_object_type
62eec1a5 70 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("typy_iterator_object");
a73bb892 71
2c74e833
TT
72/* This is used to initialize various gdb.TYPE_ constants. */
73struct pyty_code
74{
75 /* The code. */
76 enum type_code code;
77 /* The name. */
78 const char *name;
79};
80
0dab82e9
PK
81/* Forward declarations. */
82static PyObject *typy_make_iter (PyObject *self, enum gdbpy_iter_kind kind);
83
2c74e833
TT
84#define ENTRY(X) { X, #X }
85
86static struct pyty_code pyty_codes[] =
87{
6b1755ce 88 ENTRY (TYPE_CODE_BITSTRING),
2c74e833
TT
89 ENTRY (TYPE_CODE_PTR),
90 ENTRY (TYPE_CODE_ARRAY),
91 ENTRY (TYPE_CODE_STRUCT),
92 ENTRY (TYPE_CODE_UNION),
93 ENTRY (TYPE_CODE_ENUM),
94 ENTRY (TYPE_CODE_FLAGS),
95 ENTRY (TYPE_CODE_FUNC),
96 ENTRY (TYPE_CODE_INT),
97 ENTRY (TYPE_CODE_FLT),
98 ENTRY (TYPE_CODE_VOID),
99 ENTRY (TYPE_CODE_SET),
100 ENTRY (TYPE_CODE_RANGE),
101 ENTRY (TYPE_CODE_STRING),
2c74e833
TT
102 ENTRY (TYPE_CODE_ERROR),
103 ENTRY (TYPE_CODE_METHOD),
104 ENTRY (TYPE_CODE_METHODPTR),
105 ENTRY (TYPE_CODE_MEMBERPTR),
106 ENTRY (TYPE_CODE_REF),
3fcf899d 107 ENTRY (TYPE_CODE_RVALUE_REF),
2c74e833
TT
108 ENTRY (TYPE_CODE_CHAR),
109 ENTRY (TYPE_CODE_BOOL),
110 ENTRY (TYPE_CODE_COMPLEX),
111 ENTRY (TYPE_CODE_TYPEDEF),
112 ENTRY (TYPE_CODE_NAMESPACE),
113 ENTRY (TYPE_CODE_DECFLOAT),
114 ENTRY (TYPE_CODE_INTERNAL_FUNCTION),
115 { TYPE_CODE_UNDEF, NULL }
116};
117
118\f
119
120static void
121field_dealloc (PyObject *obj)
122{
123 field_object *f = (field_object *) obj;
d59b6f6c 124
2c74e833 125 Py_XDECREF (f->dict);
9a27f2c6 126 Py_TYPE (obj)->tp_free (obj);
2c74e833
TT
127}
128
129static PyObject *
130field_new (void)
131{
88b6faea
TT
132 gdbpy_ref<field_object> result (PyObject_New (field_object,
133 &field_object_type));
d59b6f6c 134
88b6faea 135 if (result != NULL)
2c74e833
TT
136 {
137 result->dict = PyDict_New ();
138 if (!result->dict)
88b6faea 139 return NULL;
2c74e833 140 }
88b6faea 141 return (PyObject *) result.release ();
2c74e833
TT
142}
143
144\f
145
a16b0e22
SC
146/* Return true if OBJ is of type gdb.Field, false otherwise. */
147
148int
149gdbpy_is_field (PyObject *obj)
150{
151 return PyObject_TypeCheck (obj, &field_object_type);
152}
153
2c74e833
TT
154/* Return the code for this type. */
155static PyObject *
156typy_get_code (PyObject *self, void *closure)
157{
158 struct type *type = ((type_object *) self)->type;
d59b6f6c 159
47f0e2ff 160 return gdb_py_object_from_longest (type->code ()).release ();
2c74e833
TT
161}
162
163/* Helper function for typy_fields which converts a single field to a
a73bb892
PK
164 gdb.Field object. Returns NULL on error. */
165
1b20edf0 166static gdbpy_ref<>
2c74e833
TT
167convert_field (struct type *type, int field)
168{
7780f186 169 gdbpy_ref<> result (field_new ());
2c74e833 170
3bb43384 171 if (result == NULL)
2c74e833
TT
172 return NULL;
173
7780f186 174 gdbpy_ref<> arg (type_to_type_object (type));
a16b0e22 175 if (arg == NULL)
3bb43384
TT
176 return NULL;
177 if (PyObject_SetAttrString (result.get (), "parent_type", arg.get ()) < 0)
178 return NULL;
a16b0e22 179
ceacbf6e 180 if (!field_is_static (&type->field (field)))
2c74e833 181 {
14e75d8e
JK
182 const char *attrstring;
183
78134374 184 if (type->code () == TYPE_CODE_ENUM)
14e75d8e 185 {
4bde49dc 186 arg = gdb_py_object_from_longest (TYPE_FIELD_ENUMVAL (type, field));
14e75d8e
JK
187 attrstring = "enumval";
188 }
189 else
190 {
1acda803
TT
191 if (TYPE_FIELD_LOC_KIND (type, field) == FIELD_LOC_KIND_DWARF_BLOCK)
192 arg = gdbpy_ref<>::new_reference (Py_None);
193 else
4bde49dc 194 arg = gdb_py_object_from_longest (TYPE_FIELD_BITPOS (type, field));
14e75d8e
JK
195 attrstring = "bitpos";
196 }
197
3bb43384
TT
198 if (arg == NULL)
199 return NULL;
2c74e833 200
6c28e44a 201 if (PyObject_SetAttrString (result.get (), attrstring, arg.get ()) < 0)
3bb43384 202 return NULL;
2c74e833
TT
203 }
204
3bb43384 205 arg.reset (NULL);
2c74e833 206 if (TYPE_FIELD_NAME (type, field))
b5b08fb4
SC
207 {
208 const char *field_name = TYPE_FIELD_NAME (type, field);
a8f35c2e 209
b5b08fb4
SC
210 if (field_name[0] != '\0')
211 {
3bb43384 212 arg.reset (PyString_FromString (TYPE_FIELD_NAME (type, field)));
b5b08fb4 213 if (arg == NULL)
3bb43384 214 return NULL;
b5b08fb4
SC
215 }
216 }
217 if (arg == NULL)
1b20edf0
TT
218 arg = gdbpy_ref<>::new_reference (Py_None);
219
3bb43384
TT
220 if (PyObject_SetAttrString (result.get (), "name", arg.get ()) < 0)
221 return NULL;
2c74e833 222
1b20edf0
TT
223 arg = gdbpy_ref<>::new_reference (TYPE_FIELD_ARTIFICIAL (type, field)
224 ? Py_True : Py_False);
3bb43384
TT
225 if (PyObject_SetAttrString (result.get (), "artificial", arg.get ()) < 0)
226 return NULL;
2c74e833 227
78134374 228 if (type->code () == TYPE_CODE_STRUCT)
1b20edf0
TT
229 arg = gdbpy_ref<>::new_reference (field < TYPE_N_BASECLASSES (type)
230 ? Py_True : Py_False);
bfd31e71 231 else
1b20edf0 232 arg = gdbpy_ref<>::new_reference (Py_False);
3bb43384
TT
233 if (PyObject_SetAttrString (result.get (), "is_base_class", arg.get ()) < 0)
234 return NULL;
235
062534d4 236 arg = gdb_py_object_from_longest (TYPE_FIELD_BITSIZE (type, field));
3bb43384
TT
237 if (arg == NULL)
238 return NULL;
239 if (PyObject_SetAttrString (result.get (), "bitsize", arg.get ()) < 0)
240 return NULL;
2c74e833
TT
241
242 /* A field can have a NULL type in some situations. */
940da03e 243 if (type->field (field).type () == NULL)
1b20edf0 244 arg = gdbpy_ref<>::new_reference (Py_None);
2c74e833 245 else
940da03e 246 arg.reset (type_to_type_object (type->field (field).type ()));
3bb43384
TT
247 if (arg == NULL)
248 return NULL;
249 if (PyObject_SetAttrString (result.get (), "type", arg.get ()) < 0)
250 return NULL;
2c74e833 251
1b20edf0 252 return result;
2c74e833
TT
253}
254
a73bb892
PK
255/* Helper function to return the name of a field, as a gdb.Field object.
256 If the field doesn't have a name, None is returned. */
257
1b20edf0 258static gdbpy_ref<>
a73bb892 259field_name (struct type *type, int field)
2c74e833 260{
1b20edf0 261 gdbpy_ref<> result;
a73bb892
PK
262
263 if (TYPE_FIELD_NAME (type, field))
1b20edf0 264 result.reset (PyString_FromString (TYPE_FIELD_NAME (type, field)));
a73bb892 265 else
1b20edf0
TT
266 result = gdbpy_ref<>::new_reference (Py_None);
267
a73bb892
PK
268 return result;
269}
270
271/* Helper function for Type standard mapping methods. Returns a
272 Python object for field i of the type. "kind" specifies what to
273 return: the name of the field, a gdb.Field object corresponding to
274 the field, or a tuple consisting of field name and gdb.Field
275 object. */
276
1b20edf0 277static gdbpy_ref<>
a73bb892
PK
278make_fielditem (struct type *type, int i, enum gdbpy_iter_kind kind)
279{
a73bb892
PK
280 switch (kind)
281 {
282 case iter_items:
3bb43384 283 {
7780f186 284 gdbpy_ref<> key (field_name (type, i));
3bb43384
TT
285 if (key == NULL)
286 return NULL;
1b20edf0 287 gdbpy_ref<> value = convert_field (type, i);
3bb43384
TT
288 if (value == NULL)
289 return NULL;
7780f186 290 gdbpy_ref<> item (PyTuple_New (2));
3bb43384
TT
291 if (item == NULL)
292 return NULL;
293 PyTuple_SET_ITEM (item.get (), 0, key.release ());
294 PyTuple_SET_ITEM (item.get (), 1, value.release ());
1b20edf0 295 return item;
3bb43384 296 }
a73bb892 297 case iter_keys:
3bb43384 298 return field_name (type, i);
a73bb892 299 case iter_values:
3bb43384 300 return convert_field (type, i);
a73bb892 301 }
3bb43384 302 gdb_assert_not_reached ("invalid gdbpy_iter_kind");
a73bb892
PK
303}
304
305/* Return a sequence of all field names, fields, or (name, field) pairs.
306 Each field is a gdb.Field object. */
307
308static PyObject *
309typy_fields_items (PyObject *self, enum gdbpy_iter_kind kind)
310{
f6b47be4 311 PyObject *py_type = self;
f6b47be4
DE
312 struct type *type = ((type_object *) py_type)->type;
313 struct type *checked_type = type;
314
a70b8144 315 try
f6b47be4 316 {
f168693b 317 checked_type = check_typedef (checked_type);
f6b47be4 318 }
230d2906 319 catch (const gdb_exception &except)
492d29ea
PA
320 {
321 GDB_PY_HANDLE_EXCEPTION (except);
322 }
f6b47be4 323
2a3c71d6 324 gdbpy_ref<> type_holder;
f6b47be4 325 if (checked_type != type)
f6b47be4 326 {
2a3c71d6
TT
327 type_holder.reset (type_to_type_object (checked_type));
328 if (type_holder == nullptr)
329 return nullptr;
330 py_type = type_holder.get ();
f6b47be4 331 }
2a3c71d6
TT
332 gdbpy_ref<> iter (typy_make_iter (py_type, kind));
333 if (iter == nullptr)
334 return nullptr;
f6b47be4 335
2a3c71d6 336 return PySequence_List (iter.get ());
a73bb892
PK
337}
338
339/* Return a sequence of all fields. Each field is a gdb.Field object. */
340
341static PyObject *
9cc10fd1 342typy_values (PyObject *self, PyObject *args)
a73bb892
PK
343{
344 return typy_fields_items (self, iter_values);
345}
346
9cc10fd1 347/* Return a sequence of all fields. Each field is a gdb.Field object.
256458bc 348 This method is similar to typy_values, except where the supplied
9cc10fd1
PK
349 gdb.Type is an array, in which case it returns a list of one entry
350 which is a gdb.Field object for a range (the array bounds). */
351
352static PyObject *
353typy_fields (PyObject *self, PyObject *args)
354{
355 struct type *type = ((type_object *) self)->type;
256458bc 356
78134374 357 if (type->code () != TYPE_CODE_ARRAY)
9cc10fd1
PK
358 return typy_fields_items (self, iter_values);
359
360 /* Array type. Handle this as a special case because the common
361 machinery wants struct or union or enum types. Build a list of
362 one entry which is the range for the array. */
1b20edf0 363 gdbpy_ref<> r = convert_field (type, 0);
9cc10fd1
PK
364 if (r == NULL)
365 return NULL;
256458bc 366
3bb43384 367 return Py_BuildValue ("[O]", r.get ());
9cc10fd1
PK
368}
369
a73bb892
PK
370/* Return a sequence of all field names. Each field is a gdb.Field object. */
371
372static PyObject *
373typy_field_names (PyObject *self, PyObject *args)
374{
375 return typy_fields_items (self, iter_keys);
376}
377
256458bc 378/* Return a sequence of all (name, fields) pairs. Each field is a
a73bb892
PK
379 gdb.Field object. */
380
381static PyObject *
382typy_items (PyObject *self, PyObject *args)
383{
384 return typy_fields_items (self, iter_items);
2c74e833
TT
385}
386
c0d48811
JB
387/* Return the type's name, or None. */
388
389static PyObject *
390typy_get_name (PyObject *self, void *closure)
391{
392 struct type *type = ((type_object *) self)->type;
393
7d93a1e0 394 if (type->name () == NULL)
c0d48811 395 Py_RETURN_NONE;
7d93a1e0 396 return PyString_FromString (type->name ());
c0d48811
JB
397}
398
2c74e833
TT
399/* Return the type's tag, or None. */
400static PyObject *
401typy_get_tag (PyObject *self, void *closure)
402{
403 struct type *type = ((type_object *) self)->type;
e86ca25f 404 const char *tagname = nullptr;
d59b6f6c 405
78134374
SM
406 if (type->code () == TYPE_CODE_STRUCT
407 || type->code () == TYPE_CODE_UNION
408 || type->code () == TYPE_CODE_ENUM)
7d93a1e0 409 tagname = type->name ();
e86ca25f
TT
410
411 if (tagname == nullptr)
2c74e833 412 Py_RETURN_NONE;
e86ca25f 413 return PyString_FromString (tagname);
2c74e833
TT
414}
415
e1f2e1a2
CB
416/* Return the type's objfile, or None. */
417static PyObject *
418typy_get_objfile (PyObject *self, void *closure)
419{
420 struct type *type = ((type_object *) self)->type;
421 struct objfile *objfile = TYPE_OBJFILE (type);
422
423 if (objfile == nullptr)
424 Py_RETURN_NONE;
425 return objfile_to_objfile_object (objfile).release ();
426}
427
2c74e833
TT
428/* Return the type, stripped of typedefs. */
429static PyObject *
430typy_strip_typedefs (PyObject *self, PyObject *args)
431{
432 struct type *type = ((type_object *) self)->type;
5d9c5995 433
a70b8144 434 try
5d9c5995
PM
435 {
436 type = check_typedef (type);
437 }
230d2906 438 catch (const gdb_exception &except)
492d29ea
PA
439 {
440 GDB_PY_HANDLE_EXCEPTION (except);
441 }
2c74e833 442
bc9abe4a 443 return type_to_type_object (type);
2c74e833
TT
444}
445
9cc10fd1
PK
446/* Strip typedefs and pointers/reference from a type. Then check that
447 it is a struct, union, or enum type. If not, raise TypeError. */
448
449static struct type *
450typy_get_composite (struct type *type)
451{
9cc10fd1
PK
452
453 for (;;)
454 {
a70b8144 455 try
9cc10fd1 456 {
f168693b 457 type = check_typedef (type);
9cc10fd1 458 }
230d2906 459 catch (const gdb_exception &except)
492d29ea
PA
460 {
461 GDB_PY_HANDLE_EXCEPTION (except);
462 }
9cc10fd1 463
78134374 464 if (type->code () != TYPE_CODE_PTR && !TYPE_IS_REFERENCE (type))
9cc10fd1
PK
465 break;
466 type = TYPE_TARGET_TYPE (type);
467 }
468
469 /* If this is not a struct, union, or enum type, raise TypeError
470 exception. */
78134374
SM
471 if (type->code () != TYPE_CODE_STRUCT
472 && type->code () != TYPE_CODE_UNION
473 && type->code () != TYPE_CODE_ENUM
474 && type->code () != TYPE_CODE_FUNC)
9cc10fd1
PK
475 {
476 PyErr_SetString (PyExc_TypeError,
bed91f4d 477 "Type is not a structure, union, enum, or function type.");
9cc10fd1
PK
478 return NULL;
479 }
256458bc 480
9cc10fd1
PK
481 return type;
482}
483
a72c3253 484/* Helper for typy_array and typy_vector. */
702c2711
TT
485
486static PyObject *
a72c3253 487typy_array_1 (PyObject *self, PyObject *args, int is_vector)
702c2711 488{
74aedc46 489 long n1, n2;
702c2711
TT
490 PyObject *n2_obj = NULL;
491 struct type *array = NULL;
492 struct type *type = ((type_object *) self)->type;
702c2711 493
74aedc46 494 if (! PyArg_ParseTuple (args, "l|O", &n1, &n2_obj))
702c2711
TT
495 return NULL;
496
497 if (n2_obj)
498 {
499 if (!PyInt_Check (n2_obj))
500 {
501 PyErr_SetString (PyExc_RuntimeError,
502 _("Array bound must be an integer"));
503 return NULL;
504 }
74aedc46
TT
505
506 if (! gdb_py_int_as_long (n2_obj, &n2))
702c2711
TT
507 return NULL;
508 }
509 else
510 {
511 n2 = n1;
512 n1 = 0;
513 }
514
e810d75b 515 if (n2 < n1 - 1) /* Note: An empty array has n2 == n1 - 1. */
702c2711
TT
516 {
517 PyErr_SetString (PyExc_ValueError,
518 _("Array length must not be negative"));
519 return NULL;
520 }
521
a70b8144 522 try
702c2711
TT
523 {
524 array = lookup_array_range_type (type, n1, n2);
a72c3253
DE
525 if (is_vector)
526 make_vector_type (array);
702c2711 527 }
230d2906 528 catch (const gdb_exception &except)
492d29ea
PA
529 {
530 GDB_PY_HANDLE_EXCEPTION (except);
531 }
702c2711
TT
532
533 return type_to_type_object (array);
534}
535
a72c3253
DE
536/* Return an array type. */
537
538static PyObject *
539typy_array (PyObject *self, PyObject *args)
540{
541 return typy_array_1 (self, args, 0);
542}
543
544/* Return a vector type. */
545
546static PyObject *
547typy_vector (PyObject *self, PyObject *args)
548{
549 return typy_array_1 (self, args, 1);
550}
551
2c74e833
TT
552/* Return a Type object which represents a pointer to SELF. */
553static PyObject *
554typy_pointer (PyObject *self, PyObject *args)
555{
556 struct type *type = ((type_object *) self)->type;
2c74e833 557
a70b8144 558 try
2c74e833
TT
559 {
560 type = lookup_pointer_type (type);
561 }
230d2906 562 catch (const gdb_exception &except)
492d29ea
PA
563 {
564 GDB_PY_HANDLE_EXCEPTION (except);
565 }
2c74e833
TT
566
567 return type_to_type_object (type);
568}
569
361ae042
PM
570/* Return the range of a type represented by SELF. The return type is
571 a tuple. The first element of the tuple contains the low bound,
572 while the second element of the tuple contains the high bound. */
573static PyObject *
574typy_range (PyObject *self, PyObject *args)
575{
576 struct type *type = ((type_object *) self)->type;
8d099ae9
PM
577 /* Initialize these to appease GCC warnings. */
578 LONGEST low = 0, high = 0;
361ae042 579
78134374
SM
580 if (type->code () != TYPE_CODE_ARRAY
581 && type->code () != TYPE_CODE_STRING
582 && type->code () != TYPE_CODE_RANGE)
361ae042
PM
583 {
584 PyErr_SetString (PyExc_RuntimeError,
044c0f87 585 _("This type does not have a range."));
361ae042
PM
586 return NULL;
587 }
588
78134374 589 switch (type->code ())
361ae042
PM
590 {
591 case TYPE_CODE_ARRAY:
592 case TYPE_CODE_STRING:
361ae042 593 case TYPE_CODE_RANGE:
5537ddd0
SM
594 low = type->bounds ()->low.const_val ();
595 high = type->bounds ()->high.const_val ();;
361ae042
PM
596 break;
597 }
598
062534d4 599 gdbpy_ref<> low_bound = gdb_py_object_from_longest (low);
3bb43384
TT
600 if (low_bound == NULL)
601 return NULL;
361ae042 602
062534d4 603 gdbpy_ref<> high_bound = gdb_py_object_from_longest (high);
3bb43384
TT
604 if (high_bound == NULL)
605 return NULL;
361ae042 606
7780f186 607 gdbpy_ref<> result (PyTuple_New (2));
3bb43384
TT
608 if (result == NULL)
609 return NULL;
256458bc 610
3bb43384
TT
611 if (PyTuple_SetItem (result.get (), 0, low_bound.release ()) != 0
612 || PyTuple_SetItem (result.get (), 1, high_bound.release ()) != 0)
613 return NULL;
614 return result.release ();
361ae042
PM
615}
616
2c74e833
TT
617/* Return a Type object which represents a reference to SELF. */
618static PyObject *
619typy_reference (PyObject *self, PyObject *args)
620{
621 struct type *type = ((type_object *) self)->type;
2c74e833 622
a70b8144 623 try
2c74e833 624 {
3b224330 625 type = lookup_lvalue_reference_type (type);
2c74e833 626 }
230d2906 627 catch (const gdb_exception &except)
492d29ea
PA
628 {
629 GDB_PY_HANDLE_EXCEPTION (except);
630 }
2c74e833
TT
631
632 return type_to_type_object (type);
633}
634
635/* Return a Type object which represents the target type of SELF. */
636static PyObject *
637typy_target (PyObject *self, PyObject *args)
638{
639 struct type *type = ((type_object *) self)->type;
640
641 if (!TYPE_TARGET_TYPE (type))
642 {
256458bc 643 PyErr_SetString (PyExc_RuntimeError,
044c0f87 644 _("Type does not have a target."));
2c74e833
TT
645 return NULL;
646 }
647
648 return type_to_type_object (TYPE_TARGET_TYPE (type));
649}
650
651/* Return a const-qualified type variant. */
652static PyObject *
653typy_const (PyObject *self, PyObject *args)
654{
655 struct type *type = ((type_object *) self)->type;
2c74e833 656
a70b8144 657 try
2c74e833
TT
658 {
659 type = make_cv_type (1, 0, type, NULL);
660 }
230d2906 661 catch (const gdb_exception &except)
492d29ea
PA
662 {
663 GDB_PY_HANDLE_EXCEPTION (except);
664 }
2c74e833
TT
665
666 return type_to_type_object (type);
667}
668
669/* Return a volatile-qualified type variant. */
670static PyObject *
671typy_volatile (PyObject *self, PyObject *args)
672{
673 struct type *type = ((type_object *) self)->type;
2c74e833 674
a70b8144 675 try
2c74e833
TT
676 {
677 type = make_cv_type (0, 1, type, NULL);
678 }
230d2906 679 catch (const gdb_exception &except)
492d29ea
PA
680 {
681 GDB_PY_HANDLE_EXCEPTION (except);
682 }
2c74e833
TT
683
684 return type_to_type_object (type);
685}
686
687/* Return an unqualified type variant. */
688static PyObject *
689typy_unqualified (PyObject *self, PyObject *args)
690{
691 struct type *type = ((type_object *) self)->type;
2c74e833 692
a70b8144 693 try
2c74e833
TT
694 {
695 type = make_cv_type (0, 0, type, NULL);
696 }
230d2906 697 catch (const gdb_exception &except)
492d29ea
PA
698 {
699 GDB_PY_HANDLE_EXCEPTION (except);
700 }
2c74e833
TT
701
702 return type_to_type_object (type);
703}
704
705/* Return the size of the type represented by SELF, in bytes. */
706static PyObject *
707typy_get_sizeof (PyObject *self, void *closure)
708{
709 struct type *type = ((type_object *) self)->type;
2c74e833 710
1acda803 711 bool size_varies = false;
a70b8144 712 try
2c74e833
TT
713 {
714 check_typedef (type);
1acda803
TT
715
716 size_varies = TYPE_HAS_DYNAMIC_LENGTH (type);
2c74e833 717 }
230d2906 718 catch (const gdb_exception &except)
492d29ea
PA
719 {
720 }
492d29ea 721
2c74e833
TT
722 /* Ignore exceptions. */
723
1acda803
TT
724 if (size_varies)
725 Py_RETURN_NONE;
4bde49dc 726 return gdb_py_object_from_longest (TYPE_LENGTH (type)).release ();
2c74e833
TT
727}
728
6d7bb824
TT
729/* Return the alignment of the type represented by SELF, in bytes. */
730static PyObject *
731typy_get_alignof (PyObject *self, void *closure)
732{
733 struct type *type = ((type_object *) self)->type;
734
735 ULONGEST align = 0;
a70b8144 736 try
6d7bb824
TT
737 {
738 align = type_align (type);
739 }
230d2906 740 catch (const gdb_exception &except)
6d7bb824
TT
741 {
742 align = 0;
743 }
6d7bb824
TT
744
745 /* Ignore exceptions. */
746
12dfa12a 747 return gdb_py_object_from_ulongest (align).release ();
6d7bb824
TT
748}
749
1acda803
TT
750/* Return whether or not the type is dynamic. */
751static PyObject *
752typy_get_dynamic (PyObject *self, void *closure)
753{
754 struct type *type = ((type_object *) self)->type;
755
756 bool result = false;
757 try
758 {
759 result = is_dynamic_type (type);
760 }
761 catch (const gdb_exception &except)
762 {
763 /* Ignore exceptions. */
764 }
765
766 if (result)
767 Py_RETURN_TRUE;
768 Py_RETURN_FALSE;
769}
770
2c74e833 771static struct type *
9df2fbc4 772typy_lookup_typename (const char *type_name, const struct block *block)
2c74e833
TT
773{
774 struct type *type = NULL;
d59b6f6c 775
a70b8144 776 try
2c74e833 777 {
61012eef 778 if (startswith (type_name, "struct "))
2c74e833 779 type = lookup_struct (type_name + 7, NULL);
61012eef 780 else if (startswith (type_name, "union "))
2c74e833 781 type = lookup_union (type_name + 6, NULL);
61012eef 782 else if (startswith (type_name, "enum "))
2c74e833
TT
783 type = lookup_enum (type_name + 5, NULL);
784 else
b858499d 785 type = lookup_typename (python_language,
5107b149 786 type_name, block, 0);
2c74e833 787 }
230d2906 788 catch (const gdb_exception &except)
492d29ea
PA
789 {
790 GDB_PY_HANDLE_EXCEPTION (except);
791 }
2c74e833
TT
792
793 return type;
794}
795
796static struct type *
5107b149 797typy_lookup_type (struct demangle_component *demangled,
9df2fbc4 798 const struct block *block)
2c74e833 799{
cd829959 800 struct type *type, *rtype = NULL;
2c74e833
TT
801 enum demangle_component_type demangled_type;
802
803 /* Save the type: typy_lookup_type() may (indirectly) overwrite
804 memory pointed by demangled. */
805 demangled_type = demangled->type;
806
807 if (demangled_type == DEMANGLE_COMPONENT_POINTER
808 || demangled_type == DEMANGLE_COMPONENT_REFERENCE
e4347c89 809 || demangled_type == DEMANGLE_COMPONENT_RVALUE_REFERENCE
2c74e833
TT
810 || demangled_type == DEMANGLE_COMPONENT_CONST
811 || demangled_type == DEMANGLE_COMPONENT_VOLATILE)
812 {
5107b149 813 type = typy_lookup_type (demangled->u.s_binary.left, block);
2c74e833
TT
814 if (! type)
815 return NULL;
816
a70b8144 817 try
76dce0be 818 {
cd829959
PM
819 /* If the demangled_type matches with one of the types
820 below, run the corresponding function and save the type
821 to return later. We cannot just return here as we are in
822 an exception handler. */
76dce0be
PM
823 switch (demangled_type)
824 {
825 case DEMANGLE_COMPONENT_REFERENCE:
3b224330 826 rtype = lookup_lvalue_reference_type (type);
cd829959 827 break;
e4347c89
AV
828 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
829 rtype = lookup_rvalue_reference_type (type);
830 break;
76dce0be 831 case DEMANGLE_COMPONENT_POINTER:
cd829959
PM
832 rtype = lookup_pointer_type (type);
833 break;
76dce0be 834 case DEMANGLE_COMPONENT_CONST:
cd829959
PM
835 rtype = make_cv_type (1, 0, type, NULL);
836 break;
76dce0be 837 case DEMANGLE_COMPONENT_VOLATILE:
cd829959
PM
838 rtype = make_cv_type (0, 1, type, NULL);
839 break;
76dce0be 840 }
76dce0be 841 }
230d2906 842 catch (const gdb_exception &except)
492d29ea
PA
843 {
844 GDB_PY_HANDLE_EXCEPTION (except);
845 }
2c74e833 846 }
256458bc 847
cd829959
PM
848 /* If we have a type from the switch statement above, just return
849 that. */
850 if (rtype)
851 return rtype;
256458bc 852
cd829959 853 /* We don't have a type, so lookup the type. */
29592bde
PA
854 gdb::unique_xmalloc_ptr<char> type_name = cp_comp_to_string (demangled, 10);
855 return typy_lookup_typename (type_name.get (), block);
2c74e833
TT
856}
857
326fd672
TT
858/* This is a helper function for typy_template_argument that is used
859 when the type does not have template symbols attached. It works by
860 parsing the type name. This happens with compilers, like older
861 versions of GCC, that do not emit DW_TAG_template_*. */
862
2c74e833 863static PyObject *
9df2fbc4 864typy_legacy_template_argument (struct type *type, const struct block *block,
326fd672 865 int argno)
2c74e833 866{
326fd672 867 int i;
2c74e833 868 struct demangle_component *demangled;
c8b23b3f 869 std::unique_ptr<demangle_parse_info> info;
3513a6bb 870 std::string err;
2c74e833 871 struct type *argtype;
2c74e833 872
7d93a1e0 873 if (type->name () == NULL)
2c74e833 874 {
5107b149 875 PyErr_SetString (PyExc_RuntimeError, _("Null type name."));
2c74e833
TT
876 return NULL;
877 }
878
a70b8144 879 try
5d9c5995
PM
880 {
881 /* Note -- this is not thread-safe. */
7d93a1e0 882 info = cp_demangled_name_to_comp (type->name (), &err);
5d9c5995 883 }
230d2906 884 catch (const gdb_exception &except)
492d29ea
PA
885 {
886 GDB_PY_HANDLE_EXCEPTION (except);
887 }
5d9c5995 888
3a93a0c2 889 if (! info)
2c74e833 890 {
3513a6bb 891 PyErr_SetString (PyExc_RuntimeError, err.c_str ());
2c74e833
TT
892 return NULL;
893 }
3a93a0c2 894 demangled = info->tree;
2c74e833
TT
895
896 /* Strip off component names. */
897 while (demangled->type == DEMANGLE_COMPONENT_QUAL_NAME
898 || demangled->type == DEMANGLE_COMPONENT_LOCAL_NAME)
899 demangled = demangled->u.s_binary.right;
900
901 if (demangled->type != DEMANGLE_COMPONENT_TEMPLATE)
902 {
5107b149 903 PyErr_SetString (PyExc_RuntimeError, _("Type is not a template."));
2c74e833
TT
904 return NULL;
905 }
906
907 /* Skip from the template to the arguments. */
908 demangled = demangled->u.s_binary.right;
909
910 for (i = 0; demangled && i < argno; ++i)
911 demangled = demangled->u.s_binary.right;
912
913 if (! demangled)
914 {
5107b149 915 PyErr_Format (PyExc_RuntimeError, _("No argument %d in template."),
2c74e833
TT
916 argno);
917 return NULL;
918 }
919
5107b149 920 argtype = typy_lookup_type (demangled->u.s_binary.left, block);
2c74e833
TT
921 if (! argtype)
922 return NULL;
923
924 return type_to_type_object (argtype);
326fd672
TT
925}
926
927static PyObject *
928typy_template_argument (PyObject *self, PyObject *args)
929{
930 int argno;
931 struct type *type = ((type_object *) self)->type;
9df2fbc4 932 const struct block *block = NULL;
326fd672
TT
933 PyObject *block_obj = NULL;
934 struct symbol *sym;
935 struct value *val = NULL;
326fd672
TT
936
937 if (! PyArg_ParseTuple (args, "i|O", &argno, &block_obj))
938 return NULL;
939
fd3ba736
TT
940 if (argno < 0)
941 {
942 PyErr_SetString (PyExc_RuntimeError,
943 _("Template argument number must be non-negative"));
944 return NULL;
945 }
946
326fd672
TT
947 if (block_obj)
948 {
949 block = block_object_to_block (block_obj);
950 if (! block)
951 {
952 PyErr_SetString (PyExc_RuntimeError,
953 _("Second argument must be block."));
954 return NULL;
955 }
956 }
957
a70b8144 958 try
05d0e1e7
TT
959 {
960 type = check_typedef (type);
aa006118 961 if (TYPE_IS_REFERENCE (type))
05d0e1e7
TT
962 type = check_typedef (TYPE_TARGET_TYPE (type));
963 }
230d2906 964 catch (const gdb_exception &except)
492d29ea
PA
965 {
966 GDB_PY_HANDLE_EXCEPTION (except);
967 }
326fd672
TT
968
969 /* We might not have DW_TAG_template_*, so try to parse the type's
970 name. This is inefficient if we do not have a template type --
971 but that is going to wind up as an error anyhow. */
972 if (! TYPE_N_TEMPLATE_ARGUMENTS (type))
973 return typy_legacy_template_argument (type, block, argno);
974
975 if (argno >= TYPE_N_TEMPLATE_ARGUMENTS (type))
976 {
977 PyErr_Format (PyExc_RuntimeError, _("No argument %d in template."),
978 argno);
979 return NULL;
980 }
981
982 sym = TYPE_TEMPLATE_ARGUMENT (type, argno);
983 if (SYMBOL_CLASS (sym) == LOC_TYPEDEF)
984 return type_to_type_object (SYMBOL_TYPE (sym));
985 else if (SYMBOL_CLASS (sym) == LOC_OPTIMIZED_OUT)
986 {
987 PyErr_Format (PyExc_RuntimeError,
988 _("Template argument is optimized out"));
989 return NULL;
990 }
991
a70b8144 992 try
326fd672
TT
993 {
994 val = value_of_variable (sym, block);
995 }
230d2906 996 catch (const gdb_exception &except)
492d29ea
PA
997 {
998 GDB_PY_HANDLE_EXCEPTION (except);
999 }
326fd672
TT
1000
1001 return value_to_value_object (val);
2c74e833
TT
1002}
1003
1004static PyObject *
1005typy_str (PyObject *self)
1006{
d7e74731 1007 string_file thetype;
2c74e833 1008
a70b8144 1009 try
2c74e833 1010 {
d7e74731 1011 LA_PRINT_TYPE (type_object_to_type (self), "", &thetype, -1, 0,
53342f27 1012 &type_print_raw_options);
2c74e833 1013 }
230d2906 1014 catch (const gdb_exception &except)
2c74e833 1015 {
2c74e833
TT
1016 GDB_PY_HANDLE_EXCEPTION (except);
1017 }
1018
d7e74731
PA
1019 return PyUnicode_Decode (thetype.c_str (), thetype.size (),
1020 host_charset (), NULL);
2c74e833
TT
1021}
1022
d839c8a4
TT
1023/* Implement the richcompare method. */
1024
1025static PyObject *
1026typy_richcompare (PyObject *self, PyObject *other, int op)
1027{
894882e3 1028 bool result = false;
d839c8a4
TT
1029 struct type *type1 = type_object_to_type (self);
1030 struct type *type2 = type_object_to_type (other);
d839c8a4
TT
1031
1032 /* We can only compare ourselves to another Type object, and only
1033 for equality or inequality. */
1034 if (type2 == NULL || (op != Py_EQ && op != Py_NE))
1035 {
1036 Py_INCREF (Py_NotImplemented);
1037 return Py_NotImplemented;
1038 }
1039
1040 if (type1 == type2)
894882e3 1041 result = true;
d839c8a4
TT
1042 else
1043 {
a70b8144 1044 try
d839c8a4 1045 {
ca092b61 1046 result = types_deeply_equal (type1, type2);
d839c8a4 1047 }
230d2906 1048 catch (const gdb_exception &except)
492d29ea
PA
1049 {
1050 /* If there is a GDB exception, a comparison is not capable
1051 (or trusted), so exit. */
1052 GDB_PY_HANDLE_EXCEPTION (except);
1053 }
d839c8a4
TT
1054 }
1055
ca092b61 1056 if (op == (result ? Py_EQ : Py_NE))
d839c8a4
TT
1057 Py_RETURN_TRUE;
1058 Py_RETURN_FALSE;
1059}
1060
2c74e833
TT
1061\f
1062
1063static const struct objfile_data *typy_objfile_data_key;
1064
1065static void
c1bd65d0 1066save_objfile_types (struct objfile *objfile, void *datum)
2c74e833 1067{
19ba03f4 1068 type_object *obj = (type_object *) datum;
2c74e833 1069
0646da15
TT
1070 if (!gdb_python_initialized)
1071 return;
1072
2c74e833
TT
1073 /* This prevents another thread from freeing the objects we're
1074 operating on. */
08feed99 1075 gdbpy_enter enter_py (objfile->arch (), current_language);
2c74e833 1076
6108fd18 1077 htab_up copied_types = create_copied_types_hash (objfile);
2c74e833
TT
1078
1079 while (obj)
1080 {
1081 type_object *next = obj->next;
1082
6108fd18 1083 htab_empty (copied_types.get ());
2c74e833 1084
6108fd18
TT
1085 obj->type = copy_type_recursive (objfile, obj->type,
1086 copied_types.get ());
2c74e833
TT
1087
1088 obj->next = NULL;
1089 obj->prev = NULL;
1090
1091 obj = next;
1092 }
2c74e833
TT
1093}
1094
1095static void
1096set_type (type_object *obj, struct type *type)
1097{
1098 obj->type = type;
1099 obj->prev = NULL;
1100 if (type && TYPE_OBJFILE (type))
1101 {
1102 struct objfile *objfile = TYPE_OBJFILE (type);
1103
f99b5177 1104 obj->next = ((type_object *)
19ba03f4 1105 objfile_data (objfile, typy_objfile_data_key));
2c74e833
TT
1106 if (obj->next)
1107 obj->next->prev = obj;
1108 set_objfile_data (objfile, typy_objfile_data_key, obj);
1109 }
1110 else
1111 obj->next = NULL;
1112}
1113
1114static void
1115typy_dealloc (PyObject *obj)
1116{
1117 type_object *type = (type_object *) obj;
1118
1119 if (type->prev)
1120 type->prev->next = type->next;
1121 else if (type->type && TYPE_OBJFILE (type->type))
1122 {
1123 /* Must reset head of list. */
1124 struct objfile *objfile = TYPE_OBJFILE (type->type);
d59b6f6c 1125
2c74e833
TT
1126 if (objfile)
1127 set_objfile_data (objfile, typy_objfile_data_key, type->next);
1128 }
1129 if (type->next)
1130 type->next->prev = type->prev;
1131
9a27f2c6 1132 Py_TYPE (type)->tp_free (type);
2c74e833
TT
1133}
1134
a73bb892
PK
1135/* Return number of fields ("length" of the field dictionary). */
1136
1137static Py_ssize_t
1138typy_length (PyObject *self)
1139{
1140 struct type *type = ((type_object *) self)->type;
1141
9cc10fd1
PK
1142 type = typy_get_composite (type);
1143 if (type == NULL)
1144 return -1;
1145
1f704f76 1146 return type->num_fields ();
a73bb892
PK
1147}
1148
9cc10fd1 1149/* Implements boolean evaluation of gdb.Type. Handle this like other
256458bc 1150 Python objects that don't have a meaningful truth value -- all
9cc10fd1
PK
1151 values are true. */
1152
1153static int
1154typy_nonzero (PyObject *self)
1155{
1156 return 1;
1157}
1158
59fb7612
SS
1159/* Return optimized out value of this type. */
1160
1161static PyObject *
1162typy_optimized_out (PyObject *self, PyObject *args)
1163{
1164 struct type *type = ((type_object *) self)->type;
1165
1166 return value_to_value_object (allocate_optimized_out_value (type));
1167}
1168
a73bb892
PK
1169/* Return a gdb.Field object for the field named by the argument. */
1170
1171static PyObject *
1172typy_getitem (PyObject *self, PyObject *key)
1173{
1174 struct type *type = ((type_object *) self)->type;
a73bb892 1175 int i;
76dce0be 1176
9b972014 1177 gdb::unique_xmalloc_ptr<char> field = python_string_to_host_string (key);
a73bb892
PK
1178 if (field == NULL)
1179 return NULL;
1180
256458bc 1181 /* We want just fields of this type, not of base types, so instead of
a73bb892
PK
1182 using lookup_struct_elt_type, portions of that function are
1183 copied here. */
1184
9cc10fd1
PK
1185 type = typy_get_composite (type);
1186 if (type == NULL)
1187 return NULL;
256458bc 1188
1f704f76 1189 for (i = 0; i < type->num_fields (); i++)
a73bb892 1190 {
0d5cff50 1191 const char *t_field_name = TYPE_FIELD_NAME (type, i);
a73bb892 1192
9b972014 1193 if (t_field_name && (strcmp_iw (t_field_name, field.get ()) == 0))
1b20edf0 1194 return convert_field (type, i).release ();
a73bb892
PK
1195 }
1196 PyErr_SetObject (PyExc_KeyError, key);
1197 return NULL;
1198}
1199
256458bc 1200/* Implement the "get" method on the type object. This is the
a73bb892
PK
1201 same as getitem if the key is present, but returns the supplied
1202 default value or None if the key is not found. */
1203
1204static PyObject *
1205typy_get (PyObject *self, PyObject *args)
1206{
1207 PyObject *key, *defval = Py_None, *result;
256458bc 1208
a73bb892
PK
1209 if (!PyArg_UnpackTuple (args, "get", 1, 2, &key, &defval))
1210 return NULL;
256458bc 1211
a73bb892
PK
1212 result = typy_getitem (self, key);
1213 if (result != NULL)
1214 return result;
256458bc 1215
a73bb892
PK
1216 /* typy_getitem returned error status. If the exception is
1217 KeyError, clear the exception status and return the defval
1218 instead. Otherwise return the exception unchanged. */
1219 if (!PyErr_ExceptionMatches (PyExc_KeyError))
1220 return NULL;
256458bc 1221
a73bb892
PK
1222 PyErr_Clear ();
1223 Py_INCREF (defval);
1224 return defval;
1225}
1226
1227/* Implement the "has_key" method on the type object. */
1228
1229static PyObject *
1230typy_has_key (PyObject *self, PyObject *args)
1231{
1232 struct type *type = ((type_object *) self)->type;
2ff6b080 1233 const char *field;
a73bb892 1234 int i;
76dce0be 1235
a73bb892
PK
1236 if (!PyArg_ParseTuple (args, "s", &field))
1237 return NULL;
1238
256458bc 1239 /* We want just fields of this type, not of base types, so instead of
a73bb892
PK
1240 using lookup_struct_elt_type, portions of that function are
1241 copied here. */
1242
9cc10fd1
PK
1243 type = typy_get_composite (type);
1244 if (type == NULL)
1245 return NULL;
a73bb892 1246
1f704f76 1247 for (i = 0; i < type->num_fields (); i++)
a73bb892 1248 {
0d5cff50 1249 const char *t_field_name = TYPE_FIELD_NAME (type, i);
a73bb892
PK
1250
1251 if (t_field_name && (strcmp_iw (t_field_name, field) == 0))
1252 Py_RETURN_TRUE;
1253 }
1254 Py_RETURN_FALSE;
1255}
1256
1257/* Make an iterator object to iterate over keys, values, or items. */
1258
1259static PyObject *
1260typy_make_iter (PyObject *self, enum gdbpy_iter_kind kind)
1261{
1262 typy_iterator_object *typy_iter_obj;
1263
9cc10fd1
PK
1264 /* Check that "self" is a structure or union type. */
1265 if (typy_get_composite (((type_object *) self)->type) == NULL)
1266 return NULL;
256458bc 1267
a73bb892
PK
1268 typy_iter_obj = PyObject_New (typy_iterator_object,
1269 &type_iterator_object_type);
1270 if (typy_iter_obj == NULL)
1271 return NULL;
1272
1273 typy_iter_obj->field = 0;
1274 typy_iter_obj->kind = kind;
1275 Py_INCREF (self);
1276 typy_iter_obj->source = (type_object *) self;
1277
1278 return (PyObject *) typy_iter_obj;
1279}
1280
1281/* iteritems() method. */
1282
1283static PyObject *
1284typy_iteritems (PyObject *self, PyObject *args)
1285{
1286 return typy_make_iter (self, iter_items);
1287}
1288
1289/* iterkeys() method. */
1290
1291static PyObject *
1292typy_iterkeys (PyObject *self, PyObject *args)
1293{
1294 return typy_make_iter (self, iter_keys);
1295}
1296
1297/* Iterating over the class, same as iterkeys except for the function
1298 signature. */
1299
1300static PyObject *
1301typy_iter (PyObject *self)
1302{
1303 return typy_make_iter (self, iter_keys);
1304}
1305
1306/* itervalues() method. */
1307
1308static PyObject *
1309typy_itervalues (PyObject *self, PyObject *args)
1310{
1311 return typy_make_iter (self, iter_values);
1312}
1313
1314/* Return a reference to the type iterator. */
1315
1316static PyObject *
1317typy_iterator_iter (PyObject *self)
1318{
1319 Py_INCREF (self);
1320 return self;
1321}
1322
1323/* Return the next field in the iteration through the list of fields
1324 of the type. */
1325
1326static PyObject *
1327typy_iterator_iternext (PyObject *self)
1328{
1329 typy_iterator_object *iter_obj = (typy_iterator_object *) self;
1330 struct type *type = iter_obj->source->type;
256458bc 1331
1f704f76 1332 if (iter_obj->field < type->num_fields ())
a73bb892 1333 {
1b20edf0
TT
1334 gdbpy_ref<> result = make_fielditem (type, iter_obj->field,
1335 iter_obj->kind);
a73bb892
PK
1336 if (result != NULL)
1337 iter_obj->field++;
1b20edf0 1338 return result.release ();
a73bb892
PK
1339 }
1340
1341 return NULL;
1342}
1343
1344static void
1345typy_iterator_dealloc (PyObject *obj)
1346{
1347 typy_iterator_object *iter_obj = (typy_iterator_object *) obj;
1348
1349 Py_DECREF (iter_obj->source);
2e953aca 1350 Py_TYPE (obj)->tp_free (obj);
a73bb892
PK
1351}
1352
2c74e833
TT
1353/* Create a new Type referring to TYPE. */
1354PyObject *
1355type_to_type_object (struct type *type)
1356{
1357 type_object *type_obj;
1358
5d63b30a
TT
1359 try
1360 {
1361 /* Try not to let stub types leak out to Python. */
e46d3488 1362 if (type->is_stub ())
5d63b30a
TT
1363 type = check_typedef (type);
1364 }
1365 catch (...)
1366 {
1367 /* Just ignore failures in check_typedef. */
1368 }
1369
2c74e833
TT
1370 type_obj = PyObject_New (type_object, &type_object_type);
1371 if (type_obj)
1372 set_type (type_obj, type);
1373
1374 return (PyObject *) type_obj;
1375}
1376
1377struct type *
1378type_object_to_type (PyObject *obj)
1379{
1380 if (! PyObject_TypeCheck (obj, &type_object_type))
1381 return NULL;
1382 return ((type_object *) obj)->type;
1383}
1384
1385\f
1386
1387/* Implementation of gdb.lookup_type. */
1388PyObject *
1389gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw)
1390{
2adadf51 1391 static const char *keywords[] = { "name", "block", NULL };
ddd49eee 1392 const char *type_name = NULL;
2c74e833 1393 struct type *type = NULL;
5107b149 1394 PyObject *block_obj = NULL;
9df2fbc4 1395 const struct block *block = NULL;
2c74e833 1396
2adadf51
PA
1397 if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|O", keywords,
1398 &type_name, &block_obj))
2c74e833
TT
1399 return NULL;
1400
5107b149
PM
1401 if (block_obj)
1402 {
1403 block = block_object_to_block (block_obj);
1404 if (! block)
1405 {
1406 PyErr_SetString (PyExc_RuntimeError,
1407 _("'block' argument must be a Block."));
1408 return NULL;
1409 }
1410 }
1411
1412 type = typy_lookup_typename (type_name, block);
2c74e833
TT
1413 if (! type)
1414 return NULL;
1415
8833fbf0 1416 return type_to_type_object (type);
2c74e833
TT
1417}
1418
999633ed 1419int
2c74e833
TT
1420gdbpy_initialize_types (void)
1421{
1422 int i;
1423
1424 typy_objfile_data_key
c1bd65d0 1425 = register_objfile_data_with_cleanup (save_objfile_types, NULL);
2c74e833
TT
1426
1427 if (PyType_Ready (&type_object_type) < 0)
999633ed 1428 return -1;
2c74e833 1429 if (PyType_Ready (&field_object_type) < 0)
999633ed 1430 return -1;
a73bb892 1431 if (PyType_Ready (&type_iterator_object_type) < 0)
999633ed 1432 return -1;
2c74e833
TT
1433
1434 for (i = 0; pyty_codes[i].name; ++i)
1435 {
6c28e44a 1436 if (PyModule_AddIntConstant (gdb_module, pyty_codes[i].name,
2c74e833 1437 pyty_codes[i].code) < 0)
999633ed 1438 return -1;
2c74e833
TT
1439 }
1440
aa36459a
TT
1441 if (gdb_pymodule_addobject (gdb_module, "Type",
1442 (PyObject *) &type_object_type) < 0)
999633ed 1443 return -1;
2c74e833 1444
aa36459a
TT
1445 if (gdb_pymodule_addobject (gdb_module, "TypeIterator",
1446 (PyObject *) &type_iterator_object_type) < 0)
999633ed 1447 return -1;
a73bb892 1448
aa36459a
TT
1449 return gdb_pymodule_addobject (gdb_module, "Field",
1450 (PyObject *) &field_object_type);
2c74e833
TT
1451}
1452
1453\f
1454
0d1f4ceb 1455static gdb_PyGetSetDef type_object_getset[] =
2c74e833 1456{
6d7bb824
TT
1457 { "alignof", typy_get_alignof, NULL,
1458 "The alignment of this type, in bytes.", NULL },
2c74e833
TT
1459 { "code", typy_get_code, NULL,
1460 "The code for this type.", NULL },
1acda803
TT
1461 { "dynamic", typy_get_dynamic, NULL,
1462 "Whether this type is dynamic.", NULL },
c0d48811
JB
1463 { "name", typy_get_name, NULL,
1464 "The name for this type, or None.", NULL },
2c74e833
TT
1465 { "sizeof", typy_get_sizeof, NULL,
1466 "The size of this type, in bytes.", NULL },
1467 { "tag", typy_get_tag, NULL,
1468 "The tag name for this type, or None.", NULL },
e1f2e1a2
CB
1469 { "objfile", typy_get_objfile, NULL,
1470 "The objfile this type was defined in, or None.", NULL },
2c74e833
TT
1471 { NULL }
1472};
1473
1474static PyMethodDef type_object_methods[] =
1475{
702c2711 1476 { "array", typy_array, METH_VARARGS,
f28c316a
DE
1477 "array ([LOW_BOUND,] HIGH_BOUND) -> Type\n\
1478Return a type which represents an array of objects of this type.\n\
1479The bounds of the array are [LOW_BOUND, HIGH_BOUND] inclusive.\n\
1480If LOW_BOUND is omitted, a value of zero is used." },
a72c3253
DE
1481 { "vector", typy_vector, METH_VARARGS,
1482 "vector ([LOW_BOUND,] HIGH_BOUND) -> Type\n\
1483Return a type which represents a vector of objects of this type.\n\
1484The bounds of the array are [LOW_BOUND, HIGH_BOUND] inclusive.\n\
1485If LOW_BOUND is omitted, a value of zero is used.\n\
1486Vectors differ from arrays in that if the current language has C-style\n\
1487arrays, vectors don't decay to a pointer to the first element.\n\
1488They are first class values." },
a73bb892
PK
1489 { "__contains__", typy_has_key, METH_VARARGS,
1490 "T.__contains__(k) -> True if T has a field named k, else False" },
2c74e833
TT
1491 { "const", typy_const, METH_NOARGS,
1492 "const () -> Type\n\
1493Return a const variant of this type." },
59fb7612
SS
1494 { "optimized_out", typy_optimized_out, METH_NOARGS,
1495 "optimized_out() -> Value\n\
1496Return optimized out value of this type." },
2c74e833 1497 { "fields", typy_fields, METH_NOARGS,
a73bb892
PK
1498 "fields () -> list\n\
1499Return a list holding all the fields of this type.\n\
1500Each field is a gdb.Field object." },
1501 { "get", typy_get, METH_VARARGS,
1502 "T.get(k[,default]) -> returns field named k in T, if it exists;\n\
1503otherwise returns default, if supplied, or None if not." },
1504 { "has_key", typy_has_key, METH_VARARGS,
1505 "T.has_key(k) -> True if T has a field named k, else False" },
1506 { "items", typy_items, METH_NOARGS,
1507 "items () -> list\n\
1508Return a list of (name, field) pairs of this type.\n\
1509Each field is a gdb.Field object." },
1510 { "iteritems", typy_iteritems, METH_NOARGS,
1511 "iteritems () -> an iterator over the (name, field)\n\
1512pairs of this type. Each field is a gdb.Field object." },
1513 { "iterkeys", typy_iterkeys, METH_NOARGS,
1514 "iterkeys () -> an iterator over the field names of this type." },
1515 { "itervalues", typy_itervalues, METH_NOARGS,
1516 "itervalues () -> an iterator over the fields of this type.\n\
1517Each field is a gdb.Field object." },
1518 { "keys", typy_field_names, METH_NOARGS,
1519 "keys () -> list\n\
1520Return a list holding all the fields names of this type." },
2c74e833
TT
1521 { "pointer", typy_pointer, METH_NOARGS,
1522 "pointer () -> Type\n\
1523Return a type of pointer to this type." },
361ae042
PM
1524 { "range", typy_range, METH_NOARGS,
1525 "range () -> tuple\n\
1526Return a tuple containing the lower and upper range for this type."},
2c74e833
TT
1527 { "reference", typy_reference, METH_NOARGS,
1528 "reference () -> Type\n\
1529Return a type of reference to this type." },
1530 { "strip_typedefs", typy_strip_typedefs, METH_NOARGS,
1531 "strip_typedefs () -> Type\n\
1532Return a type formed by stripping this type of all typedefs."},
1533 { "target", typy_target, METH_NOARGS,
1534 "target () -> Type\n\
1535Return the target type of this type." },
1536 { "template_argument", typy_template_argument, METH_VARARGS,
5107b149 1537 "template_argument (arg, [block]) -> Type\n\
2c74e833
TT
1538Return the type of a template argument." },
1539 { "unqualified", typy_unqualified, METH_NOARGS,
1540 "unqualified () -> Type\n\
1541Return a variant of this type without const or volatile attributes." },
9cc10fd1 1542 { "values", typy_values, METH_NOARGS,
a73bb892
PK
1543 "values () -> list\n\
1544Return a list holding all the fields of this type.\n\
1545Each field is a gdb.Field object." },
2c74e833
TT
1546 { "volatile", typy_volatile, METH_NOARGS,
1547 "volatile () -> Type\n\
1548Return a volatile variant of this type" },
1549 { NULL }
1550};
1551
9cc10fd1
PK
1552static PyNumberMethods type_object_as_number = {
1553 NULL, /* nb_add */
1554 NULL, /* nb_subtract */
1555 NULL, /* nb_multiply */
9a27f2c6 1556#ifndef IS_PY3K
9cc10fd1 1557 NULL, /* nb_divide */
9a27f2c6 1558#endif
9cc10fd1
PK
1559 NULL, /* nb_remainder */
1560 NULL, /* nb_divmod */
1561 NULL, /* nb_power */
1562 NULL, /* nb_negative */
1563 NULL, /* nb_positive */
1564 NULL, /* nb_absolute */
1565 typy_nonzero, /* nb_nonzero */
1566 NULL, /* nb_invert */
1567 NULL, /* nb_lshift */
1568 NULL, /* nb_rshift */
1569 NULL, /* nb_and */
1570 NULL, /* nb_xor */
1571 NULL, /* nb_or */
9a27f2c6
PK
1572#ifdef IS_PY3K
1573 NULL, /* nb_int */
1574 NULL, /* reserved */
1575#else
9cc10fd1
PK
1576 NULL, /* nb_coerce */
1577 NULL, /* nb_int */
1578 NULL, /* nb_long */
9a27f2c6 1579#endif
9cc10fd1 1580 NULL, /* nb_float */
9a27f2c6 1581#ifndef IS_PY3K
9cc10fd1
PK
1582 NULL, /* nb_oct */
1583 NULL /* nb_hex */
9a27f2c6 1584#endif
9cc10fd1
PK
1585};
1586
a73bb892
PK
1587static PyMappingMethods typy_mapping = {
1588 typy_length,
1589 typy_getitem,
1590 NULL /* no "set" method */
1591};
1592
e36122e9 1593PyTypeObject type_object_type =
2c74e833 1594{
9a27f2c6 1595 PyVarObject_HEAD_INIT (NULL, 0)
2c74e833
TT
1596 "gdb.Type", /*tp_name*/
1597 sizeof (type_object), /*tp_basicsize*/
1598 0, /*tp_itemsize*/
1599 typy_dealloc, /*tp_dealloc*/
1600 0, /*tp_print*/
1601 0, /*tp_getattr*/
1602 0, /*tp_setattr*/
1603 0, /*tp_compare*/
1604 0, /*tp_repr*/
9cc10fd1 1605 &type_object_as_number, /*tp_as_number*/
2c74e833 1606 0, /*tp_as_sequence*/
a73bb892 1607 &typy_mapping, /*tp_as_mapping*/
2c74e833
TT
1608 0, /*tp_hash */
1609 0, /*tp_call*/
1610 typy_str, /*tp_str*/
1611 0, /*tp_getattro*/
1612 0, /*tp_setattro*/
1613 0, /*tp_as_buffer*/
1614 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1615 "GDB type object", /* tp_doc */
1616 0, /* tp_traverse */
1617 0, /* tp_clear */
d839c8a4 1618 typy_richcompare, /* tp_richcompare */
2c74e833 1619 0, /* tp_weaklistoffset */
a73bb892 1620 typy_iter, /* tp_iter */
2c74e833
TT
1621 0, /* tp_iternext */
1622 type_object_methods, /* tp_methods */
1623 0, /* tp_members */
1624 type_object_getset, /* tp_getset */
1625 0, /* tp_base */
1626 0, /* tp_dict */
1627 0, /* tp_descr_get */
1628 0, /* tp_descr_set */
1629 0, /* tp_dictoffset */
1630 0, /* tp_init */
1631 0, /* tp_alloc */
1632 0, /* tp_new */
1633};
1634
0d1f4ceb 1635static gdb_PyGetSetDef field_object_getset[] =
2e8265fd
TT
1636{
1637 { "__dict__", gdb_py_generic_dict, NULL,
1638 "The __dict__ for this field.", &field_object_type },
1639 { NULL }
1640};
1641
e36122e9 1642PyTypeObject field_object_type =
2c74e833 1643{
9a27f2c6 1644 PyVarObject_HEAD_INIT (NULL, 0)
2c74e833
TT
1645 "gdb.Field", /*tp_name*/
1646 sizeof (field_object), /*tp_basicsize*/
1647 0, /*tp_itemsize*/
1648 field_dealloc, /*tp_dealloc*/
1649 0, /*tp_print*/
1650 0, /*tp_getattr*/
1651 0, /*tp_setattr*/
1652 0, /*tp_compare*/
1653 0, /*tp_repr*/
1654 0, /*tp_as_number*/
1655 0, /*tp_as_sequence*/
1656 0, /*tp_as_mapping*/
1657 0, /*tp_hash */
1658 0, /*tp_call*/
1659 0, /*tp_str*/
1660 0, /*tp_getattro*/
1661 0, /*tp_setattro*/
1662 0, /*tp_as_buffer*/
1663 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1664 "GDB field object", /* tp_doc */
1665 0, /* tp_traverse */
1666 0, /* tp_clear */
1667 0, /* tp_richcompare */
1668 0, /* tp_weaklistoffset */
1669 0, /* tp_iter */
1670 0, /* tp_iternext */
1671 0, /* tp_methods */
1672 0, /* tp_members */
2e8265fd 1673 field_object_getset, /* tp_getset */
2c74e833
TT
1674 0, /* tp_base */
1675 0, /* tp_dict */
1676 0, /* tp_descr_get */
1677 0, /* tp_descr_set */
1678 offsetof (field_object, dict), /* tp_dictoffset */
1679 0, /* tp_init */
1680 0, /* tp_alloc */
1681 0, /* tp_new */
1682};
a73bb892 1683
e36122e9 1684PyTypeObject type_iterator_object_type = {
9a27f2c6 1685 PyVarObject_HEAD_INIT (NULL, 0)
a73bb892
PK
1686 "gdb.TypeIterator", /*tp_name*/
1687 sizeof (typy_iterator_object), /*tp_basicsize*/
1688 0, /*tp_itemsize*/
1689 typy_iterator_dealloc, /*tp_dealloc*/
1690 0, /*tp_print*/
1691 0, /*tp_getattr*/
1692 0, /*tp_setattr*/
1693 0, /*tp_compare*/
1694 0, /*tp_repr*/
1695 0, /*tp_as_number*/
1696 0, /*tp_as_sequence*/
1697 0, /*tp_as_mapping*/
1698 0, /*tp_hash */
1699 0, /*tp_call*/
1700 0, /*tp_str*/
1701 0, /*tp_getattro*/
1702 0, /*tp_setattro*/
1703 0, /*tp_as_buffer*/
1704 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1705 "GDB type iterator object", /*tp_doc */
1706 0, /*tp_traverse */
1707 0, /*tp_clear */
1708 0, /*tp_richcompare */
1709 0, /*tp_weaklistoffset */
1710 typy_iterator_iter, /*tp_iter */
1711 typy_iterator_iternext, /*tp_iternext */
1712 0 /*tp_methods */
1713};
This page took 1.503309 seconds and 4 git commands to generate.