docs: 补充注释与格式化
This commit is contained in:
@@ -4,7 +4,11 @@ use crate::{BasicBlock, Cfg};
|
||||
|
||||
/// 追加 exit 哨兵块(`0..0`,置末尾),从各块 succs 反推 preds。
|
||||
pub(super) fn finalize(mut blocks: Vec<BasicBlock>, exit_id: usize) -> Cfg {
|
||||
blocks.push(BasicBlock { inst_range: 0..0, preds: Vec::new(), succs: Vec::new() });
|
||||
blocks.push(BasicBlock {
|
||||
inst_range: 0..0,
|
||||
preds: Vec::new(),
|
||||
succs: Vec::new(),
|
||||
});
|
||||
let mut succs_total = 0usize;
|
||||
let mut preds_total = 0usize;
|
||||
for i in 0..blocks.len() {
|
||||
@@ -17,7 +21,11 @@ pub(super) fn finalize(mut blocks: Vec<BasicBlock>, exit_id: usize) -> Cfg {
|
||||
}
|
||||
debug_assert_eq!(succs_total, preds_total, "succs/preds 不对称(Pitfall 4)");
|
||||
|
||||
Cfg { blocks, entry: 0, exit: exit_id }
|
||||
Cfg {
|
||||
blocks,
|
||||
entry: 0,
|
||||
exit: exit_id,
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
@@ -29,8 +37,16 @@ mod tests {
|
||||
#[test]
|
||||
fn exit_sentinel_appended_with_preds_reversed() {
|
||||
let blocks_in = vec![
|
||||
BasicBlock { inst_range: 0..1, preds: Vec::new(), succs: vec![(1, EdgeKind::Jump)] },
|
||||
BasicBlock { inst_range: 1..2, preds: Vec::new(), succs: vec![(2, EdgeKind::Fallthrough)] },
|
||||
BasicBlock {
|
||||
inst_range: 0..1,
|
||||
preds: Vec::new(),
|
||||
succs: vec![(1, EdgeKind::Jump)],
|
||||
},
|
||||
BasicBlock {
|
||||
inst_range: 1..2,
|
||||
preds: Vec::new(),
|
||||
succs: vec![(2, EdgeKind::Fallthrough)],
|
||||
},
|
||||
];
|
||||
let cfg = finalize(blocks_in, 2);
|
||||
assert_eq!(cfg.blocks.len(), 3, "2 实块 + exit 哨兵");
|
||||
@@ -41,12 +57,20 @@ mod tests {
|
||||
assert_eq!(cfg.blocks[2].preds, vec![1], "exit preds 反推自块 1 的 Fallthrough 边");
|
||||
}
|
||||
|
||||
/// succs/preds 对称:total 边数一致(Pitfall 4 防御性约束)。
|
||||
/// succs/preds 对称:total 边数一致(防御性约束)。
|
||||
#[test]
|
||||
fn preds_and_succs_symmetric() {
|
||||
let blocks_in = vec![
|
||||
BasicBlock { inst_range: 0..1, preds: Vec::new(), succs: vec![(1, EdgeKind::Jump)] },
|
||||
BasicBlock { inst_range: 1..2, preds: Vec::new(), succs: vec![(2, EdgeKind::Fallthrough)] },
|
||||
BasicBlock {
|
||||
inst_range: 0..1,
|
||||
preds: Vec::new(),
|
||||
succs: vec![(1, EdgeKind::Jump)],
|
||||
},
|
||||
BasicBlock {
|
||||
inst_range: 1..2,
|
||||
preds: Vec::new(),
|
||||
succs: vec![(2, EdgeKind::Fallthrough)],
|
||||
},
|
||||
];
|
||||
let cfg = finalize(blocks_in, 2);
|
||||
let succs_total: usize = cfg.blocks.iter().map(|b| b.succs.len()).sum();
|
||||
|
||||
Reference in New Issue
Block a user