[pypy-svn] r75992 - pypy/branch/rsre2/pypy/rlib/rsre
arigo at codespeak.net
arigo at codespeak.net
Wed Jul 7 18:30:35 CEST 2010
Author: arigo
Date: Wed Jul 7 18:30:33 2010
New Revision: 75992
Modified:
pypy/branch/rsre2/pypy/rlib/rsre/rsre.py
Log:
Change the return value of find_first_result() & co,
allowing the calls from sre_match() to be tail calls.
Modified: pypy/branch/rsre2/pypy/rlib/rsre/rsre.py
==============================================================================
--- pypy/branch/rsre2/pypy/rlib/rsre/rsre.py (original)
+++ pypy/branch/rsre2/pypy/rlib/rsre/rsre.py Wed Jul 7 18:30:33 2010
@@ -136,9 +136,9 @@
def move_to_next_result(self, ctx):
result = self.subresult
if result is None:
- return False
+ return
if result.move_to_next_result(ctx):
- return True
+ return result
return self.find_next_result(ctx)
def find_next_result(self, ctx):
@@ -161,8 +161,7 @@
if result is not None:
self.subresult = result
self.ppos = ppos
- return True
- return False
+ return self
find_next_result = find_first_result
class RepeatOneMatchResult(MatchResult):
@@ -181,8 +180,7 @@
if result is not None:
self.subresult = result
self.start_ptr = ptr
- return True
- return False
+ return self
find_next_result = find_first_result
@@ -202,18 +200,17 @@
if result is not None:
self.subresult = result
self.start_ptr = ptr
- return True
+ return self
ptr1 = find_repetition_end(ctx, self.ppos3, ptr, 1)
if ptr1 == ptr:
break
ptr = ptr1
- return False
def find_next_result(self, ctx):
ptr = self.start_ptr
ptr1 = find_repetition_end(ctx, self.ppos3, ptr, 1)
if ptr1 == ptr:
- return False
+ return
self.start_ptr = ptr1
return self.find_first_result(ctx)
@@ -258,13 +255,12 @@
self.subresult = result
self.cur_ptr = ptr
self.cur_marks = marks
- return True
+ return self
resume = False
if len(self.pending) == 0:
- return False
+ return
ptr, marks, enum = self.pending.pop()
- if not enum.move_to_next_result(ctx):
- enum = None
+ enum = enum.move_to_next_result(ctx)
#
if max == 65535 or len(self.pending) < max:
# try to match one more 'item'
@@ -294,7 +290,7 @@
self.subresult = result
self.cur_ptr = ptr
self.cur_marks = marks
- return True
+ return self
resume = False
if max == 65535 or len(self.pending) < max:
@@ -313,10 +309,9 @@
else:
# 'item' no longer matches.
if len(self.pending) == 0:
- return False
+ return
ptr, marks, enum = self.pending.pop()
- if not enum.move_to_next_result(ctx):
- enum = None
+ enum = enum.move_to_next_result(ctx)
continue
break
@@ -383,9 +378,7 @@
# alternation
# <BRANCH> <0=skip> code <JUMP> ... <NULL>
result = BranchMatchResult(ppos, ptr, marks)
- if not result.find_first_result(ctx):
- result = None
- return result
+ return result.find_first_result(ctx)
#elif op == OPCODE_CATEGORY:
# seems to be never produced
@@ -508,17 +501,13 @@
# remembering each state for each possible number of
# 'item' matching.
result = MaxUntilMatchResult(ppos, tailppos, ptr, marks)
- if not result.find_first_result(ctx):
- result = None
- return result
+ return result.find_first_result(ctx)
elif op == OPCODE_MIN_UNTIL:
# first try to match the 'tail', and if it fails, try
# to match one more 'item' and try again
result = MinUntilMatchResult(ppos, tailppos, ptr, marks)
- if not result.find_first_result(ctx):
- result = None
- return result
+ return result.find_first_result(ctx)
else:
raise AssertionError("missing UNTIL after REPEAT")
@@ -540,9 +529,7 @@
# and backtrack if not.
nextppos = ppos + ctx.pat(ppos)
result = RepeatOneMatchResult(nextppos, minptr, ptr, marks)
- if not result.find_first_result(ctx):
- result = None
- return result
+ return result.find_first_result(ctx)
elif op == OPCODE_MIN_REPEAT_ONE:
# match repeated sequence (minimizing regexp).
@@ -571,9 +558,7 @@
nextppos = ppos + ctx.pat(ppos)
result = MinRepeatOneMatchResult(nextppos, ppos+3, maxptr,
ptr, marks)
- if not result.find_first_result(ctx):
- result = None
- return result
+ return result.find_first_result(ctx)
else:
assert 0, "bad pattern code %d" % op
More information about the Pypy-commit
mailing list