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