diff --git a/lldb/include/lldb/API/SBAddress.h b/lldb/include/lldb/API/SBAddress.h index 2cebec22b472..2874a3602af2 100644 --- a/lldb/include/lldb/API/SBAddress.h +++ b/lldb/include/lldb/API/SBAddress.h @@ -31,6 +31,10 @@ public: explicit operator bool() const; + // operator== is a free function + + bool operator!=(const SBAddress &rhs) const; + bool IsValid() const; void Clear(); diff --git a/lldb/include/lldb/API/SBFileSpec.h b/lldb/include/lldb/API/SBFileSpec.h index 7f819b2f75b5..27149775901e 100644 --- a/lldb/include/lldb/API/SBFileSpec.h +++ b/lldb/include/lldb/API/SBFileSpec.h @@ -30,6 +30,10 @@ public: explicit operator bool() const; + bool operator==(const SBFileSpec &rhs) const; + + bool operator!=(const SBFileSpec &rhs) const; + bool IsValid() const; bool Exists() const; diff --git a/lldb/include/lldb/API/SBWatchpoint.h b/lldb/include/lldb/API/SBWatchpoint.h index f779030d0f6b..05ff0ca7e443 100644 --- a/lldb/include/lldb/API/SBWatchpoint.h +++ b/lldb/include/lldb/API/SBWatchpoint.h @@ -27,6 +27,10 @@ public: explicit operator bool() const; + bool operator==(const SBWatchpoint &rhs) const; + + bool operator!=(const SBWatchpoint &rhs) const; + bool IsValid() const; SBError GetError(); diff --git a/lldb/scripts/Python/modify-python-lldb.py b/lldb/scripts/Python/modify-python-lldb.py index 7a2c58ded4b8..af51ae6a85d8 100644 --- a/lldb/scripts/Python/modify-python-lldb.py +++ b/lldb/scripts/Python/modify-python-lldb.py @@ -87,10 +87,6 @@ compile_unit_iter = " def compile_unit_iter(self): return lldb_iter(self, '%s # 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 @@ d = {'SBBreakpoint': ('GetNumLocations', 'GetLocationAtIndex'), '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 @@ new_content = NewContent() 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 @@ for line in content.splitlines(): 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 @@ for line in content.splitlines(): 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()! diff --git a/lldb/scripts/interface/SBAddress.i b/lldb/scripts/interface/SBAddress.i index dc22e4c34985..18991176105a 100644 --- a/lldb/scripts/interface/SBAddress.i +++ b/lldb/scripts/interface/SBAddress.i @@ -64,6 +64,15 @@ public: 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 (); diff --git a/lldb/scripts/interface/SBBreakpoint.i b/lldb/scripts/interface/SBBreakpoint.i index d0b6bb91b422..ee9cdc1a7bb1 100644 --- a/lldb/scripts/interface/SBBreakpoint.i +++ b/lldb/scripts/interface/SBBreakpoint.i @@ -85,6 +85,10 @@ public: ~SBBreakpoint(); + bool operator==(const lldb::SBBreakpoint &rhs); + + bool operator!=(const lldb::SBBreakpoint &rhs); + break_id_t GetID () const; diff --git a/lldb/scripts/interface/SBFileSpec.i b/lldb/scripts/interface/SBFileSpec.i index de3788ddd2de..1d15454b018d 100644 --- a/lldb/scripts/interface/SBFileSpec.i +++ b/lldb/scripts/interface/SBFileSpec.i @@ -42,6 +42,10 @@ public: ~SBFileSpec (); + bool operator==(const SBFileSpec &rhs) const; + + bool operator!=(const SBFileSpec &rhs) const; + bool IsValid() const; diff --git a/lldb/scripts/interface/SBModule.i b/lldb/scripts/interface/SBModule.i index 206324e61982..622052e38d84 100644 --- a/lldb/scripts/interface/SBModule.i +++ b/lldb/scripts/interface/SBModule.i @@ -184,6 +184,10 @@ public: 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); diff --git a/lldb/scripts/interface/SBWatchpoint.i b/lldb/scripts/interface/SBWatchpoint.i index e6de8ef30d76..2dff8d130c6b 100644 --- a/lldb/scripts/interface/SBWatchpoint.i +++ b/lldb/scripts/interface/SBWatchpoint.i @@ -32,6 +32,10 @@ public: explicit operator bool() const; + bool operator==(const SBWatchpoint &rhs) const; + + bool operator!=(const SBWatchpoint &rhs) const; + SBError GetError(); diff --git a/lldb/scripts/lldb.swig b/lldb/scripts/lldb.swig index 1b8889bbbc6f..468da5b6b8e1 100644 --- a/lldb/scripts/lldb.swig +++ b/lldb/scripts/lldb.swig @@ -95,8 +95,7 @@ def lldb_iter(obj, getsize, getelem): # ============================================================================== # 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__. # ============================================================================== %} diff --git a/lldb/source/API/SBAddress.cpp b/lldb/source/API/SBAddress.cpp index ba3deef49637..cdd59fa1feb8 100644 --- a/lldb/source/API/SBAddress.cpp +++ b/lldb/source/API/SBAddress.cpp @@ -69,6 +69,13 @@ bool lldb::operator==(const SBAddress &lhs, const SBAddress &rhs) { 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 @@ void RegisterMethods(Registry &R) { 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, ()); diff --git a/lldb/source/API/SBFileSpec.cpp b/lldb/source/API/SBFileSpec.cpp index 2db008025df1..dd8ed1cc53e6 100644 --- a/lldb/source/API/SBFileSpec.cpp +++ b/lldb/source/API/SBFileSpec.cpp @@ -62,6 +62,20 @@ const SBFileSpec &SBFileSpec::operator=(const SBFileSpec &rhs) { 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 @@ void RegisterMethods(Registry &R) { 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, ()); diff --git a/lldb/source/API/SBWatchpoint.cpp b/lldb/source/API/SBWatchpoint.cpp index ed25d65c779f..de7ba95b1b9f 100644 --- a/lldb/source/API/SBWatchpoint.cpp +++ b/lldb/source/API/SBWatchpoint.cpp @@ -70,6 +70,20 @@ SBWatchpoint::operator bool() const { 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 @@ void RegisterMethods(Registry &R) { 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, ());