Rename field_int to field_signed
[deliverable/binutils-gdb.git] / gdb / python / py-type.c
CommitLineData
2c74e833
TT
1/* Python interface to types.
2
42a4f53d 3 Copyright (C) 2008-2019 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"
268a13a5 29#include "gdbsupport/vec.h"
53342f27 30#include "typeprint.h"
2c74e833
TT
31
32typedef struct pyty_type_object
33{
34 PyObject_HEAD
35 struct type *type;
36
37 /* If a Type object is associated with an objfile, it is kept on a
38 doubly-linked list, rooted in the objfile. This lets us copy the
39 underlying struct type when the objfile is deleted. */
40 struct pyty_type_object *prev;
41 struct pyty_type_object *next;
42} type_object;
43
e36122e9 44extern PyTypeObject type_object_type
62eec1a5 45 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("type_object");
2c74e833
TT
46
47/* A Field object. */
48typedef struct pyty_field_object
49{
50 PyObject_HEAD
51
52 /* Dictionary holding our attributes. */
53 PyObject *dict;
54} field_object;
55
e36122e9 56extern PyTypeObject field_object_type
62eec1a5 57 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("field_object");
2c74e833 58
a73bb892
PK
59/* A type iterator object. */
60typedef struct {
61 PyObject_HEAD
62 /* The current field index. */
63 int field;
64 /* What to return. */
65 enum gdbpy_iter_kind kind;
66 /* Pointer back to the original source type object. */
67 struct pyty_type_object *source;
68} typy_iterator_object;
69
e36122e9 70extern PyTypeObject type_iterator_object_type
62eec1a5 71 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("typy_iterator_object");
a73bb892 72
2c74e833
TT
73/* This is used to initialize various gdb.TYPE_ constants. */
74struct pyty_code
75{
76 /* The code. */
77 enum type_code code;
78 /* The name. */
79 const char *name;
80};
81
0dab82e9
PK
82/* Forward declarations. */
83static PyObject *typy_make_iter (PyObject *self, enum gdbpy_iter_kind kind);
84
2c74e833
TT
85#define ENTRY(X) { X, #X }
86
87static struct pyty_code pyty_codes[] =
88{
6b1755ce 89 ENTRY (TYPE_CODE_BITSTRING),
2c74e833
TT
90 ENTRY (TYPE_CODE_PTR),
91 ENTRY (TYPE_CODE_ARRAY),
92 ENTRY (TYPE_CODE_STRUCT),
93 ENTRY (TYPE_CODE_UNION),
94 ENTRY (TYPE_CODE_ENUM),
95 ENTRY (TYPE_CODE_FLAGS),
96 ENTRY (TYPE_CODE_FUNC),
97 ENTRY (TYPE_CODE_INT),
98 ENTRY (TYPE_CODE_FLT),
99 ENTRY (TYPE_CODE_VOID),
100 ENTRY (TYPE_CODE_SET),
101 ENTRY (TYPE_CODE_RANGE),
102 ENTRY (TYPE_CODE_STRING),
2c74e833
TT
103 ENTRY (TYPE_CODE_ERROR),
104 ENTRY (TYPE_CODE_METHOD),
105 ENTRY (TYPE_CODE_METHODPTR),
106 ENTRY (TYPE_CODE_MEMBERPTR),
107 ENTRY (TYPE_CODE_REF),
3fcf899d 108 ENTRY (TYPE_CODE_RVALUE_REF),
2c74e833
TT
109 ENTRY (TYPE_CODE_CHAR),
110 ENTRY (TYPE_CODE_BOOL),
111 ENTRY (TYPE_CODE_COMPLEX),
112 ENTRY (TYPE_CODE_TYPEDEF),
113 ENTRY (TYPE_CODE_NAMESPACE),
114 ENTRY (TYPE_CODE_DECFLOAT),
115 ENTRY (TYPE_CODE_INTERNAL_FUNCTION),
116 { TYPE_CODE_UNDEF, NULL }
117};
118
119\f
120
121static void
122field_dealloc (PyObject *obj)
123{
124 field_object *f = (field_object *) obj;
d59b6f6c 125
2c74e833 126 Py_XDECREF (f->dict);
9a27f2c6 127 Py_TYPE (obj)->tp_free (obj);
2c74e833
TT
128}
129
130static PyObject *
131field_new (void)
132{
88b6faea
TT
133 gdbpy_ref<field_object> result (PyObject_New (field_object,
134 &field_object_type));
d59b6f6c 135
88b6faea 136 if (result != NULL)
2c74e833
TT
137 {
138 result->dict = PyDict_New ();
139 if (!result->dict)
88b6faea 140 return NULL;
2c74e833 141 }
88b6faea 142 return (PyObject *) result.release ();
2c74e833
TT
143}
144
145\f
146
a16b0e22
SC
147/* Return true if OBJ is of type gdb.Field, false otherwise. */
148
149int
150gdbpy_is_field (PyObject *obj)
151{
152 return PyObject_TypeCheck (obj, &field_object_type);
153}
154
2c74e833
TT
155/* Return the code for this type. */
156static PyObject *
157typy_get_code (PyObject *self, void *closure)
158{
159 struct type *type = ((type_object *) self)->type;
d59b6f6c 160
2c74e833
TT
161 return PyInt_FromLong (TYPE_CODE (type));
162}
163
164/* Helper function for typy_fields which converts a single field to a
a73bb892
PK
165 gdb.Field object. Returns NULL on error. */
166
1b20edf0 167static gdbpy_ref<>
2c74e833
TT
168convert_field (struct type *type, int field)
169{
7780f186 170 gdbpy_ref<> result (field_new ());
2c74e833 171
3bb43384 172 if (result == NULL)
2c74e833
TT
173 return NULL;
174
7780f186 175 gdbpy_ref<> arg (type_to_type_object (type));
a16b0e22 176 if (arg == NULL)
3bb43384
TT
177 return NULL;
178 if (PyObject_SetAttrString (result.get (), "parent_type", arg.get ()) < 0)
179 return NULL;
a16b0e22 180
2c74e833
TT
181 if (!field_is_static (&TYPE_FIELD (type, field)))
182 {
14e75d8e
JK
183 const char *attrstring;
184
185 if (TYPE_CODE (type) == TYPE_CODE_ENUM)
186 {
3bb43384
TT
187 arg.reset (gdb_py_long_from_longest (TYPE_FIELD_ENUMVAL (type,
188 field)));
14e75d8e
JK
189 attrstring = "enumval";
190 }
191 else
192 {
3bb43384
TT
193 arg.reset (gdb_py_long_from_longest (TYPE_FIELD_BITPOS (type,
194 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
4753d33b 228 if (TYPE_CODE (type) == 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
236 arg.reset (PyLong_FromLong (TYPE_FIELD_BITSIZE (type, field)));
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. */
243 if (TYPE_FIELD_TYPE (type, field) == NULL)
1b20edf0 244 arg = gdbpy_ref<>::new_reference (Py_None);
2c74e833 245 else
3bb43384
TT
246 arg.reset (type_to_type_object (TYPE_FIELD_TYPE (type, field)));
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
9cc10fd1
PK
357 if (TYPE_CODE (type) != TYPE_CODE_ARRAY)
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
394 if (TYPE_NAME (type) == NULL)
395 Py_RETURN_NONE;
396 return PyString_FromString (TYPE_NAME (type));
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
e86ca25f
TT
406 if (TYPE_CODE (type) == TYPE_CODE_STRUCT
407 || TYPE_CODE (type) == TYPE_CODE_UNION
408 || TYPE_CODE (type) == TYPE_CODE_ENUM)
409 tagname = TYPE_NAME (type);
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
aa006118 464 if (TYPE_CODE (type) != 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. */
256458bc 471 if (TYPE_CODE (type) != TYPE_CODE_STRUCT
9cc10fd1 472 && TYPE_CODE (type) != TYPE_CODE_UNION
bed91f4d
SM
473 && TYPE_CODE (type) != TYPE_CODE_ENUM
474 && TYPE_CODE (type) != 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
PM
579
580 if (TYPE_CODE (type) != TYPE_CODE_ARRAY
581 && TYPE_CODE (type) != TYPE_CODE_STRING
582 && TYPE_CODE (type) != TYPE_CODE_RANGE)
583 {
584 PyErr_SetString (PyExc_RuntimeError,
044c0f87 585 _("This type does not have a range."));
361ae042
PM
586 return NULL;
587 }
588
589 switch (TYPE_CODE (type))
590 {
591 case TYPE_CODE_ARRAY:
592 case TYPE_CODE_STRING:
593 low = TYPE_LOW_BOUND (TYPE_INDEX_TYPE (type));
594 high = TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (type));
595 break;
596 case TYPE_CODE_RANGE:
597 low = TYPE_LOW_BOUND (type);
598 high = TYPE_HIGH_BOUND (type);
599 break;
600 }
601
7780f186 602 gdbpy_ref<> low_bound (PyLong_FromLong (low));
3bb43384
TT
603 if (low_bound == NULL)
604 return NULL;
361ae042 605
7780f186 606 gdbpy_ref<> high_bound (PyLong_FromLong (high));
3bb43384
TT
607 if (high_bound == NULL)
608 return NULL;
361ae042 609
7780f186 610 gdbpy_ref<> result (PyTuple_New (2));
3bb43384
TT
611 if (result == NULL)
612 return NULL;
256458bc 613
3bb43384
TT
614 if (PyTuple_SetItem (result.get (), 0, low_bound.release ()) != 0
615 || PyTuple_SetItem (result.get (), 1, high_bound.release ()) != 0)
616 return NULL;
617 return result.release ();
361ae042
PM
618}
619
2c74e833
TT
620/* Return a Type object which represents a reference to SELF. */
621static PyObject *
622typy_reference (PyObject *self, PyObject *args)
623{
624 struct type *type = ((type_object *) self)->type;
2c74e833 625
a70b8144 626 try
2c74e833 627 {
3b224330 628 type = lookup_lvalue_reference_type (type);
2c74e833 629 }
230d2906 630 catch (const gdb_exception &except)
492d29ea
PA
631 {
632 GDB_PY_HANDLE_EXCEPTION (except);
633 }
2c74e833
TT
634
635 return type_to_type_object (type);
636}
637
638/* Return a Type object which represents the target type of SELF. */
639static PyObject *
640typy_target (PyObject *self, PyObject *args)
641{
642 struct type *type = ((type_object *) self)->type;
643
644 if (!TYPE_TARGET_TYPE (type))
645 {
256458bc 646 PyErr_SetString (PyExc_RuntimeError,
044c0f87 647 _("Type does not have a target."));
2c74e833
TT
648 return NULL;
649 }
650
651 return type_to_type_object (TYPE_TARGET_TYPE (type));
652}
653
654/* Return a const-qualified type variant. */
655static PyObject *
656typy_const (PyObject *self, PyObject *args)
657{
658 struct type *type = ((type_object *) self)->type;
2c74e833 659
a70b8144 660 try
2c74e833
TT
661 {
662 type = make_cv_type (1, 0, type, NULL);
663 }
230d2906 664 catch (const gdb_exception &except)
492d29ea
PA
665 {
666 GDB_PY_HANDLE_EXCEPTION (except);
667 }
2c74e833
TT
668
669 return type_to_type_object (type);
670}
671
672/* Return a volatile-qualified type variant. */
673static PyObject *
674typy_volatile (PyObject *self, PyObject *args)
675{
676 struct type *type = ((type_object *) self)->type;
2c74e833 677
a70b8144 678 try
2c74e833
TT
679 {
680 type = make_cv_type (0, 1, type, NULL);
681 }
230d2906 682 catch (const gdb_exception &except)
492d29ea
PA
683 {
684 GDB_PY_HANDLE_EXCEPTION (except);
685 }
2c74e833
TT
686
687 return type_to_type_object (type);
688}
689
690/* Return an unqualified type variant. */
691static PyObject *
692typy_unqualified (PyObject *self, PyObject *args)
693{
694 struct type *type = ((type_object *) self)->type;
2c74e833 695
a70b8144 696 try
2c74e833
TT
697 {
698 type = make_cv_type (0, 0, type, NULL);
699 }
230d2906 700 catch (const gdb_exception &except)
492d29ea
PA
701 {
702 GDB_PY_HANDLE_EXCEPTION (except);
703 }
2c74e833
TT
704
705 return type_to_type_object (type);
706}
707
708/* Return the size of the type represented by SELF, in bytes. */
709static PyObject *
710typy_get_sizeof (PyObject *self, void *closure)
711{
712 struct type *type = ((type_object *) self)->type;
2c74e833 713
a70b8144 714 try
2c74e833
TT
715 {
716 check_typedef (type);
717 }
230d2906 718 catch (const gdb_exception &except)
492d29ea
PA
719 {
720 }
492d29ea 721
2c74e833
TT
722 /* Ignore exceptions. */
723
200bc880 724 return gdb_py_long_from_longest (TYPE_LENGTH (type));
2c74e833
TT
725}
726
6d7bb824
TT
727/* Return the alignment of the type represented by SELF, in bytes. */
728static PyObject *
729typy_get_alignof (PyObject *self, void *closure)
730{
731 struct type *type = ((type_object *) self)->type;
732
733 ULONGEST align = 0;
a70b8144 734 try
6d7bb824
TT
735 {
736 align = type_align (type);
737 }
230d2906 738 catch (const gdb_exception &except)
6d7bb824
TT
739 {
740 align = 0;
741 }
6d7bb824
TT
742
743 /* Ignore exceptions. */
744
12dfa12a 745 return gdb_py_object_from_ulongest (align).release ();
6d7bb824
TT
746}
747
2c74e833 748static struct type *
9df2fbc4 749typy_lookup_typename (const char *type_name, const struct block *block)
2c74e833
TT
750{
751 struct type *type = NULL;
d59b6f6c 752
a70b8144 753 try
2c74e833 754 {
61012eef 755 if (startswith (type_name, "struct "))
2c74e833 756 type = lookup_struct (type_name + 7, NULL);
61012eef 757 else if (startswith (type_name, "union "))
2c74e833 758 type = lookup_union (type_name + 6, NULL);
61012eef 759 else if (startswith (type_name, "enum "))
2c74e833
TT
760 type = lookup_enum (type_name + 5, NULL);
761 else
d452c4bc 762 type = lookup_typename (python_language, python_gdbarch,
5107b149 763 type_name, block, 0);
2c74e833 764 }
230d2906 765 catch (const gdb_exception &except)
492d29ea
PA
766 {
767 GDB_PY_HANDLE_EXCEPTION (except);
768 }
2c74e833
TT
769
770 return type;
771}
772
773static struct type *
5107b149 774typy_lookup_type (struct demangle_component *demangled,
9df2fbc4 775 const struct block *block)
2c74e833 776{
cd829959 777 struct type *type, *rtype = NULL;
2c74e833
TT
778 enum demangle_component_type demangled_type;
779
780 /* Save the type: typy_lookup_type() may (indirectly) overwrite
781 memory pointed by demangled. */
782 demangled_type = demangled->type;
783
784 if (demangled_type == DEMANGLE_COMPONENT_POINTER
785 || demangled_type == DEMANGLE_COMPONENT_REFERENCE
e4347c89 786 || demangled_type == DEMANGLE_COMPONENT_RVALUE_REFERENCE
2c74e833
TT
787 || demangled_type == DEMANGLE_COMPONENT_CONST
788 || demangled_type == DEMANGLE_COMPONENT_VOLATILE)
789 {
5107b149 790 type = typy_lookup_type (demangled->u.s_binary.left, block);
2c74e833
TT
791 if (! type)
792 return NULL;
793
a70b8144 794 try
76dce0be 795 {
cd829959
PM
796 /* If the demangled_type matches with one of the types
797 below, run the corresponding function and save the type
798 to return later. We cannot just return here as we are in
799 an exception handler. */
76dce0be
PM
800 switch (demangled_type)
801 {
802 case DEMANGLE_COMPONENT_REFERENCE:
3b224330 803 rtype = lookup_lvalue_reference_type (type);
cd829959 804 break;
e4347c89
AV
805 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
806 rtype = lookup_rvalue_reference_type (type);
807 break;
76dce0be 808 case DEMANGLE_COMPONENT_POINTER:
cd829959
PM
809 rtype = lookup_pointer_type (type);
810 break;
76dce0be 811 case DEMANGLE_COMPONENT_CONST:
cd829959
PM
812 rtype = make_cv_type (1, 0, type, NULL);
813 break;
76dce0be 814 case DEMANGLE_COMPONENT_VOLATILE:
cd829959
PM
815 rtype = make_cv_type (0, 1, type, NULL);
816 break;
76dce0be 817 }
76dce0be 818 }
230d2906 819 catch (const gdb_exception &except)
492d29ea
PA
820 {
821 GDB_PY_HANDLE_EXCEPTION (except);
822 }
2c74e833 823 }
256458bc 824
cd829959
PM
825 /* If we have a type from the switch statement above, just return
826 that. */
827 if (rtype)
828 return rtype;
256458bc 829
cd829959 830 /* We don't have a type, so lookup the type. */
29592bde
PA
831 gdb::unique_xmalloc_ptr<char> type_name = cp_comp_to_string (demangled, 10);
832 return typy_lookup_typename (type_name.get (), block);
2c74e833
TT
833}
834
326fd672
TT
835/* This is a helper function for typy_template_argument that is used
836 when the type does not have template symbols attached. It works by
837 parsing the type name. This happens with compilers, like older
838 versions of GCC, that do not emit DW_TAG_template_*. */
839
2c74e833 840static PyObject *
9df2fbc4 841typy_legacy_template_argument (struct type *type, const struct block *block,
326fd672 842 int argno)
2c74e833 843{
326fd672 844 int i;
2c74e833 845 struct demangle_component *demangled;
c8b23b3f 846 std::unique_ptr<demangle_parse_info> info;
3513a6bb 847 std::string err;
2c74e833 848 struct type *argtype;
2c74e833
TT
849
850 if (TYPE_NAME (type) == NULL)
851 {
5107b149 852 PyErr_SetString (PyExc_RuntimeError, _("Null type name."));
2c74e833
TT
853 return NULL;
854 }
855
a70b8144 856 try
5d9c5995
PM
857 {
858 /* Note -- this is not thread-safe. */
859 info = cp_demangled_name_to_comp (TYPE_NAME (type), &err);
860 }
230d2906 861 catch (const gdb_exception &except)
492d29ea
PA
862 {
863 GDB_PY_HANDLE_EXCEPTION (except);
864 }
5d9c5995 865
3a93a0c2 866 if (! info)
2c74e833 867 {
3513a6bb 868 PyErr_SetString (PyExc_RuntimeError, err.c_str ());
2c74e833
TT
869 return NULL;
870 }
3a93a0c2 871 demangled = info->tree;
2c74e833
TT
872
873 /* Strip off component names. */
874 while (demangled->type == DEMANGLE_COMPONENT_QUAL_NAME
875 || demangled->type == DEMANGLE_COMPONENT_LOCAL_NAME)
876 demangled = demangled->u.s_binary.right;
877
878 if (demangled->type != DEMANGLE_COMPONENT_TEMPLATE)
879 {
5107b149 880 PyErr_SetString (PyExc_RuntimeError, _("Type is not a template."));
2c74e833
TT
881 return NULL;
882 }
883
884 /* Skip from the template to the arguments. */
885 demangled = demangled->u.s_binary.right;
886
887 for (i = 0; demangled && i < argno; ++i)
888 demangled = demangled->u.s_binary.right;
889
890 if (! demangled)
891 {
5107b149 892 PyErr_Format (PyExc_RuntimeError, _("No argument %d in template."),
2c74e833
TT
893 argno);
894 return NULL;
895 }
896
5107b149 897 argtype = typy_lookup_type (demangled->u.s_binary.left, block);
2c74e833
TT
898 if (! argtype)
899 return NULL;
900
901 return type_to_type_object (argtype);
326fd672
TT
902}
903
904static PyObject *
905typy_template_argument (PyObject *self, PyObject *args)
906{
907 int argno;
908 struct type *type = ((type_object *) self)->type;
9df2fbc4 909 const struct block *block = NULL;
326fd672
TT
910 PyObject *block_obj = NULL;
911 struct symbol *sym;
912 struct value *val = NULL;
326fd672
TT
913
914 if (! PyArg_ParseTuple (args, "i|O", &argno, &block_obj))
915 return NULL;
916
fd3ba736
TT
917 if (argno < 0)
918 {
919 PyErr_SetString (PyExc_RuntimeError,
920 _("Template argument number must be non-negative"));
921 return NULL;
922 }
923
326fd672
TT
924 if (block_obj)
925 {
926 block = block_object_to_block (block_obj);
927 if (! block)
928 {
929 PyErr_SetString (PyExc_RuntimeError,
930 _("Second argument must be block."));
931 return NULL;
932 }
933 }
934
a70b8144 935 try
05d0e1e7
TT
936 {
937 type = check_typedef (type);
aa006118 938 if (TYPE_IS_REFERENCE (type))
05d0e1e7
TT
939 type = check_typedef (TYPE_TARGET_TYPE (type));
940 }
230d2906 941 catch (const gdb_exception &except)
492d29ea
PA
942 {
943 GDB_PY_HANDLE_EXCEPTION (except);
944 }
326fd672
TT
945
946 /* We might not have DW_TAG_template_*, so try to parse the type's
947 name. This is inefficient if we do not have a template type --
948 but that is going to wind up as an error anyhow. */
949 if (! TYPE_N_TEMPLATE_ARGUMENTS (type))
950 return typy_legacy_template_argument (type, block, argno);
951
952 if (argno >= TYPE_N_TEMPLATE_ARGUMENTS (type))
953 {
954 PyErr_Format (PyExc_RuntimeError, _("No argument %d in template."),
955 argno);
956 return NULL;
957 }
958
959 sym = TYPE_TEMPLATE_ARGUMENT (type, argno);
960 if (SYMBOL_CLASS (sym) == LOC_TYPEDEF)
961 return type_to_type_object (SYMBOL_TYPE (sym));
962 else if (SYMBOL_CLASS (sym) == LOC_OPTIMIZED_OUT)
963 {
964 PyErr_Format (PyExc_RuntimeError,
965 _("Template argument is optimized out"));
966 return NULL;
967 }
968
a70b8144 969 try
326fd672
TT
970 {
971 val = value_of_variable (sym, block);
972 }
230d2906 973 catch (const gdb_exception &except)
492d29ea
PA
974 {
975 GDB_PY_HANDLE_EXCEPTION (except);
976 }
326fd672
TT
977
978 return value_to_value_object (val);
2c74e833
TT
979}
980
981static PyObject *
982typy_str (PyObject *self)
983{
d7e74731 984 string_file thetype;
2c74e833 985
a70b8144 986 try
2c74e833 987 {
d7e74731 988 LA_PRINT_TYPE (type_object_to_type (self), "", &thetype, -1, 0,
53342f27 989 &type_print_raw_options);
2c74e833 990 }
230d2906 991 catch (const gdb_exception &except)
2c74e833 992 {
2c74e833
TT
993 GDB_PY_HANDLE_EXCEPTION (except);
994 }
995
d7e74731
PA
996 return PyUnicode_Decode (thetype.c_str (), thetype.size (),
997 host_charset (), NULL);
2c74e833
TT
998}
999
d839c8a4
TT
1000/* Implement the richcompare method. */
1001
1002static PyObject *
1003typy_richcompare (PyObject *self, PyObject *other, int op)
1004{
894882e3 1005 bool result = false;
d839c8a4
TT
1006 struct type *type1 = type_object_to_type (self);
1007 struct type *type2 = type_object_to_type (other);
d839c8a4
TT
1008
1009 /* We can only compare ourselves to another Type object, and only
1010 for equality or inequality. */
1011 if (type2 == NULL || (op != Py_EQ && op != Py_NE))
1012 {
1013 Py_INCREF (Py_NotImplemented);
1014 return Py_NotImplemented;
1015 }
1016
1017 if (type1 == type2)
894882e3 1018 result = true;
d839c8a4
TT
1019 else
1020 {
a70b8144 1021 try
d839c8a4 1022 {
ca092b61 1023 result = types_deeply_equal (type1, type2);
d839c8a4 1024 }
230d2906 1025 catch (const gdb_exception &except)
492d29ea
PA
1026 {
1027 /* If there is a GDB exception, a comparison is not capable
1028 (or trusted), so exit. */
1029 GDB_PY_HANDLE_EXCEPTION (except);
1030 }
d839c8a4
TT
1031 }
1032
ca092b61 1033 if (op == (result ? Py_EQ : Py_NE))
d839c8a4
TT
1034 Py_RETURN_TRUE;
1035 Py_RETURN_FALSE;
1036}
1037
2c74e833
TT
1038\f
1039
1040static const struct objfile_data *typy_objfile_data_key;
1041
1042static void
c1bd65d0 1043save_objfile_types (struct objfile *objfile, void *datum)
2c74e833 1044{
19ba03f4 1045 type_object *obj = (type_object *) datum;
2c74e833 1046 htab_t copied_types;
2c74e833 1047
0646da15
TT
1048 if (!gdb_python_initialized)
1049 return;
1050
2c74e833
TT
1051 /* This prevents another thread from freeing the objects we're
1052 operating on. */
c57af3f1 1053 gdbpy_enter enter_py (get_objfile_arch (objfile), current_language);
2c74e833
TT
1054
1055 copied_types = create_copied_types_hash (objfile);
1056
1057 while (obj)
1058 {
1059 type_object *next = obj->next;
1060
1061 htab_empty (copied_types);
1062
1063 obj->type = copy_type_recursive (objfile, obj->type, copied_types);
1064
1065 obj->next = NULL;
1066 obj->prev = NULL;
1067
1068 obj = next;
1069 }
1070
1071 htab_delete (copied_types);
2c74e833
TT
1072}
1073
1074static void
1075set_type (type_object *obj, struct type *type)
1076{
1077 obj->type = type;
1078 obj->prev = NULL;
1079 if (type && TYPE_OBJFILE (type))
1080 {
1081 struct objfile *objfile = TYPE_OBJFILE (type);
1082
19ba03f4
SM
1083 obj->next = ((struct pyty_type_object *)
1084 objfile_data (objfile, typy_objfile_data_key));
2c74e833
TT
1085 if (obj->next)
1086 obj->next->prev = obj;
1087 set_objfile_data (objfile, typy_objfile_data_key, obj);
1088 }
1089 else
1090 obj->next = NULL;
1091}
1092
1093static void
1094typy_dealloc (PyObject *obj)
1095{
1096 type_object *type = (type_object *) obj;
1097
1098 if (type->prev)
1099 type->prev->next = type->next;
1100 else if (type->type && TYPE_OBJFILE (type->type))
1101 {
1102 /* Must reset head of list. */
1103 struct objfile *objfile = TYPE_OBJFILE (type->type);
d59b6f6c 1104
2c74e833
TT
1105 if (objfile)
1106 set_objfile_data (objfile, typy_objfile_data_key, type->next);
1107 }
1108 if (type->next)
1109 type->next->prev = type->prev;
1110
9a27f2c6 1111 Py_TYPE (type)->tp_free (type);
2c74e833
TT
1112}
1113
a73bb892
PK
1114/* Return number of fields ("length" of the field dictionary). */
1115
1116static Py_ssize_t
1117typy_length (PyObject *self)
1118{
1119 struct type *type = ((type_object *) self)->type;
1120
9cc10fd1
PK
1121 type = typy_get_composite (type);
1122 if (type == NULL)
1123 return -1;
1124
a73bb892
PK
1125 return TYPE_NFIELDS (type);
1126}
1127
9cc10fd1 1128/* Implements boolean evaluation of gdb.Type. Handle this like other
256458bc 1129 Python objects that don't have a meaningful truth value -- all
9cc10fd1
PK
1130 values are true. */
1131
1132static int
1133typy_nonzero (PyObject *self)
1134{
1135 return 1;
1136}
1137
59fb7612
SS
1138/* Return optimized out value of this type. */
1139
1140static PyObject *
1141typy_optimized_out (PyObject *self, PyObject *args)
1142{
1143 struct type *type = ((type_object *) self)->type;
1144
1145 return value_to_value_object (allocate_optimized_out_value (type));
1146}
1147
a73bb892
PK
1148/* Return a gdb.Field object for the field named by the argument. */
1149
1150static PyObject *
1151typy_getitem (PyObject *self, PyObject *key)
1152{
1153 struct type *type = ((type_object *) self)->type;
a73bb892 1154 int i;
76dce0be 1155
9b972014 1156 gdb::unique_xmalloc_ptr<char> field = python_string_to_host_string (key);
a73bb892
PK
1157 if (field == NULL)
1158 return NULL;
1159
256458bc 1160 /* We want just fields of this type, not of base types, so instead of
a73bb892
PK
1161 using lookup_struct_elt_type, portions of that function are
1162 copied here. */
1163
9cc10fd1
PK
1164 type = typy_get_composite (type);
1165 if (type == NULL)
1166 return NULL;
256458bc 1167
a73bb892
PK
1168 for (i = 0; i < TYPE_NFIELDS (type); i++)
1169 {
0d5cff50 1170 const char *t_field_name = TYPE_FIELD_NAME (type, i);
a73bb892 1171
9b972014 1172 if (t_field_name && (strcmp_iw (t_field_name, field.get ()) == 0))
1b20edf0 1173 return convert_field (type, i).release ();
a73bb892
PK
1174 }
1175 PyErr_SetObject (PyExc_KeyError, key);
1176 return NULL;
1177}
1178
256458bc 1179/* Implement the "get" method on the type object. This is the
a73bb892
PK
1180 same as getitem if the key is present, but returns the supplied
1181 default value or None if the key is not found. */
1182
1183static PyObject *
1184typy_get (PyObject *self, PyObject *args)
1185{
1186 PyObject *key, *defval = Py_None, *result;
256458bc 1187
a73bb892
PK
1188 if (!PyArg_UnpackTuple (args, "get", 1, 2, &key, &defval))
1189 return NULL;
256458bc 1190
a73bb892
PK
1191 result = typy_getitem (self, key);
1192 if (result != NULL)
1193 return result;
256458bc 1194
a73bb892
PK
1195 /* typy_getitem returned error status. If the exception is
1196 KeyError, clear the exception status and return the defval
1197 instead. Otherwise return the exception unchanged. */
1198 if (!PyErr_ExceptionMatches (PyExc_KeyError))
1199 return NULL;
256458bc 1200
a73bb892
PK
1201 PyErr_Clear ();
1202 Py_INCREF (defval);
1203 return defval;
1204}
1205
1206/* Implement the "has_key" method on the type object. */
1207
1208static PyObject *
1209typy_has_key (PyObject *self, PyObject *args)
1210{
1211 struct type *type = ((type_object *) self)->type;
2ff6b080 1212 const char *field;
a73bb892 1213 int i;
76dce0be 1214
a73bb892
PK
1215 if (!PyArg_ParseTuple (args, "s", &field))
1216 return NULL;
1217
256458bc 1218 /* We want just fields of this type, not of base types, so instead of
a73bb892
PK
1219 using lookup_struct_elt_type, portions of that function are
1220 copied here. */
1221
9cc10fd1
PK
1222 type = typy_get_composite (type);
1223 if (type == NULL)
1224 return NULL;
a73bb892
PK
1225
1226 for (i = 0; i < TYPE_NFIELDS (type); i++)
1227 {
0d5cff50 1228 const char *t_field_name = TYPE_FIELD_NAME (type, i);
a73bb892
PK
1229
1230 if (t_field_name && (strcmp_iw (t_field_name, field) == 0))
1231 Py_RETURN_TRUE;
1232 }
1233 Py_RETURN_FALSE;
1234}
1235
1236/* Make an iterator object to iterate over keys, values, or items. */
1237
1238static PyObject *
1239typy_make_iter (PyObject *self, enum gdbpy_iter_kind kind)
1240{
1241 typy_iterator_object *typy_iter_obj;
1242
9cc10fd1
PK
1243 /* Check that "self" is a structure or union type. */
1244 if (typy_get_composite (((type_object *) self)->type) == NULL)
1245 return NULL;
256458bc 1246
a73bb892
PK
1247 typy_iter_obj = PyObject_New (typy_iterator_object,
1248 &type_iterator_object_type);
1249 if (typy_iter_obj == NULL)
1250 return NULL;
1251
1252 typy_iter_obj->field = 0;
1253 typy_iter_obj->kind = kind;
1254 Py_INCREF (self);
1255 typy_iter_obj->source = (type_object *) self;
1256
1257 return (PyObject *) typy_iter_obj;
1258}
1259
1260/* iteritems() method. */
1261
1262static PyObject *
1263typy_iteritems (PyObject *self, PyObject *args)
1264{
1265 return typy_make_iter (self, iter_items);
1266}
1267
1268/* iterkeys() method. */
1269
1270static PyObject *
1271typy_iterkeys (PyObject *self, PyObject *args)
1272{
1273 return typy_make_iter (self, iter_keys);
1274}
1275
1276/* Iterating over the class, same as iterkeys except for the function
1277 signature. */
1278
1279static PyObject *
1280typy_iter (PyObject *self)
1281{
1282 return typy_make_iter (self, iter_keys);
1283}
1284
1285/* itervalues() method. */
1286
1287static PyObject *
1288typy_itervalues (PyObject *self, PyObject *args)
1289{
1290 return typy_make_iter (self, iter_values);
1291}
1292
1293/* Return a reference to the type iterator. */
1294
1295static PyObject *
1296typy_iterator_iter (PyObject *self)
1297{
1298 Py_INCREF (self);
1299 return self;
1300}
1301
1302/* Return the next field in the iteration through the list of fields
1303 of the type. */
1304
1305static PyObject *
1306typy_iterator_iternext (PyObject *self)
1307{
1308 typy_iterator_object *iter_obj = (typy_iterator_object *) self;
1309 struct type *type = iter_obj->source->type;
256458bc 1310
a73bb892
PK
1311 if (iter_obj->field < TYPE_NFIELDS (type))
1312 {
1b20edf0
TT
1313 gdbpy_ref<> result = make_fielditem (type, iter_obj->field,
1314 iter_obj->kind);
a73bb892
PK
1315 if (result != NULL)
1316 iter_obj->field++;
1b20edf0 1317 return result.release ();
a73bb892
PK
1318 }
1319
1320 return NULL;
1321}
1322
1323static void
1324typy_iterator_dealloc (PyObject *obj)
1325{
1326 typy_iterator_object *iter_obj = (typy_iterator_object *) obj;
1327
1328 Py_DECREF (iter_obj->source);
1329}
1330
2c74e833
TT
1331/* Create a new Type referring to TYPE. */
1332PyObject *
1333type_to_type_object (struct type *type)
1334{
1335 type_object *type_obj;
1336
1337 type_obj = PyObject_New (type_object, &type_object_type);
1338 if (type_obj)
1339 set_type (type_obj, type);
1340
1341 return (PyObject *) type_obj;
1342}
1343
1344struct type *
1345type_object_to_type (PyObject *obj)
1346{
1347 if (! PyObject_TypeCheck (obj, &type_object_type))
1348 return NULL;
1349 return ((type_object *) obj)->type;
1350}
1351
1352\f
1353
1354/* Implementation of gdb.lookup_type. */
1355PyObject *
1356gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw)
1357{
2adadf51 1358 static const char *keywords[] = { "name", "block", NULL };
ddd49eee 1359 const char *type_name = NULL;
2c74e833 1360 struct type *type = NULL;
5107b149 1361 PyObject *block_obj = NULL;
9df2fbc4 1362 const struct block *block = NULL;
2c74e833 1363
2adadf51
PA
1364 if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|O", keywords,
1365 &type_name, &block_obj))
2c74e833
TT
1366 return NULL;
1367
5107b149
PM
1368 if (block_obj)
1369 {
1370 block = block_object_to_block (block_obj);
1371 if (! block)
1372 {
1373 PyErr_SetString (PyExc_RuntimeError,
1374 _("'block' argument must be a Block."));
1375 return NULL;
1376 }
1377 }
1378
1379 type = typy_lookup_typename (type_name, block);
2c74e833
TT
1380 if (! type)
1381 return NULL;
1382
8833fbf0 1383 return type_to_type_object (type);
2c74e833
TT
1384}
1385
999633ed 1386int
2c74e833
TT
1387gdbpy_initialize_types (void)
1388{
1389 int i;
1390
1391 typy_objfile_data_key
c1bd65d0 1392 = register_objfile_data_with_cleanup (save_objfile_types, NULL);
2c74e833
TT
1393
1394 if (PyType_Ready (&type_object_type) < 0)
999633ed 1395 return -1;
2c74e833 1396 if (PyType_Ready (&field_object_type) < 0)
999633ed 1397 return -1;
a73bb892 1398 if (PyType_Ready (&type_iterator_object_type) < 0)
999633ed 1399 return -1;
2c74e833
TT
1400
1401 for (i = 0; pyty_codes[i].name; ++i)
1402 {
6c28e44a 1403 if (PyModule_AddIntConstant (gdb_module, pyty_codes[i].name,
2c74e833 1404 pyty_codes[i].code) < 0)
999633ed 1405 return -1;
2c74e833
TT
1406 }
1407
aa36459a
TT
1408 if (gdb_pymodule_addobject (gdb_module, "Type",
1409 (PyObject *) &type_object_type) < 0)
999633ed 1410 return -1;
2c74e833 1411
aa36459a
TT
1412 if (gdb_pymodule_addobject (gdb_module, "TypeIterator",
1413 (PyObject *) &type_iterator_object_type) < 0)
999633ed 1414 return -1;
a73bb892 1415
aa36459a
TT
1416 return gdb_pymodule_addobject (gdb_module, "Field",
1417 (PyObject *) &field_object_type);
2c74e833
TT
1418}
1419
1420\f
1421
0d1f4ceb 1422static gdb_PyGetSetDef type_object_getset[] =
2c74e833 1423{
6d7bb824
TT
1424 { "alignof", typy_get_alignof, NULL,
1425 "The alignment of this type, in bytes.", NULL },
2c74e833
TT
1426 { "code", typy_get_code, NULL,
1427 "The code for this type.", NULL },
c0d48811
JB
1428 { "name", typy_get_name, NULL,
1429 "The name for this type, or None.", NULL },
2c74e833
TT
1430 { "sizeof", typy_get_sizeof, NULL,
1431 "The size of this type, in bytes.", NULL },
1432 { "tag", typy_get_tag, NULL,
1433 "The tag name for this type, or None.", NULL },
e1f2e1a2
CB
1434 { "objfile", typy_get_objfile, NULL,
1435 "The objfile this type was defined in, or None.", NULL },
2c74e833
TT
1436 { NULL }
1437};
1438
1439static PyMethodDef type_object_methods[] =
1440{
702c2711 1441 { "array", typy_array, METH_VARARGS,
f28c316a
DE
1442 "array ([LOW_BOUND,] HIGH_BOUND) -> Type\n\
1443Return a type which represents an array of objects of this type.\n\
1444The bounds of the array are [LOW_BOUND, HIGH_BOUND] inclusive.\n\
1445If LOW_BOUND is omitted, a value of zero is used." },
a72c3253
DE
1446 { "vector", typy_vector, METH_VARARGS,
1447 "vector ([LOW_BOUND,] HIGH_BOUND) -> Type\n\
1448Return a type which represents a vector of objects of this type.\n\
1449The bounds of the array are [LOW_BOUND, HIGH_BOUND] inclusive.\n\
1450If LOW_BOUND is omitted, a value of zero is used.\n\
1451Vectors differ from arrays in that if the current language has C-style\n\
1452arrays, vectors don't decay to a pointer to the first element.\n\
1453They are first class values." },
a73bb892
PK
1454 { "__contains__", typy_has_key, METH_VARARGS,
1455 "T.__contains__(k) -> True if T has a field named k, else False" },
2c74e833
TT
1456 { "const", typy_const, METH_NOARGS,
1457 "const () -> Type\n\
1458Return a const variant of this type." },
59fb7612
SS
1459 { "optimized_out", typy_optimized_out, METH_NOARGS,
1460 "optimized_out() -> Value\n\
1461Return optimized out value of this type." },
2c74e833 1462 { "fields", typy_fields, METH_NOARGS,
a73bb892
PK
1463 "fields () -> list\n\
1464Return a list holding all the fields of this type.\n\
1465Each field is a gdb.Field object." },
1466 { "get", typy_get, METH_VARARGS,
1467 "T.get(k[,default]) -> returns field named k in T, if it exists;\n\
1468otherwise returns default, if supplied, or None if not." },
1469 { "has_key", typy_has_key, METH_VARARGS,
1470 "T.has_key(k) -> True if T has a field named k, else False" },
1471 { "items", typy_items, METH_NOARGS,
1472 "items () -> list\n\
1473Return a list of (name, field) pairs of this type.\n\
1474Each field is a gdb.Field object." },
1475 { "iteritems", typy_iteritems, METH_NOARGS,
1476 "iteritems () -> an iterator over the (name, field)\n\
1477pairs of this type. Each field is a gdb.Field object." },
1478 { "iterkeys", typy_iterkeys, METH_NOARGS,
1479 "iterkeys () -> an iterator over the field names of this type." },
1480 { "itervalues", typy_itervalues, METH_NOARGS,
1481 "itervalues () -> an iterator over the fields of this type.\n\
1482Each field is a gdb.Field object." },
1483 { "keys", typy_field_names, METH_NOARGS,
1484 "keys () -> list\n\
1485Return a list holding all the fields names of this type." },
2c74e833
TT
1486 { "pointer", typy_pointer, METH_NOARGS,
1487 "pointer () -> Type\n\
1488Return a type of pointer to this type." },
361ae042
PM
1489 { "range", typy_range, METH_NOARGS,
1490 "range () -> tuple\n\
1491Return a tuple containing the lower and upper range for this type."},
2c74e833
TT
1492 { "reference", typy_reference, METH_NOARGS,
1493 "reference () -> Type\n\
1494Return a type of reference to this type." },
1495 { "strip_typedefs", typy_strip_typedefs, METH_NOARGS,
1496 "strip_typedefs () -> Type\n\
1497Return a type formed by stripping this type of all typedefs."},
1498 { "target", typy_target, METH_NOARGS,
1499 "target () -> Type\n\
1500Return the target type of this type." },
1501 { "template_argument", typy_template_argument, METH_VARARGS,
5107b149 1502 "template_argument (arg, [block]) -> Type\n\
2c74e833
TT
1503Return the type of a template argument." },
1504 { "unqualified", typy_unqualified, METH_NOARGS,
1505 "unqualified () -> Type\n\
1506Return a variant of this type without const or volatile attributes." },
9cc10fd1 1507 { "values", typy_values, METH_NOARGS,
a73bb892
PK
1508 "values () -> list\n\
1509Return a list holding all the fields of this type.\n\
1510Each field is a gdb.Field object." },
2c74e833
TT
1511 { "volatile", typy_volatile, METH_NOARGS,
1512 "volatile () -> Type\n\
1513Return a volatile variant of this type" },
1514 { NULL }
1515};
1516
9cc10fd1
PK
1517static PyNumberMethods type_object_as_number = {
1518 NULL, /* nb_add */
1519 NULL, /* nb_subtract */
1520 NULL, /* nb_multiply */
9a27f2c6 1521#ifndef IS_PY3K
9cc10fd1 1522 NULL, /* nb_divide */
9a27f2c6 1523#endif
9cc10fd1
PK
1524 NULL, /* nb_remainder */
1525 NULL, /* nb_divmod */
1526 NULL, /* nb_power */
1527 NULL, /* nb_negative */
1528 NULL, /* nb_positive */
1529 NULL, /* nb_absolute */
1530 typy_nonzero, /* nb_nonzero */
1531 NULL, /* nb_invert */
1532 NULL, /* nb_lshift */
1533 NULL, /* nb_rshift */
1534 NULL, /* nb_and */
1535 NULL, /* nb_xor */
1536 NULL, /* nb_or */
9a27f2c6
PK
1537#ifdef IS_PY3K
1538 NULL, /* nb_int */
1539 NULL, /* reserved */
1540#else
9cc10fd1
PK
1541 NULL, /* nb_coerce */
1542 NULL, /* nb_int */
1543 NULL, /* nb_long */
9a27f2c6 1544#endif
9cc10fd1 1545 NULL, /* nb_float */
9a27f2c6 1546#ifndef IS_PY3K
9cc10fd1
PK
1547 NULL, /* nb_oct */
1548 NULL /* nb_hex */
9a27f2c6 1549#endif
9cc10fd1
PK
1550};
1551
a73bb892
PK
1552static PyMappingMethods typy_mapping = {
1553 typy_length,
1554 typy_getitem,
1555 NULL /* no "set" method */
1556};
1557
e36122e9 1558PyTypeObject type_object_type =
2c74e833 1559{
9a27f2c6 1560 PyVarObject_HEAD_INIT (NULL, 0)
2c74e833
TT
1561 "gdb.Type", /*tp_name*/
1562 sizeof (type_object), /*tp_basicsize*/
1563 0, /*tp_itemsize*/
1564 typy_dealloc, /*tp_dealloc*/
1565 0, /*tp_print*/
1566 0, /*tp_getattr*/
1567 0, /*tp_setattr*/
1568 0, /*tp_compare*/
1569 0, /*tp_repr*/
9cc10fd1 1570 &type_object_as_number, /*tp_as_number*/
2c74e833 1571 0, /*tp_as_sequence*/
a73bb892 1572 &typy_mapping, /*tp_as_mapping*/
2c74e833
TT
1573 0, /*tp_hash */
1574 0, /*tp_call*/
1575 typy_str, /*tp_str*/
1576 0, /*tp_getattro*/
1577 0, /*tp_setattro*/
1578 0, /*tp_as_buffer*/
1579 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1580 "GDB type object", /* tp_doc */
1581 0, /* tp_traverse */
1582 0, /* tp_clear */
d839c8a4 1583 typy_richcompare, /* tp_richcompare */
2c74e833 1584 0, /* tp_weaklistoffset */
a73bb892 1585 typy_iter, /* tp_iter */
2c74e833
TT
1586 0, /* tp_iternext */
1587 type_object_methods, /* tp_methods */
1588 0, /* tp_members */
1589 type_object_getset, /* tp_getset */
1590 0, /* tp_base */
1591 0, /* tp_dict */
1592 0, /* tp_descr_get */
1593 0, /* tp_descr_set */
1594 0, /* tp_dictoffset */
1595 0, /* tp_init */
1596 0, /* tp_alloc */
1597 0, /* tp_new */
1598};
1599
0d1f4ceb 1600static gdb_PyGetSetDef field_object_getset[] =
2e8265fd
TT
1601{
1602 { "__dict__", gdb_py_generic_dict, NULL,
1603 "The __dict__ for this field.", &field_object_type },
1604 { NULL }
1605};
1606
e36122e9 1607PyTypeObject field_object_type =
2c74e833 1608{
9a27f2c6 1609 PyVarObject_HEAD_INIT (NULL, 0)
2c74e833
TT
1610 "gdb.Field", /*tp_name*/
1611 sizeof (field_object), /*tp_basicsize*/
1612 0, /*tp_itemsize*/
1613 field_dealloc, /*tp_dealloc*/
1614 0, /*tp_print*/
1615 0, /*tp_getattr*/
1616 0, /*tp_setattr*/
1617 0, /*tp_compare*/
1618 0, /*tp_repr*/
1619 0, /*tp_as_number*/
1620 0, /*tp_as_sequence*/
1621 0, /*tp_as_mapping*/
1622 0, /*tp_hash */
1623 0, /*tp_call*/
1624 0, /*tp_str*/
1625 0, /*tp_getattro*/
1626 0, /*tp_setattro*/
1627 0, /*tp_as_buffer*/
1628 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1629 "GDB field object", /* tp_doc */
1630 0, /* tp_traverse */
1631 0, /* tp_clear */
1632 0, /* tp_richcompare */
1633 0, /* tp_weaklistoffset */
1634 0, /* tp_iter */
1635 0, /* tp_iternext */
1636 0, /* tp_methods */
1637 0, /* tp_members */
2e8265fd 1638 field_object_getset, /* tp_getset */
2c74e833
TT
1639 0, /* tp_base */
1640 0, /* tp_dict */
1641 0, /* tp_descr_get */
1642 0, /* tp_descr_set */
1643 offsetof (field_object, dict), /* tp_dictoffset */
1644 0, /* tp_init */
1645 0, /* tp_alloc */
1646 0, /* tp_new */
1647};
a73bb892 1648
e36122e9 1649PyTypeObject type_iterator_object_type = {
9a27f2c6 1650 PyVarObject_HEAD_INIT (NULL, 0)
a73bb892
PK
1651 "gdb.TypeIterator", /*tp_name*/
1652 sizeof (typy_iterator_object), /*tp_basicsize*/
1653 0, /*tp_itemsize*/
1654 typy_iterator_dealloc, /*tp_dealloc*/
1655 0, /*tp_print*/
1656 0, /*tp_getattr*/
1657 0, /*tp_setattr*/
1658 0, /*tp_compare*/
1659 0, /*tp_repr*/
1660 0, /*tp_as_number*/
1661 0, /*tp_as_sequence*/
1662 0, /*tp_as_mapping*/
1663 0, /*tp_hash */
1664 0, /*tp_call*/
1665 0, /*tp_str*/
1666 0, /*tp_getattro*/
1667 0, /*tp_setattro*/
1668 0, /*tp_as_buffer*/
1669 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1670 "GDB type iterator object", /*tp_doc */
1671 0, /*tp_traverse */
1672 0, /*tp_clear */
1673 0, /*tp_richcompare */
1674 0, /*tp_weaklistoffset */
1675 typy_iterator_iter, /*tp_iter */
1676 typy_iterator_iternext, /*tp_iternext */
1677 0 /*tp_methods */
1678};
This page took 1.118877 seconds and 4 git commands to generate.