[2/2] Fix enum flag with Python 3
Commit Message
Using Python 3.5 (I assume it's the same with 3.4 and lower, but I didn't
test), I see this:
print (enum flag_enum) (FLAG_1)^M
Python Exception <class 'TypeError'> %x format: an integer is required, not gdb.Value: ^M
$7 = ^M
(gdb) FAIL: gdb.python/py-pp-maint.exp: print FLAG_1
Apparently, this idiom, where v is a gdb.Value, was possible with Python 2,
but not with Python 3:
'%x' % v
In Python 2, it would automatically get converted to an integer. To solve
it, I simply added wrapped v in a call to int().
'%x' % int(v)
In Python 2, the int type is implemented with a "long" in C, so on x86-32 it's
32-bits. I was worried that doing int(v) would truncate the value and give
wrong results for enum values > 32-bits. However, the int type != the int
function. The int function does the right thing, selecting the right integer
type for the given value. I tested with large enum values on x86-32 and
Python 2, and everything works as expected.
gdb/ChangeLog:
* python/lib/gdb/printing.py (_EnumInstance.to_string): Explicitly
convert gdb.Value to integer type using int().
---
gdb/python/lib/gdb/printing.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Comments
On 01/19/2016 04:23 AM, Simon Marchi wrote:
> gdb/ChangeLog:
>
> * python/lib/gdb/printing.py (_EnumInstance.to_string): Explicitly
> convert gdb.Value to integer type using int().
LGTM.
Thanks,
Pedro Alves
On 2016-01-19 06:03, Pedro Alves wrote:
> On 01/19/2016 04:23 AM, Simon Marchi wrote:
>
>> gdb/ChangeLog:
>>
>> * python/lib/gdb/printing.py (_EnumInstance.to_string): Explicitly
>> convert gdb.Value to integer type using int().
>
> LGTM.
Thanks, pushed!
@@ -239,7 +239,7 @@ class _EnumInstance:
if not any_found or v != 0:
# Leftover value.
flag_list.append('<unknown: 0x%x>' % v)
- return "0x%x [%s]" % (self.val, " | ".join(flag_list))
+ return "0x%x [%s]" % (int(self.val), " | ".join(flag_list))
class FlagEnumerationPrinter(PrettyPrinter):
"""A pretty-printer which can be used to print a flag-style enumeration.