public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM]  archer-tromey-python: Fixes from Daniel\'s review of the gdb.Value patch.
@ 2008-10-16  3:55 bauermann
  0 siblings, 0 replies; only message in thread
From: bauermann @ 2008-10-16  3:55 UTC (permalink / raw)
  To: archer-commits

The branch, archer-tromey-python has been updated
       via  47283acef2d3db522e74f305e750d66f4eea15f6 (commit)
      from  e88aa252e2fc7d031aa0b331de4bd89ed8f35932 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit 47283acef2d3db522e74f305e750d66f4eea15f6
Author: Thiago Jung Bauermann <bauerman@br.ibm.com>
Date:   Thu Oct 16 00:29:57 2008 -0300

    Fixes from Daniel\'s review of the gdb.Value patch.

-----------------------------------------------------------------------

Summary of changes:
 gdb/doc/gdb.texinfo                       |    2 +-
 gdb/python/python-value.c                 |   89 +++++++++--------------------
 gdb/testsuite/gdb.python/python-value.exp |    8 +-
 3 files changed, 33 insertions(+), 66 deletions(-)

First 500 lines of diff:
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index f881b0a..d01f4e7 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -17815,7 +17815,7 @@ for its internal bookkeeping of the inferior's values, and for
 fetching values when necessary.
 
 Inferior values that are simple scalars can be used directly in
-Python expressions that are valid for the value's data type  Here's
+Python expressions that are valid for the value's data type.  Here's
 an example for an integer or floating-point value @code{some_val}:
 
 @smallexample
diff --git a/gdb/python/python-value.c b/gdb/python/python-value.c
index 02c3fec..e78a4b6 100644
--- a/gdb/python/python-value.c
+++ b/gdb/python/python-value.c
@@ -369,113 +369,80 @@ enum valpy_opcode
 #define STRIP_REFERENCE(TYPE) \
   ((TYPE_CODE (TYPE) == TYPE_CODE_REF) ? (TYPE_TARGET_TYPE (TYPE)) : (TYPE))
 
-/* Returns a value object which is the sum of this value with the given
-   integer argument.  */
+/* Returns a value object which is the result of applying the operation
+   specified by OPCODE to the given arguments.  */
 static PyObject *
 valpy_binop (enum valpy_opcode opcode, PyObject *self, PyObject *other)
 {
-  long l;
-  double d;
   struct value *res_val = NULL;	  /* Initialize to appease gcc warning.  */
-  struct value *other_val;
-  value_object *self_value;
   volatile struct gdb_exception except;
 
-  /* If the gdb.Value object is the second operand, then it will be passed
-     to us as the OTHER argument, and SELF will be an entirely different
-     kind of object, altogether.  Swap them to avoid surprises.  */
-  if (!PyObject_TypeCheck (self, &value_object_type))
-    {
-      PyObject *tmp;
-
-      tmp = self;
-      self = other;
-      other = tmp;
-    }
-
-  self_value = (value_object *) self;
-
-  if (PyObject_TypeCheck (other, &value_object_type))
-    other_val = ((value_object *) other)->value;
-  else if (PyInt_Check (other))
-    {
-      l = PyInt_AsLong (other);
-      if (PyErr_Occurred ())
-	return Py_NotImplemented;
-
-      other_val = value_from_longest (builtin_type_pyint, l);
-    }
-  else if (PyFloat_Check (other))
+  TRY_CATCH (except, RETURN_MASK_ALL)
     {
-      d = PyFloat_AsDouble (other);
-      if (PyErr_Occurred ())
-	return Py_NotImplemented;
+      struct value *arg1, *arg2;
 
-      other_val = value_from_double (builtin_type_pyfloat, d);
-    }
-  else
-    /* If the types cannot be added, Python documentation says to return
-       NotImplemented (http://docs.python.org/ref/numeric-types.html).  */
-    return Py_NotImplemented;
+      /* If the gdb.Value object is the second operand, then it will be passed
+	 to us as the OTHER argument, and SELF will be an entirely different
+	 kind of object, altogether.  Because of this, we can't assume self is
+	 a gdb.Value object and need to convert it from python as well.  */
+      arg1 = convert_value_from_python (self);
+      arg2 = convert_value_from_python (other);
 
-  TRY_CATCH (except, RETURN_MASK_ALL)
-    {
       switch (opcode)
 	{
 	case VALPY_ADD:
 	  {
-	    struct type *ltype = value_type (self_value->value);
-	    struct type *rtype = value_type (other_val);
+	    struct type *ltype = value_type (arg1);
+	    struct type *rtype = value_type (arg2);
+
 	    CHECK_TYPEDEF (ltype);
 	    ltype = STRIP_REFERENCE (ltype);
 	    CHECK_TYPEDEF (rtype);
 	    rtype = STRIP_REFERENCE (rtype);
 
 	    if (TYPE_CODE (ltype) == TYPE_CODE_PTR)
-	      res_val = value_ptradd (self_value->value, other_val);
+	      res_val = value_ptradd (arg1, arg2);
 	    else if (TYPE_CODE (rtype) == TYPE_CODE_PTR)
-	      res_val = value_ptradd (other_val, self_value->value);
+	      res_val = value_ptradd (arg2, arg1);
 	    else
-	      res_val = value_binop (self_value->value, other_val, BINOP_ADD);
+	      res_val = value_binop (arg1, arg2, BINOP_ADD);
 	  }
 	  break;
 	case VALPY_SUB:
 	  {
-	    struct type *ltype = value_type (self_value->value);
-	    struct type *rtype = value_type (other_val);
+	    struct type *ltype = value_type (arg1);
+	    struct type *rtype = value_type (arg2);
+
 	    CHECK_TYPEDEF (ltype);
 	    ltype = STRIP_REFERENCE (ltype);
 	    CHECK_TYPEDEF (rtype);
 	    rtype = STRIP_REFERENCE (rtype);
+
 	    if (TYPE_CODE (ltype) == TYPE_CODE_PTR)
 	      {
 		if (TYPE_CODE (rtype) == TYPE_CODE_PTR)
-		  {
 		    /* A ptrdiff_t for the target would be preferable
 		       here.  */
-		    res_val
-		      = value_from_longest (builtin_type_pyint,
-					    value_ptrdiff (self_value->value,
-							   other_val));
-		  }
+		    res_val = value_from_longest (builtin_type_pyint,
+						  value_ptrdiff (arg1, arg2));
 		else
-		  res_val = value_ptrsub (self_value->value, other_val);
+		  res_val = value_ptrsub (arg1, arg2);
 	      }
 	    else
-	      res_val = value_binop (self_value->value, other_val, BINOP_SUB);
+	      res_val = value_binop (arg1, arg2, BINOP_SUB);
 	  }
 	  break;
 	case VALPY_MUL:
-	  res_val = value_binop (self_value->value, other_val, BINOP_MUL);
+	  res_val = value_binop (arg1, arg2, BINOP_MUL);
 	  break;
 	case VALPY_DIV:
-	  res_val = value_binop (self_value->value, other_val, BINOP_DIV);
+	  res_val = value_binop (arg1, arg2, BINOP_DIV);
 	  break;
 	case VALPY_REM:
-	  res_val = value_binop (self_value->value, other_val, BINOP_REM);
+	  res_val = value_binop (arg1, arg2, BINOP_REM);
 	  break;
 	case VALPY_POW:
-	  res_val = value_binop (self_value->value, other_val, BINOP_EXP);
+	  res_val = value_binop (arg1, arg2, BINOP_EXP);
 	  break;
 	}
     }
diff --git a/gdb/testsuite/gdb.python/python-value.exp b/gdb/testsuite/gdb.python/python-value.exp
index b723b9d..7515ab7 100644
--- a/gdb/testsuite/gdb.python/python-value.exp
+++ b/gdb/testsuite/gdb.python/python-value.exp
@@ -104,11 +104,11 @@ proc test_value_numeric_ops {} {
 
   # Test gdb.Value mixed with Python types.
 
-  gdb_test "python print 'result = ' + str(i+1)" " = 6" "add integer value with python integer"
-  gdb_test "python print (i+1).__class__" "<type 'gdb.Value'>" "verify type of mixed integer add result"
+  gdb_test "python print 'result = ' + str(i-1)" " = 4" "subtract integer value from python integer"
+  gdb_test "python print (i-1).__class__" "<type 'gdb.Value'>" "verify type of mixed integer subtraction result"
   gdb_test "python print 'result = ' + str(f+1.5)" " = 2.75" "add double value with python float"
 
-  gdb_test "python print 'result = ' + str(1+i)" " = 6" "add python integer with integer value"
+  gdb_test "python print 'result = ' + str(1-i)" " = -4" "subtract python integer from integer value"
   gdb_test "python print 'result = ' + str(1.5+f)" " = 2.75" "add python float with double value"
 
   # Test pointer arithmethic
@@ -126,7 +126,7 @@ proc test_value_numeric_ops {} {
   # Test some invalid operations.
 
   gdb_test_multiple "python print 'result = ' + str(i+'foo')" "catch error in python type conversion" {
-      -re "unsupported operand type.*$gdb_prompt $"   {pass "catch error in python type conversion"}
+      -re "Argument to arithmetic operation not a number or boolean.*$gdb_prompt $"   {pass "catch error in python type conversion"}
       -re "result = .*$gdb_prompt $"		      {fail "catch error in python type conversion"}
       -re "$gdb_prompt $"			      {fail "catch error in python type conversion"}
   }


hooks/post-receive
--
Repository for Project Archer.


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-10-16  3:55 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-10-16  3:55 [SCM] archer-tromey-python: Fixes from Daniel\'s review of the gdb.Value patch bauermann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).