Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r86696:0262db87059d Date: 2016-08-29 16:13 +0200 http://bitbucket.org/pypy/pypy/changeset/0262db87059d/
Log: test and fix diff --git a/rpython/rlib/rsre/rsre_char.py b/rpython/rlib/rsre/rsre_char.py --- a/rpython/rlib/rsre/rsre_char.py +++ b/rpython/rlib/rsre/rsre_char.py @@ -52,7 +52,6 @@ SRE_INFO_CHARSET = 4 SRE_FLAG_LOCALE = 4 # honour system locale SRE_FLAG_UNICODE = 32 # use unicode locale -SRE_FLAG_FULLMATCH = 0x4000 # PyPy extension, for CPython >= 3.4 def getlower(char_ord, flags): diff --git a/rpython/rlib/rsre/rsre_core.py b/rpython/rlib/rsre/rsre_core.py --- a/rpython/rlib/rsre/rsre_core.py +++ b/rpython/rlib/rsre/rsre_core.py @@ -89,6 +89,7 @@ match_end = 0 match_marks = None match_marks_flat = None + fullmatch_only = False def __init__(self, pattern, match_start, end, flags): # 'match_start' and 'end' must be known to be non-negative @@ -527,7 +528,7 @@ return elif op == OPCODE_SUCCESS: - if ctx.flags & rsre_char.SRE_FLAG_FULLMATCH: + if ctx.fullmatch_only: if ptr != ctx.end: return # not a full match ctx.match_end = ptr @@ -558,7 +559,11 @@ # assert subpattern # <ASSERT> <0=skip> <1=back> <pattern> ptr1 = ptr - ctx.pat(ppos+1) - if ptr1 < 0 or sre_match(ctx, ppos + 2, ptr1, marks) is None: + saved = ctx.fullmatch_only + ctx.fullmatch_only = False + stop = ptr1 < 0 or sre_match(ctx, ppos + 2, ptr1, marks) is None + ctx.fullmatch_only = saved + if stop: return marks = ctx.match_marks ppos += ctx.pat(ppos) @@ -567,7 +572,12 @@ # assert not subpattern # <ASSERT_NOT> <0=skip> <1=back> <pattern> ptr1 = ptr - ctx.pat(ppos+1) - if ptr1 >= 0 and sre_match(ctx, ppos + 2, ptr1, marks) is not None: + saved = ctx.fullmatch_only + ctx.fullmatch_only = False + stop = (ptr1 >= 0 and sre_match(ctx, ppos + 2, ptr1, marks) + is not None) + ctx.fullmatch_only = saved + if stop: return ppos += ctx.pat(ppos) @@ -1006,17 +1016,17 @@ elif end > length: end = length return start, end -def match(pattern, string, start=0, end=sys.maxint, flags=0): +def match(pattern, string, start=0, end=sys.maxint, flags=0, fullmatch=False): start, end = _adjust(start, end, len(string)) ctx = StrMatchContext(pattern, string, start, end, flags) + ctx.fullmatch_only = fullmatch if match_context(ctx): return ctx else: return None def fullmatch(pattern, string, start=0, end=sys.maxint, flags=0): - return match(pattern, string, start, end, - flags | rsre_char.SRE_FLAG_FULLMATCH) + return match(pattern, string, start, end, flags, fullmatch=True) def search(pattern, string, start=0, end=sys.maxint, flags=0): start, end = _adjust(start, end, len(string)) diff --git a/rpython/rlib/rsre/test/test_match.py b/rpython/rlib/rsre/test/test_match.py --- a/rpython/rlib/rsre/test/test_match.py +++ b/rpython/rlib/rsre/test/test_match.py @@ -293,3 +293,9 @@ r = get_code(r"a((bp)*)c") match = rsre_core.fullmatch(r, "abpbpbpc") assert match.group(1) == "bpbpbp" + + def test_fullmatch_assertion(self): + r = get_code(r"(?=a).b") + assert rsre_core.fullmatch(r, "ab") + r = get_code(r"(?!a)..") + assert not rsre_core.fullmatch(r, "ab") _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit