[Python-checkins] cpython (2.7): Issue #22423: Fixed debugging output of the GROUPREF_EXISTS opcode in the re

serhiy.storchaka python-checkins at python.org
Sun Sep 21 21:52:02 CEST 2014


https://hg.python.org/cpython/rev/c925b436467a
changeset:   92509:c925b436467a
branch:      2.7
parent:      92503:4baa474b4f31
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Sun Sep 21 22:47:30 2014 +0300
summary:
  Issue #22423: Fixed debugging output of the GROUPREF_EXISTS opcode in the re
module.

files:
  Lib/sre_parse.py    |  45 +++++++++++++++++++-------------
  Lib/test/test_re.py |  29 ++++++++++++++++----
  Misc/NEWS           |   3 ++
  3 files changed, 53 insertions(+), 24 deletions(-)


diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py
--- a/Lib/sre_parse.py
+++ b/Lib/sre_parse.py
@@ -94,33 +94,42 @@
         self.data = data
         self.width = None
     def dump(self, level=0):
-        nl = 1
-        seqtypes = type(()), type([])
+        seqtypes = (tuple, list)
         for op, av in self.data:
-            print level*"  " + op,; nl = 0
-            if op == "in":
+            print level*"  " + op,
+            if op == IN:
                 # member sublanguage
-                print; nl = 1
+                print
                 for op, a in av:
                     print (level+1)*"  " + op, a
-            elif op == "branch":
-                print; nl = 1
-                i = 0
-                for a in av[1]:
-                    if i > 0:
+            elif op == BRANCH:
+                print
+                for i, a in enumerate(av[1]):
+                    if i:
                         print level*"  " + "or"
-                    a.dump(level+1); nl = 1
-                    i = i + 1
-            elif type(av) in seqtypes:
+                    a.dump(level+1)
+            elif op == GROUPREF_EXISTS:
+                condgroup, item_yes, item_no = av
+                print condgroup
+                item_yes.dump(level+1)
+                if item_no:
+                    print level*"  " + "else"
+                    item_no.dump(level+1)
+            elif isinstance(av, seqtypes):
+                nl = 0
                 for a in av:
                     if isinstance(a, SubPattern):
-                        if not nl: print
-                        a.dump(level+1); nl = 1
+                        if not nl:
+                            print
+                        a.dump(level+1)
+                        nl = 1
                     else:
-                        print a, ; nl = 0
+                        print a,
+                        nl = 0
+                if not nl:
+                    print
             else:
-                print av, ; nl = 0
-            if not nl: print
+                print av
     def __repr__(self):
         return repr(self.data)
     def __len__(self):
diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py
--- a/Lib/test/test_re.py
+++ b/Lib/test/test_re.py
@@ -930,16 +930,33 @@
                 self.assertEqual(m.group(2), "y")
 
     def test_debug_flag(self):
+        pat = r'(\.)(?:[ch]|py)(?(1)$|: )'
         with captured_stdout() as out:
-            re.compile('foo', re.DEBUG)
-        self.assertEqual(out.getvalue().splitlines(),
-                         ['literal 102', 'literal 111', 'literal 111'])
+            re.compile(pat, re.DEBUG)
+        dump = '''\
+subpattern 1
+  literal 46
+subpattern None
+  branch
+    in
+      literal 99
+      literal 104
+  or
+    literal 112
+    literal 121
+subpattern None
+  groupref_exists 1
+    at at_end
+  else
+    literal 58
+    literal 32
+'''
+        self.assertEqual(out.getvalue(), dump)
         # Debug output is output again even a second time (bypassing
         # the cache -- issue #20426).
         with captured_stdout() as out:
-            re.compile('foo', re.DEBUG)
-        self.assertEqual(out.getvalue().splitlines(),
-                         ['literal 102', 'literal 111', 'literal 111'])
+            re.compile(pat, re.DEBUG)
+        self.assertEqual(out.getvalue(), dump)
 
     def test_keyword_parameters(self):
         # Issue #20283: Accepting the string keyword parameter.
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -22,6 +22,9 @@
 Library
 -------
 
+- Issue #22423: Fixed debugging output of the GROUPREF_EXISTS opcode in the re
+  module.
+
 - Issue #22423: Unhandled exception in thread no longer causes unhandled
   AttributeError when sys.stderr is None.
 

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list