
%extend lldb::SBAddress {
        PyObject *lldb::SBAddress::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBBlock {
        PyObject *lldb::SBBlock::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");

        }
}
%extend lldb::SBBreakpoint {
        PyObject *lldb::SBBreakpoint::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBBreakpointLocation {
        PyObject *lldb::SBBreakpointLocation::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description, lldb::eDescriptionLevelFull);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBCommandReturnObject {
        PyObject *lldb::SBCommandReturnObject::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBCompileUnit {
        PyObject *lldb::SBCompileUnit::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBData {
        PyObject *lldb::SBData::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBDebugger {
        PyObject *lldb::SBDebugger::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBError {
        PyObject *lldb::SBError::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBFileSpec {
        PyObject *lldb::SBFileSpec::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBFrame {
        PyObject *lldb::SBFrame::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBFunction {
        PyObject *lldb::SBFunction::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBInstruction {
        PyObject *lldb::SBInstruction::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBInstructionList {
        PyObject *lldb::SBInstructionList::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBLineEntry {
        PyObject *lldb::SBLineEntry::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBModule {
        PyObject *lldb::SBModule::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBProcess {
        PyObject *lldb::SBProcess::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBSection {
        PyObject *lldb::SBSection::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBSymbol {
        PyObject *lldb::SBSymbol::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBSymbolContext {
        PyObject *lldb::SBSymbolContext::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBSymbolContextList {
        PyObject *lldb::SBSymbolContextList::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBTarget {
        PyObject *lldb::SBTarget::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description, lldb::eDescriptionLevelBrief);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBType {
        PyObject *lldb::SBType::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description, lldb::eDescriptionLevelBrief);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBTypeMember {
        PyObject *lldb::SBTypeMember::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description, lldb::eDescriptionLevelBrief);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBThread {
        PyObject *lldb::SBThread::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBValue {
        PyObject *lldb::SBValue::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}
%extend lldb::SBValueList {
        PyObject *lldb::SBValueList::__repr__ (){
                lldb::SBStream description;
                const size_t n = $self->GetSize();
                if (n)
                {
                    for (size_t i=0; i<n; ++i)
                        $self->GetValueAtIndex(i).GetDescription(description);
                }
                else
                {
                    description.Printf("<empty> lldb.SBValueList()");
                }
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                return Py_None;
        }
}
%extend lldb::SBWatchpoint {
        PyObject *lldb::SBWatchpoint::__str__ (){
                lldb::SBStream description;
                $self->GetDescription (description, lldb::eDescriptionLevelVerbose);
                const char *desc = description.GetData();
                size_t desc_len = description.GetSize();
                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
                    --desc_len;
                if (desc_len > 0)
                    return PyString_FromStringAndSize (desc, desc_len);
                else
                    return PyString_FromString("");
        }
}

%pythoncode %{

class declaration(object):
    '''A class that represents a source declaration location with file, line and column.'''
    def __init__(self, file, line, col):
        self.file = file
        self.line = line
        self.col = col

class value(object):
    '''A class designed to wrap lldb.SBValue() objects so the resulting object
    can be used as a variable would be in code. So if you have a Point structure
    variable in your code in the current frame named "pt", you can initialize an instance
    of this class with it:
    
    pt = lldb.value(lldb.frame.FindVariable("pt"))
    print pt
    print pt.x
    print pt.y

    pt = lldb.value(lldb.frame.FindVariable("rectangle_array"))
    print rectangle_array[12]
    print rectangle_array[5].origin.x'''
    def __init__(self, sbvalue):
        self.sbvalue = sbvalue

    def __nonzero__(self):
        return self.sbvalue.__nonzero__()

    def __str__(self):
        return self.sbvalue.__str__()

    def __getitem__(self, key):
        # Allow array access if this value has children...
        if type(key) is int:
            return value(self.sbvalue.GetValueForExpressionPath("[%i]" % key))
        raise TypeError

    def __getattr__(self, name):
        child_sbvalue = self.sbvalue.GetChildMemberWithName (name)
        if child_sbvalue:
            return value(child_sbvalue)
        raise AttributeError

    def __add__(self, other):
        return int(self) + int(other)
        
    def __sub__(self, other):
        return int(self) - int(other)
        
    def __mul__(self, other):
        return int(self) * int(other)
        
    def __floordiv__(self, other):
        return int(self) // int(other)
        
    def __mod__(self, other):
        return int(self) % int(other)
        
    def __divmod__(self, other):
        return int(self) % int(other)
        
    def __pow__(self, other):
        return int(self) ** int(other)
        
    def __lshift__(self, other):
        return int(self) << int(other)
        
    def __rshift__(self, other):
        return int(self) >> int(other)
        
    def __and__(self, other):
        return int(self) & int(other)
        
    def __xor__(self, other):
        return int(self) ^ int(other)
        
    def __or__(self, other):
        return int(self) | int(other)
        
    def __div__(self, other):
        return int(self) / int(other)
        
    def __truediv__(self, other):
        return int(self) / int(other)
        
    def __iadd__(self, other):
        result = self.__add__(other)
        self.sbvalue.SetValueFromCString (str(result))
        return result
        
    def __isub__(self, other):
        result = self.__sub__(other)
        self.sbvalue.SetValueFromCString (str(result))
        return result
        
    def __imul__(self, other):
        result = self.__mul__(other)
        self.sbvalue.SetValueFromCString (str(result))
        return result
        
    def __idiv__(self, other):
        result = self.__div__(other)
        self.sbvalue.SetValueFromCString (str(result))
        return result
        
    def __itruediv__(self, other):
        result = self.__truediv__(other)
        self.sbvalue.SetValueFromCString (str(result))
        return result
        
    def __ifloordiv__(self, other):
        result =  self.__floordiv__(self, other)
        self.sbvalue.SetValueFromCString (str(result))
        return result
        
    def __imod__(self, other):
        result =  self.__and__(self, other)
        self.sbvalue.SetValueFromCString (str(result))
        return result
        
    def __ipow__(self, other):
        result = self.__pow__(self, other)
        self.sbvalue.SetValueFromCString (str(result))
        return result
        
    def __ipow__(self, other, modulo):
        result = self.__pow__(self, other, modulo)
        self.sbvalue.SetValueFromCString (str(result))
        return result
        
    def __ilshift__(self, other):
        result = self.__lshift__(other)
        self.sbvalue.SetValueFromCString (str(result))
        return result
        
    def __irshift__(self, other):
        result =  self.__rshift__(other)
        self.sbvalue.SetValueFromCString (str(result))
        return result
        
    def __iand__(self, other):
        result =  self.__and__(self, other)
        self.sbvalue.SetValueFromCString (str(result))
        return result
        
    def __ixor__(self, other):
        result =  self.__xor__(self, other)
        self.sbvalue.SetValueFromCString (str(result))
        return result
        
    def __ior__(self, other):
        result =  self.__ior__(self, other)
        self.sbvalue.SetValueFromCString (str(result))
        return result
        
    def __neg__(self):
        return -int(self)
        
    def __pos__(self):
        return +int(self)
        
    def __abs__(self):
        return abs(int(self))
        
    def __invert__(self):
        return ~int(self)
        
    def __complex__(self):
        return complex (int(self))
        
    def __int__(self):
        return self.sbvalue.GetValueAsSigned()
        
    def __long__(self):
        return self.sbvalue.GetValueAsSigned()
        
    def __float__(self):
        return float (self.sbvalue.GetValueAsSigned())
        
    def __oct__(self):
        return '0%o' % self.sbvalue.GetValueAsUnsigned()
        
    def __hex__(self):
        return '0x%x' % self.sbvalue.GetValueAsUnsigned()

    def __eq__(self, other):
        return self.sbvalue.GetValueAsUnsigned() == self.sbvalue.GetValueAsUnsigned()
                                                                    
    def __neq__(self, other):
        return not self.__eq__(other)
%}

