From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12285 invoked by alias); 23 Aug 2010 17:03:44 -0000 Received: (qmail 12140 invoked by uid 22791); 23 Aug 2010 17:03:42 -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; Mon, 23 Aug 2010 17:03:36 +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 o7NH3WQk027133 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 23 Aug 2010 13:03:33 -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 o7NH3WmA029242; Mon, 23 Aug 2010 13:03:32 -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 o7NH3V8R016145; Mon, 23 Aug 2010 13:03:31 -0400 Received: by opsy.redhat.com (Postfix, from userid 500) id F1C628880D5; Mon, 23 Aug 2010 11:03:30 -0600 (MDT) From: Tom Tromey To: Eli Zaretskii Cc: gdb-patches@sourceware.org Subject: Re: RFA: fix PR python/11915 References: <83eidspff4.fsf@gnu.org> Date: Mon, 23 Aug 2010 17:03:00 -0000 In-Reply-To: <83eidspff4.fsf@gnu.org> (Eli Zaretskii's message of "Sat, 21 Aug 2010 10:56:31 +0300") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) 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/msg00389.txt.bz2 >>>>> "Eli" == Eli Zaretskii writes: Eli> "Inclusive upper bound"? Does this mean that if the argument is N, Eli> then the array will have N+1 members, from zero to N? That sounds Eli> against the intuition, doesn't it? Yes, but it is the only way to allow an array whose upper bound is MAXINT. I think it is also consistent with Type.range. >> +given, the first argument is the lower bound of the array, and the >> +second argument is the upper bound of the array. Eli> Will the reader know whether negative arguments are allowed (provided Eli> that the second is greater than the first)? Or is it a good idea to Eli> tell explicitly? I added a note. New patch appended. 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. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index ba1607c..7750361 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, but the bounds can be. +@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..ea6c8e5 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -262,6 +262,54 @@ 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 +884,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 {} {