This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
RFA: fix PR python/11915
- From: Tom Tromey <tromey at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Fri, 20 Aug 2010 16:32:22 -0600
- Subject: RFA: fix PR python/11915
This patch fixes PR python/11915.
It adds a new method, Type.array, so that users can create new array
types at runtime.
This needs a doc review.
Built & regtested on x86-64 (compile farm).
Tom
2010-08-20 Tom Tromey <tromey@redhat.com>
PR python/11915:
* python/py-type.c (typy_array): New function.
(type_object_methods): Add "array".
2010-08-20 Tom Tromey <tromey@redhat.com>
PR python/11915:
* gdb.texinfo (Types In Python): Document array method.
2010-08-20 Tom Tromey <tromey@redhat.com>
PR python/11915:
* gdb.python/py-type.exp (test_fields): Add tests for array.
gdb/ChangeLog | 6 ++++
gdb/doc/ChangeLog | 5 +++
gdb/doc/gdb.texinfo | 9 ++++++
gdb/python/py-type.c | 50 ++++++++++++++++++++++++++++++++++
gdb/testsuite/ChangeLog | 5 +++
gdb/testsuite/gdb.python/py-type.exp | 5 +++
6 files changed, 80 insertions(+), 0 deletions(-)
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index ba1607c..628e147 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -20916,6 +20916,15 @@ but it can be @code{None} in some situations.
@end table
@end defmethod
+@defmethod Type array @var{n1} @r{[}@var{n2}@r{]}
+Return a new @code{gdb.Type} object which represents an array of this
+type. If one argument is given, it is the inclusive upper bound of
+the array; in this case the lower bound is zero. If two arguments are
+given, the first argument is the lower bound of the array, and the
+second argument is the upper bound of the array. An array's length
+must not be negative.
+@end defmethod
+
@defmethod Type const
Return a new @code{gdb.Type} object which represents a
@code{const}-qualified variant of this type.
diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c
index 529f301..3098248 100644
--- a/gdb/python/py-type.c
+++ b/gdb/python/py-type.c
@@ -262,6 +262,53 @@ typy_strip_typedefs (PyObject *self, PyObject *args)
return type_to_type_object (check_typedef (type));
}
+/* Return an array type. */
+static PyObject *
+typy_array (PyObject *self, PyObject *args)
+{
+ int n1, n2;
+ PyObject *n2_obj = NULL;
+ struct type *array = NULL;
+ struct type *type = ((type_object *) self)->type;
+ volatile struct gdb_exception except;
+
+ if (! PyArg_ParseTuple (args, "i|O", &n1, &n2_obj))
+ return NULL;
+
+ if (n2_obj)
+ {
+ if (!PyInt_Check (n2_obj))
+ {
+ PyErr_SetString (PyExc_RuntimeError,
+ _("Array bound must be an integer"));
+ return NULL;
+ }
+ n2 = (int) PyInt_AsLong (n2_obj);
+ if (PyErr_Occurred ())
+ return NULL;
+ }
+ else
+ {
+ n2 = n1;
+ n1 = 0;
+ }
+
+ if (n2 < n1)
+ {
+ PyErr_SetString (PyExc_ValueError,
+ _("Array length must not be negative"));
+ return NULL;
+ }
+
+ TRY_CATCH (except, RETURN_MASK_ALL)
+ {
+ array = lookup_array_range_type (type, n1, n2);
+ }
+ GDB_PY_HANDLE_EXCEPTION (except);
+
+ return type_to_type_object (array);
+}
+
/* Return a Type object which represents a pointer to SELF. */
static PyObject *
typy_pointer (PyObject *self, PyObject *args)
@@ -836,6 +883,9 @@ static PyGetSetDef type_object_getset[] =
static PyMethodDef type_object_methods[] =
{
+ { "array", typy_array, METH_VARARGS,
+ "array (N) -> Type\n\
+Return a type which represents an array of N objects of this type." },
{ "const", typy_const, METH_NOARGS,
"const () -> Type\n\
Return a const variant of this type." },
diff --git a/gdb/testsuite/gdb.python/py-type.exp b/gdb/testsuite/gdb.python/py-type.exp
index 6e5bd0e..095711f 100644
--- a/gdb/testsuite/gdb.python/py-type.exp
+++ b/gdb/testsuite/gdb.python/py-type.exp
@@ -97,6 +97,11 @@ proc test_fields {lang} {
gdb_test "python fields = ar.type.fields()"
gdb_test "python print len(fields)" "1" "Check the number of fields"
gdb_test "python print fields\[0\].type" "<range type>" "Check array field type"
+
+ gdb_test "python print ar\[0\].cast(ar\[0\].type.array(1))" \
+ ".1, 2." "cast to array with one argument"
+ gdb_test "python print ar\[0\].cast(ar\[0\].type.array(0, 1))" \
+ ".1, 2." "cast to array with two arguments"
}
proc test_base_class {} {