Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Thiago Jung Bauermann <bauerman@br.ibm.com>
To: Tom Tromey <tromey@redhat.com>
Cc: gdb-patches@sourceware.org
Subject: [RFA][Python] Change gdb.Value.address from a method to an 	attribute.
Date: Sat, 28 Mar 2009 21:38:00 -0000	[thread overview]
Message-ID: <1238275138.8292.3.camel@localhost.localdomain> (raw)
In-Reply-To: <m3bprs9lqg.fsf@fleche.redhat.com>

El lun, 23-03-2009 a las 11:45 -0600, Tom Tromey escribió:
> >>>>> "Thiago" == Thiago Jung Bauermann <bauerman@br.ibm.com> writes:
> Thiago> By the way, when writing this patch I realised that probably the
> Thiago> "address" method in Value would better be turned into an attribute.
> 
> Do it :)

Just did itâ„¢. Ok to commit?
-- 
[]'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-26 17:50:36.000000000 -0300
+++ src/gdb/doc/gdb.texinfo	2009-03-28 17:45:17.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 the @code{gdb.Value} 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-26 17:50:36.000000000 -0300
+++ src/gdb/python/python-value.c	2009-03-28 17:45:17.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-26 17:50:36.000000000 -0300
+++ src/gdb/testsuite/gdb.python/python-value.exp	2009-03-28 17:45:17.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"
 }
 
 



  reply	other threads:[~2009-03-28 21:19 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               ` Thiago Jung Bauermann [this message]
2009-03-29  4:21                 ` [RFA][Python] Change gdb.Value.address from a method to an attribute Eli Zaretskii
2009-03-29 18:12                   ` Tom Tromey
2009-03-29 18:56                     ` Eli Zaretskii
2009-03-29 21:22                       ` Thiago Jung Bauermann
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=1238275138.8292.3.camel@localhost.localdomain \
    --to=bauerman@br.ibm.com \
    --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