[Lldb-commits] [lldb] r252382 - Python 3 - Use __bool__() instead of __nonzero__() for truthiness.

Zachary Turner via lldb-commits lldb-commits at lists.llvm.org
Fri Nov 6 17:08:26 PST 2015


Author: zturner
Date: Fri Nov  6 19:08:25 2015
New Revision: 252382

URL: http://llvm.org/viewvc/llvm-project?rev=252382&view=rev
Log:
Python 3 - Use __bool__() instead of __nonzero__() for truthiness.

Python has a complicated mechanism of checking an objects truthity.
This involves a number of steps, which end with calling two private
methods on an object (if they are implemented).  In Python 2 these
two methods are `__nonzero__` and `__len__`, and in Python 3 they
are `__bool__` and `__len__`.  Because we *also* define a __len__
method for certain iterable types, this was triggering a situation
in Python 3 where `__nonzero__` wasn't defined, so it was calling
`__len__`, which was returning 0 (for example an SBDebugger with
no targets), and as a result the truthosity was determined to be
False.

We fix this by correctly using ` __bool__` for Python 3, and leave
the behavior under Python 2 unchanged.

Note that this fix is only implemented in the SWIG generation
python script, and not the SWIG generation shell script.  Someone
more familiar than me with shell scripts will need to fix them
to support this for Python 3 if desired.

Added:
    lldb/trunk/scripts/Python/use_lldb_suite.py
    lldb/trunk/scripts/use_lldb_suite.py
Modified:
    lldb/trunk/scripts/CMakeLists.txt
    lldb/trunk/scripts/Python/modify-python-lldb.py

Modified: lldb/trunk/scripts/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/CMakeLists.txt?rev=252382&r1=252381&r2=252382&view=diff
==============================================================================
--- lldb/trunk/scripts/CMakeLists.txt (original)
+++ lldb/trunk/scripts/CMakeLists.txt Fri Nov  6 19:08:25 2015
@@ -15,7 +15,8 @@ add_custom_command(
   DEPENDS ${SWIG_SOURCES}
   DEPENDS ${SWIG_INTERFACES}
   DEPENDS ${SWIG_HEADERS}
-  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/buildSwigWrapperClasses.py
+  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/Python/buildSwigPython.py
+  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/Python/modify-python-lldb.py
   COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/buildSwigWrapperClasses.py "--srcRoot=${LLDB_SOURCE_DIR}" "--targetDir=${CMAKE_CURRENT_BINARY_DIR}" "--cfgBldDir=${CMAKE_CURRENT_BINARY_DIR}" "--prefix=${CMAKE_BINARY_DIR}" "--swigExecutable=${SWIG_EXECUTABLE}" -m
   COMMENT "Python script building LLDB Python wrapper")
 set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/LLDBWrapPython.cpp PROPERTIES GENERATED 1)

Modified: lldb/trunk/scripts/Python/modify-python-lldb.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/modify-python-lldb.py?rev=252382&r1=252381&r2=252382&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/modify-python-lldb.py (original)
+++ lldb/trunk/scripts/Python/modify-python-lldb.py Fri Nov  6 19:08:25 2015
@@ -21,12 +21,21 @@
 # subsystem.
 #
 
+# System modules
 import sys, re
 if sys.version_info.major >= 3:
     import io as StringIO
 else:
     import StringIO
 
+# import use_lldb_suite so we can find third-party and helper modules
+import use_lldb_suite
+
+# Third party modules
+import six
+
+# LLDB modules
+
 if len(sys.argv) != 2:
     output_name = "./lldb.py"
 else:
@@ -190,9 +199,15 @@ eq_def = "    def __eq__(self, other): r
 ne_def = "    def __ne__(self, other): return not self.__eq__(other)"
 
 # Called to implement truth value testing and the built-in operation bool();
+# Note that Python 2 uses __nonzero__(), whereas Python 3 uses __bool__()
 # should return False or True, or their integer equivalents 0 or 1.
 # Delegate to self.IsValid() if it is defined for the current lldb object.
-nonzero_def = "    def __nonzero__(self): return self.IsValid()"
+
+if six.PY2:
+    print("Test")
+    nonzero_def = "    def __nonzero__(self): return self.IsValid()"
+else:
+    nonzero_def = "    def __bool__(self): return self.IsValid()"
 
 # A convenience iterator for SBSymbol!
 symbol_in_section_iter_def = '''

Added: lldb/trunk/scripts/Python/use_lldb_suite.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/use_lldb_suite.py?rev=252382&view=auto
==============================================================================
--- lldb/trunk/scripts/Python/use_lldb_suite.py (added)
+++ lldb/trunk/scripts/Python/use_lldb_suite.py Fri Nov  6 19:08:25 2015
@@ -0,0 +1,22 @@
+import inspect
+import os
+import sys
+
+def find_lldb_root():
+    lldb_root = os.path.dirname(inspect.getfile(inspect.currentframe()))
+    while True:
+        lldb_root = os.path.dirname(lldb_root)
+        if lldb_root is None:
+            return None
+
+        test_path = os.path.join(lldb_root, "lldb.root")
+        if os.path.isfile(test_path):
+            return lldb_root
+    return None
+
+lldb_root = find_lldb_root()
+if lldb_root is not None:
+    import imp
+    module = imp.find_module("use_lldb_suite_root", [lldb_root])
+    if module is not None:
+        imp.load_module("use_lldb_suite_root", *module)

Added: lldb/trunk/scripts/use_lldb_suite.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/use_lldb_suite.py?rev=252382&view=auto
==============================================================================
--- lldb/trunk/scripts/use_lldb_suite.py (added)
+++ lldb/trunk/scripts/use_lldb_suite.py Fri Nov  6 19:08:25 2015
@@ -0,0 +1,22 @@
+import inspect
+import os
+import sys
+
+def find_lldb_root():
+    lldb_root = os.path.dirname(inspect.getfile(inspect.currentframe()))
+    while True:
+        lldb_root = os.path.dirname(lldb_root)
+        if lldb_root is None:
+            return None
+
+        test_path = os.path.join(lldb_root, "lldb.root")
+        if os.path.isfile(test_path):
+            return lldb_root
+    return None
+
+lldb_root = find_lldb_root()
+if lldb_root is not None:
+    import imp
+    module = imp.find_module("use_lldb_suite_root", [lldb_root])
+    if module is not None:
+        imp.load_module("use_lldb_suite_root", *module)




More information about the lldb-commits mailing list