Don't use PyLong_FromLongLong
[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
TT
30
31typedef struct pyty_type_object
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. */
39 struct pyty_type_object *prev;
40 struct pyty_type_object *next;
41} type_object;
42
e36122e9 43extern PyTypeObject type_object_type
62eec1a5 44 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("type_object");
2c74e833
TT
45
46/* A Field object. */
47typedef struct pyty_field_object
48{
49 PyObject_HEAD
50
51 /* Dictionary holding our attributes. */
52 PyObject *dict;
53} field_object;
54
e36122e9 55extern PyTypeObject field_object_type
62eec1a5 56 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("field_object");
2c74e833 57
a73bb892
PK
58/* A type iterator object. */
59typedef struct {
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. */
66 struct pyty_type_object *source;
67} typy_iterator_object;
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
78134374 160 return PyInt_FromLong (type->code ());
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 htab_t copied_types;
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
TT
1077
1078 copied_types = create_copied_types_hash (objfile);
1079
1080 while (obj)
1081 {
1082 type_object *next = obj->next;
1083
1084 htab_empty (copied_types);
1085
1086 obj->type = copy_type_recursive (objfile, obj->type, copied_types);
1087
1088 obj->next = NULL;
1089 obj->prev = NULL;
1090
1091 obj = next;
1092 }
1093
1094 htab_delete (copied_types);
2c74e833
TT
1095}
1096
1097static void
1098set_type (type_object *obj, struct type *type)
1099{
1100 obj->type = type;
1101 obj->prev = NULL;
1102 if (type && TYPE_OBJFILE (type))
1103 {
1104 struct objfile *objfile = TYPE_OBJFILE (type);
1105
19ba03f4
SM
1106 obj->next = ((struct pyty_type_object *)
1107 objfile_data (objfile, typy_objfile_data_key));
2c74e833
TT
1108 if (obj->next)
1109 obj->next->prev = obj;
1110 set_objfile_data (objfile, typy_objfile_data_key, obj);
1111 }
1112 else
1113 obj->next = NULL;
1114}
1115
1116static void
1117typy_dealloc (PyObject *obj)
1118{
1119 type_object *type = (type_object *) obj;
1120
1121 if (type->prev)
1122 type->prev->next = type->next;
1123 else if (type->type && TYPE_OBJFILE (type->type))
1124 {
1125 /* Must reset head of list. */
1126 struct objfile *objfile = TYPE_OBJFILE (type->type);
d59b6f6c 1127
2c74e833
TT
1128 if (objfile)
1129 set_objfile_data (objfile, typy_objfile_data_key, type->next);
1130 }
1131 if (type->next)
1132 type->next->prev = type->prev;
1133
9a27f2c6 1134 Py_TYPE (type)->tp_free (type);
2c74e833
TT
1135}
1136
a73bb892
PK
1137/* Return number of fields ("length" of the field dictionary). */
1138
1139static Py_ssize_t
1140typy_length (PyObject *self)
1141{
1142 struct type *type = ((type_object *) self)->type;
1143
9cc10fd1
PK
1144 type = typy_get_composite (type);
1145 if (type == NULL)
1146 return -1;
1147
1f704f76 1148 return type->num_fields ();
a73bb892
PK
1149}
1150
9cc10fd1 1151/* Implements boolean evaluation of gdb.Type. Handle this like other
256458bc 1152 Python objects that don't have a meaningful truth value -- all
9cc10fd1
PK
1153 values are true. */
1154
1155static int
1156typy_nonzero (PyObject *self)
1157{
1158 return 1;
1159}
1160
59fb7612
SS
1161/* Return optimized out value of this type. */
1162
1163static PyObject *
1164typy_optimized_out (PyObject *self, PyObject *args)
1165{
1166 struct type *type = ((type_object *) self)->type;
1167
1168 return value_to_value_object (allocate_optimized_out_value (type));
1169}
1170
a73bb892
PK
1171/* Return a gdb.Field object for the field named by the argument. */
1172
1173static PyObject *
1174typy_getitem (PyObject *self, PyObject *key)
1175{
1176 struct type *type = ((type_object *) self)->type;
a73bb892 1177 int i;
76dce0be 1178
9b972014 1179 gdb::unique_xmalloc_ptr<char> field = python_string_to_host_string (key);
a73bb892
PK
1180 if (field == NULL)
1181 return NULL;
1182
256458bc 1183 /* We want just fields of this type, not of base types, so instead of
a73bb892
PK
1184 using lookup_struct_elt_type, portions of that function are
1185 copied here. */
1186
9cc10fd1
PK
1187 type = typy_get_composite (type);
1188 if (type == NULL)
1189 return NULL;
256458bc 1190
1f704f76 1191 for (i = 0; i < type->num_fields (); i++)
a73bb892 1192 {
0d5cff50 1193 const char *t_field_name = TYPE_FIELD_NAME (type, i);
a73bb892 1194
9b972014 1195 if (t_field_name && (strcmp_iw (t_field_name, field.get ()) == 0))
1b20edf0 1196 return convert_field (type, i).release ();
a73bb892
PK
1197 }
1198 PyErr_SetObject (PyExc_KeyError, key);
1199 return NULL;
1200}
1201
256458bc 1202/* Implement the "get" method on the type object. This is the
a73bb892
PK
1203 same as getitem if the key is present, but returns the supplied
1204 default value or None if the key is not found. */
1205
1206static PyObject *
1207typy_get (PyObject *self, PyObject *args)
1208{
1209 PyObject *key, *defval = Py_None, *result;
256458bc 1210
a73bb892
PK
1211 if (!PyArg_UnpackTuple (args, "get", 1, 2, &key, &defval))
1212 return NULL;
256458bc 1213
a73bb892
PK
1214 result = typy_getitem (self, key);
1215 if (result != NULL)
1216 return result;
256458bc 1217
a73bb892
PK
1218 /* typy_getitem returned error status. If the exception is
1219 KeyError, clear the exception status and return the defval
1220 instead. Otherwise return the exception unchanged. */
1221 if (!PyErr_ExceptionMatches (PyExc_KeyError))
1222 return NULL;
256458bc 1223
a73bb892
PK
1224 PyErr_Clear ();
1225 Py_INCREF (defval);
1226 return defval;
1227}
1228
1229/* Implement the "has_key" method on the type object. */
1230
1231static PyObject *
1232typy_has_key (PyObject *self, PyObject *args)
1233{
1234 struct type *type = ((type_object *) self)->type;
2ff6b080 1235 const char *field;
a73bb892 1236 int i;
76dce0be 1237
a73bb892
PK
1238 if (!PyArg_ParseTuple (args, "s", &field))
1239 return NULL;
1240
256458bc 1241 /* We want just fields of this type, not of base types, so instead of
a73bb892
PK
1242 using lookup_struct_elt_type, portions of that function are
1243 copied here. */
1244
9cc10fd1
PK
1245 type = typy_get_composite (type);
1246 if (type == NULL)
1247 return NULL;
a73bb892 1248
1f704f76 1249 for (i = 0; i < type->num_fields (); i++)
a73bb892 1250 {
0d5cff50 1251 const char *t_field_name = TYPE_FIELD_NAME (type, i);
a73bb892
PK
1252
1253 if (t_field_name && (strcmp_iw (t_field_name, field) == 0))
1254 Py_RETURN_TRUE;
1255 }
1256 Py_RETURN_FALSE;
1257}
1258
1259/* Make an iterator object to iterate over keys, values, or items. */
1260
1261static PyObject *
1262typy_make_iter (PyObject *self, enum gdbpy_iter_kind kind)
1263{
1264 typy_iterator_object *typy_iter_obj;
1265
9cc10fd1
PK
1266 /* Check that "self" is a structure or union type. */
1267 if (typy_get_composite (((type_object *) self)->type) == NULL)
1268 return NULL;
256458bc 1269
a73bb892
PK
1270 typy_iter_obj = PyObject_New (typy_iterator_object,
1271 &type_iterator_object_type);
1272 if (typy_iter_obj == NULL)
1273 return NULL;
1274
1275 typy_iter_obj->field = 0;
1276 typy_iter_obj->kind = kind;
1277 Py_INCREF (self);
1278 typy_iter_obj->source = (type_object *) self;
1279
1280 return (PyObject *) typy_iter_obj;
1281}
1282
1283/* iteritems() method. */
1284
1285static PyObject *
1286typy_iteritems (PyObject *self, PyObject *args)
1287{
1288 return typy_make_iter (self, iter_items);
1289}
1290
1291/* iterkeys() method. */
1292
1293static PyObject *
1294typy_iterkeys (PyObject *self, PyObject *args)
1295{
1296 return typy_make_iter (self, iter_keys);
1297}
1298
1299/* Iterating over the class, same as iterkeys except for the function
1300 signature. */
1301
1302static PyObject *
1303typy_iter (PyObject *self)
1304{
1305 return typy_make_iter (self, iter_keys);
1306}
1307
1308/* itervalues() method. */
1309
1310static PyObject *
1311typy_itervalues (PyObject *self, PyObject *args)
1312{
1313 return typy_make_iter (self, iter_values);
1314}
1315
1316/* Return a reference to the type iterator. */
1317
1318static PyObject *
1319typy_iterator_iter (PyObject *self)
1320{
1321 Py_INCREF (self);
1322 return self;
1323}
1324
1325/* Return the next field in the iteration through the list of fields
1326 of the type. */
1327
1328static PyObject *
1329typy_iterator_iternext (PyObject *self)
1330{
1331 typy_iterator_object *iter_obj = (typy_iterator_object *) self;
1332 struct type *type = iter_obj->source->type;
256458bc 1333
1f704f76 1334 if (iter_obj->field < type->num_fields ())
a73bb892 1335 {
1b20edf0
TT
1336 gdbpy_ref<> result = make_fielditem (type, iter_obj->field,
1337 iter_obj->kind);
a73bb892
PK
1338 if (result != NULL)
1339 iter_obj->field++;
1b20edf0 1340 return result.release ();
a73bb892
PK
1341 }
1342
1343 return NULL;
1344}
1345
1346static void
1347typy_iterator_dealloc (PyObject *obj)
1348{
1349 typy_iterator_object *iter_obj = (typy_iterator_object *) obj;
1350
1351 Py_DECREF (iter_obj->source);
2e953aca 1352 Py_TYPE (obj)->tp_free (obj);
a73bb892
PK
1353}
1354
2c74e833
TT
1355/* Create a new Type referring to TYPE. */
1356PyObject *
1357type_to_type_object (struct type *type)
1358{
1359 type_object *type_obj;
1360
5d63b30a
TT
1361 try
1362 {
1363 /* Try not to let stub types leak out to Python. */
e46d3488 1364 if (type->is_stub ())
5d63b30a
TT
1365 type = check_typedef (type);
1366 }
1367 catch (...)
1368 {
1369 /* Just ignore failures in check_typedef. */
1370 }
1371
2c74e833
TT
1372 type_obj = PyObject_New (type_object, &type_object_type);
1373 if (type_obj)
1374 set_type (type_obj, type);
1375
1376 return (PyObject *) type_obj;
1377}
1378
1379struct type *
1380type_object_to_type (PyObject *obj)
1381{
1382 if (! PyObject_TypeCheck (obj, &type_object_type))
1383 return NULL;
1384 return ((type_object *) obj)->type;
1385}
1386
1387\f
1388
1389/* Implementation of gdb.lookup_type. */
1390PyObject *
1391gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw)
1392{
2adadf51 1393 static const char *keywords[] = { "name", "block", NULL };
ddd49eee 1394 const char *type_name = NULL;
2c74e833 1395 struct type *type = NULL;
5107b149 1396 PyObject *block_obj = NULL;
9df2fbc4 1397 const struct block *block = NULL;
2c74e833 1398
2adadf51
PA
1399 if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|O", keywords,
1400 &type_name, &block_obj))
2c74e833
TT
1401 return NULL;
1402
5107b149
PM
1403 if (block_obj)
1404 {
1405 block = block_object_to_block (block_obj);
1406 if (! block)
1407 {
1408 PyErr_SetString (PyExc_RuntimeError,
1409 _("'block' argument must be a Block."));
1410 return NULL;
1411 }
1412 }
1413
1414 type = typy_lookup_typename (type_name, block);
2c74e833
TT
1415 if (! type)
1416 return NULL;
1417
8833fbf0 1418 return type_to_type_object (type);
2c74e833
TT
1419}
1420
999633ed 1421int
2c74e833
TT
1422gdbpy_initialize_types (void)
1423{
1424 int i;
1425
1426 typy_objfile_data_key
c1bd65d0 1427 = register_objfile_data_with_cleanup (save_objfile_types, NULL);
2c74e833
TT
1428
1429 if (PyType_Ready (&type_object_type) < 0)
999633ed 1430 return -1;
2c74e833 1431 if (PyType_Ready (&field_object_type) < 0)
999633ed 1432 return -1;
a73bb892 1433 if (PyType_Ready (&type_iterator_object_type) < 0)
999633ed 1434 return -1;
2c74e833
TT
1435
1436 for (i = 0; pyty_codes[i].name; ++i)
1437 {
6c28e44a 1438 if (PyModule_AddIntConstant (gdb_module, pyty_codes[i].name,
2c74e833 1439 pyty_codes[i].code) < 0)
999633ed 1440 return -1;
2c74e833
TT
1441 }
1442
aa36459a
TT
1443 if (gdb_pymodule_addobject (gdb_module, "Type",
1444 (PyObject *) &type_object_type) < 0)
999633ed 1445 return -1;
2c74e833 1446
aa36459a
TT
1447 if (gdb_pymodule_addobject (gdb_module, "TypeIterator",
1448 (PyObject *) &type_iterator_object_type) < 0)
999633ed 1449 return -1;
a73bb892 1450
aa36459a
TT
1451 return gdb_pymodule_addobject (gdb_module, "Field",
1452 (PyObject *) &field_object_type);
2c74e833
TT
1453}
1454
1455\f
1456
0d1f4ceb 1457static gdb_PyGetSetDef type_object_getset[] =
2c74e833 1458{
6d7bb824
TT
1459 { "alignof", typy_get_alignof, NULL,
1460 "The alignment of this type, in bytes.", NULL },
2c74e833
TT
1461 { "code", typy_get_code, NULL,
1462 "The code for this type.", NULL },
1acda803
TT
1463 { "dynamic", typy_get_dynamic, NULL,
1464 "Whether this type is dynamic.", NULL },
c0d48811
JB
1465 { "name", typy_get_name, NULL,
1466 "The name for this type, or None.", NULL },
2c74e833
TT
1467 { "sizeof", typy_get_sizeof, NULL,
1468 "The size of this type, in bytes.", NULL },
1469 { "tag", typy_get_tag, NULL,
1470 "The tag name for this type, or None.", NULL },
e1f2e1a2
CB
1471 { "objfile", typy_get_objfile, NULL,
1472 "The objfile this type was defined in, or None.", NULL },
2c74e833
TT
1473 { NULL }
1474};
1475
1476static PyMethodDef type_object_methods[] =
1477{
702c2711 1478 { "array", typy_array, METH_VARARGS,
f28c316a
DE
1479 "array ([LOW_BOUND,] HIGH_BOUND) -> Type\n\
1480Return a type which represents an array of objects of this type.\n\
1481The bounds of the array are [LOW_BOUND, HIGH_BOUND] inclusive.\n\
1482If LOW_BOUND is omitted, a value of zero is used." },
a72c3253
DE
1483 { "vector", typy_vector, METH_VARARGS,
1484 "vector ([LOW_BOUND,] HIGH_BOUND) -> Type\n\
1485Return a type which represents a vector of objects of this type.\n\
1486The bounds of the array are [LOW_BOUND, HIGH_BOUND] inclusive.\n\
1487If LOW_BOUND is omitted, a value of zero is used.\n\
1488Vectors differ from arrays in that if the current language has C-style\n\
1489arrays, vectors don't decay to a pointer to the first element.\n\
1490They are first class values." },
a73bb892
PK
1491 { "__contains__", typy_has_key, METH_VARARGS,
1492 "T.__contains__(k) -> True if T has a field named k, else False" },
2c74e833
TT
1493 { "const", typy_const, METH_NOARGS,
1494 "const () -> Type\n\
1495Return a const variant of this type." },
59fb7612
SS
1496 { "optimized_out", typy_optimized_out, METH_NOARGS,
1497 "optimized_out() -> Value\n\
1498Return optimized out value of this type." },
2c74e833 1499 { "fields", typy_fields, METH_NOARGS,
a73bb892
PK
1500 "fields () -> list\n\
1501Return a list holding all the fields of this type.\n\
1502Each field is a gdb.Field object." },
1503 { "get", typy_get, METH_VARARGS,
1504 "T.get(k[,default]) -> returns field named k in T, if it exists;\n\
1505otherwise returns default, if supplied, or None if not." },
1506 { "has_key", typy_has_key, METH_VARARGS,
1507 "T.has_key(k) -> True if T has a field named k, else False" },
1508 { "items", typy_items, METH_NOARGS,
1509 "items () -> list\n\
1510Return a list of (name, field) pairs of this type.\n\
1511Each field is a gdb.Field object." },
1512 { "iteritems", typy_iteritems, METH_NOARGS,
1513 "iteritems () -> an iterator over the (name, field)\n\
1514pairs of this type. Each field is a gdb.Field object." },
1515 { "iterkeys", typy_iterkeys, METH_NOARGS,
1516 "iterkeys () -> an iterator over the field names of this type." },
1517 { "itervalues", typy_itervalues, METH_NOARGS,
1518 "itervalues () -> an iterator over the fields of this type.\n\
1519Each field is a gdb.Field object." },
1520 { "keys", typy_field_names, METH_NOARGS,
1521 "keys () -> list\n\
1522Return a list holding all the fields names of this type." },
2c74e833
TT
1523 { "pointer", typy_pointer, METH_NOARGS,
1524 "pointer () -> Type\n\
1525Return a type of pointer to this type." },
361ae042
PM
1526 { "range", typy_range, METH_NOARGS,
1527 "range () -> tuple\n\
1528Return a tuple containing the lower and upper range for this type."},
2c74e833
TT
1529 { "reference", typy_reference, METH_NOARGS,
1530 "reference () -> Type\n\
1531Return a type of reference to this type." },
1532 { "strip_typedefs", typy_strip_typedefs, METH_NOARGS,
1533 "strip_typedefs () -> Type\n\
1534Return a type formed by stripping this type of all typedefs."},
1535 { "target", typy_target, METH_NOARGS,
1536 "target () -> Type\n\
1537Return the target type of this type." },
1538 { "template_argument", typy_template_argument, METH_VARARGS,
5107b149 1539 "template_argument (arg, [block]) -> Type\n\
2c74e833
TT
1540Return the type of a template argument." },
1541 { "unqualified", typy_unqualified, METH_NOARGS,
1542 "unqualified () -> Type\n\
1543Return a variant of this type without const or volatile attributes." },
9cc10fd1 1544 { "values", typy_values, METH_NOARGS,
a73bb892
PK
1545 "values () -> list\n\
1546Return a list holding all the fields of this type.\n\
1547Each field is a gdb.Field object." },
2c74e833
TT
1548 { "volatile", typy_volatile, METH_NOARGS,
1549 "volatile () -> Type\n\
1550Return a volatile variant of this type" },
1551 { NULL }
1552};
1553
9cc10fd1
PK
1554static PyNumberMethods type_object_as_number = {
1555 NULL, /* nb_add */
1556 NULL, /* nb_subtract */
1557 NULL, /* nb_multiply */
9a27f2c6 1558#ifndef IS_PY3K
9cc10fd1 1559 NULL, /* nb_divide */
9a27f2c6 1560#endif
9cc10fd1
PK
1561 NULL, /* nb_remainder */
1562 NULL, /* nb_divmod */
1563 NULL, /* nb_power */
1564 NULL, /* nb_negative */
1565 NULL, /* nb_positive */
1566 NULL, /* nb_absolute */
1567 typy_nonzero, /* nb_nonzero */
1568 NULL, /* nb_invert */
1569 NULL, /* nb_lshift */
1570 NULL, /* nb_rshift */
1571 NULL, /* nb_and */
1572 NULL, /* nb_xor */
1573 NULL, /* nb_or */
9a27f2c6
PK
1574#ifdef IS_PY3K
1575 NULL, /* nb_int */
1576 NULL, /* reserved */
1577#else
9cc10fd1
PK
1578 NULL, /* nb_coerce */
1579 NULL, /* nb_int */
1580 NULL, /* nb_long */
9a27f2c6 1581#endif
9cc10fd1 1582 NULL, /* nb_float */
9a27f2c6 1583#ifndef IS_PY3K
9cc10fd1
PK
1584 NULL, /* nb_oct */
1585 NULL /* nb_hex */
9a27f2c6 1586#endif
9cc10fd1
PK
1587};
1588
a73bb892
PK
1589static PyMappingMethods typy_mapping = {
1590 typy_length,
1591 typy_getitem,
1592 NULL /* no "set" method */
1593};
1594
e36122e9 1595PyTypeObject type_object_type =
2c74e833 1596{
9a27f2c6 1597 PyVarObject_HEAD_INIT (NULL, 0)
2c74e833
TT
1598 "gdb.Type", /*tp_name*/
1599 sizeof (type_object), /*tp_basicsize*/
1600 0, /*tp_itemsize*/
1601 typy_dealloc, /*tp_dealloc*/
1602 0, /*tp_print*/
1603 0, /*tp_getattr*/
1604 0, /*tp_setattr*/
1605 0, /*tp_compare*/
1606 0, /*tp_repr*/
9cc10fd1 1607 &type_object_as_number, /*tp_as_number*/
2c74e833 1608 0, /*tp_as_sequence*/
a73bb892 1609 &typy_mapping, /*tp_as_mapping*/
2c74e833
TT
1610 0, /*tp_hash */
1611 0, /*tp_call*/
1612 typy_str, /*tp_str*/
1613 0, /*tp_getattro*/
1614 0, /*tp_setattro*/
1615 0, /*tp_as_buffer*/
1616 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1617 "GDB type object", /* tp_doc */
1618 0, /* tp_traverse */
1619 0, /* tp_clear */
d839c8a4 1620 typy_richcompare, /* tp_richcompare */
2c74e833 1621 0, /* tp_weaklistoffset */
a73bb892 1622 typy_iter, /* tp_iter */
2c74e833
TT
1623 0, /* tp_iternext */
1624 type_object_methods, /* tp_methods */
1625 0, /* tp_members */
1626 type_object_getset, /* tp_getset */
1627 0, /* tp_base */
1628 0, /* tp_dict */
1629 0, /* tp_descr_get */
1630 0, /* tp_descr_set */
1631 0, /* tp_dictoffset */
1632 0, /* tp_init */
1633 0, /* tp_alloc */
1634 0, /* tp_new */
1635};
1636
0d1f4ceb 1637static gdb_PyGetSetDef field_object_getset[] =
2e8265fd
TT
1638{
1639 { "__dict__", gdb_py_generic_dict, NULL,
1640 "The __dict__ for this field.", &field_object_type },
1641 { NULL }
1642};
1643
e36122e9 1644PyTypeObject field_object_type =
2c74e833 1645{
9a27f2c6 1646 PyVarObject_HEAD_INIT (NULL, 0)
2c74e833
TT
1647 "gdb.Field", /*tp_name*/
1648 sizeof (field_object), /*tp_basicsize*/
1649 0, /*tp_itemsize*/
1650 field_dealloc, /*tp_dealloc*/
1651 0, /*tp_print*/
1652 0, /*tp_getattr*/
1653 0, /*tp_setattr*/
1654 0, /*tp_compare*/
1655 0, /*tp_repr*/
1656 0, /*tp_as_number*/
1657 0, /*tp_as_sequence*/
1658 0, /*tp_as_mapping*/
1659 0, /*tp_hash */
1660 0, /*tp_call*/
1661 0, /*tp_str*/
1662 0, /*tp_getattro*/
1663 0, /*tp_setattro*/
1664 0, /*tp_as_buffer*/
1665 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1666 "GDB field object", /* tp_doc */
1667 0, /* tp_traverse */
1668 0, /* tp_clear */
1669 0, /* tp_richcompare */
1670 0, /* tp_weaklistoffset */
1671 0, /* tp_iter */
1672 0, /* tp_iternext */
1673 0, /* tp_methods */
1674 0, /* tp_members */
2e8265fd 1675 field_object_getset, /* tp_getset */
2c74e833
TT
1676 0, /* tp_base */
1677 0, /* tp_dict */
1678 0, /* tp_descr_get */
1679 0, /* tp_descr_set */
1680 offsetof (field_object, dict), /* tp_dictoffset */
1681 0, /* tp_init */
1682 0, /* tp_alloc */
1683 0, /* tp_new */
1684};
a73bb892 1685
e36122e9 1686PyTypeObject type_iterator_object_type = {
9a27f2c6 1687 PyVarObject_HEAD_INIT (NULL, 0)
a73bb892
PK
1688 "gdb.TypeIterator", /*tp_name*/
1689 sizeof (typy_iterator_object), /*tp_basicsize*/
1690 0, /*tp_itemsize*/
1691 typy_iterator_dealloc, /*tp_dealloc*/
1692 0, /*tp_print*/
1693 0, /*tp_getattr*/
1694 0, /*tp_setattr*/
1695 0, /*tp_compare*/
1696 0, /*tp_repr*/
1697 0, /*tp_as_number*/
1698 0, /*tp_as_sequence*/
1699 0, /*tp_as_mapping*/
1700 0, /*tp_hash */
1701 0, /*tp_call*/
1702 0, /*tp_str*/
1703 0, /*tp_getattro*/
1704 0, /*tp_setattro*/
1705 0, /*tp_as_buffer*/
1706 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1707 "GDB type iterator object", /*tp_doc */
1708 0, /*tp_traverse */
1709 0, /*tp_clear */
1710 0, /*tp_richcompare */
1711 0, /*tp_weaklistoffset */
1712 typy_iterator_iter, /*tp_iter */
1713 typy_iterator_iternext, /*tp_iternext */
1714 0 /*tp_methods */
1715};
This page took 1.278654 seconds and 4 git commands to generate.