From patchwork Sun May 10 00:36:48 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Siva Chandra Reddy X-Patchwork-Id: 6648 Received: (qmail 26646 invoked by alias); 10 May 2015 00:36:53 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 26607 invoked by uid 89); 10 May 2015 00:36:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mail-ob0-f181.google.com Received: from mail-ob0-f181.google.com (HELO mail-ob0-f181.google.com) (209.85.214.181) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Sun, 10 May 2015 00:36:50 +0000 Received: by obbkp3 with SMTP id kp3so78420213obb.3 for ; Sat, 09 May 2015 17:36:48 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=9VIinLM9iwGVSPIkopxN8ECo4cJKIMiaPECgXpSWHHw=; b=gIvncYkfHIOtMT0xRj7MF7nz2ZhCuBalXIdLQT3lWARixKXbIV4dW4Uml/gjuceVzR fOJD4UphXehvgw5qjb8DOzkHebo351fx1HRjO/O7YiN4ueVftC9rxkm23+/dEiGlEadb OYalvJ11MHUiKfhz4MRLV7xGa5GPGI8YEqS4FZHR3ZtaFo5YUOJ1ov1511fXZPlRjmVo j7is6jic/w1C6lsiQ9hdzeJTktzr4hBh/jTxccOCilEARJ40fm9zZOFnkqzkg/xLIx8l bv3vGSfGYerwzuIGwjUoZ6DS31Cjd2uHBGa4uhFHG05coUtVfhU3DLxaaqasw/IswyrG FsaA== X-Gm-Message-State: ALoCoQklA3GmedejpJ+/1e9c+khj+ofVUp9/4AEHWTa2SgYi88TxpT4W1bQozeV9F37qozTyyqBD MIME-Version: 1.0 X-Received: by 10.202.69.130 with SMTP id s124mr3239199oia.70.1431218208311; Sat, 09 May 2015 17:36:48 -0700 (PDT) Received: by 10.202.83.83 with HTTP; Sat, 9 May 2015 17:36:48 -0700 (PDT) In-Reply-To: <001a1135a3d865051b0515864d6a@google.com> References: <001a1135a3d865051b0515864d6a@google.com> Date: Sat, 9 May 2015 17:36:48 -0700 Message-ID: Subject: Re: [Python] Add methods reference_value and const_value to gdb.Value From: Siva Chandra To: Doug Evans Cc: gdb-patches X-IsSubscribed: yes On Thu, May 7, 2015 at 4:30 PM, Doug Evans wrote: > Siva Chandra writes: > > This will help address libstdc++/65840: > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65840 > > > > gdb/ChangeLog: > > > > 2015-04-27 Siva Chandra Reddy > > > > * NEWS (Python Scripting): Mention the new gdb.Value methods. > > * python/py-value.c (valpy_reference_value): New function. > > (valpy_const_value): Likewise. > > (value_object_methods): Add new methods. > > * value.c (make_cv_value): New function. > > * value.h (make_cv_value): Declare. > > > > gdb/doc/ChangeLog: > > > > 2015-04-27 Siva Chandra Reddy > > > > * python.texi (Values From Inferior): Add descriptions of new > > methods gdb.Value.reference_value and gdb.Value.const_value. > > > > gdb/testsuite/ChangeLog: > > > > 2015-04-27 Siva Chandra Reddy > > > > * gdb.python/py-xmethods.cc: Enhance test case. > > * gdb.python/py-xmethods.exp: New tests. > > * gdb.python/py-xmethods.py (A_indexoper): New xmethod worker > > function. > > (B_indexoper): Likewise. > > (global_dm_list) : Add new xmethod worker functions. > > Thanks again for the ping. > > LGTM with two nits below. grep for ====. > > One more nit might be that we already have gdb.Value.referenced_value, > and now we'll also have gdb.Value.reference_value. > I'm ok with it. Thanks for the review. I have committed the attached patch after addressing the nits: 4c082a81dfebcca45e4ee8cb90490ab733b8e017 diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1004e11..b58f04a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2015-05-09 Siva Chandra Reddy + + * NEWS (Python Scripting): Mention the new gdb.Value methods. + * python/py-value.c (valpy_reference_value): New function. + (valpy_const_value): Likewise. + (value_object_methods): Add new methods. + * value.c (make_cv_value): New function. + * value.h (make_cv_value): Declare. + 2015-05-08 Yao Qi Sandra Loosemore diff --git a/gdb/NEWS b/gdb/NEWS index 0c7084a..51e4f4e 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -57,6 +57,9 @@ ** gdb.Type objects have a new method "optimized_out", returning optimized out gdb.Value instance of this type. ** Xmethods can now specify a result type. + ** gdb.Value objects have new methods "reference_value" and + "const_value" which return a reference to the value and a + "const" version of the value respectively. * New commands diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index f374fea..727d0ad 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2015-05-09 Siva Chandra Reddy + + * python.texi (Values From Inferior): Add descriptions of new + methods gdb.Value.reference_value and gdb.Value.const_value. + 2015-05-06 Joel Brobecker * gdb.texinfo (Files): Add "info dll" documentation. diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index fc3c745..57ec22e 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -781,6 +781,16 @@ The @code{gdb.Value} object @code{py_val} is identical to that corresponding to @code{val}. @end defun +@defun Value.reference_value () +Return a @code{gdb.Value} object which is a reference to the value +encapsulated by this instance. +@end defun + +@defun Value.const_value () +Return a @code{gdb.Value} object which is a @code{const} version of the +value encapsulated by this instance. +@end defun + @defun Value.dynamic_cast (type) Like @code{Value.cast}, but works as if the C@t{++} @code{dynamic_cast} operator were used. Consult a C@t{++} reference for details. diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 6622d11..97eb66a 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -236,6 +236,59 @@ valpy_referenced_value (PyObject *self, PyObject *args) return result; } +/* Return a value which is a reference to the value. */ + +static PyObject * +valpy_reference_value (PyObject *self, PyObject *args) +{ + PyObject *result = NULL; + + TRY + { + struct value *self_val; + struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ()); + + self_val = ((value_object *) self)->value; + result = value_to_value_object (value_ref (self_val)); + + do_cleanups (cleanup); + } + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH + + return result; +} + +/* Return a "const" qualified version of the value. */ + +static PyObject * +valpy_const_value (PyObject *self, PyObject *args) +{ + PyObject *result = NULL; + + TRY + { + struct value *self_val, *res_val; + struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ()); + + self_val = ((value_object *) self)->value; + res_val = make_cv_value (1, 0, self_val); + result = value_to_value_object (res_val); + + do_cleanups (cleanup); + } + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH + + return result; +} + /* Return "&value". */ static PyObject * valpy_get_address (PyObject *self, void *closure) @@ -1692,6 +1745,10 @@ reinterpret_cast operator." { "dereference", valpy_dereference, METH_NOARGS, "Dereferences the value." }, { "referenced_value", valpy_referenced_value, METH_NOARGS, "Return the value referenced by a TYPE_CODE_REF or TYPE_CODE_PTR value." }, + { "reference_value", valpy_reference_value, METH_NOARGS, + "Return a value of type TYPE_CODE_REF referencing this value." }, + { "const_value", valpy_const_value, METH_NOARGS, + "Return a 'const' qualied version of the same value." }, { "lazy_string", (PyCFunction) valpy_lazy_string, METH_VARARGS | METH_KEYWORDS, "lazy_string ([encoding] [, length]) -> lazy_string\n\ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index f4ee04a..52140bd 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2015-05-09 Siva Chandra Reddy + + * gdb.python/py-xmethods.cc: Enhance test case. + * gdb.python/py-xmethods.exp: New tests. + * gdb.python/py-xmethods.py (A_indexoper): New xmethod worker + function. + (B_indexoper): Likewise. + (global_dm_list) : Add new xmethod worker functions. + 2015-05-08 Sergio Durigan Junior * gdb.base/coredump-filter.exp: Correctly unset diff --git a/gdb/testsuite/gdb.python/py-xmethods.cc b/gdb/testsuite/gdb.python/py-xmethods.cc index aedd1de..98bdb72 100644 --- a/gdb/testsuite/gdb.python/py-xmethods.cc +++ b/gdb/testsuite/gdb.python/py-xmethods.cc @@ -173,7 +173,7 @@ int main(void) for (int i = 0; i < 10; i++) { - a1.array[i] = a2.array[i] = i; + a1.array[i] = a2.array[i] = b1.array[i] = i; } return 0; /* Break here. */ diff --git a/gdb/testsuite/gdb.python/py-xmethods.exp b/gdb/testsuite/gdb.python/py-xmethods.exp index 712f271..274b06e 100644 --- a/gdb/testsuite/gdb.python/py-xmethods.exp +++ b/gdb/testsuite/gdb.python/py-xmethods.exp @@ -100,6 +100,8 @@ gdb_test "p a1.geta()" "From Python .*5" "After: a1.geta()" gdb_test "p ++a1" "From Python .*6" "After: ++a1" gdb_test "p a1.getarrayind(5)" "From Python .*5" \ "After: a1.getarrayind(5)" +gdb_test "P a1\[6\]" ".*int &.*6" "After a1\[\]" +gdb_test "P b1\[7\]" ".*const int &.*7" "After b1\[\]" # Note the following test. Xmethods on dynamc types are not looked up # currently. Hence, even though a_ptr points to a B object, the xmethod # defined for A objects is invoked. diff --git a/gdb/testsuite/gdb.python/py-xmethods.py b/gdb/testsuite/gdb.python/py-xmethods.py index 3a2f100..a32781a 100644 --- a/gdb/testsuite/gdb.python/py-xmethods.py +++ b/gdb/testsuite/gdb.python/py-xmethods.py @@ -43,6 +43,12 @@ def A_getarrayind(obj, index): print('From Python :') return obj['array'][index] +def A_indexoper(obj, index): + return obj['array'][index].reference_value() + +def B_indexoper(obj, index): + return obj['array'][index].const_value().reference_value() + type_A = gdb.parse_and_eval('(dop::A *) 0').type.target() type_B = gdb.parse_and_eval('(dop::B *) 0').type.target() @@ -213,6 +219,16 @@ global_dm_list = [ '^getarrayind$', A_getarrayind, type_int), + SimpleXMethodMatcher('A_indexoper', + '^dop::A$', + 'operator\\[\\]', + A_indexoper, + type_int), + SimpleXMethodMatcher('B_indexoper', + '^dop::B$', + 'operator\\[\\]', + B_indexoper, + type_int) ] for matcher in global_dm_list: diff --git a/gdb/value.c b/gdb/value.c index 2b32881..86d7d00 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -1704,6 +1704,27 @@ value_copy (struct value *arg) return val; } +/* Return a "const" and/or "volatile" qualified version of the value V. + If CNST is true, then the returned value will be qualified with + "const". + if VOLTL is true, then the returned value will be qualified with + "volatile". */ + +struct value * +make_cv_value (int cnst, int voltl, struct value *v) +{ + struct type *val_type = value_type (v); + struct type *enclosing_type = value_enclosing_type (v); + struct value *cv_val = value_copy (v); + + deprecated_set_value_type (cv_val, + make_cv_type (cnst, voltl, val_type, NULL)); + set_value_enclosing_type (cv_val, + make_cv_type (cnst, voltl, enclosing_type, NULL)); + + return cv_val; +} + /* Return a version of ARG that is non-lvalue. */ struct value * diff --git a/gdb/value.h b/gdb/value.h index 25107a4..957bcd4 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -1040,6 +1040,8 @@ extern struct value *value_non_lval (struct value *); extern void value_force_lval (struct value *, CORE_ADDR); +extern struct value *make_cv_value (int, int, struct value *); + extern void preserve_one_value (struct value *, struct objfile *, htab_t); /* From valops.c */