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