From 397a654791e6bc8b108945e45e7d1393cc6f32d4 Mon Sep 17 00:00:00 2001 From: Fredrik Lundh Date: Thu, 18 Oct 2001 19:30:16 +0000 Subject: SRE bug #441409: compile should raise error for non-strings SRE bug #432570, 448951: reset group after failed match also bumped version number to 2.2.0 --- Lib/sre.py | 10 +++++++--- Lib/test/test_sre.py | 6 ++++++ Modules/_sre.c | 4 +++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Lib/sre.py b/Lib/sre.py index 7a640f9..70d0148 100644 --- a/Lib/sre.py +++ b/Lib/sre.py @@ -104,7 +104,7 @@ __all__ = [ "match", "search", "sub", "subn", "split", "findall", "U", "IGNORECASE", "LOCALE", "MULTILINE", "DOTALL", "VERBOSE", "UNICODE", "error" ] -__version__ = "2.1.1" +__version__ = "2.2.0" # this module works under 1.5.2 and later. don't use string methods import string @@ -197,6 +197,8 @@ def escape(pattern): _cache = {} _cache_repl = {} +_pattern_type = type(sre_compile.compile("", 0)) + _MAXCACHE = 100 def _join(seq, sep): @@ -209,8 +211,10 @@ def _compile(*key): if p is not None: return p pattern, flags = key - if type(pattern) not in sre_compile.STRING_TYPES: + if type(pattern) is _pattern_type: return pattern + if type(pattern) not in sre_compile.STRING_TYPES: + raise TypeError, "first argument must be string or compiled pattern" try: p = sre_compile.compile(pattern, flags) except error, v: @@ -312,7 +316,7 @@ import copy_reg def _pickle(p): return _compile, (p.pattern, p.flags) -copy_reg.pickle(type(_compile("", 0)), _pickle, _compile) +copy_reg.pickle(_pattern_type, _pickle, _compile) # -------------------------------------------------------------------- # experimental stuff (see python-dev discussions for details) diff --git a/Lib/test/test_sre.py b/Lib/test/test_sre.py index 4a71447..12a66f9 100644 --- a/Lib/test/test_sre.py +++ b/Lib/test/test_sre.py @@ -204,6 +204,12 @@ test(r"""pat.match('a').group(1, 2, 3)""", ('a', None, None)) test(r"""pat.match('b').group('a1', 'b2', 'c3')""", (None, 'b', None)) test(r"""pat.match('ac').group(1, 'b2', 3)""", ('a', None, 'c')) +# bug 448951 (similar to 429357, but with single char match) +# (Also test greedy matches.) +for op in '','?','*': + test(r"""sre.match(r'((.%s):)?z', 'z').groups()"""%op, (None, None)) + test(r"""sre.match(r'((.%s):)?z', 'a:z').groups()"""%op, ('a:', 'a')) + if verbose: print "Running tests on sre.escape" diff --git a/Modules/_sre.c b/Modules/_sre.c index 32cd48b..537dc29 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -32,6 +32,7 @@ * 2001-05-14 fl fixes for 1.5.2 * 2001-07-01 fl added BIGCHARSET support (from Martin von Loewis) * 2001-09-18 fl added _getliteral helper + * 2001-10-18 fl fixed group reset issue (from Matthew Mueller) * * Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved. * @@ -47,7 +48,7 @@ #ifndef SRE_RECURSIVE static char copyright[] = - " SRE 2.1.1 Copyright (c) 1997-2001 by Secret Labs AB "; + " SRE 2.2.0 Copyright (c) 1997-2001 by Secret Labs AB "; #include "Python.h" #include "structmember.h" /* offsetof */ @@ -1061,6 +1062,7 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level) if (i) return i; i = mark_restore(state, 0, lastmark); + state->lastmark = lastmark; if (i < 0) return i; rp->count = count - 1; -- cgit v0.12