Skip to content

Commit d8d362e

Browse files
Josverldpgeorge
authored andcommitted
unix-ffi/re: Handle PCRE2_UNSET in group and groups methods.
Adjust the re.groups() methods to properly handle the PCRE2_UNSET value for unmatched optional groups. This change prevents OverflowError when calling groups() on a match with no content. The return matches CPython's. Fixes: micropython/micropython#18877 Signed-off-by: Jos Verlinde <jos_verlinde@hotmail.com>
1 parent 017f862 commit d8d362e

File tree

2 files changed

+8
-5
lines changed

2 files changed

+8
-5
lines changed

unix-ffi/re/manifest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
metadata(version="0.2.5")
1+
metadata(version="0.2.6")
22

33
# Originally written by Paul Sokolovsky.
44

unix-ffi/re/re.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@
3838
# to -1
3939
PCRE2_ZERO_TERMINATED = -1
4040

41+
# PCRE2_UNSET is used for offsets of groups that didn't participate in a match
42+
# It's SIZE_MAX: 0xFFFFFFFF for 32bit, 0xFFFFFFFFFFFFFFFF for 64bit
43+
PCRE2_UNSET = (1 << (PCRE2_SIZE_SIZE * 8)) - 1
44+
4145

4246
IGNORECASE = I = 0x8
4347
MULTILINE = M = 0x400
@@ -62,12 +66,11 @@ def group(self, *n):
6266
if not n:
6367
return self.s[self.offsets[0] : self.offsets[1]]
6468
if len(n) == 1:
65-
return self.s[self.offsets[n[0] * 2] : self.offsets[n[0] * 2 + 1]]
66-
return tuple(self.s[self.offsets[i * 2] : self.offsets[i * 2 + 1]] for i in n)
69+
return None if self.offsets[n[0] * 2] == PCRE2_UNSET else self.s[self.offsets[n[0] * 2] : self.offsets[n[0] * 2 + 1]]
70+
return tuple(None if self.offsets[i * 2] == PCRE2_UNSET else self.s[self.offsets[i * 2] : self.offsets[i * 2 + 1]] for i in n)
6771

6872
def groups(self, default=None):
69-
assert default is None
70-
return tuple(self.group(i + 1) for i in range(self.num - 1))
73+
return tuple(default if self.offsets[(i + 1) * 2] == PCRE2_UNSET else self.group(i + 1) for i in range(self.num - 1))
7174

7275
def start(self, n=0):
7376
return self.offsets[n * 2]

0 commit comments

Comments
 (0)