changeset: 92509:c925b436467a branch: 2.7 parent: 92503:4baa474b4f31 user: Serhiy Storchaka date: Sun Sep 21 22:47:30 2014 +0300 files: Lib/sre_parse.py Lib/test/test_re.py Misc/NEWS description: Issue #22423: Fixed debugging output of the GROUPREF_EXISTS opcode in the re module. diff -r 4baa474b4f31 -r c925b436467a Lib/sre_parse.py --- a/Lib/sre_parse.py Sun Sep 21 22:08:00 2014 +0300 +++ b/Lib/sre_parse.py Sun Sep 21 22:47:30 2014 +0300 @@ -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 -r 4baa474b4f31 -r c925b436467a Lib/test/test_re.py --- a/Lib/test/test_re.py Sun Sep 21 22:08:00 2014 +0300 +++ b/Lib/test/test_re.py Sun Sep 21 22:47:30 2014 +0300 @@ -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 -r 4baa474b4f31 -r c925b436467a Misc/NEWS --- a/Misc/NEWS Sun Sep 21 22:08:00 2014 +0300 +++ b/Misc/NEWS Sun Sep 21 22:47:30 2014 +0300 @@ -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.