2013-10-03 Phil Muldoon <pmuldoon@redhat.com>
authorPhil Muldoon <pmuldoon@redhat.com>
Thu, 3 Oct 2013 14:43:32 +0000 (14:43 +0000)
committerPhil Muldoon <pmuldoon@redhat.com>
Thu, 3 Oct 2013 14:43:32 +0000 (14:43 +0000)
* python/py-value.c (convert_value_from_python): Move PyInt_Check
conversion logic to occur after PyLong_Check.  Comment on order
change significance.
* python/py-arch.c (archpy_disassemble): Comment on order of
conversion for integers and longs.

gdb/ChangeLog
gdb/python/py-arch.c
gdb/python/py-value.c

index f85dc90..5e5427c 100644 (file)
@@ -1,3 +1,11 @@
+2013-10-03  Phil Muldoon  <pmuldoon@redhat.com>
+
+       * python/py-value.c (convert_value_from_python): Move PyInt_Check
+       conversion logic to occur after PyLong_Check.  Comment on order
+       change significance.
+       * python/py-arch.c (archpy_disassemble): Comment on order of
+       conversion for integers and longs.
+
 2013-10-03  Pedro Alves  <palves@redhat.com>
 
        * common/linux-ptrace.c (linux_check_ptrace_features): Factor out
index a31ffdd..a351c12 100644 (file)
@@ -132,6 +132,13 @@ archpy_disassemble (PyObject *self, PyObject *args, PyObject *kw)
   start = start_temp;
   if (end_obj)
     {
+      /* Make a long logic check first.  In Python 3.x, internally,
+        all integers are represented as longs.  In Python 2.x, there
+        is still a differentiation internally between a PyInt and a
+        PyLong.  Explicitly do this long check conversion first. In
+        GDB, for Python 3.x, we #ifdef PyInt = PyLong.  This check has
+        to be done first to ensure we do not lose information in the
+        conversion process.  */
       if (PyLong_Check (end_obj))
         end = PyLong_AsUnsignedLongLong (end_obj);
       else if (PyInt_Check (end_obj))
index 0d87219..07feaf8 100644 (file)
@@ -1265,13 +1265,13 @@ convert_value_from_python (PyObject *obj)
          if (cmp >= 0)
            value = value_from_longest (builtin_type_pybool, cmp);
        }
-      else if (PyInt_Check (obj))
-       {
-         long l = PyInt_AsLong (obj);
-
-         if (! PyErr_Occurred ())
-           value = value_from_longest (builtin_type_pyint, l);
-       }
+      /* Make a long logic check first.  In Python 3.x, internally,
+        all integers are represented as longs.  In Python 2.x, there
+        is still a differentiation internally between a PyInt and a
+        PyLong.  Explicitly do this long check conversion first. In
+        GDB, for Python 3.x, we #ifdef PyInt = PyLong.  This check has
+        to be done first to ensure we do not lose information in the
+        conversion process.  */
       else if (PyLong_Check (obj))
        {
          LONGEST l = PyLong_AsLongLong (obj);
@@ -1306,6 +1306,13 @@ convert_value_from_python (PyObject *obj)
          else
            value = value_from_longest (builtin_type_pylong, l);
        }
+      else if (PyInt_Check (obj))
+       {
+         long l = PyInt_AsLong (obj);
+
+         if (! PyErr_Occurred ())
+           value = value_from_longest (builtin_type_pyint, l);
+       }
       else if (PyFloat_Check (obj))
        {
          double d = PyFloat_AsDouble (obj);