From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9351 invoked by alias); 20 Aug 2010 22:32:32 -0000 Received: (qmail 9308 invoked by uid 22791); 20 Aug 2010 22:32:31 -0000 X-SWARE-Spam-Status: No, hits=-6.1 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 20 Aug 2010 22:32:26 +0000 Received: from int-mx03.intmail.prod.int.phx2.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o7KMWOjQ028939 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 20 Aug 2010 18:32:24 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx03.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o7KMWO3o005495; Fri, 20 Aug 2010 18:32:24 -0400 Received: from opsy.redhat.com (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id o7KMWNCN003116; Fri, 20 Aug 2010 18:32:23 -0400 Received: by opsy.redhat.com (Postfix, from userid 500) id 189B037897B; Fri, 20 Aug 2010 16:32:23 -0600 (MDT) From: Tom Tromey To: gdb-patches@sourceware.org Subject: RFA: fix PR python/11915 Date: Fri, 20 Aug 2010 22:32:00 -0000 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-08/txt/msg00375.txt.bz2 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 PR python/11915: * python/py-type.c (typy_array): New function. (type_object_methods): Add "array". 2010-08-20 Tom Tromey PR python/11915: * gdb.texinfo (Types In Python): Document array method. 2010-08-20 Tom Tromey 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" "" "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 {} {