Allow integer immediate for VFP vmov instructions.
[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;
d59b6f6c 419
2c74e833
TT
420 if (!TYPE_TAG_NAME (type))
421 Py_RETURN_NONE;
422 return PyString_FromString (TYPE_TAG_NAME (type));
423}
424
425/* Return the type, stripped of typedefs. */
426static PyObject *
427typy_strip_typedefs (PyObject *self, PyObject *args)
428{
429 struct type *type = ((type_object *) self)->type;
5d9c5995 430
492d29ea 431 TRY
5d9c5995
PM
432 {
433 type = check_typedef (type);
434 }
492d29ea
PA
435 CATCH (except, RETURN_MASK_ALL)
436 {
437 GDB_PY_HANDLE_EXCEPTION (except);
438 }
439 END_CATCH
2c74e833 440
bc9abe4a 441 return type_to_type_object (type);
2c74e833
TT
442}
443
9cc10fd1
PK
444/* Strip typedefs and pointers/reference from a type. Then check that
445 it is a struct, union, or enum type. If not, raise TypeError. */
446
447static struct type *
448typy_get_composite (struct type *type)
449{
9cc10fd1
PK
450
451 for (;;)
452 {
492d29ea 453 TRY
9cc10fd1 454 {
f168693b 455 type = check_typedef (type);
9cc10fd1 456 }
492d29ea
PA
457 CATCH (except, RETURN_MASK_ALL)
458 {
459 GDB_PY_HANDLE_EXCEPTION (except);
460 }
461 END_CATCH
9cc10fd1 462
aa006118 463 if (TYPE_CODE (type) != TYPE_CODE_PTR && !TYPE_IS_REFERENCE (type))
9cc10fd1
PK
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
6d7bb824
TT
733/* Return the alignment of the type represented by SELF, in bytes. */
734static PyObject *
735typy_get_alignof (PyObject *self, void *closure)
736{
737 struct type *type = ((type_object *) self)->type;
738
739 ULONGEST align = 0;
740 TRY
741 {
742 align = type_align (type);
743 }
744 CATCH (except, RETURN_MASK_ALL)
745 {
746 align = 0;
747 }
748 END_CATCH
749
750 /* Ignore exceptions. */
751
752 return gdb_py_object_from_ulongest (align);
753}
754
2c74e833 755static struct type *
9df2fbc4 756typy_lookup_typename (const char *type_name, const struct block *block)
2c74e833
TT
757{
758 struct type *type = NULL;
d59b6f6c 759
492d29ea 760 TRY
2c74e833 761 {
61012eef 762 if (startswith (type_name, "struct "))
2c74e833 763 type = lookup_struct (type_name + 7, NULL);
61012eef 764 else if (startswith (type_name, "union "))
2c74e833 765 type = lookup_union (type_name + 6, NULL);
61012eef 766 else if (startswith (type_name, "enum "))
2c74e833
TT
767 type = lookup_enum (type_name + 5, NULL);
768 else
d452c4bc 769 type = lookup_typename (python_language, python_gdbarch,
5107b149 770 type_name, block, 0);
2c74e833 771 }
492d29ea
PA
772 CATCH (except, RETURN_MASK_ALL)
773 {
774 GDB_PY_HANDLE_EXCEPTION (except);
775 }
776 END_CATCH
2c74e833
TT
777
778 return type;
779}
780
781static struct type *
5107b149 782typy_lookup_type (struct demangle_component *demangled,
9df2fbc4 783 const struct block *block)
2c74e833 784{
cd829959 785 struct type *type, *rtype = NULL;
2c74e833
TT
786 enum demangle_component_type demangled_type;
787
788 /* Save the type: typy_lookup_type() may (indirectly) overwrite
789 memory pointed by demangled. */
790 demangled_type = demangled->type;
791
792 if (demangled_type == DEMANGLE_COMPONENT_POINTER
793 || demangled_type == DEMANGLE_COMPONENT_REFERENCE
e4347c89 794 || demangled_type == DEMANGLE_COMPONENT_RVALUE_REFERENCE
2c74e833
TT
795 || demangled_type == DEMANGLE_COMPONENT_CONST
796 || demangled_type == DEMANGLE_COMPONENT_VOLATILE)
797 {
5107b149 798 type = typy_lookup_type (demangled->u.s_binary.left, block);
2c74e833
TT
799 if (! type)
800 return NULL;
801
492d29ea 802 TRY
76dce0be 803 {
cd829959
PM
804 /* If the demangled_type matches with one of the types
805 below, run the corresponding function and save the type
806 to return later. We cannot just return here as we are in
807 an exception handler. */
76dce0be
PM
808 switch (demangled_type)
809 {
810 case DEMANGLE_COMPONENT_REFERENCE:
3b224330 811 rtype = lookup_lvalue_reference_type (type);
cd829959 812 break;
e4347c89
AV
813 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
814 rtype = lookup_rvalue_reference_type (type);
815 break;
76dce0be 816 case DEMANGLE_COMPONENT_POINTER:
cd829959
PM
817 rtype = lookup_pointer_type (type);
818 break;
76dce0be 819 case DEMANGLE_COMPONENT_CONST:
cd829959
PM
820 rtype = make_cv_type (1, 0, type, NULL);
821 break;
76dce0be 822 case DEMANGLE_COMPONENT_VOLATILE:
cd829959
PM
823 rtype = make_cv_type (0, 1, type, NULL);
824 break;
76dce0be 825 }
76dce0be 826 }
492d29ea
PA
827 CATCH (except, RETURN_MASK_ALL)
828 {
829 GDB_PY_HANDLE_EXCEPTION (except);
830 }
831 END_CATCH
2c74e833 832 }
256458bc 833
cd829959
PM
834 /* If we have a type from the switch statement above, just return
835 that. */
836 if (rtype)
837 return rtype;
256458bc 838
cd829959 839 /* We don't have a type, so lookup the type. */
29592bde
PA
840 gdb::unique_xmalloc_ptr<char> type_name = cp_comp_to_string (demangled, 10);
841 return typy_lookup_typename (type_name.get (), block);
2c74e833
TT
842}
843
326fd672
TT
844/* This is a helper function for typy_template_argument that is used
845 when the type does not have template symbols attached. It works by
846 parsing the type name. This happens with compilers, like older
847 versions of GCC, that do not emit DW_TAG_template_*. */
848
2c74e833 849static PyObject *
9df2fbc4 850typy_legacy_template_argument (struct type *type, const struct block *block,
326fd672 851 int argno)
2c74e833 852{
326fd672 853 int i;
2c74e833 854 struct demangle_component *demangled;
c8b23b3f 855 std::unique_ptr<demangle_parse_info> info;
2c74e833
TT
856 const char *err;
857 struct type *argtype;
2c74e833
TT
858
859 if (TYPE_NAME (type) == NULL)
860 {
5107b149 861 PyErr_SetString (PyExc_RuntimeError, _("Null type name."));
2c74e833
TT
862 return NULL;
863 }
864
492d29ea 865 TRY
5d9c5995
PM
866 {
867 /* Note -- this is not thread-safe. */
868 info = cp_demangled_name_to_comp (TYPE_NAME (type), &err);
869 }
492d29ea
PA
870 CATCH (except, RETURN_MASK_ALL)
871 {
872 GDB_PY_HANDLE_EXCEPTION (except);
873 }
874 END_CATCH
5d9c5995 875
3a93a0c2 876 if (! info)
2c74e833
TT
877 {
878 PyErr_SetString (PyExc_RuntimeError, err);
879 return NULL;
880 }
3a93a0c2 881 demangled = info->tree;
2c74e833
TT
882
883 /* Strip off component names. */
884 while (demangled->type == DEMANGLE_COMPONENT_QUAL_NAME
885 || demangled->type == DEMANGLE_COMPONENT_LOCAL_NAME)
886 demangled = demangled->u.s_binary.right;
887
888 if (demangled->type != DEMANGLE_COMPONENT_TEMPLATE)
889 {
5107b149 890 PyErr_SetString (PyExc_RuntimeError, _("Type is not a template."));
2c74e833
TT
891 return NULL;
892 }
893
894 /* Skip from the template to the arguments. */
895 demangled = demangled->u.s_binary.right;
896
897 for (i = 0; demangled && i < argno; ++i)
898 demangled = demangled->u.s_binary.right;
899
900 if (! demangled)
901 {
5107b149 902 PyErr_Format (PyExc_RuntimeError, _("No argument %d in template."),
2c74e833
TT
903 argno);
904 return NULL;
905 }
906
5107b149 907 argtype = typy_lookup_type (demangled->u.s_binary.left, block);
2c74e833
TT
908 if (! argtype)
909 return NULL;
910
911 return type_to_type_object (argtype);
326fd672
TT
912}
913
914static PyObject *
915typy_template_argument (PyObject *self, PyObject *args)
916{
917 int argno;
918 struct type *type = ((type_object *) self)->type;
9df2fbc4 919 const struct block *block = NULL;
326fd672
TT
920 PyObject *block_obj = NULL;
921 struct symbol *sym;
922 struct value *val = NULL;
326fd672
TT
923
924 if (! PyArg_ParseTuple (args, "i|O", &argno, &block_obj))
925 return NULL;
926
927 if (block_obj)
928 {
929 block = block_object_to_block (block_obj);
930 if (! block)
931 {
932 PyErr_SetString (PyExc_RuntimeError,
933 _("Second argument must be block."));
934 return NULL;
935 }
936 }
937
492d29ea 938 TRY
05d0e1e7
TT
939 {
940 type = check_typedef (type);
aa006118 941 if (TYPE_IS_REFERENCE (type))
05d0e1e7
TT
942 type = check_typedef (TYPE_TARGET_TYPE (type));
943 }
492d29ea
PA
944 CATCH (except, RETURN_MASK_ALL)
945 {
946 GDB_PY_HANDLE_EXCEPTION (except);
947 }
948 END_CATCH
326fd672
TT
949
950 /* We might not have DW_TAG_template_*, so try to parse the type's
951 name. This is inefficient if we do not have a template type --
952 but that is going to wind up as an error anyhow. */
953 if (! TYPE_N_TEMPLATE_ARGUMENTS (type))
954 return typy_legacy_template_argument (type, block, argno);
955
956 if (argno >= TYPE_N_TEMPLATE_ARGUMENTS (type))
957 {
958 PyErr_Format (PyExc_RuntimeError, _("No argument %d in template."),
959 argno);
960 return NULL;
961 }
962
963 sym = TYPE_TEMPLATE_ARGUMENT (type, argno);
964 if (SYMBOL_CLASS (sym) == LOC_TYPEDEF)
965 return type_to_type_object (SYMBOL_TYPE (sym));
966 else if (SYMBOL_CLASS (sym) == LOC_OPTIMIZED_OUT)
967 {
968 PyErr_Format (PyExc_RuntimeError,
969 _("Template argument is optimized out"));
970 return NULL;
971 }
972
492d29ea 973 TRY
326fd672
TT
974 {
975 val = value_of_variable (sym, block);
976 }
492d29ea
PA
977 CATCH (except, RETURN_MASK_ALL)
978 {
979 GDB_PY_HANDLE_EXCEPTION (except);
980 }
981 END_CATCH
326fd672
TT
982
983 return value_to_value_object (val);
2c74e833
TT
984}
985
986static PyObject *
987typy_str (PyObject *self)
988{
d7e74731 989 string_file thetype;
2c74e833 990
492d29ea 991 TRY
2c74e833 992 {
d7e74731 993 LA_PRINT_TYPE (type_object_to_type (self), "", &thetype, -1, 0,
53342f27 994 &type_print_raw_options);
2c74e833 995 }
492d29ea 996 CATCH (except, RETURN_MASK_ALL)
2c74e833 997 {
2c74e833
TT
998 GDB_PY_HANDLE_EXCEPTION (except);
999 }
492d29ea 1000 END_CATCH
2c74e833 1001
d7e74731
PA
1002 return PyUnicode_Decode (thetype.c_str (), thetype.size (),
1003 host_charset (), NULL);
2c74e833
TT
1004}
1005
d839c8a4
TT
1006/* Implement the richcompare method. */
1007
1008static PyObject *
1009typy_richcompare (PyObject *self, PyObject *other, int op)
1010{
1011 int result = Py_NE;
1012 struct type *type1 = type_object_to_type (self);
1013 struct type *type2 = type_object_to_type (other);
d839c8a4
TT
1014
1015 /* We can only compare ourselves to another Type object, and only
1016 for equality or inequality. */
1017 if (type2 == NULL || (op != Py_EQ && op != Py_NE))
1018 {
1019 Py_INCREF (Py_NotImplemented);
1020 return Py_NotImplemented;
1021 }
1022
1023 if (type1 == type2)
1024 result = Py_EQ;
1025 else
1026 {
492d29ea 1027 TRY
d839c8a4 1028 {
ca092b61 1029 result = types_deeply_equal (type1, type2);
d839c8a4 1030 }
492d29ea
PA
1031 CATCH (except, RETURN_MASK_ALL)
1032 {
1033 /* If there is a GDB exception, a comparison is not capable
1034 (or trusted), so exit. */
1035 GDB_PY_HANDLE_EXCEPTION (except);
1036 }
1037 END_CATCH
d839c8a4
TT
1038 }
1039
ca092b61 1040 if (op == (result ? Py_EQ : Py_NE))
d839c8a4
TT
1041 Py_RETURN_TRUE;
1042 Py_RETURN_FALSE;
1043}
1044
2c74e833
TT
1045\f
1046
1047static const struct objfile_data *typy_objfile_data_key;
1048
1049static void
c1bd65d0 1050save_objfile_types (struct objfile *objfile, void *datum)
2c74e833 1051{
19ba03f4 1052 type_object *obj = (type_object *) datum;
2c74e833 1053 htab_t copied_types;
2c74e833 1054
0646da15
TT
1055 if (!gdb_python_initialized)
1056 return;
1057
2c74e833
TT
1058 /* This prevents another thread from freeing the objects we're
1059 operating on. */
c57af3f1 1060 gdbpy_enter enter_py (get_objfile_arch (objfile), current_language);
2c74e833
TT
1061
1062 copied_types = create_copied_types_hash (objfile);
1063
1064 while (obj)
1065 {
1066 type_object *next = obj->next;
1067
1068 htab_empty (copied_types);
1069
1070 obj->type = copy_type_recursive (objfile, obj->type, copied_types);
1071
1072 obj->next = NULL;
1073 obj->prev = NULL;
1074
1075 obj = next;
1076 }
1077
1078 htab_delete (copied_types);
2c74e833
TT
1079}
1080
1081static void
1082set_type (type_object *obj, struct type *type)
1083{
1084 obj->type = type;
1085 obj->prev = NULL;
1086 if (type && TYPE_OBJFILE (type))
1087 {
1088 struct objfile *objfile = TYPE_OBJFILE (type);
1089
19ba03f4
SM
1090 obj->next = ((struct pyty_type_object *)
1091 objfile_data (objfile, typy_objfile_data_key));
2c74e833
TT
1092 if (obj->next)
1093 obj->next->prev = obj;
1094 set_objfile_data (objfile, typy_objfile_data_key, obj);
1095 }
1096 else
1097 obj->next = NULL;
1098}
1099
1100static void
1101typy_dealloc (PyObject *obj)
1102{
1103 type_object *type = (type_object *) obj;
1104
1105 if (type->prev)
1106 type->prev->next = type->next;
1107 else if (type->type && TYPE_OBJFILE (type->type))
1108 {
1109 /* Must reset head of list. */
1110 struct objfile *objfile = TYPE_OBJFILE (type->type);
d59b6f6c 1111
2c74e833
TT
1112 if (objfile)
1113 set_objfile_data (objfile, typy_objfile_data_key, type->next);
1114 }
1115 if (type->next)
1116 type->next->prev = type->prev;
1117
9a27f2c6 1118 Py_TYPE (type)->tp_free (type);
2c74e833
TT
1119}
1120
a73bb892
PK
1121/* Return number of fields ("length" of the field dictionary). */
1122
1123static Py_ssize_t
1124typy_length (PyObject *self)
1125{
1126 struct type *type = ((type_object *) self)->type;
1127
9cc10fd1
PK
1128 type = typy_get_composite (type);
1129 if (type == NULL)
1130 return -1;
1131
a73bb892
PK
1132 return TYPE_NFIELDS (type);
1133}
1134
9cc10fd1 1135/* Implements boolean evaluation of gdb.Type. Handle this like other
256458bc 1136 Python objects that don't have a meaningful truth value -- all
9cc10fd1
PK
1137 values are true. */
1138
1139static int
1140typy_nonzero (PyObject *self)
1141{
1142 return 1;
1143}
1144
59fb7612
SS
1145/* Return optimized out value of this type. */
1146
1147static PyObject *
1148typy_optimized_out (PyObject *self, PyObject *args)
1149{
1150 struct type *type = ((type_object *) self)->type;
1151
1152 return value_to_value_object (allocate_optimized_out_value (type));
1153}
1154
a73bb892
PK
1155/* Return a gdb.Field object for the field named by the argument. */
1156
1157static PyObject *
1158typy_getitem (PyObject *self, PyObject *key)
1159{
1160 struct type *type = ((type_object *) self)->type;
a73bb892 1161 int i;
76dce0be 1162
9b972014 1163 gdb::unique_xmalloc_ptr<char> field = python_string_to_host_string (key);
a73bb892
PK
1164 if (field == NULL)
1165 return NULL;
1166
256458bc 1167 /* We want just fields of this type, not of base types, so instead of
a73bb892
PK
1168 using lookup_struct_elt_type, portions of that function are
1169 copied here. */
1170
9cc10fd1
PK
1171 type = typy_get_composite (type);
1172 if (type == NULL)
1173 return NULL;
256458bc 1174
a73bb892
PK
1175 for (i = 0; i < TYPE_NFIELDS (type); i++)
1176 {
0d5cff50 1177 const char *t_field_name = TYPE_FIELD_NAME (type, i);
a73bb892 1178
9b972014 1179 if (t_field_name && (strcmp_iw (t_field_name, field.get ()) == 0))
a73bb892
PK
1180 {
1181 return convert_field (type, i);
1182 }
1183 }
1184 PyErr_SetObject (PyExc_KeyError, key);
1185 return NULL;
1186}
1187
256458bc 1188/* Implement the "get" method on the type object. This is the
a73bb892
PK
1189 same as getitem if the key is present, but returns the supplied
1190 default value or None if the key is not found. */
1191
1192static PyObject *
1193typy_get (PyObject *self, PyObject *args)
1194{
1195 PyObject *key, *defval = Py_None, *result;
256458bc 1196
a73bb892
PK
1197 if (!PyArg_UnpackTuple (args, "get", 1, 2, &key, &defval))
1198 return NULL;
256458bc 1199
a73bb892
PK
1200 result = typy_getitem (self, key);
1201 if (result != NULL)
1202 return result;
256458bc 1203
a73bb892
PK
1204 /* typy_getitem returned error status. If the exception is
1205 KeyError, clear the exception status and return the defval
1206 instead. Otherwise return the exception unchanged. */
1207 if (!PyErr_ExceptionMatches (PyExc_KeyError))
1208 return NULL;
256458bc 1209
a73bb892
PK
1210 PyErr_Clear ();
1211 Py_INCREF (defval);
1212 return defval;
1213}
1214
1215/* Implement the "has_key" method on the type object. */
1216
1217static PyObject *
1218typy_has_key (PyObject *self, PyObject *args)
1219{
1220 struct type *type = ((type_object *) self)->type;
2ff6b080 1221 const char *field;
a73bb892 1222 int i;
76dce0be 1223
a73bb892
PK
1224 if (!PyArg_ParseTuple (args, "s", &field))
1225 return NULL;
1226
256458bc 1227 /* We want just fields of this type, not of base types, so instead of
a73bb892
PK
1228 using lookup_struct_elt_type, portions of that function are
1229 copied here. */
1230
9cc10fd1
PK
1231 type = typy_get_composite (type);
1232 if (type == NULL)
1233 return NULL;
a73bb892
PK
1234
1235 for (i = 0; i < TYPE_NFIELDS (type); i++)
1236 {
0d5cff50 1237 const char *t_field_name = TYPE_FIELD_NAME (type, i);
a73bb892
PK
1238
1239 if (t_field_name && (strcmp_iw (t_field_name, field) == 0))
1240 Py_RETURN_TRUE;
1241 }
1242 Py_RETURN_FALSE;
1243}
1244
1245/* Make an iterator object to iterate over keys, values, or items. */
1246
1247static PyObject *
1248typy_make_iter (PyObject *self, enum gdbpy_iter_kind kind)
1249{
1250 typy_iterator_object *typy_iter_obj;
1251
9cc10fd1
PK
1252 /* Check that "self" is a structure or union type. */
1253 if (typy_get_composite (((type_object *) self)->type) == NULL)
1254 return NULL;
256458bc 1255
a73bb892
PK
1256 typy_iter_obj = PyObject_New (typy_iterator_object,
1257 &type_iterator_object_type);
1258 if (typy_iter_obj == NULL)
1259 return NULL;
1260
1261 typy_iter_obj->field = 0;
1262 typy_iter_obj->kind = kind;
1263 Py_INCREF (self);
1264 typy_iter_obj->source = (type_object *) self;
1265
1266 return (PyObject *) typy_iter_obj;
1267}
1268
1269/* iteritems() method. */
1270
1271static PyObject *
1272typy_iteritems (PyObject *self, PyObject *args)
1273{
1274 return typy_make_iter (self, iter_items);
1275}
1276
1277/* iterkeys() method. */
1278
1279static PyObject *
1280typy_iterkeys (PyObject *self, PyObject *args)
1281{
1282 return typy_make_iter (self, iter_keys);
1283}
1284
1285/* Iterating over the class, same as iterkeys except for the function
1286 signature. */
1287
1288static PyObject *
1289typy_iter (PyObject *self)
1290{
1291 return typy_make_iter (self, iter_keys);
1292}
1293
1294/* itervalues() method. */
1295
1296static PyObject *
1297typy_itervalues (PyObject *self, PyObject *args)
1298{
1299 return typy_make_iter (self, iter_values);
1300}
1301
1302/* Return a reference to the type iterator. */
1303
1304static PyObject *
1305typy_iterator_iter (PyObject *self)
1306{
1307 Py_INCREF (self);
1308 return self;
1309}
1310
1311/* Return the next field in the iteration through the list of fields
1312 of the type. */
1313
1314static PyObject *
1315typy_iterator_iternext (PyObject *self)
1316{
1317 typy_iterator_object *iter_obj = (typy_iterator_object *) self;
1318 struct type *type = iter_obj->source->type;
a73bb892 1319 PyObject *result;
256458bc 1320
a73bb892
PK
1321 if (iter_obj->field < TYPE_NFIELDS (type))
1322 {
1323 result = make_fielditem (type, iter_obj->field, iter_obj->kind);
1324 if (result != NULL)
1325 iter_obj->field++;
1326 return result;
1327 }
1328
1329 return NULL;
1330}
1331
1332static void
1333typy_iterator_dealloc (PyObject *obj)
1334{
1335 typy_iterator_object *iter_obj = (typy_iterator_object *) obj;
1336
1337 Py_DECREF (iter_obj->source);
1338}
1339
2c74e833
TT
1340/* Create a new Type referring to TYPE. */
1341PyObject *
1342type_to_type_object (struct type *type)
1343{
1344 type_object *type_obj;
1345
1346 type_obj = PyObject_New (type_object, &type_object_type);
1347 if (type_obj)
1348 set_type (type_obj, type);
1349
1350 return (PyObject *) type_obj;
1351}
1352
1353struct type *
1354type_object_to_type (PyObject *obj)
1355{
1356 if (! PyObject_TypeCheck (obj, &type_object_type))
1357 return NULL;
1358 return ((type_object *) obj)->type;
1359}
1360
1361\f
1362
1363/* Implementation of gdb.lookup_type. */
1364PyObject *
1365gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw)
1366{
2adadf51 1367 static const char *keywords[] = { "name", "block", NULL };
ddd49eee 1368 const char *type_name = NULL;
2c74e833 1369 struct type *type = NULL;
5107b149 1370 PyObject *block_obj = NULL;
9df2fbc4 1371 const struct block *block = NULL;
2c74e833 1372
2adadf51
PA
1373 if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|O", keywords,
1374 &type_name, &block_obj))
2c74e833
TT
1375 return NULL;
1376
5107b149
PM
1377 if (block_obj)
1378 {
1379 block = block_object_to_block (block_obj);
1380 if (! block)
1381 {
1382 PyErr_SetString (PyExc_RuntimeError,
1383 _("'block' argument must be a Block."));
1384 return NULL;
1385 }
1386 }
1387
1388 type = typy_lookup_typename (type_name, block);
2c74e833
TT
1389 if (! type)
1390 return NULL;
1391
1392 return (PyObject *) type_to_type_object (type);
1393}
1394
999633ed 1395int
2c74e833
TT
1396gdbpy_initialize_types (void)
1397{
1398 int i;
1399
1400 typy_objfile_data_key
c1bd65d0 1401 = register_objfile_data_with_cleanup (save_objfile_types, NULL);
2c74e833
TT
1402
1403 if (PyType_Ready (&type_object_type) < 0)
999633ed 1404 return -1;
2c74e833 1405 if (PyType_Ready (&field_object_type) < 0)
999633ed 1406 return -1;
a73bb892 1407 if (PyType_Ready (&type_iterator_object_type) < 0)
999633ed 1408 return -1;
2c74e833
TT
1409
1410 for (i = 0; pyty_codes[i].name; ++i)
1411 {
1412 if (PyModule_AddIntConstant (gdb_module,
1413 /* Cast needed for Python 2.4. */
1414 (char *) pyty_codes[i].name,
1415 pyty_codes[i].code) < 0)
999633ed 1416 return -1;
2c74e833
TT
1417 }
1418
aa36459a
TT
1419 if (gdb_pymodule_addobject (gdb_module, "Type",
1420 (PyObject *) &type_object_type) < 0)
999633ed 1421 return -1;
2c74e833 1422
aa36459a
TT
1423 if (gdb_pymodule_addobject (gdb_module, "TypeIterator",
1424 (PyObject *) &type_iterator_object_type) < 0)
999633ed 1425 return -1;
a73bb892 1426
aa36459a
TT
1427 return gdb_pymodule_addobject (gdb_module, "Field",
1428 (PyObject *) &field_object_type);
2c74e833
TT
1429}
1430
1431\f
1432
0d1f4ceb 1433static gdb_PyGetSetDef type_object_getset[] =
2c74e833 1434{
6d7bb824
TT
1435 { "alignof", typy_get_alignof, NULL,
1436 "The alignment of this type, in bytes.", NULL },
2c74e833
TT
1437 { "code", typy_get_code, NULL,
1438 "The code for this type.", NULL },
c0d48811
JB
1439 { "name", typy_get_name, NULL,
1440 "The name for this type, or None.", NULL },
2c74e833
TT
1441 { "sizeof", typy_get_sizeof, NULL,
1442 "The size of this type, in bytes.", NULL },
1443 { "tag", typy_get_tag, NULL,
1444 "The tag name for this type, or None.", NULL },
1445 { NULL }
1446};
1447
1448static PyMethodDef type_object_methods[] =
1449{
702c2711 1450 { "array", typy_array, METH_VARARGS,
f28c316a
DE
1451 "array ([LOW_BOUND,] HIGH_BOUND) -> Type\n\
1452Return a type which represents an array of objects of this type.\n\
1453The bounds of the array are [LOW_BOUND, HIGH_BOUND] inclusive.\n\
1454If LOW_BOUND is omitted, a value of zero is used." },
a72c3253
DE
1455 { "vector", typy_vector, METH_VARARGS,
1456 "vector ([LOW_BOUND,] HIGH_BOUND) -> Type\n\
1457Return a type which represents a vector of objects of this type.\n\
1458The bounds of the array are [LOW_BOUND, HIGH_BOUND] inclusive.\n\
1459If LOW_BOUND is omitted, a value of zero is used.\n\
1460Vectors differ from arrays in that if the current language has C-style\n\
1461arrays, vectors don't decay to a pointer to the first element.\n\
1462They are first class values." },
a73bb892
PK
1463 { "__contains__", typy_has_key, METH_VARARGS,
1464 "T.__contains__(k) -> True if T has a field named k, else False" },
2c74e833
TT
1465 { "const", typy_const, METH_NOARGS,
1466 "const () -> Type\n\
1467Return a const variant of this type." },
59fb7612
SS
1468 { "optimized_out", typy_optimized_out, METH_NOARGS,
1469 "optimized_out() -> Value\n\
1470Return optimized out value of this type." },
2c74e833 1471 { "fields", typy_fields, METH_NOARGS,
a73bb892
PK
1472 "fields () -> list\n\
1473Return a list holding all the fields of this type.\n\
1474Each field is a gdb.Field object." },
1475 { "get", typy_get, METH_VARARGS,
1476 "T.get(k[,default]) -> returns field named k in T, if it exists;\n\
1477otherwise returns default, if supplied, or None if not." },
1478 { "has_key", typy_has_key, METH_VARARGS,
1479 "T.has_key(k) -> True if T has a field named k, else False" },
1480 { "items", typy_items, METH_NOARGS,
1481 "items () -> list\n\
1482Return a list of (name, field) pairs of this type.\n\
1483Each field is a gdb.Field object." },
1484 { "iteritems", typy_iteritems, METH_NOARGS,
1485 "iteritems () -> an iterator over the (name, field)\n\
1486pairs of this type. Each field is a gdb.Field object." },
1487 { "iterkeys", typy_iterkeys, METH_NOARGS,
1488 "iterkeys () -> an iterator over the field names of this type." },
1489 { "itervalues", typy_itervalues, METH_NOARGS,
1490 "itervalues () -> an iterator over the fields of this type.\n\
1491Each field is a gdb.Field object." },
1492 { "keys", typy_field_names, METH_NOARGS,
1493 "keys () -> list\n\
1494Return a list holding all the fields names of this type." },
2c74e833
TT
1495 { "pointer", typy_pointer, METH_NOARGS,
1496 "pointer () -> Type\n\
1497Return a type of pointer to this type." },
361ae042
PM
1498 { "range", typy_range, METH_NOARGS,
1499 "range () -> tuple\n\
1500Return a tuple containing the lower and upper range for this type."},
2c74e833
TT
1501 { "reference", typy_reference, METH_NOARGS,
1502 "reference () -> Type\n\
1503Return a type of reference to this type." },
1504 { "strip_typedefs", typy_strip_typedefs, METH_NOARGS,
1505 "strip_typedefs () -> Type\n\
1506Return a type formed by stripping this type of all typedefs."},
1507 { "target", typy_target, METH_NOARGS,
1508 "target () -> Type\n\
1509Return the target type of this type." },
1510 { "template_argument", typy_template_argument, METH_VARARGS,
5107b149 1511 "template_argument (arg, [block]) -> Type\n\
2c74e833
TT
1512Return the type of a template argument." },
1513 { "unqualified", typy_unqualified, METH_NOARGS,
1514 "unqualified () -> Type\n\
1515Return a variant of this type without const or volatile attributes." },
9cc10fd1 1516 { "values", typy_values, METH_NOARGS,
a73bb892
PK
1517 "values () -> list\n\
1518Return a list holding all the fields of this type.\n\
1519Each field is a gdb.Field object." },
2c74e833
TT
1520 { "volatile", typy_volatile, METH_NOARGS,
1521 "volatile () -> Type\n\
1522Return a volatile variant of this type" },
1523 { NULL }
1524};
1525
9cc10fd1
PK
1526static PyNumberMethods type_object_as_number = {
1527 NULL, /* nb_add */
1528 NULL, /* nb_subtract */
1529 NULL, /* nb_multiply */
9a27f2c6 1530#ifndef IS_PY3K
9cc10fd1 1531 NULL, /* nb_divide */
9a27f2c6 1532#endif
9cc10fd1
PK
1533 NULL, /* nb_remainder */
1534 NULL, /* nb_divmod */
1535 NULL, /* nb_power */
1536 NULL, /* nb_negative */
1537 NULL, /* nb_positive */
1538 NULL, /* nb_absolute */
1539 typy_nonzero, /* nb_nonzero */
1540 NULL, /* nb_invert */
1541 NULL, /* nb_lshift */
1542 NULL, /* nb_rshift */
1543 NULL, /* nb_and */
1544 NULL, /* nb_xor */
1545 NULL, /* nb_or */
9a27f2c6
PK
1546#ifdef IS_PY3K
1547 NULL, /* nb_int */
1548 NULL, /* reserved */
1549#else
9cc10fd1
PK
1550 NULL, /* nb_coerce */
1551 NULL, /* nb_int */
1552 NULL, /* nb_long */
9a27f2c6 1553#endif
9cc10fd1 1554 NULL, /* nb_float */
9a27f2c6 1555#ifndef IS_PY3K
9cc10fd1
PK
1556 NULL, /* nb_oct */
1557 NULL /* nb_hex */
9a27f2c6 1558#endif
9cc10fd1
PK
1559};
1560
a73bb892
PK
1561static PyMappingMethods typy_mapping = {
1562 typy_length,
1563 typy_getitem,
1564 NULL /* no "set" method */
1565};
1566
e36122e9 1567PyTypeObject type_object_type =
2c74e833 1568{
9a27f2c6 1569 PyVarObject_HEAD_INIT (NULL, 0)
2c74e833
TT
1570 "gdb.Type", /*tp_name*/
1571 sizeof (type_object), /*tp_basicsize*/
1572 0, /*tp_itemsize*/
1573 typy_dealloc, /*tp_dealloc*/
1574 0, /*tp_print*/
1575 0, /*tp_getattr*/
1576 0, /*tp_setattr*/
1577 0, /*tp_compare*/
1578 0, /*tp_repr*/
9cc10fd1 1579 &type_object_as_number, /*tp_as_number*/
2c74e833 1580 0, /*tp_as_sequence*/
a73bb892 1581 &typy_mapping, /*tp_as_mapping*/
2c74e833
TT
1582 0, /*tp_hash */
1583 0, /*tp_call*/
1584 typy_str, /*tp_str*/
1585 0, /*tp_getattro*/
1586 0, /*tp_setattro*/
1587 0, /*tp_as_buffer*/
1588 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1589 "GDB type object", /* tp_doc */
1590 0, /* tp_traverse */
1591 0, /* tp_clear */
d839c8a4 1592 typy_richcompare, /* tp_richcompare */
2c74e833 1593 0, /* tp_weaklistoffset */
a73bb892 1594 typy_iter, /* tp_iter */
2c74e833
TT
1595 0, /* tp_iternext */
1596 type_object_methods, /* tp_methods */
1597 0, /* tp_members */
1598 type_object_getset, /* tp_getset */
1599 0, /* tp_base */
1600 0, /* tp_dict */
1601 0, /* tp_descr_get */
1602 0, /* tp_descr_set */
1603 0, /* tp_dictoffset */
1604 0, /* tp_init */
1605 0, /* tp_alloc */
1606 0, /* tp_new */
1607};
1608
0d1f4ceb 1609static gdb_PyGetSetDef field_object_getset[] =
2e8265fd
TT
1610{
1611 { "__dict__", gdb_py_generic_dict, NULL,
1612 "The __dict__ for this field.", &field_object_type },
1613 { NULL }
1614};
1615
e36122e9 1616PyTypeObject field_object_type =
2c74e833 1617{
9a27f2c6 1618 PyVarObject_HEAD_INIT (NULL, 0)
2c74e833
TT
1619 "gdb.Field", /*tp_name*/
1620 sizeof (field_object), /*tp_basicsize*/
1621 0, /*tp_itemsize*/
1622 field_dealloc, /*tp_dealloc*/
1623 0, /*tp_print*/
1624 0, /*tp_getattr*/
1625 0, /*tp_setattr*/
1626 0, /*tp_compare*/
1627 0, /*tp_repr*/
1628 0, /*tp_as_number*/
1629 0, /*tp_as_sequence*/
1630 0, /*tp_as_mapping*/
1631 0, /*tp_hash */
1632 0, /*tp_call*/
1633 0, /*tp_str*/
1634 0, /*tp_getattro*/
1635 0, /*tp_setattro*/
1636 0, /*tp_as_buffer*/
1637 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1638 "GDB field object", /* tp_doc */
1639 0, /* tp_traverse */
1640 0, /* tp_clear */
1641 0, /* tp_richcompare */
1642 0, /* tp_weaklistoffset */
1643 0, /* tp_iter */
1644 0, /* tp_iternext */
1645 0, /* tp_methods */
1646 0, /* tp_members */
2e8265fd 1647 field_object_getset, /* tp_getset */
2c74e833
TT
1648 0, /* tp_base */
1649 0, /* tp_dict */
1650 0, /* tp_descr_get */
1651 0, /* tp_descr_set */
1652 offsetof (field_object, dict), /* tp_dictoffset */
1653 0, /* tp_init */
1654 0, /* tp_alloc */
1655 0, /* tp_new */
1656};
a73bb892 1657
e36122e9 1658PyTypeObject type_iterator_object_type = {
9a27f2c6 1659 PyVarObject_HEAD_INIT (NULL, 0)
a73bb892
PK
1660 "gdb.TypeIterator", /*tp_name*/
1661 sizeof (typy_iterator_object), /*tp_basicsize*/
1662 0, /*tp_itemsize*/
1663 typy_iterator_dealloc, /*tp_dealloc*/
1664 0, /*tp_print*/
1665 0, /*tp_getattr*/
1666 0, /*tp_setattr*/
1667 0, /*tp_compare*/
1668 0, /*tp_repr*/
1669 0, /*tp_as_number*/
1670 0, /*tp_as_sequence*/
1671 0, /*tp_as_mapping*/
1672 0, /*tp_hash */
1673 0, /*tp_call*/
1674 0, /*tp_str*/
1675 0, /*tp_getattro*/
1676 0, /*tp_setattro*/
1677 0, /*tp_as_buffer*/
1678 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1679 "GDB type iterator object", /*tp_doc */
1680 0, /*tp_traverse */
1681 0, /*tp_clear */
1682 0, /*tp_richcompare */
1683 0, /*tp_weaklistoffset */
1684 typy_iterator_iter, /*tp_iter */
1685 typy_iterator_iternext, /*tp_iternext */
1686 0 /*tp_methods */
1687};
This page took 1.010703 seconds and 4 git commands to generate.