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