疯狂餐厅
86.88M · 2026-03-21
这次重构只做一件事:围绕 SRP(单一职责原则),把 VM 里的“执行职责”和“统计职责”拆开。
重构范围如下:
改造前,VM 与 StackStats 的职责边界不清晰:
StackStats 同时负责 栈存储 和 统计计数。VM 对外暴露了 PushCount/PopCount/Depth/MaxDepth 等统计接口。问题本质是:功能可用,但长期维护和扩展成本会持续升高。
src/stack_stats.h -> src/vm_stack.hsrc/stack_stats.cc -> src/vm_stack.cctests/stack_stats_test.cc -> tests/vm_stack_test.ccStackStats -> VmStackPush/Pop/Top/At/Clear/Empty 等栈行为。values() 只读接口供 GC root 扫描使用。新增 IVmObserver / VmStackObserver:
IVmObserver 提供:
OnStackPush()OnStackPop()OnTestEmit(const Value&)VmStackObserver 专门负责统计:
push_count_pop_count_max_depth_VM 增加并打通测试事件路径:
TestEmit(const Value&)NotifyTestEmit(const Value&)__test_emit(x) builtin 仍保持脚本语义不变,但内部统一走 VM 事件广播。VmHookObserver(基于 OnTestEmit),用于测试侧采集 emit 值。vm.SetTestEmitSink(...)VmHookObserver hook; vm.AddObserver(&hook);VM 内部栈类型切换为 VmStack。VM 增加 AddObserver(IVmObserver*)。VM::Push/Pop 中增加事件通知:
OnStackPushOnStackPop本次重构中,构建系统发生了两类问题并已修复:
stack_stats_test 已改为 vm_stack_test 并更新到 test_suite(all)。//src/frontend:frontend 残留依赖。//src:cilly_core 统一收口源码。src/BUILD.bazel 与 tests/BUILD.bazel 的依赖关系。执行命令:
bazelisk test //tests:"all" --test_output=errors
结果:38/38 测试全部通过。
说明这次 SRP 重构没有破坏现有行为。
职责更清晰
VmStack 只管数据,统计逻辑归 VmStackObserver,VM 只负责执行与事件广播。
扩展更简单
后续加 profiler/debugger,只需新增 observer,不必反复改 VM 核心执行路径。
构建更稳定
Bazel 依赖图更干净,减少跨包引用造成的隐式构建错误。
第 1 阶段(SRP)目标达成:
“将统计职责从核心执行路径剥离”已经完成,且测试全绿。
下一阶段可以按计划推进: