From: Benjamin Peterson Date: Sun, 30 Nov 2014 16:51:16 +0000 (-0500) Subject: merge 3.4 (#9179) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=16e802f4aed9db71a2e25fa25daa8fed0fc2e539;p=python merge 3.4 (#9179) --- 16e802f4aed9db71a2e25fa25daa8fed0fc2e539 diff --cc Lib/sre_parse.py index 45411f89f1,b56d437c34..8d9a09a860 --- a/Lib/sre_parse.py +++ b/Lib/sre_parse.py @@@ -68,27 -66,24 +68,26 @@@ class Pattern # master pattern object. keeps track of global attributes def __init__(self): self.flags = 0 + self.open = [] + self.groups = 1 self.groupdict = {} - self.subpatterns = [None] # group 0 - @property - def groups(self): - return len(self.subpatterns) def opengroup(self, name=None): gid = self.groups - self.subpatterns.append(None) + self.groups = gid + 1 + if self.groups > MAXGROUPS: + raise error("groups number is too large") if name is not None: ogid = self.groupdict.get(name, None) if ogid is not None: - raise error("redefinition of group name %s as group %d; " - "was group %d" % (repr(name), gid, ogid)) + raise error("redefinition of group name %r as group %d; " + "was group %d" % (name, gid, ogid)) self.groupdict[name] = gid + self.open.append(gid) return gid - def closegroup(self, gid, p): - self.subpatterns[gid] = p + def closegroup(self, gid): + self.open.remove(gid) def checkgroup(self, gid): - return gid < self.groups and self.subpatterns[gid] is not None + return gid < self.groups and gid not in self.open class SubPattern: # a subpattern, in intermediate form @@@ -181,24 -178,10 +180,10 @@@ i, j = av[2].getwidth() lo = lo + i * av[0] hi = hi + j * av[1] - elif op in UNITCODES: + elif op in _UNITCODES: lo = lo + 1 hi = hi + 1 - elif op is GROUPREF: - i, j = self.pattern.subpatterns[av].getwidth() - lo = lo + i - hi = hi + j - elif op is GROUPREF_EXISTS: - i, j = av[1].getwidth() - if av[2] is not None: - l, h = av[2].getwidth() - i = min(i, l) - j = max(j, h) - else: - i = 0 - lo = lo + i - hi = hi + j - elif op is SUCCESS: + elif op == SUCCESS: break self.width = min(lo, MAXREPEAT - 1), min(hi, MAXREPEAT) return self.width @@@ -739,18 -707,18 +724,18 @@@ def _parse(source, state) else: p = _parse_sub(source, state) if not sourcematch(")"): - raise error("unbalanced parenthesis") + raise source.error("unbalanced parenthesis") if group is not None: - state.closegroup(group, p) + state.closegroup(group) subpatternappend((SUBPATTERN, (group, p))) else: - while 1: + while True: char = sourceget() if char is None: - raise error("unexpected end of pattern") + raise source.error("unexpected end of pattern") if char == ")": break - raise error("unknown extension") + raise source.error("unknown extension", len(char)) elif this == "^": subpatternappend((AT, AT_BEGINNING)) diff --cc Misc/NEWS index 21769d8330,6916ca3f53..7e568c6503 --- a/Misc/NEWS +++ b/Misc/NEWS @@@ -238,17 -68,6 +238,14 @@@ Librar - Issue #22821: Fixed fcntl() with integer argument on 64-bit big-endian platforms. +- Issue #21650: Add an `--sort-keys` option to json.tool CLI. + - - Issues #814253, #9179: Group references and conditional group references now - work in lookbehind assertions in regular expressions. - +- Issue #22824: Updated reprlib output format for sets to use set literals. + Patch contributed by Berker Peksag. + +- Issue #22824: Updated reprlib output format for arrays to display empty + arrays without an unnecessary empty list. Suggested by Serhiy Storchaka. + - Issue #22406: Fixed the uu_codec codec incorrectly ported to 3.x. Based on patch by Martin Panter.