[gdb] Fix assert in remote_async_get_pending_events_handler
[deliverable/binutils-gdb.git] / gdb / python / py-type.c
CommitLineData
2c74e833
TT
1/* Python interface to types.
2
3666a048 3 Copyright (C) 2008-2021 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;
6ac37371 421 struct objfile *objfile = type->objfile_owner ();
e1f2e1a2
CB
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
b3f9469b 474 && type->code () != TYPE_CODE_METHOD
78134374 475 && type->code () != TYPE_CODE_FUNC)
9cc10fd1
PK
476 {
477 PyErr_SetString (PyExc_TypeError,
bed91f4d 478 "Type is not a structure, union, enum, or function type.");
9cc10fd1
PK
479 return NULL;
480 }
256458bc 481
9cc10fd1
PK
482 return type;
483}
484
a72c3253 485/* Helper for typy_array and typy_vector. */
702c2711
TT
486
487static PyObject *
a72c3253 488typy_array_1 (PyObject *self, PyObject *args, int is_vector)
702c2711 489{
74aedc46 490 long n1, n2;
702c2711
TT
491 PyObject *n2_obj = NULL;
492 struct type *array = NULL;
493 struct type *type = ((type_object *) self)->type;
702c2711 494
74aedc46 495 if (! PyArg_ParseTuple (args, "l|O", &n1, &n2_obj))
702c2711
TT
496 return NULL;
497
498 if (n2_obj)
499 {
500 if (!PyInt_Check (n2_obj))
501 {
502 PyErr_SetString (PyExc_RuntimeError,
503 _("Array bound must be an integer"));
504 return NULL;
505 }
74aedc46
TT
506
507 if (! gdb_py_int_as_long (n2_obj, &n2))
702c2711
TT
508 return NULL;
509 }
510 else
511 {
512 n2 = n1;
513 n1 = 0;
514 }
515
e810d75b 516 if (n2 < n1 - 1) /* Note: An empty array has n2 == n1 - 1. */
702c2711
TT
517 {
518 PyErr_SetString (PyExc_ValueError,
519 _("Array length must not be negative"));
520 return NULL;
521 }
522
a70b8144 523 try
702c2711
TT
524 {
525 array = lookup_array_range_type (type, n1, n2);
a72c3253
DE
526 if (is_vector)
527 make_vector_type (array);
702c2711 528 }
230d2906 529 catch (const gdb_exception &except)
492d29ea
PA
530 {
531 GDB_PY_HANDLE_EXCEPTION (except);
532 }
702c2711
TT
533
534 return type_to_type_object (array);
535}
536
a72c3253
DE
537/* Return an array type. */
538
539static PyObject *
540typy_array (PyObject *self, PyObject *args)
541{
542 return typy_array_1 (self, args, 0);
543}
544
545/* Return a vector type. */
546
547static PyObject *
548typy_vector (PyObject *self, PyObject *args)
549{
550 return typy_array_1 (self, args, 1);
551}
552
2c74e833
TT
553/* Return a Type object which represents a pointer to SELF. */
554static PyObject *
555typy_pointer (PyObject *self, PyObject *args)
556{
557 struct type *type = ((type_object *) self)->type;
2c74e833 558
a70b8144 559 try
2c74e833
TT
560 {
561 type = lookup_pointer_type (type);
562 }
230d2906 563 catch (const gdb_exception &except)
492d29ea
PA
564 {
565 GDB_PY_HANDLE_EXCEPTION (except);
566 }
2c74e833
TT
567
568 return type_to_type_object (type);
569}
570
361ae042
PM
571/* Return the range of a type represented by SELF. The return type is
572 a tuple. The first element of the tuple contains the low bound,
573 while the second element of the tuple contains the high bound. */
574static PyObject *
575typy_range (PyObject *self, PyObject *args)
576{
577 struct type *type = ((type_object *) self)->type;
8d099ae9
PM
578 /* Initialize these to appease GCC warnings. */
579 LONGEST low = 0, high = 0;
361ae042 580
78134374
SM
581 if (type->code () != TYPE_CODE_ARRAY
582 && type->code () != TYPE_CODE_STRING
583 && type->code () != TYPE_CODE_RANGE)
361ae042
PM
584 {
585 PyErr_SetString (PyExc_RuntimeError,
044c0f87 586 _("This type does not have a range."));
361ae042
PM
587 return NULL;
588 }
589
78134374 590 switch (type->code ())
361ae042
PM
591 {
592 case TYPE_CODE_ARRAY:
593 case TYPE_CODE_STRING:
361ae042 594 case TYPE_CODE_RANGE:
5537ddd0
SM
595 low = type->bounds ()->low.const_val ();
596 high = type->bounds ()->high.const_val ();;
361ae042
PM
597 break;
598 }
599
062534d4 600 gdbpy_ref<> low_bound = gdb_py_object_from_longest (low);
3bb43384
TT
601 if (low_bound == NULL)
602 return NULL;
361ae042 603
062534d4 604 gdbpy_ref<> high_bound = gdb_py_object_from_longest (high);
3bb43384
TT
605 if (high_bound == NULL)
606 return NULL;
361ae042 607
7780f186 608 gdbpy_ref<> result (PyTuple_New (2));
3bb43384
TT
609 if (result == NULL)
610 return NULL;
256458bc 611
3bb43384
TT
612 if (PyTuple_SetItem (result.get (), 0, low_bound.release ()) != 0
613 || PyTuple_SetItem (result.get (), 1, high_bound.release ()) != 0)
614 return NULL;
615 return result.release ();
361ae042
PM
616}
617
2c74e833
TT
618/* Return a Type object which represents a reference to SELF. */
619static PyObject *
620typy_reference (PyObject *self, PyObject *args)
621{
622 struct type *type = ((type_object *) self)->type;
2c74e833 623
a70b8144 624 try
2c74e833 625 {
3b224330 626 type = lookup_lvalue_reference_type (type);
2c74e833 627 }
230d2906 628 catch (const gdb_exception &except)
492d29ea
PA
629 {
630 GDB_PY_HANDLE_EXCEPTION (except);
631 }
2c74e833
TT
632
633 return type_to_type_object (type);
634}
635
636/* Return a Type object which represents the target type of SELF. */
637static PyObject *
638typy_target (PyObject *self, PyObject *args)
639{
640 struct type *type = ((type_object *) self)->type;
641
642 if (!TYPE_TARGET_TYPE (type))
643 {
256458bc 644 PyErr_SetString (PyExc_RuntimeError,
044c0f87 645 _("Type does not have a target."));
2c74e833
TT
646 return NULL;
647 }
648
649 return type_to_type_object (TYPE_TARGET_TYPE (type));
650}
651
652/* Return a const-qualified type variant. */
653static PyObject *
654typy_const (PyObject *self, PyObject *args)
655{
656 struct type *type = ((type_object *) self)->type;
2c74e833 657
a70b8144 658 try
2c74e833
TT
659 {
660 type = make_cv_type (1, 0, type, NULL);
661 }
230d2906 662 catch (const gdb_exception &except)
492d29ea
PA
663 {
664 GDB_PY_HANDLE_EXCEPTION (except);
665 }
2c74e833
TT
666
667 return type_to_type_object (type);
668}
669
670/* Return a volatile-qualified type variant. */
671static PyObject *
672typy_volatile (PyObject *self, PyObject *args)
673{
674 struct type *type = ((type_object *) self)->type;
2c74e833 675
a70b8144 676 try
2c74e833
TT
677 {
678 type = make_cv_type (0, 1, type, NULL);
679 }
230d2906 680 catch (const gdb_exception &except)
492d29ea
PA
681 {
682 GDB_PY_HANDLE_EXCEPTION (except);
683 }
2c74e833
TT
684
685 return type_to_type_object (type);
686}
687
688/* Return an unqualified type variant. */
689static PyObject *
690typy_unqualified (PyObject *self, PyObject *args)
691{
692 struct type *type = ((type_object *) self)->type;
2c74e833 693
a70b8144 694 try
2c74e833
TT
695 {
696 type = make_cv_type (0, 0, type, NULL);
697 }
230d2906 698 catch (const gdb_exception &except)
492d29ea
PA
699 {
700 GDB_PY_HANDLE_EXCEPTION (except);
701 }
2c74e833
TT
702
703 return type_to_type_object (type);
704}
705
706/* Return the size of the type represented by SELF, in bytes. */
707static PyObject *
708typy_get_sizeof (PyObject *self, void *closure)
709{
710 struct type *type = ((type_object *) self)->type;
2c74e833 711
1acda803 712 bool size_varies = false;
a70b8144 713 try
2c74e833
TT
714 {
715 check_typedef (type);
1acda803
TT
716
717 size_varies = TYPE_HAS_DYNAMIC_LENGTH (type);
2c74e833 718 }
230d2906 719 catch (const gdb_exception &except)
492d29ea
PA
720 {
721 }
492d29ea 722
2c74e833
TT
723 /* Ignore exceptions. */
724
1acda803
TT
725 if (size_varies)
726 Py_RETURN_NONE;
4bde49dc 727 return gdb_py_object_from_longest (TYPE_LENGTH (type)).release ();
2c74e833
TT
728}
729
6d7bb824
TT
730/* Return the alignment of the type represented by SELF, in bytes. */
731static PyObject *
732typy_get_alignof (PyObject *self, void *closure)
733{
734 struct type *type = ((type_object *) self)->type;
735
736 ULONGEST align = 0;
a70b8144 737 try
6d7bb824
TT
738 {
739 align = type_align (type);
740 }
230d2906 741 catch (const gdb_exception &except)
6d7bb824
TT
742 {
743 align = 0;
744 }
6d7bb824
TT
745
746 /* Ignore exceptions. */
747
12dfa12a 748 return gdb_py_object_from_ulongest (align).release ();
6d7bb824
TT
749}
750
1acda803
TT
751/* Return whether or not the type is dynamic. */
752static PyObject *
753typy_get_dynamic (PyObject *self, void *closure)
754{
755 struct type *type = ((type_object *) self)->type;
756
757 bool result = false;
758 try
759 {
760 result = is_dynamic_type (type);
761 }
762 catch (const gdb_exception &except)
763 {
764 /* Ignore exceptions. */
765 }
766
767 if (result)
768 Py_RETURN_TRUE;
769 Py_RETURN_FALSE;
770}
771
2c74e833 772static struct type *
9df2fbc4 773typy_lookup_typename (const char *type_name, const struct block *block)
2c74e833
TT
774{
775 struct type *type = NULL;
d59b6f6c 776
a70b8144 777 try
2c74e833 778 {
61012eef 779 if (startswith (type_name, "struct "))
2c74e833 780 type = lookup_struct (type_name + 7, NULL);
61012eef 781 else if (startswith (type_name, "union "))
2c74e833 782 type = lookup_union (type_name + 6, NULL);
61012eef 783 else if (startswith (type_name, "enum "))
2c74e833
TT
784 type = lookup_enum (type_name + 5, NULL);
785 else
b858499d 786 type = lookup_typename (python_language,
5107b149 787 type_name, block, 0);
2c74e833 788 }
230d2906 789 catch (const gdb_exception &except)
492d29ea
PA
790 {
791 GDB_PY_HANDLE_EXCEPTION (except);
792 }
2c74e833
TT
793
794 return type;
795}
796
797static struct type *
5107b149 798typy_lookup_type (struct demangle_component *demangled,
9df2fbc4 799 const struct block *block)
2c74e833 800{
cd829959 801 struct type *type, *rtype = NULL;
2c74e833
TT
802 enum demangle_component_type demangled_type;
803
804 /* Save the type: typy_lookup_type() may (indirectly) overwrite
805 memory pointed by demangled. */
806 demangled_type = demangled->type;
807
808 if (demangled_type == DEMANGLE_COMPONENT_POINTER
809 || demangled_type == DEMANGLE_COMPONENT_REFERENCE
e4347c89 810 || demangled_type == DEMANGLE_COMPONENT_RVALUE_REFERENCE
2c74e833
TT
811 || demangled_type == DEMANGLE_COMPONENT_CONST
812 || demangled_type == DEMANGLE_COMPONENT_VOLATILE)
813 {
5107b149 814 type = typy_lookup_type (demangled->u.s_binary.left, block);
2c74e833
TT
815 if (! type)
816 return NULL;
817
a70b8144 818 try
76dce0be 819 {
cd829959
PM
820 /* If the demangled_type matches with one of the types
821 below, run the corresponding function and save the type
822 to return later. We cannot just return here as we are in
823 an exception handler. */
76dce0be
PM
824 switch (demangled_type)
825 {
826 case DEMANGLE_COMPONENT_REFERENCE:
3b224330 827 rtype = lookup_lvalue_reference_type (type);
cd829959 828 break;
e4347c89
AV
829 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
830 rtype = lookup_rvalue_reference_type (type);
831 break;
76dce0be 832 case DEMANGLE_COMPONENT_POINTER:
cd829959
PM
833 rtype = lookup_pointer_type (type);
834 break;
76dce0be 835 case DEMANGLE_COMPONENT_CONST:
cd829959
PM
836 rtype = make_cv_type (1, 0, type, NULL);
837 break;
76dce0be 838 case DEMANGLE_COMPONENT_VOLATILE:
cd829959
PM
839 rtype = make_cv_type (0, 1, type, NULL);
840 break;
76dce0be 841 }
76dce0be 842 }
230d2906 843 catch (const gdb_exception &except)
492d29ea
PA
844 {
845 GDB_PY_HANDLE_EXCEPTION (except);
846 }
2c74e833 847 }
256458bc 848
cd829959
PM
849 /* If we have a type from the switch statement above, just return
850 that. */
851 if (rtype)
852 return rtype;
256458bc 853
cd829959 854 /* We don't have a type, so lookup the type. */
29592bde
PA
855 gdb::unique_xmalloc_ptr<char> type_name = cp_comp_to_string (demangled, 10);
856 return typy_lookup_typename (type_name.get (), block);
2c74e833
TT
857}
858
326fd672
TT
859/* This is a helper function for typy_template_argument that is used
860 when the type does not have template symbols attached. It works by
861 parsing the type name. This happens with compilers, like older
862 versions of GCC, that do not emit DW_TAG_template_*. */
863
2c74e833 864static PyObject *
9df2fbc4 865typy_legacy_template_argument (struct type *type, const struct block *block,
326fd672 866 int argno)
2c74e833 867{
326fd672 868 int i;
2c74e833 869 struct demangle_component *demangled;
c8b23b3f 870 std::unique_ptr<demangle_parse_info> info;
3513a6bb 871 std::string err;
2c74e833 872 struct type *argtype;
2c74e833 873
7d93a1e0 874 if (type->name () == NULL)
2c74e833 875 {
5107b149 876 PyErr_SetString (PyExc_RuntimeError, _("Null type name."));
2c74e833
TT
877 return NULL;
878 }
879
a70b8144 880 try
5d9c5995
PM
881 {
882 /* Note -- this is not thread-safe. */
7d93a1e0 883 info = cp_demangled_name_to_comp (type->name (), &err);
5d9c5995 884 }
230d2906 885 catch (const gdb_exception &except)
492d29ea
PA
886 {
887 GDB_PY_HANDLE_EXCEPTION (except);
888 }
5d9c5995 889
3a93a0c2 890 if (! info)
2c74e833 891 {
3513a6bb 892 PyErr_SetString (PyExc_RuntimeError, err.c_str ());
2c74e833
TT
893 return NULL;
894 }
3a93a0c2 895 demangled = info->tree;
2c74e833
TT
896
897 /* Strip off component names. */
898 while (demangled->type == DEMANGLE_COMPONENT_QUAL_NAME
899 || demangled->type == DEMANGLE_COMPONENT_LOCAL_NAME)
900 demangled = demangled->u.s_binary.right;
901
902 if (demangled->type != DEMANGLE_COMPONENT_TEMPLATE)
903 {
5107b149 904 PyErr_SetString (PyExc_RuntimeError, _("Type is not a template."));
2c74e833
TT
905 return NULL;
906 }
907
908 /* Skip from the template to the arguments. */
909 demangled = demangled->u.s_binary.right;
910
911 for (i = 0; demangled && i < argno; ++i)
912 demangled = demangled->u.s_binary.right;
913
914 if (! demangled)
915 {
5107b149 916 PyErr_Format (PyExc_RuntimeError, _("No argument %d in template."),
2c74e833
TT
917 argno);
918 return NULL;
919 }
920
5107b149 921 argtype = typy_lookup_type (demangled->u.s_binary.left, block);
2c74e833
TT
922 if (! argtype)
923 return NULL;
924
925 return type_to_type_object (argtype);
326fd672
TT
926}
927
928static PyObject *
929typy_template_argument (PyObject *self, PyObject *args)
930{
931 int argno;
932 struct type *type = ((type_object *) self)->type;
9df2fbc4 933 const struct block *block = NULL;
326fd672
TT
934 PyObject *block_obj = NULL;
935 struct symbol *sym;
936 struct value *val = NULL;
326fd672
TT
937
938 if (! PyArg_ParseTuple (args, "i|O", &argno, &block_obj))
939 return NULL;
940
fd3ba736
TT
941 if (argno < 0)
942 {
943 PyErr_SetString (PyExc_RuntimeError,
944 _("Template argument number must be non-negative"));
945 return NULL;
946 }
947
326fd672
TT
948 if (block_obj)
949 {
950 block = block_object_to_block (block_obj);
951 if (! block)
952 {
953 PyErr_SetString (PyExc_RuntimeError,
954 _("Second argument must be block."));
955 return NULL;
956 }
957 }
958
a70b8144 959 try
05d0e1e7
TT
960 {
961 type = check_typedef (type);
aa006118 962 if (TYPE_IS_REFERENCE (type))
05d0e1e7
TT
963 type = check_typedef (TYPE_TARGET_TYPE (type));
964 }
230d2906 965 catch (const gdb_exception &except)
492d29ea
PA
966 {
967 GDB_PY_HANDLE_EXCEPTION (except);
968 }
326fd672
TT
969
970 /* We might not have DW_TAG_template_*, so try to parse the type's
971 name. This is inefficient if we do not have a template type --
972 but that is going to wind up as an error anyhow. */
973 if (! TYPE_N_TEMPLATE_ARGUMENTS (type))
974 return typy_legacy_template_argument (type, block, argno);
975
976 if (argno >= TYPE_N_TEMPLATE_ARGUMENTS (type))
977 {
978 PyErr_Format (PyExc_RuntimeError, _("No argument %d in template."),
979 argno);
980 return NULL;
981 }
982
983 sym = TYPE_TEMPLATE_ARGUMENT (type, argno);
984 if (SYMBOL_CLASS (sym) == LOC_TYPEDEF)
985 return type_to_type_object (SYMBOL_TYPE (sym));
986 else if (SYMBOL_CLASS (sym) == LOC_OPTIMIZED_OUT)
987 {
988 PyErr_Format (PyExc_RuntimeError,
989 _("Template argument is optimized out"));
990 return NULL;
991 }
992
a70b8144 993 try
326fd672
TT
994 {
995 val = value_of_variable (sym, block);
996 }
230d2906 997 catch (const gdb_exception &except)
492d29ea
PA
998 {
999 GDB_PY_HANDLE_EXCEPTION (except);
1000 }
326fd672
TT
1001
1002 return value_to_value_object (val);
2c74e833
TT
1003}
1004
1005static PyObject *
1006typy_str (PyObject *self)
1007{
d7e74731 1008 string_file thetype;
2c74e833 1009
a70b8144 1010 try
2c74e833 1011 {
d7e74731 1012 LA_PRINT_TYPE (type_object_to_type (self), "", &thetype, -1, 0,
53342f27 1013 &type_print_raw_options);
2c74e833 1014 }
230d2906 1015 catch (const gdb_exception &except)
2c74e833 1016 {
2c74e833
TT
1017 GDB_PY_HANDLE_EXCEPTION (except);
1018 }
1019
d7e74731
PA
1020 return PyUnicode_Decode (thetype.c_str (), thetype.size (),
1021 host_charset (), NULL);
2c74e833
TT
1022}
1023
d839c8a4
TT
1024/* Implement the richcompare method. */
1025
1026static PyObject *
1027typy_richcompare (PyObject *self, PyObject *other, int op)
1028{
894882e3 1029 bool result = false;
d839c8a4
TT
1030 struct type *type1 = type_object_to_type (self);
1031 struct type *type2 = type_object_to_type (other);
d839c8a4
TT
1032
1033 /* We can only compare ourselves to another Type object, and only
1034 for equality or inequality. */
1035 if (type2 == NULL || (op != Py_EQ && op != Py_NE))
1036 {
1037 Py_INCREF (Py_NotImplemented);
1038 return Py_NotImplemented;
1039 }
1040
1041 if (type1 == type2)
894882e3 1042 result = true;
d839c8a4
TT
1043 else
1044 {
a70b8144 1045 try
d839c8a4 1046 {
ca092b61 1047 result = types_deeply_equal (type1, type2);
d839c8a4 1048 }
230d2906 1049 catch (const gdb_exception &except)
492d29ea
PA
1050 {
1051 /* If there is a GDB exception, a comparison is not capable
1052 (or trusted), so exit. */
1053 GDB_PY_HANDLE_EXCEPTION (except);
1054 }
d839c8a4
TT
1055 }
1056
ca092b61 1057 if (op == (result ? Py_EQ : Py_NE))
d839c8a4
TT
1058 Py_RETURN_TRUE;
1059 Py_RETURN_FALSE;
1060}
1061
2c74e833
TT
1062\f
1063
1064static const struct objfile_data *typy_objfile_data_key;
1065
1066static void
c1bd65d0 1067save_objfile_types (struct objfile *objfile, void *datum)
2c74e833 1068{
19ba03f4 1069 type_object *obj = (type_object *) datum;
2c74e833 1070
0646da15
TT
1071 if (!gdb_python_initialized)
1072 return;
1073
2c74e833
TT
1074 /* This prevents another thread from freeing the objects we're
1075 operating on. */
08feed99 1076 gdbpy_enter enter_py (objfile->arch (), current_language);
2c74e833 1077
6108fd18 1078 htab_up copied_types = create_copied_types_hash (objfile);
2c74e833
TT
1079
1080 while (obj)
1081 {
1082 type_object *next = obj->next;
1083
6108fd18 1084 htab_empty (copied_types.get ());
2c74e833 1085
6108fd18
TT
1086 obj->type = copy_type_recursive (objfile, obj->type,
1087 copied_types.get ());
2c74e833
TT
1088
1089 obj->next = NULL;
1090 obj->prev = NULL;
1091
1092 obj = next;
1093 }
2c74e833
TT
1094}
1095
1096static void
1097set_type (type_object *obj, struct type *type)
1098{
1099 obj->type = type;
1100 obj->prev = NULL;
6ac37371 1101 if (type != nullptr && type->objfile_owner () != nullptr)
2c74e833 1102 {
6ac37371 1103 struct objfile *objfile = type->objfile_owner ();
2c74e833 1104
f99b5177 1105 obj->next = ((type_object *)
19ba03f4 1106 objfile_data (objfile, typy_objfile_data_key));
2c74e833
TT
1107 if (obj->next)
1108 obj->next->prev = obj;
1109 set_objfile_data (objfile, typy_objfile_data_key, obj);
1110 }
1111 else
1112 obj->next = NULL;
1113}
1114
1115static void
1116typy_dealloc (PyObject *obj)
1117{
1118 type_object *type = (type_object *) obj;
1119
1120 if (type->prev)
1121 type->prev->next = type->next;
6ac37371 1122 else if (type->type != nullptr && type->type->objfile_owner () != nullptr)
2c74e833
TT
1123 {
1124 /* Must reset head of list. */
6ac37371 1125 struct objfile *objfile = type->type->objfile_owner ();
d59b6f6c 1126
2c74e833
TT
1127 if (objfile)
1128 set_objfile_data (objfile, typy_objfile_data_key, type->next);
1129 }
1130 if (type->next)
1131 type->next->prev = type->prev;
1132
9a27f2c6 1133 Py_TYPE (type)->tp_free (type);
2c74e833
TT
1134}
1135
a73bb892
PK
1136/* Return number of fields ("length" of the field dictionary). */
1137
1138static Py_ssize_t
1139typy_length (PyObject *self)
1140{
1141 struct type *type = ((type_object *) self)->type;
1142
9cc10fd1
PK
1143 type = typy_get_composite (type);
1144 if (type == NULL)
1145 return -1;
1146
1f704f76 1147 return type->num_fields ();
a73bb892
PK
1148}
1149
9cc10fd1 1150/* Implements boolean evaluation of gdb.Type. Handle this like other
256458bc 1151 Python objects that don't have a meaningful truth value -- all
9cc10fd1
PK
1152 values are true. */
1153
1154static int
1155typy_nonzero (PyObject *self)
1156{
1157 return 1;
1158}
1159
59fb7612
SS
1160/* Return optimized out value of this type. */
1161
1162static PyObject *
1163typy_optimized_out (PyObject *self, PyObject *args)
1164{
1165 struct type *type = ((type_object *) self)->type;
1166
1167 return value_to_value_object (allocate_optimized_out_value (type));
1168}
1169
a73bb892
PK
1170/* Return a gdb.Field object for the field named by the argument. */
1171
1172static PyObject *
1173typy_getitem (PyObject *self, PyObject *key)
1174{
1175 struct type *type = ((type_object *) self)->type;
a73bb892 1176 int i;
76dce0be 1177
9b972014 1178 gdb::unique_xmalloc_ptr<char> field = python_string_to_host_string (key);
a73bb892
PK
1179 if (field == NULL)
1180 return NULL;
1181
256458bc 1182 /* We want just fields of this type, not of base types, so instead of
a73bb892
PK
1183 using lookup_struct_elt_type, portions of that function are
1184 copied here. */
1185
9cc10fd1
PK
1186 type = typy_get_composite (type);
1187 if (type == NULL)
1188 return NULL;
256458bc 1189
1f704f76 1190 for (i = 0; i < type->num_fields (); i++)
a73bb892 1191 {
0d5cff50 1192 const char *t_field_name = TYPE_FIELD_NAME (type, i);
a73bb892 1193
9b972014 1194 if (t_field_name && (strcmp_iw (t_field_name, field.get ()) == 0))
1b20edf0 1195 return convert_field (type, i).release ();
a73bb892
PK
1196 }
1197 PyErr_SetObject (PyExc_KeyError, key);
1198 return NULL;
1199}
1200
256458bc 1201/* Implement the "get" method on the type object. This is the
a73bb892
PK
1202 same as getitem if the key is present, but returns the supplied
1203 default value or None if the key is not found. */
1204
1205static PyObject *
1206typy_get (PyObject *self, PyObject *args)
1207{
1208 PyObject *key, *defval = Py_None, *result;
256458bc 1209
a73bb892
PK
1210 if (!PyArg_UnpackTuple (args, "get", 1, 2, &key, &defval))
1211 return NULL;
256458bc 1212
a73bb892
PK
1213 result = typy_getitem (self, key);
1214 if (result != NULL)
1215 return result;
256458bc 1216
a73bb892
PK
1217 /* typy_getitem returned error status. If the exception is
1218 KeyError, clear the exception status and return the defval
1219 instead. Otherwise return the exception unchanged. */
1220 if (!PyErr_ExceptionMatches (PyExc_KeyError))
1221 return NULL;
256458bc 1222
a73bb892
PK
1223 PyErr_Clear ();
1224 Py_INCREF (defval);
1225 return defval;
1226}
1227
1228/* Implement the "has_key" method on the type object. */
1229
1230static PyObject *
1231typy_has_key (PyObject *self, PyObject *args)
1232{
1233 struct type *type = ((type_object *) self)->type;
2ff6b080 1234 const char *field;
a73bb892 1235 int i;
76dce0be 1236
a73bb892
PK
1237 if (!PyArg_ParseTuple (args, "s", &field))
1238 return NULL;
1239
256458bc 1240 /* We want just fields of this type, not of base types, so instead of
a73bb892
PK
1241 using lookup_struct_elt_type, portions of that function are
1242 copied here. */
1243
9cc10fd1
PK
1244 type = typy_get_composite (type);
1245 if (type == NULL)
1246 return NULL;
a73bb892 1247
1f704f76 1248 for (i = 0; i < type->num_fields (); i++)
a73bb892 1249 {
0d5cff50 1250 const char *t_field_name = TYPE_FIELD_NAME (type, i);
a73bb892
PK
1251
1252 if (t_field_name && (strcmp_iw (t_field_name, field) == 0))
1253 Py_RETURN_TRUE;
1254 }
1255 Py_RETURN_FALSE;
1256}
1257
1258/* Make an iterator object to iterate over keys, values, or items. */
1259
1260static PyObject *
1261typy_make_iter (PyObject *self, enum gdbpy_iter_kind kind)
1262{
1263 typy_iterator_object *typy_iter_obj;
1264
9cc10fd1
PK
1265 /* Check that "self" is a structure or union type. */
1266 if (typy_get_composite (((type_object *) self)->type) == NULL)
1267 return NULL;
256458bc 1268
a73bb892
PK
1269 typy_iter_obj = PyObject_New (typy_iterator_object,
1270 &type_iterator_object_type);
1271 if (typy_iter_obj == NULL)
1272 return NULL;
1273
1274 typy_iter_obj->field = 0;
1275 typy_iter_obj->kind = kind;
1276 Py_INCREF (self);
1277 typy_iter_obj->source = (type_object *) self;
1278
1279 return (PyObject *) typy_iter_obj;
1280}
1281
1282/* iteritems() method. */
1283
1284static PyObject *
1285typy_iteritems (PyObject *self, PyObject *args)
1286{
1287 return typy_make_iter (self, iter_items);
1288}
1289
1290/* iterkeys() method. */
1291
1292static PyObject *
1293typy_iterkeys (PyObject *self, PyObject *args)
1294{
1295 return typy_make_iter (self, iter_keys);
1296}
1297
1298/* Iterating over the class, same as iterkeys except for the function
1299 signature. */
1300
1301static PyObject *
1302typy_iter (PyObject *self)
1303{
1304 return typy_make_iter (self, iter_keys);
1305}
1306
1307/* itervalues() method. */
1308
1309static PyObject *
1310typy_itervalues (PyObject *self, PyObject *args)
1311{
1312 return typy_make_iter (self, iter_values);
1313}
1314
1315/* Return a reference to the type iterator. */
1316
1317static PyObject *
1318typy_iterator_iter (PyObject *self)
1319{
1320 Py_INCREF (self);
1321 return self;
1322}
1323
1324/* Return the next field in the iteration through the list of fields
1325 of the type. */
1326
1327static PyObject *
1328typy_iterator_iternext (PyObject *self)
1329{
1330 typy_iterator_object *iter_obj = (typy_iterator_object *) self;
1331 struct type *type = iter_obj->source->type;
256458bc 1332
1f704f76 1333 if (iter_obj->field < type->num_fields ())
a73bb892 1334 {
1b20edf0
TT
1335 gdbpy_ref<> result = make_fielditem (type, iter_obj->field,
1336 iter_obj->kind);
a73bb892
PK
1337 if (result != NULL)
1338 iter_obj->field++;
1b20edf0 1339 return result.release ();
a73bb892
PK
1340 }
1341
1342 return NULL;
1343}
1344
1345static void
1346typy_iterator_dealloc (PyObject *obj)
1347{
1348 typy_iterator_object *iter_obj = (typy_iterator_object *) obj;
1349
1350 Py_DECREF (iter_obj->source);
2e953aca 1351 Py_TYPE (obj)->tp_free (obj);
a73bb892
PK
1352}
1353
2c74e833
TT
1354/* Create a new Type referring to TYPE. */
1355PyObject *
1356type_to_type_object (struct type *type)
1357{
1358 type_object *type_obj;
1359
5d63b30a
TT
1360 try
1361 {
1362 /* Try not to let stub types leak out to Python. */
e46d3488 1363 if (type->is_stub ())
5d63b30a
TT
1364 type = check_typedef (type);
1365 }
1366 catch (...)
1367 {
1368 /* Just ignore failures in check_typedef. */
1369 }
1370
2c74e833
TT
1371 type_obj = PyObject_New (type_object, &type_object_type);
1372 if (type_obj)
1373 set_type (type_obj, type);
1374
1375 return (PyObject *) type_obj;
1376}
1377
1378struct type *
1379type_object_to_type (PyObject *obj)
1380{
1381 if (! PyObject_TypeCheck (obj, &type_object_type))
1382 return NULL;
1383 return ((type_object *) obj)->type;
1384}
1385
1386\f
1387
1388/* Implementation of gdb.lookup_type. */
1389PyObject *
1390gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw)
1391{
2adadf51 1392 static const char *keywords[] = { "name", "block", NULL };
ddd49eee 1393 const char *type_name = NULL;
2c74e833 1394 struct type *type = NULL;
5107b149 1395 PyObject *block_obj = NULL;
9df2fbc4 1396 const struct block *block = NULL;
2c74e833 1397
2adadf51
PA
1398 if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|O", keywords,
1399 &type_name, &block_obj))
2c74e833
TT
1400 return NULL;
1401
5107b149
PM
1402 if (block_obj)
1403 {
1404 block = block_object_to_block (block_obj);
1405 if (! block)
1406 {
1407 PyErr_SetString (PyExc_RuntimeError,
1408 _("'block' argument must be a Block."));
1409 return NULL;
1410 }
1411 }
1412
1413 type = typy_lookup_typename (type_name, block);
2c74e833
TT
1414 if (! type)
1415 return NULL;
1416
8833fbf0 1417 return type_to_type_object (type);
2c74e833
TT
1418}
1419
999633ed 1420int
2c74e833
TT
1421gdbpy_initialize_types (void)
1422{
1423 int i;
1424
1425 typy_objfile_data_key
c1bd65d0 1426 = register_objfile_data_with_cleanup (save_objfile_types, NULL);
2c74e833
TT
1427
1428 if (PyType_Ready (&type_object_type) < 0)
999633ed 1429 return -1;
2c74e833 1430 if (PyType_Ready (&field_object_type) < 0)
999633ed 1431 return -1;
a73bb892 1432 if (PyType_Ready (&type_iterator_object_type) < 0)
999633ed 1433 return -1;
2c74e833
TT
1434
1435 for (i = 0; pyty_codes[i].name; ++i)
1436 {
6c28e44a 1437 if (PyModule_AddIntConstant (gdb_module, pyty_codes[i].name,
2c74e833 1438 pyty_codes[i].code) < 0)
999633ed 1439 return -1;
2c74e833
TT
1440 }
1441
aa36459a
TT
1442 if (gdb_pymodule_addobject (gdb_module, "Type",
1443 (PyObject *) &type_object_type) < 0)
999633ed 1444 return -1;
2c74e833 1445
aa36459a
TT
1446 if (gdb_pymodule_addobject (gdb_module, "TypeIterator",
1447 (PyObject *) &type_iterator_object_type) < 0)
999633ed 1448 return -1;
a73bb892 1449
aa36459a
TT
1450 return gdb_pymodule_addobject (gdb_module, "Field",
1451 (PyObject *) &field_object_type);
2c74e833
TT
1452}
1453
1454\f
1455
0d1f4ceb 1456static gdb_PyGetSetDef type_object_getset[] =
2c74e833 1457{
6d7bb824
TT
1458 { "alignof", typy_get_alignof, NULL,
1459 "The alignment of this type, in bytes.", NULL },
2c74e833
TT
1460 { "code", typy_get_code, NULL,
1461 "The code for this type.", NULL },
1acda803
TT
1462 { "dynamic", typy_get_dynamic, NULL,
1463 "Whether this type is dynamic.", NULL },
c0d48811
JB
1464 { "name", typy_get_name, NULL,
1465 "The name for this type, or None.", NULL },
2c74e833
TT
1466 { "sizeof", typy_get_sizeof, NULL,
1467 "The size of this type, in bytes.", NULL },
1468 { "tag", typy_get_tag, NULL,
1469 "The tag name for this type, or None.", NULL },
e1f2e1a2
CB
1470 { "objfile", typy_get_objfile, NULL,
1471 "The objfile this type was defined in, or None.", NULL },
2c74e833
TT
1472 { NULL }
1473};
1474
1475static PyMethodDef type_object_methods[] =
1476{
702c2711 1477 { "array", typy_array, METH_VARARGS,
f28c316a
DE
1478 "array ([LOW_BOUND,] HIGH_BOUND) -> Type\n\
1479Return a type which represents an array of objects of this type.\n\
1480The bounds of the array are [LOW_BOUND, HIGH_BOUND] inclusive.\n\
1481If LOW_BOUND is omitted, a value of zero is used." },
a72c3253
DE
1482 { "vector", typy_vector, METH_VARARGS,
1483 "vector ([LOW_BOUND,] HIGH_BOUND) -> Type\n\
1484Return a type which represents a vector of objects of this type.\n\
1485The bounds of the array are [LOW_BOUND, HIGH_BOUND] inclusive.\n\
1486If LOW_BOUND is omitted, a value of zero is used.\n\
1487Vectors differ from arrays in that if the current language has C-style\n\
1488arrays, vectors don't decay to a pointer to the first element.\n\
1489They are first class values." },
a73bb892
PK
1490 { "__contains__", typy_has_key, METH_VARARGS,
1491 "T.__contains__(k) -> True if T has a field named k, else False" },
2c74e833
TT
1492 { "const", typy_const, METH_NOARGS,
1493 "const () -> Type\n\
1494Return a const variant of this type." },
59fb7612
SS
1495 { "optimized_out", typy_optimized_out, METH_NOARGS,
1496 "optimized_out() -> Value\n\
1497Return optimized out value of this type." },
2c74e833 1498 { "fields", typy_fields, METH_NOARGS,
a73bb892
PK
1499 "fields () -> list\n\
1500Return a list holding all the fields of this type.\n\
1501Each field is a gdb.Field object." },
1502 { "get", typy_get, METH_VARARGS,
1503 "T.get(k[,default]) -> returns field named k in T, if it exists;\n\
1504otherwise returns default, if supplied, or None if not." },
1505 { "has_key", typy_has_key, METH_VARARGS,
1506 "T.has_key(k) -> True if T has a field named k, else False" },
1507 { "items", typy_items, METH_NOARGS,
1508 "items () -> list\n\
1509Return a list of (name, field) pairs of this type.\n\
1510Each field is a gdb.Field object." },
1511 { "iteritems", typy_iteritems, METH_NOARGS,
1512 "iteritems () -> an iterator over the (name, field)\n\
1513pairs of this type. Each field is a gdb.Field object." },
1514 { "iterkeys", typy_iterkeys, METH_NOARGS,
1515 "iterkeys () -> an iterator over the field names of this type." },
1516 { "itervalues", typy_itervalues, METH_NOARGS,
1517 "itervalues () -> an iterator over the fields of this type.\n\
1518Each field is a gdb.Field object." },
1519 { "keys", typy_field_names, METH_NOARGS,
1520 "keys () -> list\n\
1521Return a list holding all the fields names of this type." },
2c74e833
TT
1522 { "pointer", typy_pointer, METH_NOARGS,
1523 "pointer () -> Type\n\
1524Return a type of pointer to this type." },
361ae042
PM
1525 { "range", typy_range, METH_NOARGS,
1526 "range () -> tuple\n\
1527Return a tuple containing the lower and upper range for this type."},
2c74e833
TT
1528 { "reference", typy_reference, METH_NOARGS,
1529 "reference () -> Type\n\
1530Return a type of reference to this type." },
1531 { "strip_typedefs", typy_strip_typedefs, METH_NOARGS,
1532 "strip_typedefs () -> Type\n\
1533Return a type formed by stripping this type of all typedefs."},
1534 { "target", typy_target, METH_NOARGS,
1535 "target () -> Type\n\
1536Return the target type of this type." },
1537 { "template_argument", typy_template_argument, METH_VARARGS,
5107b149 1538 "template_argument (arg, [block]) -> Type\n\
2c74e833
TT
1539Return the type of a template argument." },
1540 { "unqualified", typy_unqualified, METH_NOARGS,
1541 "unqualified () -> Type\n\
1542Return a variant of this type without const or volatile attributes." },
9cc10fd1 1543 { "values", typy_values, METH_NOARGS,
a73bb892
PK
1544 "values () -> list\n\
1545Return a list holding all the fields of this type.\n\
1546Each field is a gdb.Field object." },
2c74e833
TT
1547 { "volatile", typy_volatile, METH_NOARGS,
1548 "volatile () -> Type\n\
1549Return a volatile variant of this type" },
1550 { NULL }
1551};
1552
9cc10fd1
PK
1553static PyNumberMethods type_object_as_number = {
1554 NULL, /* nb_add */
1555 NULL, /* nb_subtract */
1556 NULL, /* nb_multiply */
9a27f2c6 1557#ifndef IS_PY3K
9cc10fd1 1558 NULL, /* nb_divide */
9a27f2c6 1559#endif
9cc10fd1
PK
1560 NULL, /* nb_remainder */
1561 NULL, /* nb_divmod */
1562 NULL, /* nb_power */
1563 NULL, /* nb_negative */
1564 NULL, /* nb_positive */
1565 NULL, /* nb_absolute */
1566 typy_nonzero, /* nb_nonzero */
1567 NULL, /* nb_invert */
1568 NULL, /* nb_lshift */
1569 NULL, /* nb_rshift */
1570 NULL, /* nb_and */
1571 NULL, /* nb_xor */
1572 NULL, /* nb_or */
9a27f2c6
PK
1573#ifdef IS_PY3K
1574 NULL, /* nb_int */
1575 NULL, /* reserved */
1576#else
9cc10fd1
PK
1577 NULL, /* nb_coerce */
1578 NULL, /* nb_int */
1579 NULL, /* nb_long */
9a27f2c6 1580#endif
9cc10fd1 1581 NULL, /* nb_float */
9a27f2c6 1582#ifndef IS_PY3K
9cc10fd1
PK
1583 NULL, /* nb_oct */
1584 NULL /* nb_hex */
9a27f2c6 1585#endif
9cc10fd1
PK
1586};
1587
a73bb892
PK
1588static PyMappingMethods typy_mapping = {
1589 typy_length,
1590 typy_getitem,
1591 NULL /* no "set" method */
1592};
1593
e36122e9 1594PyTypeObject type_object_type =
2c74e833 1595{
9a27f2c6 1596 PyVarObject_HEAD_INIT (NULL, 0)
2c74e833
TT
1597 "gdb.Type", /*tp_name*/
1598 sizeof (type_object), /*tp_basicsize*/
1599 0, /*tp_itemsize*/
1600 typy_dealloc, /*tp_dealloc*/
1601 0, /*tp_print*/
1602 0, /*tp_getattr*/
1603 0, /*tp_setattr*/
1604 0, /*tp_compare*/
1605 0, /*tp_repr*/
9cc10fd1 1606 &type_object_as_number, /*tp_as_number*/
2c74e833 1607 0, /*tp_as_sequence*/
a73bb892 1608 &typy_mapping, /*tp_as_mapping*/
2c74e833
TT
1609 0, /*tp_hash */
1610 0, /*tp_call*/
1611 typy_str, /*tp_str*/
1612 0, /*tp_getattro*/
1613 0, /*tp_setattro*/
1614 0, /*tp_as_buffer*/
1615 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1616 "GDB type object", /* tp_doc */
1617 0, /* tp_traverse */
1618 0, /* tp_clear */
d839c8a4 1619 typy_richcompare, /* tp_richcompare */
2c74e833 1620 0, /* tp_weaklistoffset */
a73bb892 1621 typy_iter, /* tp_iter */
2c74e833
TT
1622 0, /* tp_iternext */
1623 type_object_methods, /* tp_methods */
1624 0, /* tp_members */
1625 type_object_getset, /* tp_getset */
1626 0, /* tp_base */
1627 0, /* tp_dict */
1628 0, /* tp_descr_get */
1629 0, /* tp_descr_set */
1630 0, /* tp_dictoffset */
1631 0, /* tp_init */
1632 0, /* tp_alloc */
1633 0, /* tp_new */
1634};
1635
0d1f4ceb 1636static gdb_PyGetSetDef field_object_getset[] =
2e8265fd
TT
1637{
1638 { "__dict__", gdb_py_generic_dict, NULL,
1639 "The __dict__ for this field.", &field_object_type },
1640 { NULL }
1641};
1642
e36122e9 1643PyTypeObject field_object_type =
2c74e833 1644{
9a27f2c6 1645 PyVarObject_HEAD_INIT (NULL, 0)
2c74e833
TT
1646 "gdb.Field", /*tp_name*/
1647 sizeof (field_object), /*tp_basicsize*/
1648 0, /*tp_itemsize*/
1649 field_dealloc, /*tp_dealloc*/
1650 0, /*tp_print*/
1651 0, /*tp_getattr*/
1652 0, /*tp_setattr*/
1653 0, /*tp_compare*/
1654 0, /*tp_repr*/
1655 0, /*tp_as_number*/
1656 0, /*tp_as_sequence*/
1657 0, /*tp_as_mapping*/
1658 0, /*tp_hash */
1659 0, /*tp_call*/
1660 0, /*tp_str*/
1661 0, /*tp_getattro*/
1662 0, /*tp_setattro*/
1663 0, /*tp_as_buffer*/
1664 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1665 "GDB field object", /* tp_doc */
1666 0, /* tp_traverse */
1667 0, /* tp_clear */
1668 0, /* tp_richcompare */
1669 0, /* tp_weaklistoffset */
1670 0, /* tp_iter */
1671 0, /* tp_iternext */
1672 0, /* tp_methods */
1673 0, /* tp_members */
2e8265fd 1674 field_object_getset, /* tp_getset */
2c74e833
TT
1675 0, /* tp_base */
1676 0, /* tp_dict */
1677 0, /* tp_descr_get */
1678 0, /* tp_descr_set */
1679 offsetof (field_object, dict), /* tp_dictoffset */
1680 0, /* tp_init */
1681 0, /* tp_alloc */
1682 0, /* tp_new */
1683};
a73bb892 1684
e36122e9 1685PyTypeObject type_iterator_object_type = {
9a27f2c6 1686 PyVarObject_HEAD_INIT (NULL, 0)
a73bb892
PK
1687 "gdb.TypeIterator", /*tp_name*/
1688 sizeof (typy_iterator_object), /*tp_basicsize*/
1689 0, /*tp_itemsize*/
1690 typy_iterator_dealloc, /*tp_dealloc*/
1691 0, /*tp_print*/
1692 0, /*tp_getattr*/
1693 0, /*tp_setattr*/
1694 0, /*tp_compare*/
1695 0, /*tp_repr*/
1696 0, /*tp_as_number*/
1697 0, /*tp_as_sequence*/
1698 0, /*tp_as_mapping*/
1699 0, /*tp_hash */
1700 0, /*tp_call*/
1701 0, /*tp_str*/
1702 0, /*tp_getattro*/
1703 0, /*tp_setattro*/
1704 0, /*tp_as_buffer*/
1705 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1706 "GDB type iterator object", /*tp_doc */
1707 0, /*tp_traverse */
1708 0, /*tp_clear */
1709 0, /*tp_richcompare */
1710 0, /*tp_weaklistoffset */
1711 typy_iterator_iter, /*tp_iter */
1712 typy_iterator_iternext, /*tp_iternext */
1713 0 /*tp_methods */
1714};
This page took 1.679855 seconds and 4 git commands to generate.