#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
This hook is necessary for compatibility with Python2.7 versions of GDB
since they cannot directly cast to integer a gdb.Value object that is
not already an integer type.
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

import sys

import gdb

import pwndbg.typeinfo

if sys.version_info < (3,0):
    import __builtin__ as builtins
else:
    import builtins

_int = builtins.int

# We need this class to get isinstance(7, xint) to return True
class IsAnInt(type):
    def __instancecheck__(self, other):
        return isinstance(other, _int)

class xint(builtins.int):
    __metaclass__ = IsAnInt
    def __new__(cls, value, *a, **kw):
        if isinstance(value, gdb.Value):
            if pwndbg.typeinfo.is_pointer(value):
                value = value.cast(pwndbg.typeinfo.ulong)
            else:
                value = value.cast(pwndbg.typeinfo.long)
        return _int(_int(value, *a, **kw))

builtins.int = xint
globals()['int'] = xint

if sys.version_info >= (3,0):
    builtins.long = xint
    globals()['long'] = xint


#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
This hook is necessary for compatibility with Python2.7 versions of GDB
since they cannot directly cast to integer a gdb.Value object that is
not already an integer type.
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

import sys

import gdb
from future.utils import with_metaclass

import pwndbg.typeinfo

if sys.version_info < (3,0):
    import __builtin__ as builtins
else:
    import builtins

_int = builtins.int

# We need this class to get isinstance(7, xint) to return True
class IsAnInt(type):
    def __instancecheck__(self, other):
        return isinstance(other, _int)

class xint(with_metaclass(IsAnInt, builtins.int)):
    def __new__(cls, value, *a, **kw):
        if isinstance(value, gdb.Value):
            if pwndbg.typeinfo.is_pointer(value):
                value = value.cast(pwndbg.typeinfo.ulong)
            else:
                value = value.cast(pwndbg.typeinfo.long)
        return _int(_int(value, *a, **kw))

builtins.int = xint
globals()['int'] = xint

if sys.version_info >= (3,0):
    builtins.long = xint
    globals()['long'] = xint

make metaclass syntax in inthook.py compatible with Python 3 (#128)