Files
Just-DataInspector/Documents/Code_Review_Progress.md
T
DeepSeek-V4.1-Flash 7a3fefb9c2 refactor(plotview): 面板状态/滚动量收敛为唯一派发点,消除 20+ 处手写分支
问题:`Lane` 里 7 种实验性功能各自持有一份 `LanePanelState` 与滚动偏移(共 14 个字段)。
旧实现在每个需要“按种类取用”的地方各写一遍多层嵌套三元式或 switch:
 - EdgePanelLayoutFor 的 enabled / open / collapsed / storedX / storedY
   共 5 条 7 层嵌套三元式(历史上多次因多/少一个右括号编译失败);
 - 标题栏拖拽、✕ 关闭、滚轮翻页、滚动条拖动、错开序数统计各自再写一遍。
新增一种面板要改 20+ 处,漏一处就是「面板拖不动 / 关不掉 / 滚轮滚不到底」
(MARK、RESAMPLE、CLIP 三种面板都真实踩过)。

改法(PlotViewInternal.hpp 新增唯一派发点):
- LanePanelEnabled(lane, kind)
- LanePanelStateOf(lane, kind)    可写/只读
- LanePanelScrollOf(lane, kind)   可写/只读
这些 switch **穷举全部 7 种且不写 default**,因此 -Wswitch(属 -Wall)会在新增
EdgePanelKind 而漏登记时直接报警 —— 已用最小程序验证 -Wswitch 确实会报。

调用点改造:
- EdgePanelLayoutFor:5 条嵌套三元式 -> 3 行访问器调用;局部 kOrder[] -> kEdgePanelKinds。
- 标题栏拖拽:整个 7 分支 switch -> 一次访问器写入。
- 滚轮翻页:current 的三元式链 -> LanePanelScrollOf;switch 补全 MEAN/MARK 并去掉 default。
- 滚动条拖动:switch 补全 MEAN/MARK 并去掉 default。
- ✕ 关闭:去掉 `case COUNT: default:` 的兜底,改为穷举。
- SetLanePanelCollapsed / LanePanelCollapsed:两个 switch -> 一次访问器。
- 滚轮“是否可滚面板”的 kind 列举改为 `hoveredKind != MARK`。

验证:release / debug 全量编译零 warning;产物大小不变(793,088 B,逻辑等价)。
2026-11-04 02:59:57 +08:00

3.3 KiB
Raw Blame History

Code Review 进度(分支 Code_Review)

每个节点完成后追加:节点号、改动摘要、验证方式、实测数字。 计划见 Documents/Code_Review_Plan.md;最终报告见 Documents/Code_Review_Report.md。

基线(起点 764e5be)

项 数值
Release 产物 890,880 B
.text 753,136 B
.rdata 36,936 B
.pdata 30,420 B
.xdata 29,496 B
.rsrc 20,656 B
.idata 12,856 B
Debug 产物 1,801,617 B
源码规模 约 5.6 万行

关键发现(详见计划 §一):

  • dynamic_cast(Toolbar.cpp:370)使最小复现程序从 39,936 B 涨到 115,200 B ⇒ +75,264 B;map 中 cp-demangle.o 占 56,320 B。
  • 每个 EdgePanelKind 在源码中出现 21–26 次(6 种面板 ⇒ 约 140 处手写分支)。

节点记录

(下面按完成顺序追加)

P1 移除 dynamic_cast + 关闭 RTTI —— ✅ 完成(提交 5de3763)

改动

  1. Toolbar::BuildBoxes 里唯一的 dynamic_cast 是多余强转(Button::widget 本来就是 UiButtonWidget*)。改为直接遍历 m_buttons(与 m_root->Children() 同源同序)。
  2. 仅关 RTTI 不够:cp-demangle.o 仍在链接里。真凶是 libstdc++ 的 vterminate.o (引用 __cxa_demangle),它被 eh_terminate.o 的 std::terminate 拉入。 ⇒ 在 Utilities/Src/MemProbe.cpp 里自行定义 __gnu_cxx::__verbose_terminate_handler(), 归档成员 vterminate.o 不再被拉入,demangler 整体消失。 应用启动后本来就会 std::set_terminate 换成自己的处理函数,行为等效。
  3. Makefile 新增 NO_RTTI=1(默认开)→ CXXFLAGS += -fno-rtti。

实测

指标 改前 改后 差
Release 890,880 B 829,440 B −61,440 B
.text 753,136 B 703,616 B −49,520 B
.rdata 36,936 B 26,616 B −10,320 B
Debug 1,801,617 B 1,734,578 B −67,039 B

验证:release + debug 全量重建(删 *.o/*.d)零 error 零 warning; map 中 cp-demangle.o 已无 .text 段分配。

P2 Release 关闭异步展开表 + 修正 Debug 构建参数 —— ✅ 完成(提交 94fc1c4)

改动

  1. 新增 RELEASE_ONLY_OPT = -fno-asynchronous-unwind-tables,只加在 Release 的两条 编译规则上。-fno-exceptions 下绝大多数函数不再需要 .pdata/.xdata。
    • 代价(已评估接受):Release 崩溃时 WER 拿不到可靠调用栈;不打印栈回溯的程序 功能不受影响,Debug 构建保留完整展开表。
    • -fno-unwind-tables(全关)会链接失败,不采用。
  2. 修正真实缺陷:DEBUG_OPT = -O0 定义了却从未被使用 —— Debug 的两条编译规则 误用 $(RELEASE_OPT)(-Oz),且全程没有 -g。所谓 "Debug 构建" 其实只是 "不 strip 的 Release",根本无法调试。现改用 $(DEBUG_OPT) -g,链接也加 -g。

实测

指标 改前 改后
Release 829,440 B 793,088 B(−36,352)
.pdata 30,420 B 12,684 B
.xdata 28,904 B 10,156 B
Debug 1,734,578 B 5,992,064 B(真实 -O0 -g,属预期)

验证:release 与 debug 均全量重建,零 error 零 warning(-O0 下也没有新警告)。