Track subcall read regions within read-only calls
This commit is contained in:
@@ -8,3 +8,5 @@
|
||||
| [store.rs](store.rs) | 只读嵌套、容器与类型写入屏障、稳定地址、跨存储句柄拒绝与更新原子性、Dict/Cell 循环回收、函数校验失败无泄漏、共享代码与常量生命周期 |
|
||||
|
||||
非法句柄索引、槽位代数与计数溢出仍在 src/heap.rs 的私有单元测试内,不开放句柄构造器。VM 委托 API 与求值行为继续由 [core/tests](../../core/tests/README.md) 检查。随工作区在指定远端运行,本地不测试;现有测试源码不代表已通过,见 [验证](../../../docs/operations/validation.md)。返回 [objects](../README.md)。
|
||||
|
||||
store.rs 还覆盖只读子调用读取区域、重复读取、LIFO 校验与未关闭区域的调用结束清理;这些用例按约定不在本地运行。
|
||||
|
||||
@@ -153,3 +153,33 @@ fn read_only_scopes_block_existing_container_and_type_writes_but_allow_fresh_res
|
||||
store.collect_cycles();
|
||||
assert_eq!(store.object_count(), 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn read_tracking_regions_repeat_shared_reads_and_preserve_enclosing_dependencies() {
|
||||
let mut store = ObjectStore::new().unwrap();
|
||||
let first = store.new_object().unwrap();
|
||||
let second = store.new_object().unwrap();
|
||||
assert!(store.begin_read_tracking().is_err());
|
||||
let scope = store.begin_read_only();
|
||||
let outer = store.begin_read_tracking().unwrap();
|
||||
store.object(first).unwrap();
|
||||
let nested = store.begin_read_tracking().unwrap();
|
||||
store.object(first).unwrap();
|
||||
store.object(second).unwrap();
|
||||
assert!(store.end_read_tracking(outer).is_err());
|
||||
assert_eq!(
|
||||
store.end_read_tracking(nested).unwrap(),
|
||||
vec![first, second]
|
||||
);
|
||||
assert_eq!(store.end_read_tracking(outer).unwrap(), vec![first, second]);
|
||||
let repeated = store.begin_read_tracking().unwrap();
|
||||
store.object(first).unwrap();
|
||||
assert_eq!(store.end_read_tracking(repeated).unwrap(), vec![first]);
|
||||
// Ending the call discards an unfinished region, as on callback failure.
|
||||
store.begin_read_tracking().unwrap();
|
||||
assert_eq!(store.end_read_only(scope).unwrap(), vec![first, second]);
|
||||
assert!(store.end_read_tracking(1).is_err());
|
||||
assert!(!store.is_read_only());
|
||||
store.release(first).unwrap();
|
||||
store.release(second).unwrap();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user