Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(257)

Unified Diff: gdb/python/py-type.c

Issue 124383005: GDB 7.6.50 (Closed) Base URL: http://git.chromium.org/native_client/nacl-gdb.git@upstream
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gdb/python/py-threadevent.c ('k') | gdb/python/py-utils.c » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gdb/python/py-type.c
diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c
index 98030a6fecc6e6ff5b4442ad81b3f1b965e0002c..9aeb92c18bc11e3bfe50b6ffd38b3cd65ede51f8 100644
--- a/gdb/python/py-type.c
+++ b/gdb/python/py-type.c
@@ -1,6 +1,6 @@
/* Python interface to types.
- Copyright (C) 2008-2012 Free Software Foundation, Inc.
+ Copyright (C) 2008-2013 Free Software Foundation, Inc.
This file is part of GDB.
@@ -28,8 +28,7 @@
#include "objfiles.h"
#include "language.h"
#include "vec.h"
-#include "bcache.h"
-#include "dwarf2loc.h"
+#include "typeprint.h"
typedef struct pyty_type_object
{
@@ -43,7 +42,8 @@ typedef struct pyty_type_object
struct pyty_type_object *next;
} type_object;
-static PyTypeObject type_object_type;
+static PyTypeObject type_object_type
+ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("type_object");
/* A Field object. */
typedef struct pyty_field_object
@@ -54,7 +54,8 @@ typedef struct pyty_field_object
PyObject *dict;
} field_object;
-static PyTypeObject field_object_type;
+static PyTypeObject field_object_type
+ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("field_object");
/* A type iterator object. */
typedef struct {
@@ -67,7 +68,8 @@ typedef struct {
struct pyty_type_object *source;
} typy_iterator_object;
-static PyTypeObject type_iterator_object_type;
+static PyTypeObject type_iterator_object_type
+ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("typy_iterator_object");
/* This is used to initialize various gdb.TYPE_ constants. */
struct pyty_code
@@ -85,6 +87,7 @@ static PyObject *typy_make_iter (PyObject *self, enum gdbpy_iter_kind kind);
static struct pyty_code pyty_codes[] =
{
+ ENTRY (TYPE_CODE_BITSTRING),
ENTRY (TYPE_CODE_PTR),
ENTRY (TYPE_CODE_ARRAY),
ENTRY (TYPE_CODE_STRUCT),
@@ -98,7 +101,6 @@ static struct pyty_code pyty_codes[] =
ENTRY (TYPE_CODE_SET),
ENTRY (TYPE_CODE_RANGE),
ENTRY (TYPE_CODE_STRING),
- ENTRY (TYPE_CODE_BITSTRING),
ENTRY (TYPE_CODE_ERROR),
ENTRY (TYPE_CODE_METHOD),
ENTRY (TYPE_CODE_METHODPTR),
@@ -122,7 +124,7 @@ field_dealloc (PyObject *obj)
field_object *f = (field_object *) obj;
Py_XDECREF (f->dict);
- f->ob_type->tp_free (obj);
+ Py_TYPE (obj)->tp_free (obj);
}
static PyObject *
@@ -176,7 +178,7 @@ convert_field (struct type *type, int field)
}
else
{
- arg = PyLong_FromLong (TYPE_FIELD_BITPOS (type, field));
+ arg = gdb_py_long_from_longest (TYPE_FIELD_BITPOS (type, field));
attrstring = "bitpos";
}
@@ -186,6 +188,7 @@ convert_field (struct type *type, int field)
/* At least python-2.4 had the second parameter non-const. */
if (PyObject_SetAttrString (result, (char *) attrstring, arg) < 0)
goto failarg;
+ Py_DECREF (arg);
}
if (TYPE_FIELD_NAME (type, field))
@@ -199,11 +202,13 @@ convert_field (struct type *type, int field)
goto fail;
if (PyObject_SetAttrString (result, "name", arg) < 0)
goto failarg;
+ Py_DECREF (arg);
arg = TYPE_FIELD_ARTIFICIAL (type, field) ? Py_True : Py_False;
Py_INCREF (arg);
if (PyObject_SetAttrString (result, "artificial", arg) < 0)
goto failarg;
+ Py_DECREF (arg);
if (TYPE_CODE (type) == TYPE_CODE_CLASS)
arg = field < TYPE_N_BASECLASSES (type) ? Py_True : Py_False;
@@ -212,12 +217,14 @@ convert_field (struct type *type, int field)
Py_INCREF (arg);
if (PyObject_SetAttrString (result, "is_base_class", arg) < 0)
goto failarg;
+ Py_DECREF (arg);
arg = PyLong_FromLong (TYPE_FIELD_BITSIZE (type, field));
if (!arg)
goto fail;
if (PyObject_SetAttrString (result, "bitsize", arg) < 0)
goto failarg;
+ Py_DECREF (arg);
/* A field can have a NULL type in some situations. */
if (TYPE_FIELD_TYPE (type, field) == NULL)
@@ -231,6 +238,7 @@ convert_field (struct type *type, int field)
goto fail;
if (PyObject_SetAttrString (result, "type", arg) < 0)
goto failarg;
+ Py_DECREF (arg);
return result;
@@ -291,9 +299,11 @@ make_fielditem (struct type *type, int i, enum gdbpy_iter_kind kind)
case iter_values:
item = convert_field (type, i);
break;
+ default:
+ gdb_assert_not_reached ("invalid gdbpy_iter_kind");
}
return item;
-
+
fail:
Py_XDECREF (key);
Py_XDECREF (value);
@@ -346,7 +356,7 @@ typy_values (PyObject *self, PyObject *args)
}
/* Return a sequence of all fields. Each field is a gdb.Field object.
- This method is similar to typy_values, except where the supplied
+ This method is similar to typy_values, except where the supplied
gdb.Type is an array, in which case it returns a list of one entry
which is a gdb.Field object for a range (the array bounds). */
@@ -355,7 +365,7 @@ typy_fields (PyObject *self, PyObject *args)
{
struct type *type = ((type_object *) self)->type;
PyObject *r, *rl;
-
+
if (TYPE_CODE (type) != TYPE_CODE_ARRAY)
return typy_fields_items (self, iter_values);
@@ -365,12 +375,9 @@ typy_fields (PyObject *self, PyObject *args)
r = convert_field (type, 0);
if (r == NULL)
return NULL;
-
+
rl = Py_BuildValue ("[O]", r);
- if (rl == NULL)
- {
- Py_DECREF (r);
- }
+ Py_DECREF (r);
return rl;
}
@@ -383,7 +390,7 @@ typy_field_names (PyObject *self, PyObject *args)
return typy_fields_items (self, iter_keys);
}
-/* Return a sequence of all (name, fields) pairs. Each field is a
+/* Return a sequence of all (name, fields) pairs. Each field is a
gdb.Field object. */
static PyObject *
@@ -416,7 +423,7 @@ typy_strip_typedefs (PyObject *self, PyObject *args)
}
GDB_PY_HANDLE_EXCEPTION (except);
- return type_to_type_object (check_typedef (type));
+ return type_to_type_object (type);
}
/* Strip typedefs and pointers/reference from a type. Then check that
@@ -433,13 +440,7 @@ typy_get_composite (struct type *type)
{
CHECK_TYPEDEF (type);
}
- /* Don't use GDB_PY_HANDLE_EXCEPTION here because that returns
- a (NULL) pointer of the wrong type. */
- if (except.reason < 0)
- {
- gdbpy_convert_exception (except);
- return NULL;
- }
+ GDB_PY_HANDLE_EXCEPTION (except);
if (TYPE_CODE (type) != TYPE_CODE_PTR
&& TYPE_CODE (type) != TYPE_CODE_REF)
@@ -449,7 +450,7 @@ typy_get_composite (struct type *type)
/* If this is not a struct, union, or enum type, raise TypeError
exception. */
- if (TYPE_CODE (type) != TYPE_CODE_STRUCT
+ if (TYPE_CODE (type) != TYPE_CODE_STRUCT
&& TYPE_CODE (type) != TYPE_CODE_UNION
&& TYPE_CODE (type) != TYPE_CODE_ENUM)
{
@@ -457,14 +458,14 @@ typy_get_composite (struct type *type)
"Type is not a structure, union, or enum type.");
return NULL;
}
-
+
return type;
}
-/* Return an array type. */
+/* Helper for typy_array and typy_vector. */
static PyObject *
-typy_array (PyObject *self, PyObject *args)
+typy_array_1 (PyObject *self, PyObject *args, int is_vector)
{
long n1, n2;
PyObject *n2_obj = NULL;
@@ -503,12 +504,30 @@ typy_array (PyObject *self, PyObject *args)
TRY_CATCH (except, RETURN_MASK_ALL)
{
array = lookup_array_range_type (type, n1, n2);
+ if (is_vector)
+ make_vector_type (array);
}
GDB_PY_HANDLE_EXCEPTION (except);
return type_to_type_object (array);
}
+/* Return an array type. */
+
+static PyObject *
+typy_array (PyObject *self, PyObject *args)
+{
+ return typy_array_1 (self, args, 0);
+}
+
+/* Return a vector type. */
+
+static PyObject *
+typy_vector (PyObject *self, PyObject *args)
+{
+ return typy_array_1 (self, args, 1);
+}
+
/* Return a Type object which represents a pointer to SELF. */
static PyObject *
typy_pointer (PyObject *self, PyObject *args)
@@ -583,7 +602,7 @@ typy_range (PyObject *self, PyObject *args)
return NULL;
}
return result;
-
+
failarg:
Py_XDECREF (high_bound);
Py_XDECREF (low_bound);
@@ -614,7 +633,7 @@ typy_target (PyObject *self, PyObject *args)
if (!TYPE_TARGET_TYPE (type))
{
- PyErr_SetString (PyExc_RuntimeError,
+ PyErr_SetString (PyExc_RuntimeError,
_("Type does not have a target."));
return NULL;
}
@@ -683,7 +702,7 @@ typy_get_sizeof (PyObject *self, void *closure)
}
/* Ignore exceptions. */
- return PyLong_FromLong (TYPE_LENGTH (type));
+ return gdb_py_long_from_longest (TYPE_LENGTH (type));
}
static struct type *
@@ -704,11 +723,7 @@ typy_lookup_typename (const char *type_name, const struct block *block)
type = lookup_typename (python_language, python_gdbarch,
type_name, block, 0);
}
- if (except.reason < 0)
- {
- gdbpy_convert_exception (except);
- return NULL;
- }
+ GDB_PY_HANDLE_EXCEPTION (except);
return type;
}
@@ -757,18 +772,14 @@ typy_lookup_type (struct demangle_component *demangled,
break;
}
}
- if (except.reason < 0)
- {
- gdbpy_convert_exception (except);
- return NULL;
- }
+ GDB_PY_HANDLE_EXCEPTION (except);
}
-
+
/* If we have a type from the switch statement above, just return
that. */
if (rtype)
return rtype;
-
+
/* We don't have a type, so lookup the type. */
type_name = cp_comp_to_string (demangled, 10);
type = typy_lookup_typename (type_name, block);
@@ -930,7 +941,8 @@ typy_str (PyObject *self)
stb = mem_fileopen ();
old_chain = make_cleanup_ui_file_delete (stb);
- type_print (type_object_to_type (self), "", stb, -1);
+ LA_PRINT_TYPE (type_object_to_type (self), "", stb, -1, 0,
+ &type_print_raw_options);
thetype = ui_file_xstrdup (stb, &length);
do_cleanups (old_chain);
@@ -947,173 +959,6 @@ typy_str (PyObject *self)
return result;
}
-/* An entry in the type-equality bcache. */
-
-typedef struct type_equality_entry
-{
- struct type *type1, *type2;
-} type_equality_entry_d;
-
-DEF_VEC_O (type_equality_entry_d);
-
-/* A helper function to compare two strings. Returns 1 if they are
- the same, 0 otherwise. Handles NULLs properly. */
-
-static int
-compare_maybe_null_strings (const char *s, const char *t)
-{
- if (s == NULL && t != NULL)
- return 0;
- else if (s != NULL && t == NULL)
- return 0;
- else if (s == NULL && t== NULL)
- return 1;
- return strcmp (s, t) == 0;
-}
-
-/* A helper function for typy_richcompare that checks two types for
- "deep" equality. Returns Py_EQ if the types are considered the
- same, Py_NE otherwise. */
-
-static int
-check_types_equal (struct type *type1, struct type *type2,
- VEC (type_equality_entry_d) **worklist)
-{
- CHECK_TYPEDEF (type1);
- CHECK_TYPEDEF (type2);
-
- if (type1 == type2)
- return Py_EQ;
-
- if (TYPE_CODE (type1) != TYPE_CODE (type2)
- || TYPE_LENGTH (type1) != TYPE_LENGTH (type2)
- || TYPE_UNSIGNED (type1) != TYPE_UNSIGNED (type2)
- || TYPE_NOSIGN (type1) != TYPE_NOSIGN (type2)
- || TYPE_VARARGS (type1) != TYPE_VARARGS (type2)
- || TYPE_VECTOR (type1) != TYPE_VECTOR (type2)
- || TYPE_NOTTEXT (type1) != TYPE_NOTTEXT (type2)
- || TYPE_INSTANCE_FLAGS (type1) != TYPE_INSTANCE_FLAGS (type2)
- || TYPE_NFIELDS (type1) != TYPE_NFIELDS (type2))
- return Py_NE;
-
- if (!compare_maybe_null_strings (TYPE_TAG_NAME (type1),
- TYPE_TAG_NAME (type2)))
- return Py_NE;
- if (!compare_maybe_null_strings (TYPE_NAME (type1), TYPE_NAME (type2)))
- return Py_NE;
-
- if (TYPE_CODE (type1) == TYPE_CODE_RANGE)
- {
- if (memcmp (TYPE_RANGE_DATA (type1), TYPE_RANGE_DATA (type2),
- sizeof (*TYPE_RANGE_DATA (type1))) != 0)
- return Py_NE;
- }
- else
- {
- int i;
-
- for (i = 0; i < TYPE_NFIELDS (type1); ++i)
- {
- const struct field *field1 = &TYPE_FIELD (type1, i);
- const struct field *field2 = &TYPE_FIELD (type2, i);
- struct type_equality_entry entry;
-
- if (FIELD_ARTIFICIAL (*field1) != FIELD_ARTIFICIAL (*field2)
- || FIELD_BITSIZE (*field1) != FIELD_BITSIZE (*field2)
- || FIELD_LOC_KIND (*field1) != FIELD_LOC_KIND (*field2))
- return Py_NE;
- if (!compare_maybe_null_strings (FIELD_NAME (*field1),
- FIELD_NAME (*field2)))
- return Py_NE;
- switch (FIELD_LOC_KIND (*field1))
- {
- case FIELD_LOC_KIND_BITPOS:
- if (FIELD_BITPOS (*field1) != FIELD_BITPOS (*field2))
- return Py_NE;
- break;
- case FIELD_LOC_KIND_ENUMVAL:
- if (FIELD_ENUMVAL (*field1) != FIELD_ENUMVAL (*field2))
- return Py_NE;
- break;
- case FIELD_LOC_KIND_PHYSADDR:
- if (FIELD_STATIC_PHYSADDR (*field1)
- != FIELD_STATIC_PHYSADDR (*field2))
- return Py_NE;
- break;
- case FIELD_LOC_KIND_PHYSNAME:
- if (!compare_maybe_null_strings (FIELD_STATIC_PHYSNAME (*field1),
- FIELD_STATIC_PHYSNAME (*field2)))
- return Py_NE;
- break;
- case FIELD_LOC_KIND_DWARF_BLOCK:
- {
- struct dwarf2_locexpr_baton *block1, *block2;
-
- block1 = FIELD_DWARF_BLOCK (*field1);
- block2 = FIELD_DWARF_BLOCK (*field2);
- if (block1->per_cu != block2->per_cu
- || block1->size != block2->size
- || memcmp (block1->data, block2->data, block1->size) != 0)
- return Py_NE;
- }
- break;
- default:
- internal_error (__FILE__, __LINE__, _("Unsupported field kind "
- "%d by check_types_equal"),
- FIELD_LOC_KIND (*field1));
- }
-
- entry.type1 = FIELD_TYPE (*field1);
- entry.type2 = FIELD_TYPE (*field2);
- VEC_safe_push (type_equality_entry_d, *worklist, &entry);
- }
- }
-
- if (TYPE_TARGET_TYPE (type1) != NULL)
- {
- struct type_equality_entry entry;
-
- if (TYPE_TARGET_TYPE (type2) == NULL)
- return Py_NE;
-
- entry.type1 = TYPE_TARGET_TYPE (type1);
- entry.type2 = TYPE_TARGET_TYPE (type2);
- VEC_safe_push (type_equality_entry_d, *worklist, &entry);
- }
- else if (TYPE_TARGET_TYPE (type2) != NULL)
- return Py_NE;
-
- return Py_EQ;
-}
-
-/* Check types on a worklist for equality. Returns Py_NE if any pair
- is not equal, Py_EQ if they are all considered equal. */
-
-static int
-check_types_worklist (VEC (type_equality_entry_d) **worklist,
- struct bcache *cache)
-{
- while (!VEC_empty (type_equality_entry_d, *worklist))
- {
- struct type_equality_entry entry;
- int added;
-
- entry = *VEC_last (type_equality_entry_d, *worklist);
- VEC_pop (type_equality_entry_d, *worklist);
-
- /* If the type pair has already been visited, we know it is
- ok. */
- bcache_full (&entry, sizeof (entry), cache, &added);
- if (!added)
- continue;
-
- if (check_types_equal (entry.type1, entry.type2, worklist) == Py_NE)
- return Py_NE;
- }
-
- return Py_EQ;
-}
-
/* Implement the richcompare method. */
static PyObject *
@@ -1136,30 +981,16 @@ typy_richcompare (PyObject *self, PyObject *other, int op)
result = Py_EQ;
else
{
- struct bcache *cache;
- VEC (type_equality_entry_d) *worklist = NULL;
- struct type_equality_entry entry;
-
- cache = bcache_xmalloc (NULL, NULL);
-
- entry.type1 = type1;
- entry.type2 = type2;
- VEC_safe_push (type_equality_entry_d, worklist, &entry);
-
TRY_CATCH (except, RETURN_MASK_ALL)
{
- result = check_types_worklist (&worklist, cache);
+ result = types_deeply_equal (type1, type2);
}
- /* check_types_worklist calls several nested Python helper
- functions, some of which can raise a GDB Exception, so we
- just check and convert here. If there is a GDB exception, a
- comparison is not capable (or trusted), so exit. */
- bcache_xfree (cache);
- VEC_free (type_equality_entry_d, worklist);
+ /* If there is a GDB exception, a comparison is not capable
+ (or trusted), so exit. */
GDB_PY_HANDLE_EXCEPTION (except);
}
- if (op == result)
+ if (op == (result ? Py_EQ : Py_NE))
Py_RETURN_TRUE;
Py_RETURN_FALSE;
}
@@ -1175,6 +1006,9 @@ save_objfile_types (struct objfile *objfile, void *datum)
htab_t copied_types;
struct cleanup *cleanup;
+ if (!gdb_python_initialized)
+ return;
+
/* This prevents another thread from freeing the objects we're
operating on. */
cleanup = ensure_python_env (get_objfile_arch (objfile), current_language);
@@ -1236,7 +1070,7 @@ typy_dealloc (PyObject *obj)
if (type->next)
type->next->prev = type->prev;
- type->ob_type->tp_free (type);
+ Py_TYPE (type)->tp_free (type);
}
/* Return number of fields ("length" of the field dictionary). */
@@ -1254,7 +1088,7 @@ typy_length (PyObject *self)
}
/* Implements boolean evaluation of gdb.Type. Handle this like other
- Python objects that don't have a meaningful truth value -- all
+ Python objects that don't have a meaningful truth value -- all
values are true. */
static int
@@ -1276,14 +1110,14 @@ typy_getitem (PyObject *self, PyObject *key)
if (field == NULL)
return NULL;
- /* We want just fields of this type, not of base types, so instead of
+ /* We want just fields of this type, not of base types, so instead of
using lookup_struct_elt_type, portions of that function are
copied here. */
type = typy_get_composite (type);
if (type == NULL)
return NULL;
-
+
for (i = 0; i < TYPE_NFIELDS (type); i++)
{
const char *t_field_name = TYPE_FIELD_NAME (type, i);
@@ -1297,7 +1131,7 @@ typy_getitem (PyObject *self, PyObject *key)
return NULL;
}
-/* Implement the "get" method on the type object. This is the
+/* Implement the "get" method on the type object. This is the
same as getitem if the key is present, but returns the supplied
default value or None if the key is not found. */
@@ -1305,20 +1139,20 @@ static PyObject *
typy_get (PyObject *self, PyObject *args)
{
PyObject *key, *defval = Py_None, *result;
-
+
if (!PyArg_UnpackTuple (args, "get", 1, 2, &key, &defval))
return NULL;
-
+
result = typy_getitem (self, key);
if (result != NULL)
return result;
-
+
/* typy_getitem returned error status. If the exception is
KeyError, clear the exception status and return the defval
instead. Otherwise return the exception unchanged. */
if (!PyErr_ExceptionMatches (PyExc_KeyError))
return NULL;
-
+
PyErr_Clear ();
Py_INCREF (defval);
return defval;
@@ -1336,7 +1170,7 @@ typy_has_key (PyObject *self, PyObject *args)
if (!PyArg_ParseTuple (args, "s", &field))
return NULL;
- /* We want just fields of this type, not of base types, so instead of
+ /* We want just fields of this type, not of base types, so instead of
using lookup_struct_elt_type, portions of that function are
copied here. */
@@ -1364,7 +1198,7 @@ typy_make_iter (PyObject *self, enum gdbpy_iter_kind kind)
/* Check that "self" is a structure or union type. */
if (typy_get_composite (((type_object *) self)->type) == NULL)
return NULL;
-
+
typy_iter_obj = PyObject_New (typy_iterator_object,
&type_iterator_object_type);
if (typy_iter_obj == NULL)
@@ -1429,7 +1263,7 @@ typy_iterator_iternext (PyObject *self)
typy_iterator_object *iter_obj = (typy_iterator_object *) self;
struct type *type = iter_obj->source->type;
PyObject *result;
-
+
if (iter_obj->field < TYPE_NFIELDS (type))
{
result = make_fielditem (type, iter_obj->field, iter_obj->kind);
@@ -1504,7 +1338,7 @@ gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw)
return (PyObject *) type_to_type_object (type);
}
-void
+int
gdbpy_initialize_types (void)
{
int i;
@@ -1513,11 +1347,11 @@ gdbpy_initialize_types (void)
= register_objfile_data_with_cleanup (save_objfile_types, NULL);
if (PyType_Ready (&type_object_type) < 0)
- return;
+ return -1;
if (PyType_Ready (&field_object_type) < 0)
- return;
+ return -1;
if (PyType_Ready (&type_iterator_object_type) < 0)
- return;
+ return -1;
for (i = 0; pyty_codes[i].name; ++i)
{
@@ -1525,18 +1359,19 @@ gdbpy_initialize_types (void)
/* Cast needed for Python 2.4. */
(char *) pyty_codes[i].name,
pyty_codes[i].code) < 0)
- return;
+ return -1;
}
- Py_INCREF (&type_object_type);
- PyModule_AddObject (gdb_module, "Type", (PyObject *) &type_object_type);
+ if (gdb_pymodule_addobject (gdb_module, "Type",
+ (PyObject *) &type_object_type) < 0)
+ return -1;
- Py_INCREF (&type_iterator_object_type);
- PyModule_AddObject (gdb_module, "TypeIterator",
- (PyObject *) &type_iterator_object_type);
+ if (gdb_pymodule_addobject (gdb_module, "TypeIterator",
+ (PyObject *) &type_iterator_object_type) < 0)
+ return -1;
- Py_INCREF (&field_object_type);
- PyModule_AddObject (gdb_module, "Field", (PyObject *) &field_object_type);
+ return gdb_pymodule_addobject (gdb_module, "Field",
+ (PyObject *) &field_object_type);
}
@@ -1559,6 +1394,14 @@ static PyMethodDef type_object_methods[] =
Return a type which represents an array of objects of this type.\n\
The bounds of the array are [LOW_BOUND, HIGH_BOUND] inclusive.\n\
If LOW_BOUND is omitted, a value of zero is used." },
+ { "vector", typy_vector, METH_VARARGS,
+ "vector ([LOW_BOUND,] HIGH_BOUND) -> Type\n\
+Return a type which represents a vector of objects of this type.\n\
+The bounds of the array are [LOW_BOUND, HIGH_BOUND] inclusive.\n\
+If LOW_BOUND is omitted, a value of zero is used.\n\
+Vectors differ from arrays in that if the current language has C-style\n\
+arrays, vectors don't decay to a pointer to the first element.\n\
+They are first class values." },
{ "__contains__", typy_has_key, METH_VARARGS,
"T.__contains__(k) -> True if T has a field named k, else False" },
{ "const", typy_const, METH_NOARGS,
@@ -1623,7 +1466,9 @@ static PyNumberMethods type_object_as_number = {
NULL, /* nb_add */
NULL, /* nb_subtract */
NULL, /* nb_multiply */
+#ifndef IS_PY3K
NULL, /* nb_divide */
+#endif
NULL, /* nb_remainder */
NULL, /* nb_divmod */
NULL, /* nb_power */
@@ -1637,12 +1482,19 @@ static PyNumberMethods type_object_as_number = {
NULL, /* nb_and */
NULL, /* nb_xor */
NULL, /* nb_or */
+#ifdef IS_PY3K
+ NULL, /* nb_int */
+ NULL, /* reserved */
+#else
NULL, /* nb_coerce */
NULL, /* nb_int */
NULL, /* nb_long */
+#endif
NULL, /* nb_float */
+#ifndef IS_PY3K
NULL, /* nb_oct */
NULL /* nb_hex */
+#endif
};
static PyMappingMethods typy_mapping = {
@@ -1653,8 +1505,7 @@ static PyMappingMethods typy_mapping = {
static PyTypeObject type_object_type =
{
- PyObject_HEAD_INIT (NULL)
- 0, /*ob_size*/
+ PyVarObject_HEAD_INIT (NULL, 0)
"gdb.Type", /*tp_name*/
sizeof (type_object), /*tp_basicsize*/
0, /*tp_itemsize*/
@@ -1703,8 +1554,7 @@ static PyGetSetDef field_object_getset[] =
static PyTypeObject field_object_type =
{
- PyObject_HEAD_INIT (NULL)
- 0, /*ob_size*/
+ PyVarObject_HEAD_INIT (NULL, 0)
"gdb.Field", /*tp_name*/
sizeof (field_object), /*tp_basicsize*/
0, /*tp_itemsize*/
@@ -1745,8 +1595,7 @@ static PyTypeObject field_object_type =
};
static PyTypeObject type_iterator_object_type = {
- PyObject_HEAD_INIT (NULL)
- 0, /*ob_size*/
+ PyVarObject_HEAD_INIT (NULL, 0)
"gdb.TypeIterator", /*tp_name*/
sizeof (typy_iterator_object), /*tp_basicsize*/
0, /*tp_itemsize*/
« no previous file with comments | « gdb/python/py-threadevent.c ('k') | gdb/python/py-utils.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698