diff options
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/python/py-arch.c | 7 | ||||
-rw-r--r-- | gdb/python/py-value.c | 21 |
3 files changed, 29 insertions, 7 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f85dc90..5e5427c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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 diff --git a/gdb/python/py-arch.c b/gdb/python/py-arch.c index a31ffdd..a351c12 100644 --- a/gdb/python/py-arch.c +++ b/gdb/python/py-arch.c @@ -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)) diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 0d87219..07feaf8 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -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); |