arch: Use finditer in the (Sub)OperandList classes.
authorGabe Black <gabeblack@google.com>
Wed, 30 Sep 2020 04:11:19 +0000 (21:11 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 13 Oct 2020 04:57:44 +0000 (04:57 +0000)
This method returns an iterator which goes through all the
non-overlapping matches for the given RE, without having to hand code
that same behavior with the more basic "search" method.

Change-Id: I4c4d95cfc8f72125566222aebb56604c3e9e2b03
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/35817
Reviewed-by: Jason Lowe-Power <power.jg@gmail.com>
Maintainer: Jason Lowe-Power <power.jg@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/isa_parser/operand_list.py

index 076b77e5a9f2290ab0940db3535c1602e94d5583..86de5a51f42bf3fe822350759e31b2537efd7c25 100755 (executable)
@@ -49,13 +49,9 @@ class OperandList(object):
         # delete strings and comments so we don't match on operands inside
         for regEx in (stringRE, commentRE):
             code = regEx.sub('', code)
+
         # search for operands
-        next_pos = 0
-        while 1:
-            match = parser.operandsRE().search(code, next_pos)
-            if not match:
-                # no more matches: we're done
-                break
+        for match in parser.operandsRE().finditer(code):
             op = match.groups()
             # regexp groups are operand full name, base, and extension
             (op_full, op_base, op_ext) = op
@@ -103,8 +99,7 @@ class OperandList(object):
                     op_desc.elemExt = elem_op[1]
                     op_desc.active_elems = [elem_op]
                 self.append(op_desc)
-            # start next search after end of current match
-            next_pos = match.end()
+
         self.sort()
         # enumerate source & dest register operands... used in building
         # constructor later
@@ -219,13 +214,9 @@ class SubOperandList(OperandList):
         # delete strings and comments so we don't match on operands inside
         for regEx in (stringRE, commentRE):
             code = regEx.sub('', code)
+
         # search for operands
-        next_pos = 0
-        while 1:
-            match = parser.operandsRE().search(code, next_pos)
-            if not match:
-                # no more matches: we're done
-                break
+        for match in parser.operandsRE().finditer(code):
             op = match.groups()
             # regexp groups are operand full name, base, and extension
             (op_full, op_base, op_ext) = op
@@ -246,8 +237,6 @@ class SubOperandList(OperandList):
                     # if not, add a reference to it to this sub list
                     self.append(requestor_list.bases[op_base])
 
-            # start next search after end of current match
-            next_pos = match.end()
         self.sort()
         self.memOperand = None
         # Whether the whole PC needs to be read so parts of it can be accessed