Issue #25554: Got rid of circular references in regular expression parsing.

This commit is contained in:
Serhiy Storchaka 2015-11-05 17:49:26 +02:00
parent 60a1d3cd15
commit b5d0a21553
2 changed files with 8 additions and 6 deletions

View file

@ -70,14 +70,14 @@ class Pattern:
def __init__(self): def __init__(self):
self.flags = 0 self.flags = 0
self.groupdict = {} self.groupdict = {}
self.subpatterns = [None] # group 0 self.groupwidths = [None] # group 0
self.lookbehindgroups = None self.lookbehindgroups = None
@property @property
def groups(self): def groups(self):
return len(self.subpatterns) return len(self.groupwidths)
def opengroup(self, name=None): def opengroup(self, name=None):
gid = self.groups gid = self.groups
self.subpatterns.append(None) self.groupwidths.append(None)
if self.groups > MAXGROUPS: if self.groups > MAXGROUPS:
raise error("too many groups") raise error("too many groups")
if name is not None: if name is not None:
@ -88,9 +88,9 @@ class Pattern:
self.groupdict[name] = gid self.groupdict[name] = gid
return gid return gid
def closegroup(self, gid, p): def closegroup(self, gid, p):
self.subpatterns[gid] = p self.groupwidths[gid] = p.getwidth()
def checkgroup(self, gid): def checkgroup(self, gid):
return gid < self.groups and self.subpatterns[gid] is not None return gid < self.groups and self.groupwidths[gid] is not None
def checklookbehindgroup(self, gid, source): def checklookbehindgroup(self, gid, source):
if self.lookbehindgroups is not None: if self.lookbehindgroups is not None:
@ -195,7 +195,7 @@ class SubPattern:
lo = lo + 1 lo = lo + 1
hi = hi + 1 hi = hi + 1
elif op is GROUPREF: elif op is GROUPREF:
i, j = self.pattern.subpatterns[av].getwidth() i, j = self.pattern.groupwidths[av]
lo = lo + i lo = lo + i
hi = hi + j hi = hi + j
elif op is GROUPREF_EXISTS: elif op is GROUPREF_EXISTS:

View file

@ -54,6 +54,8 @@ Core and Builtins
Library Library
------- -------
- Issue #25554: Got rid of circular references in regular expression parsing.
- Issue #25510: fileinput.FileInput.readline() now returns b'' instead of '' - Issue #25510: fileinput.FileInput.readline() now returns b'' instead of ''
at the end if the FileInput was opened with binary mode. at the end if the FileInput was opened with binary mode.
Patch by Ryosuke Ito. Patch by Ryosuke Ito.