deps: vendor regress 字节字面量优化 gate 改逐编译运行时标志 + 惰性物化单元向 IR——utf16 feature 编译期全局 gate 原会关掉全部 regex 的字节 pass 与执行器起始谓词快路径,启用即劣化全部 str 路径;现字节 pass 由 byte_literals 编译参数控制(str IR 传 true 与旧行为逐位一致、单元 IR 传 false),执行器起始谓词分派按输入编码切换(字节输入保留锚定/字节定位快路径、单元输入逐位尝试),单元向 IR 首次 find_from_utf16/find_from_ucs2 时重解析编译并缓存(正则留存源码码点序列),no_opt 标志同路径贯穿;fork 增量边界 = optimizer.rs 两处 cfg 改运行时标志(optimize 降为包装)+ api.rs Regex 两字段与 utf16 两入口改走单元产物 + classicalbacktrack.rs 两处 cfg 去除分派运行时化 + manifest 独立 [workspace] 表与 feature 注释刷新,其余与上游 0.11.1 逐位一致;新增回归钉五则(well-formed 匹配逐一相等/孤立 surrogate 属性命中/代理对 ≡ str 路径/字节指令与起始谓词按 IR 门控/no_opt 贯穿)

This commit is contained in:
2026-09-13 17:56:09 +00:00
parent f088858cf4
commit 2eea4f1fbc
4 changed files with 320 additions and 39 deletions
+16 -4
View File
@@ -405,9 +405,9 @@ fn promote_1char_loops(n: &mut Node, _w: &Walk) -> PassAction {
/// Replace Cat(Char) with ByteSeq.
/// Also replace chars with literal bytes.
/// Don't do this in utf16 mode because UTF-16 should never match against bytes.
/// 字节指令无法在单元输入(UTF-16/UCS-2)上执行,面向单元的编译由调用方
/// 关闭本 pass(见 `optimize_with_byte_literals`)。
/// TODO: this seems to do too much; consider breaking this up.
#[cfg(not(feature = "utf16"))]
fn form_literal_bytes(n: &mut Node, walk: &Walk) -> PassAction {
// Helper to return a mutable reference to the nodes of a literal bytes.
fn get_literal_bytes(n: &mut Node) -> Option<&mut Vec<u8>> {
@@ -521,7 +521,17 @@ fn simplify_brackets(n: &mut Node, _walk: &Walk) -> PassAction {
}
}
/// 编译主入口:字节字面量 pass 恒开,编译产物与旧的全局 feature 门控形态逐位一致。
pub fn optimize(r: &mut Regex) {
optimize_with_byte_literals(r, true)
}
/// 与 `optimize` 同一条定点 pass 链,仅字节字面量 pass
/// (Char → ByteSequence、ASCII 集合 → ByteSet)由 `byte_literals` 控制。
///
/// 字节指令无法在单元输入(UTF-16/UCS-2)上执行:面向单元输入的 IR 必须以
/// `false` 编译,字节输入(UTF-8)IR 以 `true` 编译保持编译与执行策略不变。
pub fn optimize_with_byte_literals(r: &mut Regex, byte_literals: bool) {
run_pass(r, &mut simplify_brackets);
loop {
let mut changed = false;
@@ -531,10 +541,12 @@ pub fn optimize(r: &mut Regex) {
}
changed |= run_pass(r, &mut unroll_loops);
changed |= run_pass(r, &mut promote_1char_loops);
#[cfg(not(feature = "utf16"))]
{
// 字节字面量 pass:仅字节输入编译允许,单元输入 IR 不得含字节指令。
if byte_literals {
changed |= run_pass(r, &mut form_literal_bytes);
}
changed |= run_pass(r, &mut remove_empties);
changed |= run_pass(r, &mut propagate_early_fails);
if !changed {