Index: lldb/trunk/include/lldb/API/SBAddress.h =================================================================== --- lldb/trunk/include/lldb/API/SBAddress.h +++ lldb/trunk/include/lldb/API/SBAddress.h @@ -31,6 +31,10 @@ explicit operator bool() const; + // operator== is a free function + + bool operator!=(const SBAddress &rhs) const; + bool IsValid() const; void Clear(); Index: lldb/trunk/include/lldb/API/SBFileSpec.h =================================================================== --- lldb/trunk/include/lldb/API/SBFileSpec.h +++ lldb/trunk/include/lldb/API/SBFileSpec.h @@ -30,6 +30,10 @@ explicit operator bool() const; + bool operator==(const SBFileSpec &rhs) const; + + bool operator!=(const SBFileSpec &rhs) const; + bool IsValid() const; bool Exists() const; Index: lldb/trunk/include/lldb/API/SBWatchpoint.h =================================================================== --- lldb/trunk/include/lldb/API/SBWatchpoint.h +++ lldb/trunk/include/lldb/API/SBWatchpoint.h @@ -27,6 +27,10 @@ explicit operator bool() const; + bool operator==(const SBWatchpoint &rhs) const; + + bool operator!=(const SBWatchpoint &rhs) const; + bool IsValid() const; SBError GetError(); Index: lldb/trunk/scripts/Python/modify-python-lldb.py =================================================================== --- lldb/trunk/scripts/Python/modify-python-lldb.py +++ lldb/trunk/scripts/Python/modify-python-lldb.py @@ -87,10 +87,6 @@ # Eligible objects are those containers with unambiguous iteration support. len_def = " def __len__(self): return self.%s()" -# This supports the rich comparison methods of __eq__ and __ne__. -eq_def = " def __eq__(self, other): return isinstance(other, %s) and %s" -ne_def = " def __ne__(self, other): return not self.__eq__(other)" - # A convenience iterator for SBSymbol! symbol_in_section_iter_def = ''' def symbol_in_section_iter(self, section): @@ -135,17 +131,6 @@ 'SBModule-symbol-in-section': symbol_in_section_iter_def } -# -# This dictionary defines a mapping from classname to equality method name(s). -# -e = {'SBAddress': ['GetFileAddress', 'GetModule'], - 'SBBreakpoint': ['GetID'], - 'SBWatchpoint': ['GetID'], - 'SBFileSpec': ['GetFilename', 'GetDirectory'], - 'SBModule': ['GetFileSpec', 'GetUUIDString'], - } - - def list_to_frag(list): """Transform a list to equality program fragment. @@ -198,41 +183,28 @@ with open(output_name, 'r') as f_in: content = f_in.read() -# The pattern for recognizing the SWIG Version string -version_pattern = re.compile("^# Version:? (.*)$") - # The pattern for recognizing the beginning of an SB class definition. class_pattern = re.compile("^class (SB.*)\(_object\):$") # The pattern for recognizing the beginning of the __init__ method definition. init_pattern = re.compile("^ def __init__\(self.*\):") -# The pattern for recognizing the beginning of the IsValid method definition. -isvalid_pattern = re.compile("^ def IsValid\(") - # These define the states of our finite state machine. NORMAL = 1 DEFINING_ITERATOR = 2 -DEFINING_EQUALITY = 4 CLEANUP_DOCSTRING = 8 # Our FSM begins its life in the NORMAL state, and transitions to the -# DEFINING_ITERATOR and/or DEFINING_EQUALITY state whenever it encounters the -# beginning of certain class definitions, see dictionaries 'd' and 'e' above. +# DEFINING_ITERATOR state whenever it encounters the beginning of certain class +# definitions, see dictionary 'd' above. # -# Note that the two states DEFINING_ITERATOR and DEFINING_EQUALITY are -# orthogonal in that our FSM can be in one, the other, or both states at the -# same time. During such time, the FSM is eagerly searching for the __init__ +# In the DEFINING_ITERATOR state, the FSM is eagerly searching for the __init__ # method definition in order to insert the appropriate method(s) into the lldb # module. # # The state CLEANUP_DOCSTRING can be entered from either the NORMAL or the -# DEFINING_ITERATOR/EQUALITY states. While in this state, the FSM is fixing/ -# cleaning the Python docstrings generated by the swig docstring features. -# -# The FSM, in all possible states, also checks the current input for IsValid() -# definition, and inserts a __nonzero__() method definition to implement truth -# value testing and the built-in operation bool(). +# DEFINING_ITERATOR state. While in this state, the FSM is fixing/cleaning the +# Python docstrings generated by the swig docstring features. state = NORMAL for line in content.splitlines(): @@ -254,22 +226,18 @@ if state == NORMAL: match = class_pattern.search(line) # If we are at the beginning of the class definitions, prepare to - # transition to the DEFINING_ITERATOR/DEFINING_EQUALITY state for the - # right class names. + # transition to the DEFINING_ITERATOR state for the right class names. if match: cls = match.group(1) if cls in d: # Adding support for iteration for the matched SB class. state |= DEFINING_ITERATOR - if cls in e: - # Adding support for eq and ne for the matched SB class. - state |= DEFINING_EQUALITY - if (state & DEFINING_ITERATOR) or (state & DEFINING_EQUALITY): + if state & DEFINING_ITERATOR: match = init_pattern.search(line) if match: # We found the beginning of the __init__ method definition. - # This is a good spot to insert the iter and/or eq-ne support. + # This is a good spot to insert the iter support. # # But note that SBTarget has three types of iterations. if cls == "SBTarget": @@ -280,9 +248,6 @@ if (state & DEFINING_ITERATOR): new_content.add_line(iter_def % d[cls]) new_content.add_line(len_def % d[cls][0]) - if (state & DEFINING_EQUALITY): - new_content.add_line(eq_def % (cls, list_to_frag(e[cls]))) - new_content.add_line(ne_def) # SBModule has extra SBSection, SBCompileUnit iterators and # symbol_in_section_iter()! Index: lldb/trunk/scripts/interface/SBAddress.i =================================================================== --- lldb/trunk/scripts/interface/SBAddress.i +++ lldb/trunk/scripts/interface/SBAddress.i @@ -64,6 +64,15 @@ explicit operator bool() const; + // operator== is a free function, which swig does not handle, so we inject + // our own equality operator here + %pythoncode%{ + def __eq__(self, other): + return not self.__ne__(other) + %} + + bool operator!=(const SBAddress &rhs) const; + void Clear (); Index: lldb/trunk/scripts/interface/SBBreakpoint.i =================================================================== --- lldb/trunk/scripts/interface/SBBreakpoint.i +++ lldb/trunk/scripts/interface/SBBreakpoint.i @@ -85,6 +85,10 @@ ~SBBreakpoint(); + bool operator==(const lldb::SBBreakpoint &rhs); + + bool operator!=(const lldb::SBBreakpoint &rhs); + break_id_t GetID () const; Index: lldb/trunk/scripts/interface/SBFileSpec.i =================================================================== --- lldb/trunk/scripts/interface/SBFileSpec.i +++ lldb/trunk/scripts/interface/SBFileSpec.i @@ -42,6 +42,10 @@ ~SBFileSpec (); + bool operator==(const SBFileSpec &rhs) const; + + bool operator!=(const SBFileSpec &rhs) const; + bool IsValid() const; Index: lldb/trunk/scripts/interface/SBModule.i =================================================================== --- lldb/trunk/scripts/interface/SBModule.i +++ lldb/trunk/scripts/interface/SBModule.i @@ -184,6 +184,10 @@ const char * GetUUIDString () const; + bool operator==(const lldb::SBModule &rhs) const; + + bool operator!=(const lldb::SBModule &rhs) const; + lldb::SBSection FindSection (const char *sect_name); Index: lldb/trunk/scripts/interface/SBWatchpoint.i =================================================================== --- lldb/trunk/scripts/interface/SBWatchpoint.i +++ lldb/trunk/scripts/interface/SBWatchpoint.i @@ -32,6 +32,10 @@ explicit operator bool() const; + bool operator==(const SBWatchpoint &rhs) const; + + bool operator!=(const SBWatchpoint &rhs) const; + SBError GetError(); Index: lldb/trunk/scripts/lldb.swig =================================================================== --- lldb/trunk/scripts/lldb.swig +++ lldb/trunk/scripts/lldb.swig @@ -95,8 +95,7 @@ # ============================================================================== # The modify-python-lldb.py script is responsible for post-processing this SWIG- # generated lldb.py module. It is responsible for adding support for: iteration -# protocol: __iter__, rich comparison methods: __eq__ and __ne__, and built-in -# function len(): __len__. +# protocol: __iter__, and built-in function len(): __len__. # ============================================================================== %} Index: lldb/trunk/source/API/SBAddress.cpp =================================================================== --- lldb/trunk/source/API/SBAddress.cpp +++ lldb/trunk/source/API/SBAddress.cpp @@ -69,6 +69,13 @@ return false; } +bool SBAddress::operator!=(const SBAddress &rhs) const { + LLDB_RECORD_METHOD_CONST(bool, SBAddress, operator!=,(const SBAddress &), + &rhs); + + return !(*this == rhs); +} + bool SBAddress::IsValid() const { LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBAddress, IsValid); return this->operator bool(); @@ -294,6 +301,8 @@ LLDB_REGISTER_CONSTRUCTOR(SBAddress, (lldb::addr_t, lldb::SBTarget &)); LLDB_REGISTER_METHOD(const lldb::SBAddress &, SBAddress, operator=,(const lldb::SBAddress &)); + LLDB_REGISTER_METHOD_CONST(bool, + SBAddress, operator!=,(const lldb::SBAddress &)); LLDB_REGISTER_METHOD_CONST(bool, SBAddress, IsValid, ()); LLDB_REGISTER_METHOD_CONST(bool, SBAddress, operator bool, ()); LLDB_REGISTER_METHOD(void, SBAddress, Clear, ()); Index: lldb/trunk/source/API/SBFileSpec.cpp =================================================================== --- lldb/trunk/source/API/SBFileSpec.cpp +++ lldb/trunk/source/API/SBFileSpec.cpp @@ -62,6 +62,20 @@ return *this; } +bool SBFileSpec::operator==(const SBFileSpec &rhs) const { + LLDB_RECORD_METHOD_CONST(bool, SBFileSpec, operator==,(const SBFileSpec &rhs), + rhs); + + return ref() == rhs.ref(); +} + +bool SBFileSpec::operator!=(const SBFileSpec &rhs) const { + LLDB_RECORD_METHOD_CONST(bool, SBFileSpec, operator!=,(const SBFileSpec &rhs), + rhs); + + return !(*this == rhs); +} + bool SBFileSpec::IsValid() const { LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFileSpec, IsValid); return this->operator bool(); @@ -185,6 +199,10 @@ LLDB_REGISTER_CONSTRUCTOR(SBFileSpec, (const char *, bool)); LLDB_REGISTER_METHOD(const lldb::SBFileSpec &, SBFileSpec, operator=,(const lldb::SBFileSpec &)); + LLDB_REGISTER_METHOD_CONST(bool, + SBFileSpec, operator==,(const lldb::SBFileSpec &)); + LLDB_REGISTER_METHOD_CONST(bool, + SBFileSpec, operator!=,(const lldb::SBFileSpec &)); LLDB_REGISTER_METHOD_CONST(bool, SBFileSpec, IsValid, ()); LLDB_REGISTER_METHOD_CONST(bool, SBFileSpec, operator bool, ()); LLDB_REGISTER_METHOD_CONST(bool, SBFileSpec, Exists, ()); Index: lldb/trunk/source/API/SBWatchpoint.cpp =================================================================== --- lldb/trunk/source/API/SBWatchpoint.cpp +++ lldb/trunk/source/API/SBWatchpoint.cpp @@ -70,6 +70,20 @@ return bool(m_opaque_wp.lock()); } +bool SBWatchpoint::operator==(const SBWatchpoint &rhs) const { + LLDB_RECORD_METHOD_CONST( + bool, SBWatchpoint, operator==,(const SBWatchpoint &), rhs); + + return GetSP() == rhs.GetSP(); +} + +bool SBWatchpoint::operator!=(const SBWatchpoint &rhs) const { + LLDB_RECORD_METHOD_CONST( + bool, SBWatchpoint, operator!=,(const SBWatchpoint &), rhs); + + return !(*this == rhs); +} + SBError SBWatchpoint::GetError() { LLDB_RECORD_METHOD_NO_ARGS(lldb::SBError, SBWatchpoint, GetError); @@ -303,6 +317,10 @@ LLDB_REGISTER_METHOD(lldb::watch_id_t, SBWatchpoint, GetID, ()); LLDB_REGISTER_METHOD_CONST(bool, SBWatchpoint, IsValid, ()); LLDB_REGISTER_METHOD_CONST(bool, SBWatchpoint, operator bool, ()); + LLDB_REGISTER_METHOD_CONST( + bool, SBWatchpoint, operator==,(const lldb::SBWatchpoint &)); + LLDB_REGISTER_METHOD_CONST( + bool, SBWatchpoint, operator!=,(const lldb::SBWatchpoint &)); LLDB_REGISTER_METHOD(lldb::SBError, SBWatchpoint, GetError, ()); LLDB_REGISTER_METHOD(int32_t, SBWatchpoint, GetHardwareIndex, ()); LLDB_REGISTER_METHOD(lldb::addr_t, SBWatchpoint, GetWatchAddress, ());