From: Thiago Jung Bauermann <bauerman@br.ibm.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: Tom Tromey <tromey@redhat.com>, gdb-patches@sourceware.org
Subject: Re: [RFA][Python] Change gdb.Value.address from a method to an attribute.
Date: Sun, 29 Mar 2009 21:22:00 -0000 [thread overview]
Message-ID: <1238361366.7100.4.camel@localhost.localdomain> (raw)
In-Reply-To: <umyb4kxo4.fsf@gnu.org>
El dom, 29-03-2009 a las 21:10 +0300, Eli Zaretskii escribió:
> > From: Tom Tromey <tromey@redhat.com>
> > Date: Sun, 29 Mar 2009 09:41:48 -0600
> > But perhaps the first "the @code{}" can be changed to "this".
>
> Fine with me, thanks.
Ok, I committed the following.
--
[]'s
Thiago Jung Bauermann
IBM Linux Technology Center
gdb/
Change gdb.Value.address from a method to an attribute.
* python/python-value.c (value_object): Add `address' element.
(valpy_dealloc): Decrement reference to self->address if set.
(valpy_new): Initialize val_obj->address.
(valpy_address): Rename to ...
(valpy_get_address): ... this. Change signature from method to
attribute. Update self->address if not set.
(value_to_value_object): Initialize val_obj->address.
(value_object_getset): Add `address' element.
(value_object_methods): Remove `address' element.
gdb/testsuite/
* gdb.python/python-value.exp: Add tests for the address
attribute.
gdb/doc/
* gdb.texinfo (Values From Inferior): Change gdb.Value.address
from a method to an attribute.
Index: src/gdb/doc/gdb.texinfo
===================================================================
--- src.orig/gdb/doc/gdb.texinfo 2009-03-28 17:55:49.000000000 -0300
+++ src/gdb/doc/gdb.texinfo 2009-03-29 18:03:09.000000000 -0300
@@ -18325,9 +18325,15 @@ bar = some_val['foo']
Again, @code{bar} will also be a @code{gdb.Value} object.
-The following attribute is provided:
+The following attributes are provided:
@table @code
+@defmethod Value address
+If this object is addressable, this read-only attribute holds a
+@code{gdb.Value} object representing the address. Otherwise,
+this attribute holds @code{None}.
+@end defmethod
+
@cindex optimized out value in Python
@defmethod Value is_optimized_out
This read-only boolean attribute is true if the compiler optimized out
Index: src/gdb/python/python-value.c
===================================================================
--- src.orig/gdb/python/python-value.c 2009-03-28 17:55:49.000000000 -0300
+++ src/gdb/python/python-value.c 2009-03-28 17:55:51.000000000 -0300
@@ -59,6 +59,7 @@ typedef struct {
PyObject_HEAD
struct value *value;
int owned_by_gdb;
+ PyObject *address;
} value_object;
/* Called by the Python interpreter when deallocating a value object. */
@@ -71,6 +72,13 @@ valpy_dealloc (PyObject *obj)
if (!self->owned_by_gdb)
value_free (self->value);
+
+ if (self->address)
+ /* Use braces to appease gcc warning. *sigh* */
+ {
+ Py_DECREF (self->address);
+ }
+
self->ob_type->tp_free (self);
}
@@ -105,6 +113,7 @@ valpy_new (PyTypeObject *subtype, PyObje
value_obj->value = value;
value_obj->owned_by_gdb = 0;
+ value_obj->address = NULL;
release_value (value);
value_prepend_to_list (&values_in_python, value);
@@ -129,18 +138,30 @@ valpy_dereference (PyObject *self, PyObj
/* Return "&value". */
static PyObject *
-valpy_address (PyObject *self, PyObject *args)
+valpy_get_address (PyObject *self, void *closure)
{
struct value *res_val = NULL; /* Initialize to appease gcc warning. */
+ value_object *val_obj = (value_object *) self;
volatile struct gdb_exception except;
- TRY_CATCH (except, RETURN_MASK_ALL)
+ if (!val_obj->address)
{
- res_val = value_addr (((value_object *) self)->value);
+ TRY_CATCH (except, RETURN_MASK_ALL)
+ {
+ res_val = value_addr (val_obj->value);
+ }
+ if (except.reason < 0)
+ {
+ val_obj->address = Py_None;
+ Py_INCREF (Py_None);
+ }
+ else
+ val_obj->address = value_to_value_object (res_val);
}
- GDB_PY_HANDLE_EXCEPTION (except);
- return value_to_value_object (res_val);
+ Py_INCREF (val_obj->address);
+
+ return val_obj->address;
}
/* Implementation of gdb.Value.string ([encoding] [, errors]) -> string
@@ -726,6 +747,7 @@ value_to_value_object (struct value *val
{
val_obj->value = val;
val_obj->owned_by_gdb = 0;
+ val_obj->address = NULL;
release_value (val);
value_prepend_to_list (&values_in_python, val);
}
@@ -838,6 +860,8 @@ gdbpy_initialize_values (void)
}
static PyGetSetDef value_object_getset[] = {
+ { "address", valpy_get_address, NULL, "The address of the value.",
+ NULL },
{ "is_optimized_out", valpy_get_is_optimized_out, NULL,
"Boolean telling whether the value is optimized out (i.e., not available).",
NULL },
@@ -845,7 +869,6 @@ static PyGetSetDef value_object_getset[]
};
static PyMethodDef value_object_methods[] = {
- { "address", valpy_address, METH_NOARGS, "Return the address of the value." },
{ "dereference", valpy_dereference, METH_NOARGS, "Dereferences the value." },
{ "string", (PyCFunction) valpy_string, METH_VARARGS | METH_KEYWORDS,
"string ([encoding] [, errors]) -> string\n\
Index: src/gdb/testsuite/gdb.python/python-value.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.python/python-value.exp 2009-03-28 17:55:49.000000000 -0300
+++ src/gdb/testsuite/gdb.python/python-value.exp 2009-03-28 17:55:51.000000000 -0300
@@ -70,6 +70,9 @@ proc test_value_creation {} {
gdb_py_test_silent_cmd "python a = gdb.Value (u'unicode test')" "create unicode value" 1
gdb_test "python print a" "\"unicode test\"" "print Unicode string"
gdb_test "python print a.__class__" "<type 'gdb.Value'>" "verify type of unicode string"
+
+ # Test address attribute is None in a non-addressable value
+ gdb_test "python print 'result =', i.address" "= None" "Test address attribute in non-addressable value"
}
proc test_value_numeric_ops {} {
@@ -228,6 +231,9 @@ proc test_value_in_inferior {} {
# Smoke-test is_optimized_out attribute
gdb_test "python print 'result =', arg0.is_optimized_out" "= False" "Test is_optimized_out attribute"
+
+ # Test address attribute
+ gdb_test "python print 'result =', arg0.address" "= 0x\[\[:xdigit:\]\]+" "Test address attribute"
}
next prev parent reply other threads:[~2009-03-29 21:16 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <orskllhfo3.fsf@oliva.athome.lsd.ic.unicamp.br>
[not found] ` <20090310125945.GA4376@caradoc.them.org>
[not found] ` <1236700079.11106.1.camel@localhost.localdomain>
[not found] ` <orzlftfhu1.fsf@oliva.athome.lsd.ic.unicamp.br>
[not found] ` <1236710732.11106.30.camel@localhost.localdomain>
[not found] ` <m3hc1rluz1.fsf@fleche.redhat.com>
2009-03-23 2:09 ` [RFC][Python] Re: any expression to tell whether a variable was optimized out? Thiago Jung Bauermann
2009-03-23 4:24 ` Eli Zaretskii
2009-03-26 21:21 ` Thiago Jung Bauermann
2009-03-23 17:47 ` Tom Tromey
2009-03-28 21:38 ` [RFA][Python] Change gdb.Value.address from a method to an attribute Thiago Jung Bauermann
2009-03-29 4:21 ` Eli Zaretskii
2009-03-29 18:12 ` Tom Tromey
2009-03-29 18:56 ` Eli Zaretskii
2009-03-29 21:22 ` Thiago Jung Bauermann [this message]
2009-03-29 15:42 ` Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1238361366.7100.4.camel@localhost.localdomain \
--to=bauerman@br.ibm.com \
--cc=eliz@gnu.org \
--cc=gdb-patches@sourceware.org \
--cc=tromey@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox