mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-28 18:59:04 +08:00
Switch to criterion in sre_engine benchmarks
This commit is contained in:
1 parent
d698b28ce5
commit
331a3c108f
6 files changed
+97
-62
No files matched your search
Generated
+1
@@ -2178,6 +2178,7 @@ name = "rustpython-sre_engine"
|
||||
version = "0.4.0"
|
||||
dependencies = [
|
||||
"bitflags 2.8.0",
|
||||
"criterion",
|
||||
"num_enum",
|
||||
"optional",
|
||||
]
|
||||
|
||||
+2
-1
@@ -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"
|
||||
|
||||
@@ -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 }
|
||||
@@ -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);
|
||||
@@ -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};
|
||||
|
||||
@@ -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
|
||||
}
|
||||
Reference in new issue
Block a user