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