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