[Lldb-commits] [lldb] r354975 - Insert blocks of python code with swig instead of modify-python-lldb.py

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Wed Feb 27 06:16:48 PST 2019


Author: labath
Date: Wed Feb 27 06:16:48 2019
New Revision: 354975

URL: http://llvm.org/viewvc/llvm-project?rev=354975&view=rev
Log:
Insert blocks of python code with swig instead of modify-python-lldb.py

Summary:
Swig is perfectly capable of inserting blocks of python code into its
output (and we use those fascilities already), so there's no need for
this to be done in a post-process step.

lldb_iter is a general-purpose utility used from many classes, so I add
it to the main swig file. The other two blocks are tied to a specific
class, so I add it to the interface file of that class.

Reviewers: zturner, jingham, serge-sans-paille

Subscribers: jdoerfert, lldb-commits

Differential Revision: https://reviews.llvm.org/D58350

Modified:
    lldb/trunk/scripts/Python/modify-python-lldb.py
    lldb/trunk/scripts/interface/SBModule.i
    lldb/trunk/scripts/interface/SBValue.i
    lldb/trunk/scripts/lldb.swig

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=354975&r1=354974&r2=354975&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/modify-python-lldb.py (original)
+++ lldb/trunk/scripts/Python/modify-python-lldb.py Wed Feb 27 06:16:48 2019
@@ -75,117 +75,6 @@ one_liner_docstring_pattern = re.compile
     '^(%s|%s)""".*"""$' %
     (TWO_SPACES, EIGHT_SPACES))
 
-#
-# lldb_helpers and lldb_iter() should appear before our first SB* class definition.
-#
-lldb_helpers = '''
-# ==================================
-# Helper function for SBModule class
-# ==================================
-def in_range(symbol, section):
-    """Test whether a symbol is within the range of a section."""
-    symSA = symbol.GetStartAddress().GetFileAddress()
-    symEA = symbol.GetEndAddress().GetFileAddress()
-    secSA = section.GetFileAddress()
-    secEA = secSA + section.GetByteSize()
-
-    if symEA != LLDB_INVALID_ADDRESS:
-        if secSA <= symSA and symEA <= secEA:
-            return True
-        else:
-            return False
-    else:
-        if secSA <= symSA and symSA < secEA:
-            return True
-        else:
-            return False
-'''
-
-lldb_iter_def = '''
-# ===================================
-# Iterator for lldb container objects
-# ===================================
-def lldb_iter(obj, getsize, getelem):
-    """A generator adaptor to support iteration for lldb container objects."""
-    size = getattr(obj, getsize)
-    elem = getattr(obj, getelem)
-    for i in range(size()):
-        yield elem(i)
-
-# ==============================================================================
-# The modify-python-lldb.py script is responsible for post-processing this SWIG-
-# generated lldb.py module.  It is responsible for adding the above lldb_iter()
-# function definition as well as the supports, in the following, for iteration
-# protocol: __iter__, rich comparison methods: __eq__ and __ne__, truth value
-# testing (and built-in operation bool()): __nonzero__, and built-in function
-# len(): __len__.
-# ==============================================================================
-'''
-
-#
-# linked_list_iter() is a special purpose iterator to treat the SBValue as the
-# head of a list data structure, where you specify the child member name which
-# points to the next item on the list and you specify the end-of-list function
-# which takes an SBValue and returns True if EOL is reached and False if not.
-#
-linked_list_iter_def = '''
-    def __eol_test__(val):
-        """Default function for end of list test takes an SBValue object.
-
-        Return True if val is invalid or it corresponds to a null pointer.
-        Otherwise, return False.
-        """
-        if not val or val.GetValueAsUnsigned() == 0:
-            return True
-        else:
-            return False
-
-    # ==================================================
-    # Iterator for lldb.SBValue treated as a linked list
-    # ==================================================
-    def linked_list_iter(self, next_item_name, end_of_list_test=__eol_test__):
-        """Generator adaptor to support iteration for SBValue as a linked list.
-
-        linked_list_iter() is a special purpose iterator to treat the SBValue as
-        the head of a list data structure, where you specify the child member
-        name which points to the next item on the list and you specify the
-        end-of-list test function which takes an SBValue for an item and returns
-        True if EOL is reached and False if not.
-
-        linked_list_iter() also detects infinite loop and bails out early.
-
-        The end_of_list_test arg, if omitted, defaults to the __eol_test__
-        function above.
-
-        For example,
-
-        # Get Frame #0.
-        ...
-
-        # Get variable 'task_head'.
-        task_head = frame0.FindVariable('task_head')
-        ...
-
-        for t in task_head.linked_list_iter('next'):
-            print t
-        """
-        if end_of_list_test(self):
-            return
-        item = self
-        visited = set()
-        try:
-            while not end_of_list_test(item) and not item.GetValueAsUnsigned() in visited:
-                visited.add(item.GetValueAsUnsigned())
-                yield item
-                # Prepare for the next iteration.
-                item = item.GetChildMemberWithName(next_item_name)
-        except:
-            # Exception occurred.  Stop the generator.
-            pass
-
-        return
-'''
-
 # This supports the iteration protocol.
 iter_def = "    def __iter__(self): return lldb_iter(self, '%s', '%s')"
 module_iter = "    def module_iter(self): return lldb_iter(self, '%s', '%s')"
@@ -338,9 +227,6 @@ DEFINING_ITERATOR = 2
 DEFINING_EQUALITY = 4
 CLEANUP_DOCSTRING = 8
 
-# The lldb_iter_def only needs to be inserted once.
-lldb_iter_defined = False
-
 # 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.
@@ -378,13 +264,6 @@ for line in content.splitlines():
 
     if state == NORMAL:
         match = class_pattern.search(line)
-        # Inserts lldb_helpers and the lldb_iter() definition before the first
-        # class definition.
-        if not lldb_iter_defined and match:
-            new_content.add_line(lldb_helpers)
-            new_content.add_line(lldb_iter_def)
-            lldb_iter_defined = True
-
         # 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.
@@ -424,10 +303,6 @@ for line in content.splitlines():
                                      d[cls + '-compile-unit'])
                 new_content.add_line(d[cls + '-symbol-in-section'])
 
-            # This special purpose iterator is for SBValue only!!!
-            if cls == "SBValue":
-                new_content.add_line(linked_list_iter_def)
-
             # Next state will be NORMAL.
             state = NORMAL
 

Modified: lldb/trunk/scripts/interface/SBModule.i
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/interface/SBModule.i?rev=354975&r1=354974&r2=354975&view=diff
==============================================================================
--- lldb/trunk/scripts/interface/SBModule.i (original)
+++ lldb/trunk/scripts/interface/SBModule.i Wed Feb 27 06:16:48 2019
@@ -8,6 +8,29 @@
 
 namespace lldb {
 
+%pythoncode%{
+# ==================================
+# Helper function for SBModule class
+# ==================================
+def in_range(symbol, section):
+    """Test whether a symbol is within the range of a section."""
+    symSA = symbol.GetStartAddress().GetFileAddress()
+    symEA = symbol.GetEndAddress().GetFileAddress()
+    secSA = section.GetFileAddress()
+    secEA = secSA + section.GetByteSize()
+
+    if symEA != LLDB_INVALID_ADDRESS:
+        if secSA <= symSA and symEA <= secEA:
+            return True
+        else:
+            return False
+    else:
+        if secSA <= symSA and symSA < secEA:
+            return True
+        else:
+            return False
+%}
+
 %feature("docstring",
 "Represents an executable image and its associated object and symbol files.
 

Modified: lldb/trunk/scripts/interface/SBValue.i
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/interface/SBValue.i?rev=354975&r1=354974&r2=354975&view=diff
==============================================================================
--- lldb/trunk/scripts/interface/SBValue.i (original)
+++ lldb/trunk/scripts/interface/SBValue.i Wed Feb 27 06:16:48 2019
@@ -601,6 +601,61 @@ public:
             child.SetSyntheticChildrenGenerated(True)
             return child
 
+        def __eol_test(val):
+            """Default function for end of list test takes an SBValue object.
+
+            Return True if val is invalid or it corresponds to a null pointer.
+            Otherwise, return False.
+            """
+            if not val or val.GetValueAsUnsigned() == 0:
+                return True
+            else:
+                return False
+
+        # ==================================================
+        # Iterator for lldb.SBValue treated as a linked list
+        # ==================================================
+        def linked_list_iter(self, next_item_name, end_of_list_test=__eol_test):
+            """Generator adaptor to support iteration for SBValue as a linked list.
+
+            linked_list_iter() is a special purpose iterator to treat the SBValue as
+            the head of a list data structure, where you specify the child member
+            name which points to the next item on the list and you specify the
+            end-of-list test function which takes an SBValue for an item and returns
+            True if EOL is reached and False if not.
+
+            linked_list_iter() also detects infinite loop and bails out early.
+
+            The end_of_list_test arg, if omitted, defaults to the __eol_test
+            function above.
+
+            For example,
+
+            # Get Frame #0.
+            ...
+
+            # Get variable 'task_head'.
+            task_head = frame0.FindVariable('task_head')
+            ...
+
+            for t in task_head.linked_list_iter('next'):
+                print t
+            """
+            if end_of_list_test(self):
+                return
+            item = self
+            visited = set()
+            try:
+                while not end_of_list_test(item) and not item.GetValueAsUnsigned() in visited:
+                    visited.add(item.GetValueAsUnsigned())
+                    yield item
+                    # Prepare for the next iteration.
+                    item = item.GetChildMemberWithName(next_item_name)
+            except:
+                # Exception occurred.  Stop the generator.
+                pass
+
+            return
     %}
 
 };

Modified: lldb/trunk/scripts/lldb.swig
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/lldb.swig?rev=354975&r1=354974&r2=354975&view=diff
==============================================================================
--- lldb/trunk/scripts/lldb.swig (original)
+++ lldb/trunk/scripts/lldb.swig Wed Feb 27 06:16:48 2019
@@ -81,6 +81,26 @@ del _to_int
 %enddef
 EMBED_VERSION(SWIG_VERSION)
 
+%pythoncode%{
+# ===================================
+# Iterator for lldb container objects
+# ===================================
+def lldb_iter(obj, getsize, getelem):
+    """A generator adaptor to support iteration for lldb container objects."""
+    size = getattr(obj, getsize)
+    elem = getattr(obj, getelem)
+    for i in range(size()):
+        yield elem(i)
+
+# ==============================================================================
+# 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__, truth value
+# testing (and built-in operation bool()): __nonzero__, and built-in function
+# len(): __len__.
+# ==============================================================================
+%}
+
 %include "./Python/python-typemaps.swig"
 
 /* C++ headers to be included. */




More information about the lldb-commits mailing list