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