summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2015-11-07 01:08:25 +0000
committerZachary Turner <zturner@google.com>2015-11-07 01:08:25 +0000
commitc22811bbcc02e833a315274f2158add4217f8ca1 (patch)
tree48eb68ac60d67c013ec3a01f385a28066ec6e952
parent8d13fab183bc6ce0793a1c039448a738709f00ae (diff)
downloadbcm5719-llvm-c22811bbcc02e833a315274f2158add4217f8ca1.tar.gz
bcm5719-llvm-c22811bbcc02e833a315274f2158add4217f8ca1.zip
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. llvm-svn: 252382
-rw-r--r--lldb/scripts/CMakeLists.txt3
-rw-r--r--lldb/scripts/Python/modify-python-lldb.py17
-rw-r--r--lldb/scripts/Python/use_lldb_suite.py22
-rw-r--r--lldb/scripts/use_lldb_suite.py22
4 files changed, 62 insertions, 2 deletions
diff --git a/lldb/scripts/CMakeLists.txt b/lldb/scripts/CMakeLists.txt
index a393517824f..71c8d1cc059 100644
--- a/lldb/scripts/CMakeLists.txt
+++ b/lldb/scripts/CMakeLists.txt
@@ -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)
diff --git a/lldb/scripts/Python/modify-python-lldb.py b/lldb/scripts/Python/modify-python-lldb.py
index 7b9c26c6d80..9912cd72528 100644
--- a/lldb/scripts/Python/modify-python-lldb.py
+++ b/lldb/scripts/Python/modify-python-lldb.py
@@ -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): return isinstance(other, %s) and %s"
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 = '''
diff --git a/lldb/scripts/Python/use_lldb_suite.py b/lldb/scripts/Python/use_lldb_suite.py
new file mode 100644
index 00000000000..3dbcbb91700
--- /dev/null
+++ b/lldb/scripts/Python/use_lldb_suite.py
@@ -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)
diff --git a/lldb/scripts/use_lldb_suite.py b/lldb/scripts/use_lldb_suite.py
new file mode 100644
index 00000000000..3dbcbb91700
--- /dev/null
+++ b/lldb/scripts/use_lldb_suite.py
@@ -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)
OpenPOWER on IntegriCloud