Switch to criterion in sre_engine benchmarks

This commit is contained in:
Noa authored and Jeong, YunWon committed 2025-02-23 09:44:57 +09:00
1 parent d698b28ce5
commit 331a3c108f
6 files changed
+97 -62

No files matched your search

Generated
+1
View File
@@ -2178,6 +2178,7 @@ name = "rustpython-sre_engine"
version = "0.4.0"
dependencies = [
"bitflags 2.8.0",
"criterion",
"num_enum",
"optional",
]
+2 -1
View File
@@ -47,7 +47,7 @@ libc = { workspace = true }
rustyline = { workspace = true }
[dev-dependencies]
criterion = { version = "0.3.5", features = ["html_reports"] }
criterion = { workspace = true }
pyo3 = { version = "0.22", features = ["auto-initialize"] }
[[bench]]
@@ -144,6 +144,7 @@ bitflags = "2.4.2"
bstr = "1"
cfg-if = "1.0"
chrono = "0.4.39"
criterion = { version = "0.3.5", features = ["html_reports"] }
crossbeam-utils = "0.8.21"
flame = "0.2.2"
getrandom = "0.3"
+7
View File
@@ -10,7 +10,14 @@ rust-version.workspace = true
repository.workspace = true
license.workspace = true
[[bench]]
name = "benches"
harness = false
[dependencies]
num_enum = { workspace = true }
bitflags = { workspace = true }
optional = "0.5"
[dev-dependencies]
criterion = { workspace = true }
+44 -39
View File
@@ -1,11 +1,9 @@
#![feature(test)]
extern crate test;
use test::Bencher;
use rustpython_sre_engine::{Request, State, StrDrive};
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
struct Pattern {
pattern: &'static str,
code: &'static [u32],
}
@@ -25,52 +23,51 @@ impl Pattern {
}
}
#[bench]
fn benchmarks(b: &mut Bencher) {
fn basic(c: &mut Criterion) {
// # test common prefix
// pattern p1 = re.compile('Python|Perl') # , 'Perl'), # Alternation
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p1 = Pattern { code: &[14, 8, 1, 4, 6, 1, 1, 80, 0, 16, 80, 7, 13, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 15, 11, 9, 16, 101, 16, 114, 16, 108, 15, 2, 0, 1] };
#[rustfmt::skip] let p1 = Pattern { pattern: "Python|Perl", code: &[14, 8, 1, 4, 6, 1, 1, 80, 0, 16, 80, 7, 13, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 15, 11, 9, 16, 101, 16, 114, 16, 108, 15, 2, 0, 1] };
// END GENERATED
// pattern p2 = re.compile('(Python|Perl)') #, 'Perl'), # Grouped alternation
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p2 = Pattern { code: &[14, 8, 1, 4, 6, 1, 0, 80, 0, 17, 0, 16, 80, 7, 13, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 15, 11, 9, 16, 101, 16, 114, 16, 108, 15, 2, 0, 17, 1, 1] };
#[rustfmt::skip] let p2 = Pattern { pattern: "(Python|Perl)", code: &[14, 8, 1, 4, 6, 1, 0, 80, 0, 17, 0, 16, 80, 7, 13, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 15, 11, 9, 16, 101, 16, 114, 16, 108, 15, 2, 0, 17, 1, 1] };
// END GENERATED
// pattern p3 = re.compile('Python|Perl|Tcl') #, 'Perl'), # Alternation
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p3 = Pattern { code: &[14, 9, 4, 3, 6, 16, 80, 16, 84, 0, 7, 15, 16, 80, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 15, 22, 11, 16, 80, 16, 101, 16, 114, 16, 108, 15, 11, 9, 16, 84, 16, 99, 16, 108, 15, 2, 0, 1] };
#[rustfmt::skip] let p3 = Pattern { pattern: "Python|Perl|Tcl", code: &[14, 9, 4, 3, 6, 16, 80, 16, 84, 0, 7, 15, 16, 80, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 15, 22, 11, 16, 80, 16, 101, 16, 114, 16, 108, 15, 11, 9, 16, 84, 16, 99, 16, 108, 15, 2, 0, 1] };
// END GENERATED
// pattern p4 = re.compile('(Python|Perl|Tcl)') #, 'Perl'), # Grouped alternation
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p4 = Pattern { code: &[14, 9, 4, 3, 6, 16, 80, 16, 84, 0, 17, 0, 7, 15, 16, 80, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 15, 22, 11, 16, 80, 16, 101, 16, 114, 16, 108, 15, 11, 9, 16, 84, 16, 99, 16, 108, 15, 2, 0, 17, 1, 1] };
#[rustfmt::skip] let p4 = Pattern { pattern: "(Python|Perl|Tcl)", code: &[14, 9, 4, 3, 6, 16, 80, 16, 84, 0, 17, 0, 7, 15, 16, 80, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 15, 22, 11, 16, 80, 16, 101, 16, 114, 16, 108, 15, 11, 9, 16, 84, 16, 99, 16, 108, 15, 2, 0, 17, 1, 1] };
// END GENERATED
// pattern p5 = re.compile('(Python)\\1') #, 'PythonPython'), # Backreference
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p5 = Pattern { code: &[14, 18, 1, 12, 12, 6, 0, 80, 121, 116, 104, 111, 110, 0, 0, 0, 0, 0, 0, 17, 0, 16, 80, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 17, 1, 11, 0, 1] };
#[rustfmt::skip] let p5 = Pattern { pattern: "(Python)\\1", code: &[14, 18, 1, 12, 12, 6, 0, 80, 121, 116, 104, 111, 110, 0, 0, 0, 0, 0, 0, 17, 0, 16, 80, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 17, 1, 11, 0, 1] };
// END GENERATED
// pattern p6 = re.compile('([0a-z][a-z0-9]*,)+') #, 'a5,b7,c9,'), # Disable the fastmap optimization
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p6 = Pattern { code: &[14, 4, 0, 2, 4294967295, 23, 31, 1, 4294967295, 17, 0, 13, 7, 16, 48, 22, 97, 122, 0, 24, 13, 0, 4294967295, 13, 8, 22, 97, 122, 22, 48, 57, 0, 1, 16, 44, 17, 1, 18, 1] };
#[rustfmt::skip] let p6 = Pattern { pattern: "([0a-z][a-z0-9]*,)+", code: &[14, 4, 0, 2, 4294967295, 23, 31, 1, 4294967295, 17, 0, 13, 7, 16, 48, 22, 97, 122, 0, 24, 13, 0, 4294967295, 13, 8, 22, 97, 122, 22, 48, 57, 0, 1, 16, 44, 17, 1, 18, 1] };
// END GENERATED
// pattern p7 = re.compile('([a-z][a-z0-9]*,)+') #, 'a5,b7,c9,'), # A few sets
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p7 = Pattern { code: &[14, 4, 0, 2, 4294967295, 23, 29, 1, 4294967295, 17, 0, 13, 5, 22, 97, 122, 0, 24, 13, 0, 4294967295, 13, 8, 22, 97, 122, 22, 48, 57, 0, 1, 16, 44, 17, 1, 18, 1] };
#[rustfmt::skip] let p7 = Pattern { pattern: "([a-z][a-z0-9]*,)+", code: &[14, 4, 0, 2, 4294967295, 23, 29, 1, 4294967295, 17, 0, 13, 5, 22, 97, 122, 0, 24, 13, 0, 4294967295, 13, 8, 22, 97, 122, 22, 48, 57, 0, 1, 16, 44, 17, 1, 18, 1] };
// END GENERATED
// pattern p8 = re.compile('Python') #, 'Python'), # Simple text literal
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p8 = Pattern { code: &[14, 18, 3, 6, 6, 6, 6, 80, 121, 116, 104, 111, 110, 0, 0, 0, 0, 0, 0, 16, 80, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 1] };
#[rustfmt::skip] let p8 = Pattern { pattern: "Python", code: &[14, 18, 3, 6, 6, 6, 6, 80, 121, 116, 104, 111, 110, 0, 0, 0, 0, 0, 0, 16, 80, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 1] };
// END GENERATED
// pattern p9 = re.compile('.*Python') #, 'Python'), # Bad text literal
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p9 = Pattern { code: &[14, 4, 0, 6, 4294967295, 24, 5, 0, 4294967295, 2, 1, 16, 80, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 1] };
#[rustfmt::skip] let p9 = Pattern { pattern: ".*Python", code: &[14, 4, 0, 6, 4294967295, 24, 5, 0, 4294967295, 2, 1, 16, 80, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 1] };
// END GENERATED
// pattern p10 = re.compile('.*Python.*') #, 'Python'), # Worse text literal
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p10 = Pattern { code: &[14, 4, 0, 6, 4294967295, 24, 5, 0, 4294967295, 2, 1, 16, 80, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 24, 5, 0, 4294967295, 2, 1, 1] };
#[rustfmt::skip] let p10 = Pattern { pattern: ".*Python.*", code: &[14, 4, 0, 6, 4294967295, 24, 5, 0, 4294967295, 2, 1, 16, 80, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 24, 5, 0, 4294967295, 2, 1, 1] };
// END GENERATED
// pattern p11 = re.compile('.*(Python)') #, 'Python'), # Bad text literal with grouping
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p11 = Pattern { code: &[14, 4, 0, 6, 4294967295, 24, 5, 0, 4294967295, 2, 1, 17, 0, 16, 80, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 17, 1, 1] };
#[rustfmt::skip] let p11 = Pattern { pattern: ".*(Python)", code: &[14, 4, 0, 6, 4294967295, 24, 5, 0, 4294967295, 2, 1, 17, 0, 16, 80, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 17, 1, 1] };
// END GENERATED
let tests = [
@@ -87,25 +84,33 @@ fn benchmarks(b: &mut Bencher) {
(p11, "Python"),
];
b.iter(move || {
for (p, s) in &tests {
let (req, mut state) = p.state(s.clone());
assert!(state.search(req));
let (req, mut state) = p.state(s.clone());
assert!(state.pymatch(&req));
let (mut req, mut state) = p.state(s.clone());
req.match_all = true;
assert!(state.pymatch(&req));
let s2 = format!("{}{}{}", " ".repeat(10000), s, " ".repeat(10000));
let (req, mut state) = p.state_range(s2.as_str(), 0..usize::MAX);
assert!(state.search(req));
let (req, mut state) = p.state_range(s2.as_str(), 10000..usize::MAX);
assert!(state.pymatch(&req));
let (req, mut state) = p.state_range(s2.as_str(), 10000..10000 + s.len());
assert!(state.pymatch(&req));
let (mut req, mut state) = p.state_range(s2.as_str(), 10000..10000 + s.len());
req.match_all = true;
assert!(state.pymatch(&req));
}
})
let mut group = c.benchmark_group("basic");
for (p, s) in tests {
group.bench_with_input(BenchmarkId::new(p.pattern, s), s, |b, s| {
b.iter(|| {
let (req, mut state) = p.state(s);
assert!(state.search(req));
let (req, mut state) = p.state(s);
assert!(state.pymatch(&req));
let (mut req, mut state) = p.state(s);
req.match_all = true;
assert!(state.pymatch(&req));
let s2 = format!("{}{}{}", " ".repeat(10000), s, " ".repeat(10000));
let (req, mut state) = p.state_range(s2.as_str(), 0..usize::MAX);
assert!(state.search(req));
let (req, mut state) = p.state_range(s2.as_str(), 10000..usize::MAX);
assert!(state.pymatch(&req));
let (req, mut state) = p.state_range(s2.as_str(), 10000..10000 + s.len());
assert!(state.pymatch(&req));
let (mut req, mut state) = p.state_range(s2.as_str(), 10000..10000 + s.len());
req.match_all = true;
assert!(state.pymatch(&req));
});
});
}
}
criterion_group!(benches, basic);
criterion_main!(benches);
+24 -7
View File
@@ -1,9 +1,6 @@
import os
from pathlib import Path
import re
import sre_constants
import sre_compile
import sre_parse
import json
from itertools import chain
@@ -11,13 +8,13 @@ m = re.search(r"const SRE_MAGIC: usize = (\d+);", open("src/constants.rs").read(
sre_engine_magic = int(m.group(1))
del m
assert sre_constants.MAGIC == sre_engine_magic
assert re._constants.MAGIC == sre_engine_magic
class CompiledPattern:
@classmethod
def compile(cls, pattern, flags=0):
p = sre_parse.parse(pattern)
code = sre_compile._code(p, flags)
p = re._parser.parse(pattern)
code = re._compiler._code(p, flags)
self = cls()
self.pattern = pattern
self.code = code
@@ -28,12 +25,32 @@ for k, v in re.RegexFlag.__members__.items():
setattr(CompiledPattern, k, v)
class EscapeRustStr:
hardcoded = {
ord('\r'): '\\r',
ord('\t'): '\\t',
ord('\r'): '\\r',
ord('\n'): '\\n',
ord('\\'): '\\\\',
ord('\''): '\\\'',
ord('\"'): '\\\"',
}
@classmethod
def __class_getitem__(cls, ch):
if (rpl := cls.hardcoded.get(ch)) is not None:
return rpl
if ch in range(0x20, 0x7f):
return ch
return f"\\u{{{ch:x}}}"
def rust_str(s):
return '"' + s.translate(EscapeRustStr) + '"'
# matches `// pattern {varname} = re.compile(...)`
pattern_pattern = re.compile(r"^((\s*)\/\/\s*pattern\s+(\w+)\s+=\s+(.+?))$(?:.+?END GENERATED)?", re.M | re.S)
def replace_compiled(m):
line, indent, varname, pattern = m.groups()
pattern = eval(pattern, {"re": CompiledPattern})
pattern = f"Pattern {{ code: &{json.dumps(pattern.code)} }}"
pattern = f"Pattern {{ pattern: {rust_str(pattern.pattern)}, code: &{json.dumps(pattern.code)} }}"
return f'''{line}
{indent}// START GENERATED by generate_tests.py
{indent}#[rustfmt::skip] let {varname} = {pattern};
+19 -15
View File
@@ -1,6 +1,7 @@
use rustpython_sre_engine::{Request, State, StrDrive};
struct Pattern {
pattern: &'static str,
code: &'static [u32],
}
@@ -16,7 +17,7 @@ impl Pattern {
fn test_2427() {
// pattern lookbehind = re.compile(r'(?<!\.)x\b')
// START GENERATED by generate_tests.py
#[rustfmt::skip] let lookbehind = Pattern { code: &[14, 4, 0, 1, 1, 5, 5, 1, 16, 46, 1, 16, 120, 6, 10, 1] };
#[rustfmt::skip] let lookbehind = Pattern { pattern: "(?<!\\.)x\\b", code: &[14, 4, 0, 1, 1, 5, 5, 1, 16, 46, 1, 16, 120, 6, 10, 1] };
// END GENERATED
let (req, mut state) = lookbehind.state("x");
assert!(state.pymatch(&req));
@@ -26,7 +27,7 @@ fn test_2427() {
fn test_assert() {
// pattern positive_lookbehind = re.compile(r'(?<=abc)def')
// START GENERATED by generate_tests.py
#[rustfmt::skip] let positive_lookbehind = Pattern { code: &[14, 4, 0, 3, 3, 4, 9, 3, 16, 97, 16, 98, 16, 99, 1, 16, 100, 16, 101, 16, 102, 1] };
#[rustfmt::skip] let positive_lookbehind = Pattern { pattern: "(?<=abc)def", code: &[14, 4, 0, 3, 3, 4, 9, 3, 16, 97, 16, 98, 16, 99, 1, 16, 100, 16, 101, 16, 102, 1] };
// END GENERATED
let (req, mut state) = positive_lookbehind.state("abcdef");
assert!(state.search(req));
@@ -36,7 +37,7 @@ fn test_assert() {
fn test_string_boundaries() {
// pattern big_b = re.compile(r'\B')
// START GENERATED by generate_tests.py
#[rustfmt::skip] let big_b = Pattern { code: &[14, 4, 0, 0, 0, 6, 11, 1] };
#[rustfmt::skip] let big_b = Pattern { pattern: "\\B", code: &[14, 4, 0, 0, 0, 6, 11, 1] };
// END GENERATED
let (req, mut state) = big_b.state("");
assert!(!state.search(req));
@@ -46,7 +47,7 @@ fn test_string_boundaries() {
fn test_zerowidth() {
// pattern p = re.compile(r'\b|:+')
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p = Pattern { code: &[14, 4, 0, 0, 4294967295, 7, 5, 6, 10, 15, 12, 10, 24, 6, 1, 4294967295, 16, 58, 1, 15, 2, 0, 1] };
#[rustfmt::skip] let p = Pattern { pattern: "\\b|:+", code: &[14, 4, 0, 0, 4294967295, 7, 5, 6, 10, 15, 12, 10, 24, 6, 1, 4294967295, 16, 58, 1, 15, 2, 0, 1] };
// END GENERATED
let (mut req, mut state) = p.state("a:");
req.must_advance = true;
@@ -59,7 +60,7 @@ fn test_repeat_context_panic() {
use optional::Optioned;
// pattern p = re.compile(r'(?:a*?(xx)??z)*')
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p = Pattern { code: &[14, 4, 0, 0, 4294967295, 23, 25, 0, 4294967295, 26, 6, 0, 4294967295, 16, 97, 1, 23, 11, 0, 1, 17, 0, 16, 120, 16, 120, 17, 1, 19, 16, 122, 18, 1] };
#[rustfmt::skip] let p = Pattern { pattern: "(?:a*?(xx)??z)*", code: &[14, 4, 0, 0, 4294967295, 23, 25, 0, 4294967295, 26, 6, 0, 4294967295, 16, 97, 1, 23, 11, 0, 1, 17, 0, 16, 120, 16, 120, 17, 1, 19, 16, 122, 18, 1] };
// END GENERATED
let (req, mut state) = p.state("axxzaz");
assert!(state.pymatch(&req));
@@ -73,7 +74,7 @@ fn test_repeat_context_panic() {
fn test_double_max_until() {
// pattern p = re.compile(r'((1)?)*')
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p = Pattern { code: &[14, 4, 0, 0, 4294967295, 23, 18, 0, 4294967295, 17, 0, 23, 9, 0, 1, 17, 2, 16, 49, 17, 3, 18, 17, 1, 18, 1] };
#[rustfmt::skip] let p = Pattern { pattern: "((1)?)*", code: &[14, 4, 0, 0, 4294967295, 23, 18, 0, 4294967295, 17, 0, 23, 9, 0, 1, 17, 2, 16, 49, 17, 3, 18, 17, 1, 18, 1] };
// END GENERATED
let (req, mut state) = p.state("1111");
assert!(state.pymatch(&req));
@@ -84,7 +85,7 @@ fn test_double_max_until() {
fn test_info_single() {
// pattern p = re.compile(r'aa*')
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p = Pattern { code: &[14, 8, 1, 1, 4294967295, 1, 1, 97, 0, 16, 97, 24, 6, 0, 4294967295, 16, 97, 1, 1] };
#[rustfmt::skip] let p = Pattern { pattern: "aa*", code: &[14, 8, 1, 1, 4294967295, 1, 1, 97, 0, 16, 97, 24, 6, 0, 4294967295, 16, 97, 1, 1] };
// END GENERATED
let (req, mut state) = p.state("baaaa");
assert!(state.search(req));
@@ -96,7 +97,7 @@ fn test_info_single() {
fn test_info_single2() {
// pattern p = re.compile(r'Python|Perl')
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p = Pattern { code: &[14, 8, 1, 4, 6, 1, 1, 80, 0, 16, 80, 7, 13, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 15, 11, 9, 16, 101, 16, 114, 16, 108, 15, 2, 0, 1] };
#[rustfmt::skip] let p = Pattern { pattern: "Python|Perl", code: &[14, 8, 1, 4, 6, 1, 1, 80, 0, 16, 80, 7, 13, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 15, 11, 9, 16, 101, 16, 114, 16, 108, 15, 2, 0, 1] };
// END GENERATED
let (req, mut state) = p.state("Perl");
assert!(state.search(req));
@@ -106,7 +107,7 @@ fn test_info_single2() {
fn test_info_literal() {
// pattern p = re.compile(r'ababc+')
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p = Pattern { code: &[14, 14, 1, 5, 4294967295, 4, 4, 97, 98, 97, 98, 0, 0, 1, 2, 16, 97, 16, 98, 16, 97, 16, 98, 24, 6, 1, 4294967295, 16, 99, 1, 1] };
#[rustfmt::skip] let p = Pattern { pattern: "ababc+", code: &[14, 14, 1, 5, 4294967295, 4, 4, 97, 98, 97, 98, 0, 0, 1, 2, 16, 97, 16, 98, 16, 97, 16, 98, 24, 6, 1, 4294967295, 16, 99, 1, 1] };
// END GENERATED
let (req, mut state) = p.state("!ababc");
assert!(state.search(req));
@@ -116,7 +117,7 @@ fn test_info_literal() {
fn test_info_literal2() {
// pattern p = re.compile(r'(python)\1')
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p = Pattern { code: &[14, 18, 1, 12, 12, 6, 0, 112, 121, 116, 104, 111, 110, 0, 0, 0, 0, 0, 0, 17, 0, 16, 112, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 17, 1, 11, 0, 1] };
#[rustfmt::skip] let p = Pattern { pattern: "(python)\\1", code: &[14, 18, 1, 12, 12, 6, 0, 112, 121, 116, 104, 111, 110, 0, 0, 0, 0, 0, 0, 17, 0, 16, 112, 16, 121, 16, 116, 16, 104, 16, 111, 16, 110, 17, 1, 11, 0, 1] };
// END GENERATED
let (req, mut state) = p.state("pythonpython");
assert!(state.search(req));
@@ -126,7 +127,7 @@ fn test_info_literal2() {
fn test_repeat_in_assertions() {
// pattern p = re.compile('^([ab]*?)(?=(b)?)c', re.IGNORECASE)
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p = Pattern { code: &[14, 4, 0, 1, 4294967295, 6, 0, 17, 0, 26, 10, 0, 4294967295, 39, 5, 22, 97, 98, 0, 1, 17, 1, 4, 14, 0, 23, 9, 0, 1, 17, 2, 40, 98, 17, 3, 18, 1, 40, 99, 1] };
#[rustfmt::skip] let p = Pattern { pattern: "^([ab]*?)(?=(b)?)c", code: &[14, 4, 0, 1, 4294967295, 6, 0, 17, 0, 26, 10, 0, 4294967295, 39, 5, 22, 97, 98, 0, 1, 17, 1, 4, 14, 0, 23, 9, 0, 1, 17, 2, 40, 98, 17, 3, 18, 1, 40, 99, 1] };
// END GENERATED
let (req, mut state) = p.state("abc");
assert!(state.search(req));
@@ -136,7 +137,7 @@ fn test_repeat_in_assertions() {
fn test_possessive_quantifier() {
// pattern p = re.compile('e++a')
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p = Pattern { code: &[14, 4, 0, 2, 4294967295, 29, 6, 1, 4294967295, 16, 101, 1, 16, 97, 1] };
#[rustfmt::skip] let p = Pattern { pattern: "e++a", code: &[14, 4, 0, 2, 4294967295, 29, 6, 1, 4294967295, 16, 101, 1, 16, 97, 1] };
// END GENERATED
let (req, mut state) = p.state("eeea");
assert!(state.pymatch(&req));
@@ -146,7 +147,7 @@ fn test_possessive_quantifier() {
fn test_possessive_atomic_group() {
// pattern p = re.compile('(?>x)++x')
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p = Pattern { code: &[14, 4, 0, 2, 4294967295, 28, 8, 1, 4294967295, 27, 4, 16, 120, 1, 1, 16, 120, 1] };
#[rustfmt::skip] let p = Pattern { pattern: "(?>x)++x", code: &[14, 4, 0, 2, 4294967295, 28, 8, 1, 4294967295, 27, 4, 16, 120, 1, 1, 16, 120, 1] };
// END GENERATED
let (req, mut state) = p.state("xxx");
assert!(!state.pymatch(&req));
@@ -156,7 +157,7 @@ fn test_possessive_atomic_group() {
fn test_bug_20998() {
// pattern p = re.compile('[a-c]+', re.I)
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p = Pattern { code: &[14, 4, 0, 1, 4294967295, 24, 10, 1, 4294967295, 39, 5, 22, 97, 99, 0, 1, 1] };
#[rustfmt::skip] let p = Pattern { pattern: "[a-c]+", code: &[14, 4, 0, 1, 4294967295, 24, 10, 1, 4294967295, 39, 5, 22, 97, 99, 0, 1, 1] };
// END GENERATED
let (mut req, mut state) = p.state("ABC");
req.match_all = true;
@@ -168,7 +169,7 @@ fn test_bug_20998() {
fn test_bigcharset() {
// pattern p = re.compile('[a-z]*', re.I)
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p = Pattern { code: &[14, 4, 0, 0, 4294967295, 24, 97, 0, 4294967295, 39, 92, 10, 3, 33685760, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 0, 0, 0, 134217726, 0, 0, 0, 0, 0, 131072, 0, 2147483648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1] };
#[rustfmt::skip] let p = Pattern { pattern: "[a-z]*", code: &[14, 4, 0, 0, 4294967295, 24, 97, 0, 4294967295, 39, 92, 10, 3, 33685760, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 33686018, 0, 0, 0, 134217726, 0, 0, 0, 0, 0, 131072, 0, 2147483648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1] };
// END GENERATED
let (req, mut state) = p.state("x ");
assert!(state.pymatch(&req));
@@ -178,4 +179,7 @@ fn test_bigcharset() {
#[test]
fn test_search_nonascii() {
// pattern p = re.compile('\xe0+')
// START GENERATED by generate_tests.py
#[rustfmt::skip] let p = Pattern { pattern: "\u{e0}+", code: &[14, 4, 0, 1, 4294967295, 24, 6, 1, 4294967295, 16, 224, 1, 1] };
// END GENERATED
}