mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-25 03:01:12 +08:00
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:
Vendored
+16
-4
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user